Google Capabilities

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

Sort
Expand

Uses Anthropic to summarize a GitHub pull request diff and posts the AI-generated review notes to the PR as a comment.

naftiko: "0.5"
info:
  label: "AI-Assisted Code Review Summary"
  description: "Uses Anthropic to summarize a GitHub pull request diff and posts the AI-generated review notes to the PR as a comment."
  tags:
    - devops
    - github
    - anthropic
    - ai
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: ai-devtools
      port: 8080
      tools:
        - name: summarize-pull-request
          description: "Given a GitHub repo and PR number, fetch the diff, generate an AI code review summary using Anthropic, and post the summary as a PR comment."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. google/platform."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number to review."
          steps:
            - name: get-pr-diff
              type: call
              call: github.get-pull-request-diff
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: generate-review
              type: call
              call: anthropic.review-code
              with:
                model: claude-opus-4-5
                prompt: "Review this pull request diff and summarize key changes, potential issues, and suggestions: {{get-pr-diff.diff}}"
            - name: post-comment
              type: call
              call: github-comments.create-pr-comment
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                body: "AI Code Review Summary:\n{{generate-review.content}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request-diff
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: review-code
              method: POST
    - type: http
      namespace: github-comments
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-comments
          path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST

Retrieves device details from Google Endpoint Management for a managed Android device.

naftiko: "0.5"
info:
  label: "Android Device Management Info"
  description: "Retrieves device details from Google Endpoint Management for a managed Android device."
  tags:
    - mobile
    - android
    - device-management
    - security
capability:
  exposes:
    - type: mcp
      namespace: mdm-ops
      port: 8080
      tools:
        - name: get-managed-device
          description: "Given a customer ID and device ID, return the device model, OS version, and compliance state."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Workspace customer ID."
            - name: device_id
              in: body
              type: string
              description: "The managed device resource ID."
          call: endpoint-mgmt.get-device
          with:
            customer_id: "{{customer_id}}"
            device_id: "{{device_id}}"
          outputParameters:
            - name: model
              type: string
              mapping: "$.model"
            - name: os_version
              type: string
              mapping: "$.osVersion"
            - name: compliance_state
              type: string
              mapping: "$.managementState"
  consumes:
    - type: http
      namespace: endpoint-mgmt
      baseUri: "https://cloudidentity.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: devices
          path: "/devices/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device
              method: GET

After an incident is resolved, uses Anthropic to draft a post-mortem document from the incident timeline and Jira notes, then posts it to Confluence.

naftiko: "0.5"
info:
  label: "Anthropic-Powered Incident Post-Mortem Draft"
  description: "After an incident is resolved, uses Anthropic to draft a post-mortem document from the incident timeline and Jira notes, then posts it to Confluence."
  tags:
    - sre
    - incident-response
    - anthropic
    - jira
    - confluence
    - ai
capability:
  exposes:
    - type: mcp
      namespace: postmortem-ops
      port: 8080
      tools:
        - name: draft-postmortem
          description: "Given a Jira incident issue key, retrieve the full incident timeline and comments, use Anthropic to draft a post-mortem document, and publish it to Confluence."
          inputParameters:
            - name: jira_issue_key
              in: body
              type: string
              description: "The Jira incident issue key, e.g. SRE-1234."
            - name: confluence_space_key
              in: body
              type: string
              description: "The Confluence space key to publish the post-mortem to."
          steps:
            - name: get-incident-details
              type: call
              call: jira.get-issue-with-comments
              with:
                issue_key: "{{jira_issue_key}}"
            - name: draft-postmortem
              type: call
              call: anthropic.draft-postmortem
              with:
                model: claude-opus-4-5
                prompt: "Draft a structured SRE post-mortem for this incident. Include timeline, root cause, impact, and action items: {{get-incident-details.summary}} {{get-incident-details.comments}}"
            - name: publish-to-confluence
              type: call
              call: confluence.create-page
              with:
                space_key: "{{confluence_space_key}}"
                title: "Post-Mortem: {{jira_issue_key}}"
                content: "{{draft-postmortem.content}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue-with-comments
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: draft-postmortem
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://google.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Monitors BigQuery scheduled query execution status, raises a Datadog alert for failures, and creates a Jira data incident for remediation.

naftiko: "0.5"
info:
  label: "BigQuery Data Pipeline Health Monitor"
  description: "Monitors BigQuery scheduled query execution status, raises a Datadog alert for failures, and creates a Jira data incident for remediation."
  tags:
    - data-analytics
    - bigquery
    - datadog
    - jira
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-bigquery-pipeline
          description: "Given a BigQuery scheduled query ID, check its last execution status, raise a Datadog event for failures, and open a Jira data incident."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID containing the scheduled query."
            - name: scheduled_query_id
              in: body
              type: string
              description: "The BigQuery Data Transfer Service scheduled query resource ID."
          steps:
            - name: get-transfer-run
              type: call
              call: bigquery-dts.get-run-status
              with:
                project_id: "{{project_id}}"
                scheduled_query_id: "{{scheduled_query_id}}"
            - name: raise-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "BigQuery pipeline failure: {{scheduled_query_id}}"
                text: "Project: {{project_id}} | State: {{get-transfer-run.state}}"
                alert_type: "error"
            - name: open-jira-incident
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                summary: "BigQuery pipeline failure: {{scheduled_query_id}}"
                description: "Project: {{project_id}}\nState: {{get-transfer-run.state}}"
  consumes:
    - type: http
      namespace: bigquery-dts
      baseUri: "https://bigquerydatatransfer.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: transfer-runs
          path: "/projects/{{project_id}}/transferConfigs/{{scheduled_query_id}}/runs"
          inputParameters:
            - name: project_id
              in: path
            - name: scheduled_query_id
              in: path
          operations:
            - name: get-run-status
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Runs data quality validation queries on a BigQuery table and posts completeness and anomaly results to the data engineering Google Chat space.

naftiko: "0.5"
info:
  label: "BigQuery Data Quality Check Report"
  description: "Runs data quality validation queries on a BigQuery table and posts completeness and anomaly results to the data engineering Google Chat space."
  tags:
    - data-analytics
    - bigquery
    - google-chat
    - data-quality
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-bigquery-data-quality
          description: "Given a BigQuery project, dataset, and table, execute a data quality check and post the results to the data engineering Google Chat space."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID containing the BigQuery dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The BigQuery dataset ID."
            - name: table_id
              in: body
              type: string
              description: "The BigQuery table ID to run quality checks against."
          steps:
            - name: run-quality-query
              type: call
              call: bigquery.execute-query
              with:
                project_id: "{{project_id}}"
                query: "SELECT COUNT(*) as total, COUNTIF(id IS NULL) as missing_ids FROM `{{project_id}}.{{dataset_id}}.{{table_id}}`"
            - name: post-results
              type: call
              call: google-chat.post-quality-report
              with:
                space_name: "data-engineering"
                text: "Data quality check on {{table_id}}: Total={{run-quality-query.total}}, Missing IDs={{run-quality-query.missing_ids}}"
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: queries
          path: "/projects/{{project_id}}/queries"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-quality-report
              method: POST

Retrieves BigQuery job statistics for scheduled queries, calculates estimated costs, and posts a cost summary to the data engineering Slack channel.

naftiko: "0.5"
info:
  label: "BigQuery Scheduled Query Cost Tracker"
  description: "Retrieves BigQuery job statistics for scheduled queries, calculates estimated costs, and posts a cost summary to the data engineering Slack channel."
  tags:
    - finops
    - bigquery
    - gcp
    - slack
    - data-analytics
capability:
  exposes:
    - type: mcp
      namespace: bq-cost-ops
      port: 8080
      tools:
        - name: track-scheduled-query-costs
          description: "Given a project ID and job ID, retrieve query statistics including bytes processed and estimated cost, then post to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: job_id
              in: body
              type: string
              description: "The BigQuery job ID."
          steps:
            - name: get-job-stats
              type: call
              call: bigquery.get-job
              with:
                project_id: "{{project_id}}"
                job_id: "{{job_id}}"
            - name: post-cost-summary
              type: call
              call: slack.post-message
              with:
                channel: "data-eng-costs"
                text: "BigQuery job {{job_id}} cost report: {{get-job-stats.totalBytesProcessed}} bytes processed, status: {{get-job-stats.status}} in project {{project_id}}."
  consumes:
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/jobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET
    - 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

Retrieves metadata for a Chrome extension from the Chrome Web Store including version, user count, and rating.

naftiko: "0.5"
info:
  label: "Chrome Web Store Extension Info"
  description: "Retrieves metadata for a Chrome extension from the Chrome Web Store including version, user count, and rating."
  tags:
    - chrome
    - developer-tools
capability:
  exposes:
    - type: mcp
      namespace: chrome-store
      port: 8080
      tools:
        - name: get-extension-info
          description: "Given a Chrome extension ID, return its name, version, user count, and average rating."
          inputParameters:
            - name: extension_id
              in: body
              type: string
              description: "The Chrome Web Store extension ID."
          call: chrome-webstore.get-item
          with:
            extension_id: "{{extension_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: version
              type: string
              mapping: "$.version"
            - name: user_count
              type: number
              mapping: "$.userCount"
  consumes:
    - type: http
      namespace: chrome-webstore
      baseUri: "https://chromewebstore.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.google_oauth_token"
      resources:
        - name: items
          path: "/items/{{extension_id}}"
          inputParameters:
            - name: extension_id
              in: path
          operations:
            - name: get-item
              method: GET

Detects Kubernetes pod crash-loop anomalies via Datadog, creates a Jira SRE incident, and pages the on-call team via PagerDuty.

naftiko: "0.5"
info:
  label: "Datadog Kubernetes Pod Anomaly Responder"
  description: "Detects Kubernetes pod crash-loop anomalies via Datadog, creates a Jira SRE incident, and pages the on-call team via PagerDuty."
  tags:
    - cloud
    - kubernetes
    - observability
    - datadog
    - pagerduty
    - jira
    - sre
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: respond-to-pod-anomaly
          description: "Given a Datadog monitor ID detecting a pod crash loop, retrieve monitor details, create a Jira SRE incident, and page the Kubernetes on-call team via PagerDuty."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that detected the Kubernetes pod anomaly."
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace where the failing pods are running."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-jira-incident
              type: call
              call: jira.create-sre-incident
              with:
                project_key: "SRE"
                summary: "K8s pod anomaly: {{namespace}} — {{get-monitor.name}}"
                priority: "High"
            - name: page-k8s-oncall
              type: call
              call: pagerduty.create-incident
              with:
                title: "Pod crash loop: {{namespace}}"
                service_id: "$secrets.pagerduty_k8s_service_id"
                body: "Jira: {{create-jira-incident.key}}\nMonitor: {{get-monitor.name}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-sre-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves SLO compliance status for all production services from Datadog and posts a weekly digest to the SRE team Google Chat space.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Digest"
  description: "Retrieves SLO compliance status for all production services from Datadog and posts a weekly digest to the SRE team Google Chat space."
  tags:
    - observability
    - datadog
    - google-chat
    - slo
    - sre
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sre-reporting
      port: 8080
      tools:
        - name: digest-slo-compliance
          description: "Retrieve all SLO statuses from Datadog for a given timeframe and post a compliance digest to the SRE Google Chat space."
          inputParameters:
            - name: timeframe
              in: body
              type: string
              description: "SLO evaluation window: 7d, 30d, or 90d."
          steps:
            - name: get-slos
              type: call
              call: datadog.list-slos
              with:
                timeframe: "{{timeframe}}"
            - name: post-digest
              type: call
              call: google-chat.post-slo-report
              with:
                space_name: "sre-slo-reports"
                text: "SLO Compliance ({{timeframe}}): {{get-slos.compliant}} compliant, {{get-slos.breached}} breached services."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-slo-report
              method: POST

Submits user-generated content to the Gemini safety classifier via Vertex AI, reviews the safety ratings, and escalates flagged content to the trust and safety Jira queue.

naftiko: "0.5"
info:
  label: "DeepMind Gemini Content Safety Review"
  description: "Submits user-generated content to the Gemini safety classifier via Vertex AI, reviews the safety ratings, and escalates flagged content to the trust and safety Jira queue."
  tags:
    - ai-ml
    - deepmind
    - vertex-ai
    - gcp
    - jira
    - trust-safety
capability:
  exposes:
    - type: mcp
      namespace: content-safety
      port: 8080
      tools:
        - name: review-content-safety
          description: "Given a project, location, and text content, classify safety via Gemini and create a Jira task for flagged content."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: location
              in: body
              type: string
              description: "The Vertex AI region."
            - name: content_text
              in: body
              type: string
              description: "The text content to review for safety."
          steps:
            - name: classify-content
              type: call
              call: vertex-ai.generate-content
              with:
                project_id: "{{project_id}}"
                location: "{{location}}"
                model: "gemini-pro"
                content: "{{content_text}}"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project_key: "TAS"
                summary: "Content safety review flagged"
                description: "Safety ratings: {{classify-content.safetyRatings}}\nBlocked: {{classify-content.blocked}}\nContent preview: {{content_text}}"
  consumes:
    - type: http
      namespace: vertex-ai
      baseUri: "https://{{location}}-aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: models
          path: "/projects/{{project_id}}/locations/{{location}}/publishers/google/models/{{model}}:generateContent"
          inputParameters:
            - name: project_id
              in: path
            - name: location
              in: path
            - name: model
              in: path
          operations:
            - name: generate-content
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks the deployment status of a Vertex AI model endpoint, verifies traffic split, and notifies the ML team via Google Chat.

naftiko: "0.5"
info:
  label: "Vertex AI Model Deployment Notifier"
  description: "Checks the deployment status of a Vertex AI model endpoint, verifies traffic split, and notifies the ML team via Google Chat."
  tags:
    - ai-ml
    - gcp
    - vertex-ai
    - deepmind
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: notify-model-deployment
          description: "Given a project, location, and endpoint ID, check model deployment status and notify the ML Google Chat space."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: location
              in: body
              type: string
              description: "The Vertex AI region, e.g. us-central1."
            - name: endpoint_id
              in: body
              type: string
              description: "The Vertex AI endpoint resource ID."
          steps:
            - name: get-endpoint
              type: call
              call: vertex-ai.get-endpoint
              with:
                project_id: "{{project_id}}"
                location: "{{location}}"
                endpoint_id: "{{endpoint_id}}"
            - name: notify-ml-team
              type: call
              call: google-chat.post-message
              with:
                space_name: "ml-platform"
                text: "Vertex AI endpoint {{endpoint_id}} status: {{get-endpoint.deployedModels_count}} deployed models. Display name: {{get-endpoint.displayName}}."
  consumes:
    - type: http
      namespace: vertex-ai
      baseUri: "https://{{location}}-aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: endpoints
          path: "/projects/{{project_id}}/locations/{{location}}/endpoints/{{endpoint_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: location
              in: path
            - name: endpoint_id
              in: path
          operations:
            - name: get-endpoint
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

When a departure is logged in Workday, suspends the Google Workspace account, removes Okta access, and closes open Jira tickets assigned to the departing employee.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When a departure is logged in Workday, suspends the Google Workspace account, removes Okta access, and closes open Jira tickets assigned to the departing employee."
  tags:
    - hr
    - offboarding
    - workday
    - google-workspace
    - okta
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a departing employee Workday ID and Google account email, suspend the Google Workspace account, deactivate Okta, and close their open Jira issues."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: google_email
              in: body
              type: string
              description: "The employee Google Workspace email to suspend."
            - name: okta_user_id
              in: body
              type: string
              description: "The Okta user ID to deactivate."
          steps:
            - name: suspend-workspace
              type: call
              call: google-admin.suspend-user
              with:
                user_email: "{{google_email}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                user_id: "{{okta_user_id}}"
            - name: close-jira-tickets
              type: call
              call: jira.bulk-close-issues
              with:
                assignee: "{{google_email}}"
  consumes:
    - type: http
      namespace: google-admin
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: suspend-user
              method: PUT
    - type: http
      namespace: okta
      baseUri: "https://google.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: bulk-close-issues
              method: POST

When a new hire is created in Workday, provisions a Google Workspace account, opens a Jira onboarding task, and sends a welcome message via Google Chat.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, provisions a Google Workspace account, opens a Jira onboarding task, and sends a welcome message via Google Chat."
  tags:
    - hr
    - onboarding
    - workday
    - google-workspace
    - jira
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, provision a Google Workspace account, create a Jira onboarding issue, and send a Google Chat welcome message."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee first day in ISO 8601 format, e.g. 2026-04-01."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-workspace-account
              type: call
              call: google-admin.create-user
              with:
                primary_email: "{{get-employee.work_email}}"
                first_name: "{{get-employee.first_name}}"
                last_name: "{{get-employee.last_name}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "ONBOARD"
                issuetype: "Task"
                summary: "Onboarding: {{get-employee.full_name}} — starts {{start_date}}"
            - name: send-welcome
              type: call
              call: google-chat.send-message
              with:
                space_name: "hr-onboarding-channel"
                text: "Welcome to Google, {{get-employee.first_name}}! Workspace account created. Jira task: {{create-jira-task.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/google/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: google-admin
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: send-message
              method: POST

Queries Apigee Analytics for API proxy traffic metrics, detects anomalous error rates, and alerts the API platform team via Slack.

naftiko: "0.5"
info:
  label: "GCP Apigee API Traffic Anomaly Detector"
  description: "Queries Apigee Analytics for API proxy traffic metrics, detects anomalous error rates, and alerts the API platform team via Slack."
  tags:
    - api-management
    - gcp
    - apigee
    - slack
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: apigee-ops
      port: 8080
      tools:
        - name: detect-traffic-anomalies
          description: "Given an Apigee org and environment, pull traffic stats and post anomaly findings to Slack."
          inputParameters:
            - name: org_name
              in: body
              type: string
              description: "The Apigee organization name."
            - name: environment
              in: body
              type: string
              description: "The Apigee environment name."
            - name: time_range
              in: body
              type: string
              description: "The time range for analytics, e.g. last1hour."
          steps:
            - name: get-traffic-stats
              type: call
              call: apigee.get-stats
              with:
                org_name: "{{org_name}}"
                environment: "{{environment}}"
                time_range: "{{time_range}}"
            - name: alert-api-team
              type: call
              call: slack.post-message
              with:
                channel: "api-platform"
                text: "Apigee traffic report for {{org_name}}/{{environment}} ({{time_range}}): total traffic={{get-traffic-stats.total_traffic}}, error rate={{get-traffic-stats.error_rate}}."
  consumes:
    - type: http
      namespace: apigee
      baseUri: "https://apigee.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: stats
          path: "/organizations/{{org_name}}/environments/{{environment}}/stats"
          inputParameters:
            - name: org_name
              in: path
            - name: environment
              in: path
          operations:
            - name: get-stats
              method: GET
    - 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

Retrieves metadata for a container image version stored in Google Artifact Registry.

naftiko: "0.5"
info:
  label: "GCP Artifact Registry Image Lookup"
  description: "Retrieves metadata for a container image version stored in Google Artifact Registry."
  tags:
    - cloud
    - gcp
    - artifact-registry
    - containers
capability:
  exposes:
    - type: mcp
      namespace: artifact-ops
      port: 8080
      tools:
        - name: get-image-metadata
          description: "Given a project, location, repository, and image name, return the image digest, tags, and upload time."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: location
              in: body
              type: string
              description: "The Artifact Registry location, e.g. us-central1."
            - name: repository
              in: body
              type: string
              description: "The repository name."
            - name: image_name
              in: body
              type: string
              description: "The container image name."
          call: artifact-registry.get-image
          with:
            project_id: "{{project_id}}"
            location: "{{location}}"
            repository: "{{repository}}"
            image_name: "{{image_name}}"
          outputParameters:
            - name: uri
              type: string
              mapping: "$.uri"
            - name: update_time
              type: string
              mapping: "$.updateTime"
  consumes:
    - type: http
      namespace: artifact-registry
      baseUri: "https://artifactregistry.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: docker-images
          path: "/projects/{{project_id}}/locations/{{location}}/repositories/{{repository}}/dockerImages/{{image_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: location
              in: path
            - name: repository
              in: path
            - name: image_name
              in: path
          operations:
            - name: get-image
              method: GET

Retrieves Cloud Bigtable cluster node count and storage utilization, and posts a capacity report to the data platform Slack channel.

naftiko: "0.5"
info:
  label: "GCP Bigtable Cluster Utilization Reporter"
  description: "Retrieves Cloud Bigtable cluster node count and storage utilization, and posts a capacity report to the data platform Slack channel."
  tags:
    - database
    - gcp
    - bigtable
    - slack
    - capacity-planning
capability:
  exposes:
    - type: mcp
      namespace: bigtable-ops
      port: 8080
      tools:
        - name: report-bigtable-utilization
          description: "Given a project, instance, and cluster ID, retrieve Bigtable cluster metrics and post utilization to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: instance_id
              in: body
              type: string
              description: "The Bigtable instance ID."
            - name: cluster_id
              in: body
              type: string
              description: "The Bigtable cluster ID."
          steps:
            - name: get-cluster
              type: call
              call: bigtable.get-cluster
              with:
                project_id: "{{project_id}}"
                instance_id: "{{instance_id}}"
                cluster_id: "{{cluster_id}}"
            - name: post-report
              type: call
              call: slack.post-message
              with:
                channel: "data-platform"
                text: "Bigtable cluster {{cluster_id}} (instance {{instance_id}}): {{get-cluster.serveNodes}} nodes, storage type: {{get-cluster.defaultStorageType}}, state: {{get-cluster.state}}."
  consumes:
    - type: http
      namespace: bigtable
      baseUri: "https://bigtableadmin.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: clusters
          path: "/projects/{{project_id}}/instances/{{instance_id}}/clusters/{{cluster_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_id
              in: path
            - name: cluster_id
              in: path
          operations:
            - name: get-cluster
              method: GET
    - 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

Retrieves current GCP billing budget usage, posts an alert to Google Chat, and creates a Jira finance ticket when a budget threshold is exceeded.

naftiko: "0.5"
info:
  label: "GCP Billing Budget Alert Responder"
  description: "Retrieves current GCP billing budget usage, posts an alert to Google Chat, and creates a Jira finance ticket when a budget threshold is exceeded."
  tags:
    - finops
    - gcp
    - billing
    - google-chat
    - jira
capability:
  exposes:
    - type: mcp
      namespace: billing-alerts
      port: 8080
      tools:
        - name: respond-to-budget-alert
          description: "Given a billing account and budget ID, check usage against threshold, alert Google Chat, and open a Jira finance ticket."
          inputParameters:
            - name: billing_account
              in: body
              type: string
              description: "The GCP billing account ID."
            - name: budget_id
              in: body
              type: string
              description: "The budget resource ID."
          steps:
            - name: get-budget
              type: call
              call: billing-budgets.get-budget
              with:
                billing_account: "{{billing_account}}"
                budget_id: "{{budget_id}}"
            - name: alert-chat
              type: call
              call: google-chat.post-message
              with:
                space_name: "finance-alerts"
                text: "Budget alert: {{budget_id}} at {{get-budget.amount_spent}} of {{get-budget.amount_limit}} for account {{billing_account}}."
            - name: create-finance-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "FIN"
                summary: "GCP budget threshold exceeded: {{budget_id}}"
                description: "Billing account: {{billing_account}}\nSpent: {{get-budget.amount_spent}}\nLimit: {{get-budget.amount_limit}}"
  consumes:
    - type: http
      namespace: billing-budgets
      baseUri: "https://billingbudgets.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: budgets
          path: "/billingAccounts/{{billing_account}}/budgets/{{budget_id}}"
          inputParameters:
            - name: billing_account
              in: path
            - name: budget_id
              in: path
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks SSL certificate expiry dates in Google Certificate Manager and creates a Jira task for certificates approaching expiration.

naftiko: "0.5"
info:
  label: "GCP Certificate Manager Expiry Alert"
  description: "Checks SSL certificate expiry dates in Google Certificate Manager and creates a Jira task for certificates approaching expiration."
  tags:
    - security
    - gcp
    - certificate-manager
    - jira
    - ssl
capability:
  exposes:
    - type: mcp
      namespace: cert-ops
      port: 8080
      tools:
        - name: alert-certificate-expiry
          description: "Given a project ID and certificate name, check expiry date and create a Jira renewal task if within threshold."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: certificate_name
              in: body
              type: string
              description: "The certificate resource name."
          steps:
            - name: get-certificate
              type: call
              call: cert-manager.get-certificate
              with:
                project_id: "{{project_id}}"
                certificate_name: "{{certificate_name}}"
            - name: create-renewal-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "SSL certificate expiring: {{certificate_name}}"
                description: "Project: {{project_id}}\nExpires: {{get-certificate.expireTime}}\nDomains: {{get-certificate.subjectAlternativeNames}}"
  consumes:
    - type: http
      namespace: cert-manager
      baseUri: "https://certificatemanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: certificates
          path: "/projects/{{project_id}}/locations/global/certificates/{{certificate_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: certificate_name
              in: path
          operations:
            - name: get-certificate
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves Cloud Armor rate limiting policy configuration, compares it against the approved baseline in a Google Sheet, and posts drift findings to the security Slack channel.

naftiko: "0.5"
info:
  label: "GCP Cloud Armor Rate Limit Policy Sync"
  description: "Retrieves Cloud Armor rate limiting policy configuration, compares it against the approved baseline in a Google Sheet, and posts drift findings to the security Slack channel."
  tags:
    - security
    - gcp
    - cloud-armor
    - google-sheets
    - slack
capability:
  exposes:
    - type: mcp
      namespace: armor-policy-sync
      port: 8080
      tools:
        - name: sync-rate-limit-policies
          description: "Given a project and security policy name, retrieve rate limit rules, compare against the baseline spreadsheet, and post drift to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: policy_name
              in: body
              type: string
              description: "The Cloud Armor security policy name."
            - name: baseline_spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID containing approved rate limit baselines."
          steps:
            - name: get-policy
              type: call
              call: cloud-armor.get-policy
              with:
                project_id: "{{project_id}}"
                policy_name: "{{policy_name}}"
            - name: get-baseline
              type: call
              call: google-sheets.get-values
              with:
                spreadsheet_id: "{{baseline_spreadsheet_id}}"
                range: "RateLimits!A1:D100"
            - name: post-drift-report
              type: call
              call: slack.post-message
              with:
                channel: "security-ops"
                text: "Cloud Armor rate limit policy sync for {{policy_name}} in {{project_id}}: {{get-policy.rule_count}} active rules vs {{get-baseline.row_count}} baseline entries. Review for drift."
  consumes:
    - type: http
      namespace: cloud-armor
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: security-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
    - type: http
      namespace: google-sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_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: 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

Detects Cloud Armor WAF policy violations, blocks the offending IP range, and creates a Jira security incident for SOC review.

naftiko: "0.5"
info:
  label: "GCP Cloud Armor Threat Response"
  description: "Detects Cloud Armor WAF policy violations, blocks the offending IP range, and creates a Jira security incident for SOC review."
  tags:
    - security
    - gcp
    - cloud-armor
    - jira
capability:
  exposes:
    - type: mcp
      namespace: waf-response
      port: 8080
      tools:
        - name: respond-to-cloud-armor-threat
          description: "Given a security policy name and source IP, add a deny rule to Cloud Armor and open a Jira security incident."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: policy_name
              in: body
              type: string
              description: "The Cloud Armor security policy name."
            - name: source_ip
              in: body
              type: string
              description: "The offending source IP or CIDR range."
          steps:
            - name: add-deny-rule
              type: call
              call: cloud-armor.patch-rule
              with:
                project_id: "{{project_id}}"
                policy_name: "{{policy_name}}"
                source_ip: "{{source_ip}}"
                action: "deny(403)"
            - name: create-security-incident
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Cloud Armor threat blocked: {{source_ip}}"
                description: "Auto-blocked IP {{source_ip}} on policy {{policy_name}} in project {{project_id}}."
  consumes:
    - type: http
      namespace: cloud-armor
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: security-policies
          path: "/projects/{{project_id}}/global/securityPolicies/{{policy_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: policy_name
              in: path
          operations:
            - name: patch-rule
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves the status of a Cloud Build trigger execution, and on failure posts a notification to Slack and creates a Jira bug.

naftiko: "0.5"
info:
  label: "GCP Cloud Build Failure Notifier"
  description: "Retrieves the status of a Cloud Build trigger execution, and on failure posts a notification to Slack and creates a Jira bug."
  tags:
    - ci-cd
    - gcp
    - cloud-build
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: build-ops
      port: 8080
      tools:
        - name: notify-build-failure
          description: "Given a project ID and build ID, check build status and on failure notify Slack and create a Jira bug."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: build_id
              in: body
              type: string
              description: "The Cloud Build build ID."
          steps:
            - name: get-build
              type: call
              call: cloud-build.get-build
              with:
                project_id: "{{project_id}}"
                build_id: "{{build_id}}"
            - name: notify-slack
              type: call
              call: slack.post-message
              with:
                channel: "ci-cd-alerts"
                text: "Cloud Build failure: build {{build_id}} in {{project_id}} finished with status {{get-build.status}}."
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                summary: "Cloud Build failure: {{build_id}}"
                description: "Project: {{project_id}}\nStatus: {{get-build.status}}\nLog URL: {{get-build.logUrl}}"
  consumes:
    - type: http
      namespace: cloud-build
      baseUri: "https://cloudbuild.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: builds
          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: 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
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Triggers a Cloud CDN cache invalidation for a URL pattern, monitors completion, and notifies the web team via Google Chat.

naftiko: "0.5"
info:
  label: "GCP Cloud CDN Cache Invalidation Tracker"
  description: "Triggers a Cloud CDN cache invalidation for a URL pattern, monitors completion, and notifies the web team via Google Chat."
  tags:
    - cloud
    - gcp
    - cloud-cdn
    - google-chat
    - caching
capability:
  exposes:
    - type: mcp
      namespace: cdn-ops
      port: 8080
      tools:
        - name: track-cache-invalidation
          description: "Given a project ID, URL map, and path pattern, trigger cache invalidation and notify the web team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: url_map
              in: body
              type: string
              description: "The URL map resource name."
            - name: path_pattern
              in: body
              type: string
              description: "The path pattern to invalidate, e.g. /static/*."
          steps:
            - name: invalidate-cache
              type: call
              call: compute-url-maps.invalidate-cache
              with:
                project_id: "{{project_id}}"
                url_map: "{{url_map}}"
                path: "{{path_pattern}}"
            - name: notify-web-team
              type: call
              call: google-chat.post-message
              with:
                space_name: "web-platform"
                text: "CDN cache invalidation triggered for {{path_pattern}} on {{url_map}} in {{project_id}}. Operation: {{invalidate-cache.operationId}}."
  consumes:
    - type: http
      namespace: compute-url-maps
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: url-maps
          path: "/projects/{{project_id}}/global/urlMaps/{{url_map}}/invalidateCache"
          inputParameters:
            - name: project_id
              in: path
            - name: url_map
              in: path
          operations:
            - name: invalidate-cache
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the latest Cloud Deploy release status, promotes it to the next target in the pipeline, and notifies the release team via Slack.

naftiko: "0.5"
info:
  label: "GCP Cloud Deploy Release Promoter"
  description: "Retrieves the latest Cloud Deploy release status, promotes it to the next target in the pipeline, and notifies the release team via Slack."
  tags:
    - ci-cd
    - gcp
    - cloud-deploy
    - slack
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: deploy-ops
      port: 8080
      tools:
        - name: promote-release
          description: "Given a project, region, delivery pipeline, and release name, check status, promote to next target, and notify Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Deploy region."
            - name: pipeline_name
              in: body
              type: string
              description: "The delivery pipeline name."
            - name: release_name
              in: body
              type: string
              description: "The release resource name."
          steps:
            - name: get-release
              type: call
              call: cloud-deploy.get-release
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                pipeline_name: "{{pipeline_name}}"
                release_name: "{{release_name}}"
            - name: promote-release
              type: call
              call: cloud-deploy.promote-release
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                pipeline_name: "{{pipeline_name}}"
                release_name: "{{release_name}}"
            - name: notify-release-team
              type: call
              call: slack.post-message
              with:
                channel: "release-management"
                text: "Cloud Deploy release {{release_name}} promoted in pipeline {{pipeline_name}}. Render state: {{get-release.renderState}}."
  consumes:
    - type: http
      namespace: cloud-deploy
      baseUri: "https://clouddeploy.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: releases
          path: "/projects/{{project_id}}/locations/{{region}}/deliveryPipelines/{{pipeline_name}}/releases/{{release_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: pipeline_name
              in: path
            - name: release_name
              in: path
          operations:
            - name: get-release
              method: GET
        - name: release-promote
          path: "/projects/{{project_id}}/locations/{{region}}/deliveryPipelines/{{pipeline_name}}/releases/{{release_name}}:promote"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: pipeline_name
              in: path
            - name: release_name
              in: path
          operations:
            - name: promote-release
              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

Retrieves DNS resource record sets for a managed zone in Google Cloud DNS.

naftiko: "0.5"
info:
  label: "GCP Cloud DNS Record Lookup"
  description: "Retrieves DNS resource record sets for a managed zone in Google Cloud DNS."
  tags:
    - cloud
    - gcp
    - dns
    - networking
capability:
  exposes:
    - type: mcp
      namespace: dns-ops
      port: 8080
      tools:
        - name: lookup-dns-records
          description: "Given a project ID and managed zone, return all DNS resource record sets."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: managed_zone
              in: body
              type: string
              description: "The name of the Cloud DNS managed zone."
          call: cloud-dns.list-records
          with:
            project_id: "{{project_id}}"
            managed_zone: "{{managed_zone}}"
          outputParameters:
            - name: record_count
              type: number
              mapping: "$.rrsets.length"
  consumes:
    - type: http
      namespace: cloud-dns
      baseUri: "https://dns.googleapis.com/dns/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: resource-record-sets
          path: "/projects/{{project_id}}/managedZones/{{managed_zone}}/rrsets"
          inputParameters:
            - name: project_id
              in: path
            - name: managed_zone
              in: path
          operations:
            - name: list-records
              method: GET

Retrieves metadata and status for a Cloud Function including runtime, entry point, and deployment state.

naftiko: "0.5"
info:
  label: "GCP Cloud Functions Invocation Lookup"
  description: "Retrieves metadata and status for a Cloud Function including runtime, entry point, and deployment state."
  tags:
    - cloud
    - gcp
    - cloud-functions
    - serverless
capability:
  exposes:
    - type: mcp
      namespace: functions-ops
      port: 8080
      tools:
        - name: get-function-info
          description: "Given a project ID, region, and function name, return the runtime, entry point, and status of the Cloud Function."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The region where the function is deployed."
            - name: function_name
              in: body
              type: string
              description: "The name of the Cloud Function."
          call: cloud-functions.get-function
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            function_name: "{{function_name}}"
          outputParameters:
            - name: runtime
              type: string
              mapping: "$.buildConfig.runtime"
            - name: entry_point
              type: string
              mapping: "$.buildConfig.entryPoint"
            - name: state
              type: string
              mapping: "$.state"
  consumes:
    - type: http
      namespace: cloud-functions
      baseUri: "https://cloudfunctions.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: functions
          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

Queries Cloud Logging for ERROR-level entries in a project, aggregates them into a digest, and posts the summary to a Slack channel.

naftiko: "0.5"
info:
  label: "GCP Cloud Logging Error Digest"
  description: "Queries Cloud Logging for ERROR-level entries in a project, aggregates them into a digest, and posts the summary to a Slack channel."
  tags:
    - monitoring
    - gcp
    - cloud-logging
    - slack
    - observability
capability:
  exposes:
    - type: mcp
      namespace: logging-ops
      port: 8080
      tools:
        - name: digest-error-logs
          description: "Given a GCP project ID and time window, query Cloud Logging for errors and post a digest to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: hours_back
              in: body
              type: string
              description: "Number of hours to look back for error entries."
          steps:
            - name: query-errors
              type: call
              call: cloud-logging.list-entries
              with:
                project_id: "{{project_id}}"
                filter: "severity=ERROR"
                hours_back: "{{hours_back}}"
            - name: post-digest
              type: call
              call: slack.post-message
              with:
                channel: "platform-alerts"
                text: "Cloud Logging error digest for {{project_id}} (last {{hours_back}}h): {{query-errors.entry_count}} errors detected."
  consumes:
    - type: http
      namespace: cloud-logging
      baseUri: "https://logging.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: entries
          path: "/entries:list"
          operations:
            - name: list-entries
              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

Retrieves a Cloud Monitoring alert policy incident, extracts metric details, and posts a formatted alert to the SRE Slack channel.

naftiko: "0.5"
info:
  label: "GCP Cloud Monitoring Alert to Slack"
  description: "Retrieves a Cloud Monitoring alert policy incident, extracts metric details, and posts a formatted alert to the SRE Slack channel."
  tags:
    - monitoring
    - gcp
    - cloud-monitoring
    - slack
    - sre
capability:
  exposes:
    - type: mcp
      namespace: monitoring-alerts
      port: 8080
      tools:
        - name: forward-monitoring-alert
          description: "Given a project ID and alert policy name, retrieve the latest incident and post details to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: policy_name
              in: body
              type: string
              description: "The alert policy resource name."
          steps:
            - name: get-alert-policy
              type: call
              call: cloud-monitoring.get-policy
              with:
                project_id: "{{project_id}}"
                policy_name: "{{policy_name}}"
            - name: post-to-slack
              type: call
              call: slack.post-message
              with:
                channel: "sre-alerts"
                text: "Cloud Monitoring alert: {{get-alert-policy.displayName}} in {{project_id}}. Condition: {{get-alert-policy.conditions}}. Enabled: {{get-alert-policy.enabled}}."
  consumes:
    - type: http
      namespace: cloud-monitoring
      baseUri: "https://monitoring.googleapis.com/v3"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: alert-policies
          path: "/projects/{{project_id}}/alertPolicies/{{policy_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: policy_name
              in: path
          operations:
            - name: get-policy
              method: GET
    - 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

Retrieves Cloud NAT gateway allocation and port utilization metrics and posts a capacity report to the network engineering Slack channel.

naftiko: "0.5"
info:
  label: "GCP Cloud NAT Gateway Utilization Reporter"
  description: "Retrieves Cloud NAT gateway allocation and port utilization metrics and posts a capacity report to the network engineering Slack channel."
  tags:
    - cloud
    - gcp
    - cloud-nat
    - networking
    - slack
capability:
  exposes:
    - type: mcp
      namespace: nat-ops
      port: 8080
      tools:
        - name: report-nat-utilization
          description: "Given a project, region, and router name, retrieve NAT configuration and post utilization to Slack."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The region of the Cloud Router."
            - name: router_name
              in: body
              type: string
              description: "The Cloud Router name with NAT config."
          steps:
            - name: get-router
              type: call
              call: compute-router.get-router
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                router_name: "{{router_name}}"
            - name: post-utilization
              type: call
              call: slack.post-message
              with:
                channel: "network-eng"
                text: "Cloud NAT report for {{router_name}} in {{region}}: NAT IPs allocated={{get-router.natIpCount}}, min ports per VM={{get-router.minPortsPerVm}}."
  consumes:
    - type: http
      namespace: compute-router
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: routers
          path: "/projects/{{project_id}}/regions/{{region}}/routers/{{router_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: router_name
              in: path
          operations:
            - name: get-router
              method: GET
    - 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

Retrieves the current revision, URL, and traffic configuration for a Cloud Run service.

naftiko: "0.5"
info:
  label: "GCP Cloud Run Service Info"
  description: "Retrieves the current revision, URL, and traffic configuration for a Cloud Run service."
  tags:
    - cloud
    - gcp
    - cloud-run
    - serverless
capability:
  exposes:
    - type: mcp
      namespace: cloud-run-ops
      port: 8080
      tools:
        - name: get-cloud-run-service
          description: "Given a project ID, region, and service name, return the latest revision, serving URL, and traffic split."
          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: cloud-run.get-service
          with:
            project_id: "{{project_id}}"
            region: "{{region}}"
            service_name: "{{service_name}}"
          outputParameters:
            - name: url
              type: string
              mapping: "$.status.url"
            - name: latest_revision
              type: string
              mapping: "$.status.latestReadyRevisionName"
  consumes:
    - type: http
      namespace: cloud-run
      baseUri: "https://run.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_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

Retrieves a Cloud Run service revision list, promotes a canary revision to full traffic, and notifies the deployment team via Google Chat.

naftiko: "0.5"
info:
  label: "GCP Cloud Run Traffic Split Promoter"
  description: "Retrieves a Cloud Run service revision list, promotes a canary revision to full traffic, and notifies the deployment team via Google Chat."
  tags:
    - cloud
    - gcp
    - cloud-run
    - deployment
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: cloud-run-deploy
      port: 8080
      tools:
        - name: promote-canary-revision
          description: "Given a project, region, and service, check current revisions, update traffic to 100% on the latest, and notify the team."
          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."
          steps:
            - name: get-service
              type: call
              call: cloud-run.get-service
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                service_name: "{{service_name}}"
            - name: update-traffic
              type: call
              call: cloud-run.update-traffic
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                service_name: "{{service_name}}"
                revision: "{{get-service.latestReadyRevision}}"
                percent: "100"
            - name: notify-deploy-team
              type: call
              call: google-chat.post-message
              with:
                space_name: "deployments"
                text: "Cloud Run {{service_name}} promoted revision {{get-service.latestReadyRevision}} to 100% traffic in {{region}}."
  consumes:
    - type: http
      namespace: cloud-run
      baseUri: "https://run.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_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-traffic
              method: PATCH
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Checks Cloud Scheduler job execution status, retries the job on failure, and notifies the platform team via Google Chat.

naftiko: "0.5"
info:
  label: "GCP Cloud Scheduler Job Failure Responder"
  description: "Checks Cloud Scheduler job execution status, retries the job on failure, and notifies the platform team via Google Chat."
  tags:
    - cloud
    - gcp
    - cloud-scheduler
    - google-chat
    - automation
capability:
  exposes:
    - type: mcp
      namespace: scheduler-ops
      port: 8080
      tools:
        - name: respond-to-scheduler-failure
          description: "Given a project, region, and job name, check scheduler job status, retry if failed, and notify Google Chat."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Scheduler region."
            - name: job_name
              in: body
              type: string
              description: "The Cloud Scheduler job name."
          steps:
            - name: get-job
              type: call
              call: cloud-scheduler.get-job
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_name: "{{job_name}}"
            - name: retry-job
              type: call
              call: cloud-scheduler.run-job
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_name: "{{job_name}}"
            - name: notify-platform
              type: call
              call: google-chat.post-message
              with:
                space_name: "platform-ops"
                text: "Cloud Scheduler job {{job_name}} status: {{get-job.state}}. Retry triggered. Last attempt: {{get-job.lastAttemptTime}}."
  consumes:
    - type: http
      namespace: cloud-scheduler
      baseUri: "https://cloudscheduler.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/locations/{{region}}/jobs/{{job_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: job_name
              in: path
          operations:
            - name: get-job
              method: GET
        - name: job-run
          path: "/projects/{{project_id}}/locations/{{region}}/jobs/{{job_name}}:run"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: job_name
              in: path
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Lists recent Cloud SQL automated backups, verifies the latest backup completed successfully, and posts verification status to the DBA Slack channel.

naftiko: "0.5"
info:
  label: "GCP Cloud SQL Backup Verification"
  description: "Lists recent Cloud SQL automated backups, verifies the latest backup completed successfully, and posts verification status to the DBA Slack channel."
  tags:
    - database
    - gcp
    - cloud-sql
    - slack
    - backup
capability:
  exposes:
    - type: mcp
      namespace: sql-backup-ops
      port: 8080
      tools:
        - name: verify-sql-backup
          description: "Given a project ID and Cloud SQL instance name, check the latest backup status and notify the DBA team via Slack."
          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."
          steps:
            - name: list-backups
              type: call
              call: cloud-sql.list-backups
              with:
                project_id: "{{project_id}}"
                instance_name: "{{instance_name}}"
            - name: notify-dba
              type: call
              call: slack.post-message
              with:
                channel: "dba-ops"
                text: "Cloud SQL backup verification for {{instance_name}}: latest backup status={{list-backups.latest_status}}, type={{list-backups.latest_type}}, end time={{list-backups.latest_endTime}}."
  consumes:
    - type: http
      namespace: cloud-sql
      baseUri: "https://sqladmin.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: backup-runs
          path: "/projects/{{project_id}}/instances/{{instance_name}}/backupRuns"
          inputParameters:
            - name: project_id
              in: path
            - name: instance_name
              in: path
          operations:
            - name: list-backups
              method: GET
    - 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

Retrieves the current status of a Cloud SQL instance including state, database version, and tier.

naftiko: "0.5"
info:
  label: "GCP Cloud SQL Instance Status"
  description: "Retrieves the current status of a Cloud SQL instance including state, database version, and tier."
  tags:
    - cloud
    - gcp
    - cloud-sql
    - database
capability:
  exposes:
    - type: mcp
      namespace: sql-ops
      port: 8080
      tools:
        - name: get-sql-instance-status
          description: "Given a project ID and instance name, return the Cloud SQL instance state, database version, and machine tier."
          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."
          call: cloud-sql.get-instance
          with:
            project_id: "{{project_id}}"
            instance_name: "{{instance_name}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: database_version
              type: string
              mapping: "$.databaseVersion"
            - name: tier
              type: string
              mapping: "$.settings.tier"
  consumes:
    - type: http
      namespace: cloud-sql
      baseUri: "https://sqladmin.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_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

Retrieves metadata for a Google Cloud Storage bucket including location, storage class, and versioning status.

naftiko: "0.5"
info:
  label: "GCP Cloud Storage Bucket Metadata Lookup"
  description: "Retrieves metadata for a Google Cloud Storage bucket including location, storage class, and versioning status."
  tags:
    - cloud
    - gcp
    - cloud-storage
capability:
  exposes:
    - type: mcp
      namespace: storage-ops
      port: 8080
      tools:
        - name: get-bucket-metadata
          description: "Given a GCS bucket name, return its location, storage class, versioning state, and creation timestamp."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The name of the GCS bucket."
          call: gcs.get-bucket
          with:
            bucket_name: "{{bucket_name}}"
          outputParameters:
            - name: location
              type: string
              mapping: "$.location"
            - name: storage_class
              type: string
              mapping: "$.storageClass"
            - name: versioning_enabled
              type: boolean
              mapping: "$.versioning.enabled"
  consumes:
    - type: http
      namespace: gcs
      baseUri: "https://storage.googleapis.com/storage/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: buckets
          path: "/b/{{bucket_name}}"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-bucket
              method: GET

Monitors Cloud Tasks queue depth and dispatch rate, and creates a Datadog event when queue backlog exceeds the configured threshold.

naftiko: "0.5"
info:
  label: "GCP Cloud Tasks Queue Depth Monitor"
  description: "Monitors Cloud Tasks queue depth and dispatch rate, and creates a Datadog event when queue backlog exceeds the configured threshold."
  tags:
    - cloud
    - gcp
    - cloud-tasks
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: tasks-ops
      port: 8080
      tools:
        - name: monitor-queue-depth
          description: "Given a project, region, and queue name, check queue stats and raise a Datadog event if backlog is high."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Cloud Tasks region."
            - name: queue_name
              in: body
              type: string
              description: "The Cloud Tasks queue name."
          steps:
            - name: get-queue
              type: call
              call: cloud-tasks.get-queue
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                queue_name: "{{queue_name}}"
            - name: raise-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "Cloud Tasks queue backlog: {{queue_name}}"
                text: "Queue {{queue_name}} in {{project_id}}/{{region}} state: {{get-queue.state}}, rate limit: {{get-queue.rateLimits}}."
                alert_type: "warning"
  consumes:
    - type: http
      namespace: cloud-tasks
      baseUri: "https://cloudtasks.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: queues
          path: "/projects/{{project_id}}/locations/{{region}}/queues/{{queue_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: queue_name
              in: path
          operations:
            - name: get-queue
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Retrieves the current status of a Google Compute Engine instance including zone, machine type, and running state.

naftiko: "0.5"
info:
  label: "GCP Compute Instance Status Check"
  description: "Retrieves the current status of a Google Compute Engine instance including zone, machine type, and running state."
  tags:
    - cloud
    - gcp
    - compute-engine
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: compute-ops
      port: 8080
      tools:
        - name: check-instance-status
          description: "Given a project ID, zone, and instance name, return the current running state and machine type of a GCE instance."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone
              in: body
              type: string
              description: "The zone of the instance, e.g. us-central1-a."
            - name: instance_name
              in: body
              type: string
              description: "The name of the compute instance."
          call: compute.get-instance
          with:
            project_id: "{{project_id}}"
            zone: "{{zone}}"
            instance_name: "{{instance_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: machine_type
              type: string
              mapping: "$.machineType"
  consumes:
    - type: http
      namespace: compute
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/zones/{{zone}}/instances/{{instance_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: instance_name
              in: path
          operations:
            - name: get-instance
              method: GET

Retrieves vulnerability scan results from Artifact Registry for a container image and creates a Jira security task for critical findings.

naftiko: "0.5"
info:
  label: "GCP Container Vulnerability Scanner"
  description: "Retrieves vulnerability scan results from Artifact Registry for a container image and creates a Jira security task for critical findings."
  tags:
    - security
    - gcp
    - artifact-registry
    - containers
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-scanning
      port: 8080
      tools:
        - name: scan-container-vulnerabilities
          description: "Given a project, location, repository, and image, retrieve vulnerability occurrences and create a Jira task for critical ones."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: resource_uri
              in: body
              type: string
              description: "The container image resource URI."
          steps:
            - name: list-vulnerabilities
              type: call
              call: container-analysis.list-occurrences
              with:
                project_id: "{{project_id}}"
                resource_uri: "{{resource_uri}}"
            - name: create-security-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Container vulnerabilities in {{resource_uri}}"
                description: "Project: {{project_id}}\nImage: {{resource_uri}}\nVulnerability count: {{list-vulnerabilities.occurrence_count}}"
  consumes:
    - type: http
      namespace: container-analysis
      baseUri: "https://containeranalysis.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: occurrences
          path: "/projects/{{project_id}}/occurrences"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: list-occurrences
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Monitors a Dataflow job for failures, posts an alert to Slack, and creates a Jira data engineering ticket for investigation.

naftiko: "0.5"
info:
  label: "GCP Dataflow Job Failure Handler"
  description: "Monitors a Dataflow job for failures, posts an alert to Slack, and creates a Jira data engineering ticket for investigation."
  tags:
    - data-engineering
    - gcp
    - dataflow
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: dataflow-ops
      port: 8080
      tools:
        - name: handle-dataflow-failure
          description: "Given a project ID, region, and job ID, check the Dataflow job status and on failure notify Slack and open a Jira ticket."
          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 ID."
          steps:
            - name: get-job
              type: call
              call: dataflow.get-job
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                job_id: "{{job_id}}"
            - name: alert-slack
              type: call
              call: slack.post-message
              with:
                channel: "data-eng-alerts"
                text: "Dataflow job {{job_id}} in {{project_id}}/{{region}} status: {{get-job.currentState}}."
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                summary: "Dataflow job failure: {{job_id}}"
                description: "Project: {{project_id}}\nRegion: {{region}}\nState: {{get-job.currentState}}\nName: {{get-job.name}}"
  consumes:
    - type: http
      namespace: dataflow
      baseUri: "https://dataflow.googleapis.com/v1b3"
      authentication:
        type: bearer
        token: "$secrets.gcp_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
    - 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
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Monitors Filestore instance capacity usage and creates a PagerDuty incident when storage nears the provisioned limit.

naftiko: "0.5"
info:
  label: "GCP Filestore Capacity Alert"
  description: "Monitors Filestore instance capacity usage and creates a PagerDuty incident when storage nears the provisioned limit."
  tags:
    - cloud
    - gcp
    - filestore
    - pagerduty
    - storage
capability:
  exposes:
    - type: mcp
      namespace: filestore-ops
      port: 8080
      tools:
        - name: alert-filestore-capacity
          description: "Given a project, zone, and Filestore instance, check storage capacity and page on-call if nearing limits."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone
              in: body
              type: string
              description: "The Filestore zone."
            - name: instance_name
              in: body
              type: string
              description: "The Filestore instance name."
          steps:
            - name: get-instance
              type: call
              call: filestore.get-instance
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                instance_name: "{{instance_name}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "filestore-service"
                title: "Filestore {{instance_name}} capacity alert"
                details: "Zone: {{zone}}, Tier: {{get-instance.tier}}, Capacity: {{get-instance.fileShares_capacityGb}}GB, State: {{get-instance.state}}"
  consumes:
    - type: http
      namespace: filestore
      baseUri: "https://file.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/locations/{{zone}}/instances/{{instance_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: instance_name
              in: path
          operations:
            - name: get-instance
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves metadata for a Google Kubernetes Engine cluster including version, node count, and endpoint.

naftiko: "0.5"
info:
  label: "GCP GKE Cluster Info"
  description: "Retrieves metadata for a Google Kubernetes Engine cluster including version, node count, and endpoint."
  tags:
    - cloud
    - gcp
    - gke
    - kubernetes
capability:
  exposes:
    - type: mcp
      namespace: gke-ops
      port: 8080
      tools:
        - name: get-cluster-info
          description: "Given a project ID, zone, and cluster name, return the GKE cluster version, node count, and master endpoint."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: zone
              in: body
              type: string
              description: "The zone of the GKE cluster."
            - name: cluster_name
              in: body
              type: string
              description: "The GKE cluster name."
          call: gke.get-cluster
          with:
            project_id: "{{project_id}}"
            zone: "{{zone}}"
            cluster_name: "{{cluster_name}}"
          outputParameters:
            - name: master_version
              type: string
              mapping: "$.currentMasterVersion"
            - name: node_count
              type: number
              mapping: "$.currentNodeCount"
            - name: endpoint
              type: string
              mapping: "$.endpoint"
  consumes:
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: clusters
          path: "/projects/{{project_id}}/zones/{{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

Monitors GKE node pool autoscaling events, captures current node count, and posts a scaling summary to the platform Slack channel.

naftiko: "0.5"
info:
  label: "GCP GKE Node Pool Scaling Reporter"
  description: "Monitors GKE node pool autoscaling events, captures current node count, and posts a scaling summary to the platform Slack channel."
  tags:
    - cloud
    - gcp
    - gke
    - kubernetes
    - slack
    - autoscaling
capability:
  exposes:
    - type: mcp
      namespace: gke-scaling
      port: 8080
      tools:
        - name: report-node-pool-scaling
          description: "Given a project, zone, cluster, and node pool, retrieve current size and post scaling status to Slack."
          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: node_pool
              in: body
              type: string
              description: "The node pool name."
          steps:
            - name: get-node-pool
              type: call
              call: gke.get-node-pool
              with:
                project_id: "{{project_id}}"
                zone: "{{zone}}"
                cluster_name: "{{cluster_name}}"
                node_pool: "{{node_pool}}"
            - name: notify-slack
              type: call
              call: slack.post-message
              with:
                channel: "platform-ops"
                text: "GKE node pool {{node_pool}} in {{cluster_name}}: {{get-node-pool.initialNodeCount}} initial, autoscaling {{get-node-pool.autoscaling_enabled}}."
  consumes:
    - type: http
      namespace: gke
      baseUri: "https://container.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: node-pools
          path: "/projects/{{project_id}}/zones/{{zone}}/clusters/{{cluster_name}}/nodePools/{{node_pool}}"
          inputParameters:
            - name: project_id
              in: path
            - name: zone
              in: path
            - name: cluster_name
              in: path
            - name: node_pool
              in: path
          operations:
            - name: get-node-pool
              method: GET
    - 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

Compares current GCP IAM bindings against approved policy baseline and creates a Jira security task for any unauthorized role assignments detected.

naftiko: "0.5"
info:
  label: "GCP IAM Policy Drift Detection"
  description: "Compares current GCP IAM bindings against approved policy baseline and creates a Jira security task for any unauthorized role assignments detected."
  tags:
    - security
    - cloud
    - gcp
    - jira
    - iam
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: iam-governance
      port: 8080
      tools:
        - name: detect-iam-policy-drift
          description: "Given a GCP project ID, retrieve current IAM policy bindings and create a Jira security task listing any bindings that deviate from the approved baseline."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID to audit IAM policy for."
          steps:
            - name: get-iam-policy
              type: call
              call: gcp-iam.get-policy
              with:
                project_id: "{{project_id}}"
            - name: create-drift-task
              type: call
              call: jira.create-iam-task
              with:
                project_key: "SEC"
                summary: "IAM policy drift detected in {{project_id}}"
                description: "Bindings count: {{get-iam-policy.bindings_count}}\nProject: {{project_id}}"
  consumes:
    - type: http
      namespace: gcp-iam
      baseUri: "https://cloudresourcemanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: iam-policy
          path: "/projects/{{project_id}}:getIamPolicy"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-policy
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-iam-task
              method: POST

Detects GCP cost anomalies via Datadog, creates a Jira cost optimization task, and notifies the FinOps team in Google Chat.

naftiko: "0.5"
info:
  label: "GCP Infrastructure Cost Anomaly Responder"
  description: "Detects GCP cost anomalies via Datadog, creates a Jira cost optimization task, and notifies the FinOps team in Google Chat."
  tags:
    - cloud
    - gcp
    - observability
    - datadog
    - jira
    - google-chat
    - finops
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: respond-to-gcp-cost-anomaly
          description: "Given a Datadog monitor ID detecting a GCP cost spike, retrieve monitor details, create a Jira cost optimization task, and notify the FinOps Google Chat space."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that detected the GCP cost anomaly."
            - name: gcp_project
              in: body
              type: string
              description: "The GCP project ID with the cost anomaly."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-task
              type: call
              call: jira.create-cost-task
              with:
                project_key: "FINOPS"
                summary: "GCP cost anomaly: {{gcp_project}} — {{get-monitor.name}}"
                description: "Monitor: {{get-monitor.name}}\nGCP Project: {{gcp_project}}"
            - name: notify-finops
              type: call
              call: google-chat.post-finops-alert
              with:
                space_name: "finops-alerts"
                text: "GCP cost anomaly in {{gcp_project}}: {{get-monitor.name}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-cost-task
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-finops-alert
              method: POST

Retrieves backend health status for a GCP HTTP(S) load balancer and creates a PagerDuty incident for any unhealthy backends.

naftiko: "0.5"
info:
  label: "GCP Load Balancer Health Check Reporter"
  description: "Retrieves backend health status for a GCP HTTP(S) load balancer and creates a PagerDuty incident for any unhealthy backends."
  tags:
    - cloud
    - gcp
    - load-balancing
    - pagerduty
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: lb-health
      port: 8080
      tools:
        - name: report-lb-health
          description: "Given a project ID and backend service name, check backend health and page on-call if backends are unhealthy."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: backend_service
              in: body
              type: string
              description: "The backend service resource name."
          steps:
            - name: get-health
              type: call
              call: compute-backend.get-health
              with:
                project_id: "{{project_id}}"
                backend_service: "{{backend_service}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "lb-health-service"
                title: "Unhealthy backends in {{backend_service}}"
                details: "Project: {{project_id}}, Health status: {{get-health.healthStatus}}"
  consumes:
    - type: http
      namespace: compute-backend
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: backend-services
          path: "/projects/{{project_id}}/global/backendServices/{{backend_service}}/getHealth"
          inputParameters:
            - name: project_id
              in: path
            - name: backend_service
              in: path
          operations:
            - name: get-health
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Checks Memorystore Redis instance health metrics including memory usage and connection count, and pages on-call via PagerDuty if thresholds are breached.

naftiko: "0.5"
info:
  label: "GCP Memorystore Redis Health Check"
  description: "Checks Memorystore Redis instance health metrics including memory usage and connection count, and pages on-call via PagerDuty if thresholds are breached."
  tags:
    - cloud
    - gcp
    - memorystore
    - redis
    - pagerduty
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: redis-ops
      port: 8080
      tools:
        - name: check-redis-health
          description: "Given a project, region, and Redis instance name, check health metrics and page on-call if memory usage is critical."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: region
              in: body
              type: string
              description: "The Memorystore region."
            - name: instance_name
              in: body
              type: string
              description: "The Redis instance name."
          steps:
            - name: get-redis-instance
              type: call
              call: memorystore.get-instance
              with:
                project_id: "{{project_id}}"
                region: "{{region}}"
                instance_name: "{{instance_name}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "redis-service"
                title: "Redis instance {{instance_name}} health alert"
                details: "Region: {{region}}, Memory: {{get-redis-instance.memorySizeGb}}GB, State: {{get-redis-instance.state}}, Tier: {{get-redis-instance.tier}}"
  consumes:
    - type: http
      namespace: memorystore
      baseUri: "https://redis.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: instances
          path: "/projects/{{project_id}}/locations/{{region}}/instances/{{instance_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: region
              in: path
            - name: instance_name
              in: path
          operations:
            - name: get-instance
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Runs a Network Intelligence Center connectivity test between two endpoints and creates a Jira networking task if reachability fails.

naftiko: "0.5"
info:
  label: "GCP Network Intelligence Connectivity Test"
  description: "Runs a Network Intelligence Center connectivity test between two endpoints and creates a Jira networking task if reachability fails."
  tags:
    - cloud
    - gcp
    - networking
    - jira
    - diagnostics
capability:
  exposes:
    - type: mcp
      namespace: network-diag
      port: 8080
      tools:
        - name: run-connectivity-test
          description: "Given a project and test ID, execute a connectivity test and create a Jira task if the result is unreachable."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: test_id
              in: body
              type: string
              description: "The connectivity test resource ID."
          steps:
            - name: get-test-result
              type: call
              call: network-intelligence.get-test
              with:
                project_id: "{{project_id}}"
                test_id: "{{test_id}}"
            - name: rerun-test
              type: call
              call: network-intelligence.rerun-test
              with:
                project_id: "{{project_id}}"
                test_id: "{{test_id}}"
            - name: create-network-task
              type: call
              call: jira.create-issue
              with:
                project_key: "NET"
                summary: "Connectivity test failed: {{test_id}}"
                description: "Project: {{project_id}}\nTest: {{test_id}}\nResult: {{get-test-result.reachabilityDetails}}\nVerdict: {{get-test-result.result}}"
  consumes:
    - type: http
      namespace: network-intelligence
      baseUri: "https://networkmanagement.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: connectivity-tests
          path: "/projects/{{project_id}}/locations/global/connectivityTests/{{test_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: test_id
              in: path
          operations:
            - name: get-test
              method: GET
        - name: rerun
          path: "/projects/{{project_id}}/locations/global/connectivityTests/{{test_id}}:rerun"
          inputParameters:
            - name: project_id
              in: path
            - name: test_id
              in: path
          operations:
            - name: rerun-test
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves metadata for a Google Cloud Pub/Sub topic including message retention and schema settings.

naftiko: "0.5"
info:
  label: "GCP Pub/Sub Topic Info"
  description: "Retrieves metadata for a Google Cloud Pub/Sub topic including message retention and schema settings."
  tags:
    - cloud
    - gcp
    - pubsub
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: pubsub-ops
      port: 8080
      tools:
        - name: get-topic-info
          description: "Given a project ID and topic name, return the topic configuration including retention duration."
          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."
          call: pubsub.get-topic
          with:
            project_id: "{{project_id}}"
            topic_name: "{{topic_name}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: message_retention
              type: string
              mapping: "$.messageRetentionDuration"
  consumes:
    - type: http
      namespace: pubsub
      baseUri: "https://pubsub.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: topics
          path: "/projects/{{project_id}}/topics/{{topic_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: topic_name
              in: path
          operations:
            - name: get-topic
              method: GET

Retrieves the latest version metadata of a secret stored in Google Cloud Secret Manager.

naftiko: "0.5"
info:
  label: "GCP Secret Manager Version Lookup"
  description: "Retrieves the latest version metadata of a secret stored in Google Cloud Secret Manager."
  tags:
    - security
    - gcp
    - secret-manager
capability:
  exposes:
    - type: mcp
      namespace: secrets-ops
      port: 8080
      tools:
        - name: get-secret-version
          description: "Given a project ID and secret name, return the latest version number and create time."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: secret_name
              in: body
              type: string
              description: "The name of the secret."
          call: secret-manager.get-latest-version
          with:
            project_id: "{{project_id}}"
            secret_name: "{{secret_name}}"
          outputParameters:
            - name: version
              type: string
              mapping: "$.name"
            - name: create_time
              type: string
              mapping: "$.createTime"
            - name: state
              type: string
              mapping: "$.state"
  consumes:
    - type: http
      namespace: secret-manager
      baseUri: "https://secretmanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: secret-versions
          path: "/projects/{{project_id}}/secrets/{{secret_name}}/versions/latest"
          inputParameters:
            - name: project_id
              in: path
            - name: secret_name
              in: path
          operations:
            - name: get-latest-version
              method: GET

Retrieves active findings from Security Command Center, sets their state to inactive after review, and creates a Jira security remediation task.

naftiko: "0.5"
info:
  label: "GCP Security Command Center Finding Handler"
  description: "Retrieves active findings from Security Command Center, sets their state to inactive after review, and creates a Jira security remediation task."
  tags:
    - security
    - gcp
    - security-command-center
    - jira
capability:
  exposes:
    - type: mcp
      namespace: scc-ops
      port: 8080
      tools:
        - name: handle-scc-finding
          description: "Given an organization ID and finding name, retrieve details, update state, and create a Jira remediation task."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The Google Cloud organization ID."
            - name: finding_name
              in: body
              type: string
              description: "The full resource name of the SCC finding."
          steps:
            - name: get-finding
              type: call
              call: scc.get-finding
              with:
                finding_name: "{{finding_name}}"
            - name: update-state
              type: call
              call: scc.set-finding-state
              with:
                finding_name: "{{finding_name}}"
                state: "INACTIVE"
            - name: create-remediation-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "SCC finding: {{get-finding.category}}"
                description: "Finding: {{finding_name}}\nCategory: {{get-finding.category}}\nSeverity: {{get-finding.severity}}\nResource: {{get-finding.resourceName}}"
  consumes:
    - type: http
      namespace: scc
      baseUri: "https://securitycenter.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: findings
          path: "/{{finding_name}}"
          inputParameters:
            - name: finding_name
              in: path
          operations:
            - name: get-finding
              method: GET
        - name: finding-state
          path: "/{{finding_name}}:setState"
          inputParameters:
            - name: finding_name
              in: path
          operations:
            - name: set-finding-state
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Lists service account keys, identifies keys older than the rotation policy, deletes expired keys, and creates a Jira compliance task.

naftiko: "0.5"
info:
  label: "GCP Service Account Key Rotation Enforcer"
  description: "Lists service account keys, identifies keys older than the rotation policy, deletes expired keys, and creates a Jira compliance task."
  tags:
    - security
    - gcp
    - iam
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sa-key-ops
      port: 8080
      tools:
        - name: enforce-key-rotation
          description: "Given a project ID and service account email, list keys, delete expired ones, and create a Jira task for audit trail."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: service_account_email
              in: body
              type: string
              description: "The service account email address."
          steps:
            - name: list-keys
              type: call
              call: iam.list-service-account-keys
              with:
                project_id: "{{project_id}}"
                service_account_email: "{{service_account_email}}"
            - name: delete-expired-key
              type: call
              call: iam.delete-service-account-key
              with:
                project_id: "{{project_id}}"
                service_account_email: "{{service_account_email}}"
                key_id: "{{list-keys.oldest_key_id}}"
            - name: create-audit-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "SA key rotation: {{service_account_email}}"
                description: "Project: {{project_id}}\nService account: {{service_account_email}}\nKeys rotated: {{list-keys.expired_count}}\nRemaining keys: {{list-keys.active_count}}"
  consumes:
    - type: http
      namespace: iam
      baseUri: "https://iam.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: service-account-keys
          path: "/projects/{{project_id}}/serviceAccounts/{{service_account_email}}/keys"
          inputParameters:
            - name: project_id
              in: path
            - name: service_account_email
              in: path
          operations:
            - name: list-service-account-keys
              method: GET
        - name: service-account-key
          path: "/projects/{{project_id}}/serviceAccounts/{{service_account_email}}/keys/{{key_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: service_account_email
              in: path
            - name: key_id
              in: path
          operations:
            - name: delete-service-account-key
              method: DELETE
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks Cloud Spanner instance CPU utilization and node count, and creates a PagerDuty incident if utilization exceeds threshold.

naftiko: "0.5"
info:
  label: "GCP Spanner Instance Health Monitor"
  description: "Checks Cloud Spanner instance CPU utilization and node count, and creates a PagerDuty incident if utilization exceeds threshold."
  tags:
    - database
    - gcp
    - cloud-spanner
    - pagerduty
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: spanner-ops
      port: 8080
      tools:
        - name: monitor-spanner-health
          description: "Given a project ID and Spanner instance ID, check node count and CPU utilization, and page on-call if critical."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: instance_id
              in: body
              type: string
              description: "The Cloud Spanner instance ID."
          steps:
            - name: get-instance
              type: call
              call: spanner.get-instance
              with:
                project_id: "{{project_id}}"
                instance_id: "{{instance_id}}"
            - name: create-pd-incident
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "spanner-service"
                title: "Spanner instance {{instance_id}} high utilization"
                details: "Project: {{project_id}}, Nodes: {{get-instance.nodeCount}}, State: {{get-instance.state}}"
  consumes:
    - type: http
      namespace: spanner
      baseUri: "https://spanner.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Lists all VPC firewall rules for a project, flags overly permissive rules allowing 0.0.0.0/0, and creates a Jira compliance task.

naftiko: "0.5"
info:
  label: "GCP VPC Firewall Rule Audit"
  description: "Lists all VPC firewall rules for a project, flags overly permissive rules allowing 0.0.0.0/0, and creates a Jira compliance task."
  tags:
    - security
    - gcp
    - networking
    - firewall
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: audit-firewall-rules
          description: "Given a GCP project ID, list all firewall rules, identify overly permissive entries, and open a Jira compliance task."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID to audit firewall rules for."
          steps:
            - name: list-firewalls
              type: call
              call: compute-firewall.list-rules
              with:
                project_id: "{{project_id}}"
            - name: create-compliance-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Firewall rule audit for project {{project_id}}"
                description: "Total rules: {{list-firewalls.rule_count}}. Review for 0.0.0.0/0 source ranges."
  consumes:
    - type: http
      namespace: compute-firewall
      baseUri: "https://compute.googleapis.com/compute/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: firewalls
          path: "/projects/{{project_id}}/global/firewalls"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: list-rules
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

On a GitHub Actions workflow failure on a main branch, creates a Jira bug, fires a Datadog event marker, and posts a failure summary to the engineering Google Chat space.

naftiko: "0.5"
info:
  label: "GitHub Actions CI/CD Failure Response"
  description: "On a GitHub Actions workflow failure on a main branch, creates a Jira bug, fires a Datadog event marker, and posts a failure summary to the engineering Google Chat space."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions run ID, repo, and branch, create a Jira bug, post a Datadog event, and send a failure summary to the Google Chat engineering space."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID that failed."
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. google/platform."
            - name: branch
              in: body
              type: string
              description: "The branch on which the failure occurred."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Run ID: {{run_id}}"
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "CI Failure: {{workflow_name}} on {{branch}}"
                text: "Run {{run_id}} failed. Jira: {{create-bug.key}}"
                alert_type: "error"
            - name: notify-engineering
              type: call
              call: google-chat.send-alert
              with:
                space_name: "engineering-alerts"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{run_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: send-alert
              method: POST

Retrieves GitHub Advanced Security code scanning alerts for critical findings and creates Jira security issues for the application security team.

naftiko: "0.5"
info:
  label: "GitHub Code Security Alert Sync to Jira"
  description: "Retrieves GitHub Advanced Security code scanning alerts for critical findings and creates Jira security issues for the application security team."
  tags:
    - security
    - devops
    - github
    - jira
    - code-scanning
capability:
  exposes:
    - type: mcp
      namespace: appsec-ops
      port: 8080
      tools:
        - name: sync-security-alerts-to-jira
          description: "Given a GitHub repository and severity filter, fetch open code scanning alerts and create Jira security issues for each finding at or above the specified severity."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. google/platform."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to import: critical, high, or medium."
          steps:
            - name: get-alerts
              type: call
              call: github.list-code-scanning-alerts
              with:
                repo: "{{repo}}"
                severity: "{{severity_filter}}"
            - name: create-security-issue
              type: call
              call: jira.create-security-issue
              with:
                project_key: "APPSEC"
                summary: "Code scanning alerts in {{repo}}: {{get-alerts.total}} {{severity_filter}}+ findings"
                description: "Top finding rule: {{get-alerts.top_rule}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: list-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-security-issue
              method: POST

Audits Google GitHub repositories for required security settings and files a Jira compliance task for any policy violations found.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Policy Audit"
  description: "Audits Google GitHub repositories for required security settings and files a Jira compliance task for any policy violations found."
  tags:
    - security
    - devops
    - github
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: repo-governance
      port: 8080
      tools:
        - name: enforce-repo-security-policy
          description: "Given a GitHub repository and default branch, check branch protection and secret scanning settings; if non-compliant, create a Jira security task."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. google/platform."
            - name: default_branch
              in: body
              type: string
              description: "The default branch to check, e.g. main."
          steps:
            - name: check-protection
              type: call
              call: github.get-branch-protection
              with:
                repo: "{{repo}}"
                branch: "{{default_branch}}"
            - name: create-compliance-task
              type: call
              call: jira.create-security-task
              with:
                project_key: "SEC"
                summary: "Repo policy violation: {{repo}}"
                description: "Branch {{default_branch}} missing required protection rules."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/{{branch}}/protection"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch-protection
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-security-task
              method: POST

Retrieves Google Ads campaign budget pacing data and alerts the marketing team via Google Chat when spend is ahead or behind schedule.

naftiko: "0.5"
info:
  label: "Google Ads Budget Pacing Alert"
  description: "Retrieves Google Ads campaign budget pacing data and alerts the marketing team via Google Chat when spend is ahead or behind schedule."
  tags:
    - advertising
    - google-ads
    - google-chat
    - finops
capability:
  exposes:
    - type: mcp
      namespace: ads-pacing
      port: 8080
      tools:
        - name: alert-budget-pacing
          description: "Given a customer ID and campaign ID, check budget pacing and post an alert to the marketing Google Chat space."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - name: campaign_id
              in: body
              type: string
              description: "The campaign ID to check pacing for."
          steps:
            - name: get-campaign-budget
              type: call
              call: google-ads.get-campaign
              with:
                customer_id: "{{customer_id}}"
                campaign_id: "{{campaign_id}}"
            - name: alert-marketing
              type: call
              call: google-chat.post-message
              with:
                space_name: "marketing-ads"
                text: "Budget pacing alert for campaign {{campaign_id}}: status={{get-campaign-budget.status}}, serving={{get-campaign-budget.servingStatus}}, budget={{get-campaign-budget.budgetAmountMicros}} micros."
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v15"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: campaigns
          path: "/customers/{{customer_id}}/campaigns/{{campaign_id}}"
          inputParameters:
            - name: customer_id
              in: path
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the current status and budget details of a Google Ads campaign.

naftiko: "0.5"
info:
  label: "Google Ads Campaign Status Check"
  description: "Retrieves the current status and budget details of a Google Ads campaign."
  tags:
    - advertising
    - google-ads
capability:
  exposes:
    - type: mcp
      namespace: ads-ops
      port: 8080
      tools:
        - name: check-campaign-status
          description: "Given a customer ID and campaign ID, return the campaign status, budget amount, and serving status."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - name: campaign_id
              in: body
              type: string
              description: "The campaign resource ID."
          call: google-ads.get-campaign
          with:
            customer_id: "{{customer_id}}"
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: serving_status
              type: string
              mapping: "$.servingStatus"
            - name: budget_micros
              type: string
              mapping: "$.campaignBudget.amountMicros"
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v15"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: campaigns
          path: "/customers/{{customer_id}}/campaigns/{{campaign_id}}"
          inputParameters:
            - name: customer_id
              in: path
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET

Pulls Google Ads conversion metrics, detects anomalies against historical baselines, and posts a summary to the marketing Slack channel.

naftiko: "0.5"
info:
  label: "Google Ads Conversion Anomaly Reporter"
  description: "Pulls Google Ads conversion metrics, detects anomalies against historical baselines, and posts a summary to the marketing Slack channel."
  tags:
    - advertising
    - google-ads
    - slack
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: ads-analytics
      port: 8080
      tools:
        - name: report-conversion-anomalies
          description: "Given a customer ID and date range, fetch conversion data from Google Ads and post anomaly findings to Slack."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Ads customer ID."
            - 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."
          steps:
            - name: get-conversions
              type: call
              call: google-ads.query-report
              with:
                customer_id: "{{customer_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-anomaly-report
              type: call
              call: slack.post-message
              with:
                channel: "marketing-ads"
                text: "Google Ads conversion anomaly ({{start_date}} to {{end_date}}): {{get-conversions.total_conversions}} conversions, {{get-conversions.conversion_rate}} rate for customer {{customer_id}}."
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v15"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: search-stream
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: query-report
              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

Pulls keyword performance data from Google Ads and appends the results to a Google Sheets spreadsheet for the marketing team.

naftiko: "0.5"
info:
  label: "Google Ads Keyword Performance to Sheets"
  description: "Pulls keyword performance data from Google Ads and appends the results to a Google Sheets spreadsheet for the marketing team."
  tags:
    - advertising
    - google-ads
    - google-sheets
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: ads-reporting
      port: 8080
      tools:
        - name: export-keyword-performance
          description: "Given a Google Ads customer ID and a Sheets spreadsheet ID, pull keyword metrics and append rows to the spreadsheet."
          inputParameters:
            - 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."
          steps:
            - name: get-keyword-data
              type: call
              call: google-ads.query-report
              with:
                customer_id: "{{customer_id}}"
                query: "SELECT keyword.text, metrics.clicks, metrics.impressions, metrics.cost_micros FROM keyword_view"
            - name: append-to-sheet
              type: call
              call: google-sheets.append-values
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "KeywordReport!A1"
                values: "{{get-keyword-data.results}}"
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v15"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: search-stream
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: query-report
              method: POST
    - type: http
      namespace: google-sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_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

Pulls weekly traffic metrics from Google Analytics Data API and posts a summary to the marketing Google Chat space.

naftiko: "0.5"
info:
  label: "Google Analytics Weekly Traffic Digest"
  description: "Pulls weekly traffic metrics from Google Analytics Data API and posts a summary to the marketing Google Chat space."
  tags:
    - analytics
    - google-analytics
    - google-chat
    - marketing
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: ga-reporting
      port: 8080
      tools:
        - name: digest-weekly-traffic
          description: "Given a GA4 property ID and date range, retrieve session and user metrics and post a summary to Google Chat."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA4 property ID."
            - 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."
          steps:
            - name: run-report
              type: call
              call: analytics-data.run-report
              with:
                property_id: "{{property_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: google-chat.post-message
              with:
                space_name: "marketing-analytics"
                text: "GA4 weekly traffic ({{start_date}} to {{end_date}}): {{run-report.sessions}} sessions, {{run-report.activeUsers}} active users, {{run-report.bounceRate}} bounce rate."
  consumes:
    - type: http
      namespace: analytics-data
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Checks free/busy availability for a Google Calendar user within a given time range.

naftiko: "0.5"
info:
  label: "Google Calendar Free/Busy Check"
  description: "Checks free/busy availability for a Google Calendar user within a given time range."
  tags:
    - productivity
    - google-workspace
    - google-calendar
capability:
  exposes:
    - type: mcp
      namespace: calendar-util
      port: 8080
      tools:
        - name: check-freebusy
          description: "Given a user email and time range, return their free/busy intervals from Google Calendar."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The calendar user email to check availability for."
            - name: time_min
              in: body
              type: string
              description: "Start of the query window in RFC3339 format."
            - name: time_max
              in: body
              type: string
              description: "End of the query window in RFC3339 format."
          call: google-calendar.freebusy-query
          with:
            user_email: "{{user_email}}"
            time_min: "{{time_min}}"
            time_max: "{{time_max}}"
          outputParameters:
            - name: busy_intervals
              type: string
              mapping: "$.calendars['{{user_email}}'].busy"
  consumes:
    - type: http
      namespace: google-calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: freebusy
          path: "/freeBusy"
          operations:
            - name: freebusy-query
              method: POST

Scans Google Drive files for external sharing permissions, compiles a report, and creates a Jira compliance task for the security team.

naftiko: "0.5"
info:
  label: "Google Drive External Sharing Audit"
  description: "Scans Google Drive files for external sharing permissions, compiles a report, and creates a Jira compliance task for the security team."
  tags:
    - security
    - google-workspace
    - google-drive
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: drive-compliance
      port: 8080
      tools:
        - name: audit-external-sharing
          description: "Given a shared drive ID, list all files with external sharing and create a Jira task with the audit results."
          inputParameters:
            - name: drive_id
              in: body
              type: string
              description: "The shared drive ID to audit."
          steps:
            - name: list-shared-files
              type: call
              call: google-drive.list-files
              with:
                drive_id: "{{drive_id}}"
                q: "visibility='anyoneWithLink' or visibility='anyoneCanFind'"
            - name: create-audit-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "External sharing audit for drive {{drive_id}}"
                description: "Found {{list-shared-files.file_count}} externally shared files in drive {{drive_id}}. Review and remediate."
  consumes:
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: list-files
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves file metadata from Google Drive including name, owner, and sharing permissions.

naftiko: "0.5"
info:
  label: "Google Drive File Metadata Lookup"
  description: "Retrieves file metadata from Google Drive including name, owner, and sharing permissions."
  tags:
    - productivity
    - google-workspace
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: drive-util
      port: 8080
      tools:
        - name: get-file-metadata
          description: "Given a Google Drive file ID, return the file name, owner email, and sharing visibility."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file ID."
          call: google-drive.get-file
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: owner_email
              type: string
              mapping: "$.owners[0].emailAddress"
            - name: shared
              type: boolean
              mapping: "$.shared"
  consumes:
    - type: http
      namespace: google-drive
      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

Retrieves metadata for a Gmail label including message count and thread count.

naftiko: "0.5"
info:
  label: "Google Gmail Label Info"
  description: "Retrieves metadata for a Gmail label including message count and thread count."
  tags:
    - productivity
    - google-workspace
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: gmail-util
      port: 8080
      tools:
        - name: get-label-info
          description: "Given a user email and label ID, return the label name, message count, and unread count."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The Gmail user email, or 'me' for the authenticated user."
            - name: label_id
              in: body
              type: string
              description: "The Gmail label ID."
          call: gmail.get-label
          with:
            user_email: "{{user_email}}"
            label_id: "{{label_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: messages_total
              type: number
              mapping: "$.messagesTotal"
            - name: messages_unread
              type: number
              mapping: "$.messagesUnread"
  consumes:
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_gmail_token"
      resources:
        - name: labels
          path: "/users/{{user_email}}/labels/{{label_id}}"
          inputParameters:
            - name: user_email
              in: path
            - name: label_id
              in: path
          operations:
            - name: get-label
              method: GET

Calculates travel distances and ETAs for fleet vehicles using the Google Maps Distance Matrix API and posts a summary to the logistics Slack channel.

naftiko: "0.5"
info:
  label: "Google Maps Distance Matrix Fleet Report"
  description: "Calculates travel distances and ETAs for fleet vehicles using the Google Maps Distance Matrix API and posts a summary to the logistics Slack channel."
  tags:
    - logistics
    - google-maps
    - slack
    - fleet-management
capability:
  exposes:
    - type: mcp
      namespace: fleet-ops
      port: 8080
      tools:
        - name: report-fleet-distances
          description: "Given origin and destination addresses, calculate distance and duration via Distance Matrix API and post results to Slack."
          inputParameters:
            - name: origins
              in: body
              type: string
              description: "Pipe-separated list of origin addresses."
            - name: destinations
              in: body
              type: string
              description: "Pipe-separated list of destination addresses."
          steps:
            - name: get-distances
              type: call
              call: maps-distance.get-matrix
              with:
                origins: "{{origins}}"
                destinations: "{{destinations}}"
            - name: post-report
              type: call
              call: slack.post-message
              with:
                channel: "logistics-ops"
                text: "Fleet distance report: {{get-distances.row_count}} routes calculated. Total estimated duration: {{get-distances.total_duration}}."
  consumes:
    - type: http
      namespace: maps-distance
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apikey
        key: "key"
        value: "$secrets.google_maps_api_key"
        placement: query
      resources:
        - name: distance-matrix
          path: "/distancematrix/json"
          operations:
            - name: get-matrix
              method: GET
    - 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

Converts a street address into geographic coordinates using the Google Maps Geocoding API.

naftiko: "0.5"
info:
  label: "Google Maps Geocode Address"
  description: "Converts a street address into geographic coordinates using the Google Maps Geocoding API."
  tags:
    - geolocation
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: maps-util
      port: 8080
      tools:
        - name: geocode-address
          description: "Given a street address, return latitude and longitude coordinates via Google Maps Geocoding API."
          inputParameters:
            - name: address
              in: body
              type: string
              description: "The street address to geocode."
          call: maps-geocoding.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-geocoding
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apikey
        key: "key"
        value: "$secrets.google_maps_api_key"
        placement: query
      resources:
        - name: geocode
          path: "/geocode/json"
          operations:
            - name: geocode
              method: GET

Retrieves crawl error statistics from Google Search Console, identifies problematic URLs, and creates a Jira SEO task for the web team.

naftiko: "0.5"
info:
  label: "Google Search Console Crawl Error Reporter"
  description: "Retrieves crawl error statistics from Google Search Console, identifies problematic URLs, and creates a Jira SEO task for the web team."
  tags:
    - seo
    - google-search-console
    - jira
    - web-platform
capability:
  exposes:
    - type: mcp
      namespace: seo-ops
      port: 8080
      tools:
        - name: report-crawl-errors
          description: "Given a site URL, retrieve crawl error stats from Search Console and create a Jira task for remediation."
          inputParameters:
            - name: site_url
              in: body
              type: string
              description: "The Search Console site URL property."
          steps:
            - name: get-crawl-stats
              type: call
              call: search-console.get-url-inspection
              with:
                site_url: "{{site_url}}"
            - name: create-seo-task
              type: call
              call: jira.create-issue
              with:
                project_key: "WEB"
                summary: "Crawl errors detected for {{site_url}}"
                description: "Site: {{site_url}}\nInspection result: {{get-crawl-stats.inspectionResult}}\nIndex status: {{get-crawl-stats.indexStatusResult}}"
  consumes:
    - type: http
      namespace: search-console
      baseUri: "https://searchconsole.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: url-inspection
          path: "/urlInspection/index:inspect"
          operations:
            - name: get-url-inspection
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Verifies ownership of a website property in Google Search Console using a DNS token.

naftiko: "0.5"
info:
  label: "Google Search Console Site Verification"
  description: "Verifies ownership of a website property in Google Search Console using a DNS token."
  tags:
    - seo
    - google-search-console
    - verification
capability:
  exposes:
    - type: mcp
      namespace: search-console
      port: 8080
      tools:
        - name: verify-site-ownership
          description: "Given a site URL, initiate DNS-based ownership verification in Google Search Console and return the verification status."
          inputParameters:
            - name: site_url
              in: body
              type: string
              description: "The URL of the site to verify, e.g. https://example.com."
          call: search-console.verify-site
          with:
            site_url: "{{site_url}}"
          outputParameters:
            - name: verified
              type: boolean
              mapping: "$.verified"
            - name: method
              type: string
              mapping: "$.method"
  consumes:
    - type: http
      namespace: search-console
      baseUri: "https://searchconsole.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: sites
          path: "/sites/{{site_url}}"
          inputParameters:
            - name: site_url
              in: path
          operations:
            - name: verify-site
              method: PUT

Retrieves admin alerts from Google Workspace Alert Center, acknowledges them, and creates a Jira security task for investigation.

naftiko: "0.5"
info:
  label: "Google Workspace Admin Alert Responder"
  description: "Retrieves admin alerts from Google Workspace Alert Center, acknowledges them, and creates a Jira security task for investigation."
  tags:
    - security
    - google-workspace
    - jira
    - alert-management
capability:
  exposes:
    - type: mcp
      namespace: workspace-alerts
      port: 8080
      tools:
        - name: respond-to-admin-alert
          description: "Given an alert ID, retrieve alert details from Workspace Alert Center, acknowledge it, and create a Jira task."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Google Workspace Alert Center alert ID."
          steps:
            - name: get-alert
              type: call
              call: alert-center.get-alert
              with:
                alert_id: "{{alert_id}}"
            - name: acknowledge-alert
              type: call
              call: alert-center.acknowledge-alert
              with:
                alert_id: "{{alert_id}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Workspace alert: {{get-alert.type}} - {{get-alert.source}}"
                description: "Alert ID: {{alert_id}}\nType: {{get-alert.type}}\nCreate time: {{get-alert.createTime}}"
  consumes:
    - type: http
      namespace: alert-center
      baseUri: "https://alertcenter.googleapis.com/v1beta1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
            - name: acknowledge-alert
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves conference room availability from Google Calendar and posts a daily room utilization report to the facilities Google Chat space.

naftiko: "0.5"
info:
  label: "Google Workspace Calendar Room Booking Sync"
  description: "Retrieves conference room availability from Google Calendar and posts a daily room utilization report to the facilities Google Chat space."
  tags:
    - productivity
    - google-workspace
    - google-calendar
    - google-chat
    - facilities
capability:
  exposes:
    - type: mcp
      namespace: facilities-ops
      port: 8080
      tools:
        - name: sync-room-utilization
          description: "Given a building ID and date, check all room calendars for bookings and post a utilization summary to Google Chat."
          inputParameters:
            - name: building_id
              in: body
              type: string
              description: "The building resource identifier."
            - name: date
              in: body
              type: string
              description: "The date to check utilization for in YYYY-MM-DD format."
          steps:
            - name: list-room-calendars
              type: call
              call: admin-directory.list-resources
              with:
                building_id: "{{building_id}}"
            - name: get-room-events
              type: call
              call: google-calendar.list-events
              with:
                calendar_id: "{{list-room-calendars.primary_room_id}}"
                date: "{{date}}"
            - name: post-utilization
              type: call
              call: google-chat.post-message
              with:
                space_name: "facilities"
                text: "Room utilization for building {{building_id}} on {{date}}: {{get-room-events.event_count}} bookings across {{list-room-calendars.room_count}} rooms."
  consumes:
    - type: http
      namespace: admin-directory
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: calendar-resources
          path: "/customer/my_customer/resources/calendars"
          operations:
            - name: list-resources
              method: GET
    - type: http
      namespace: google-calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: events
          path: "/calendars/{{calendar_id}}/events"
          inputParameters:
            - name: calendar_id
              in: path
          operations:
            - name: list-events
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves Chrome browser enrollment and policy compliance data for managed devices and posts an audit summary to the IT Slack channel.

naftiko: "0.5"
info:
  label: "Google Workspace Chrome Browser Policy Audit"
  description: "Retrieves Chrome browser enrollment and policy compliance data for managed devices and posts an audit summary to the IT Slack channel."
  tags:
    - security
    - chrome
    - google-workspace
    - slack
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: chrome-policy-audit
      port: 8080
      tools:
        - name: audit-chrome-policies
          description: "Given a customer ID, retrieve managed Chrome browser enrollment info and post a compliance summary to Slack."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Google Workspace customer ID."
          steps:
            - name: list-browsers
              type: call
              call: chrome-mgmt.list-browsers
              with:
                customer_id: "{{customer_id}}"
            - name: post-audit-summary
              type: call
              call: slack.post-message
              with:
                channel: "it-compliance"
                text: "Chrome browser policy audit: {{list-browsers.browser_count}} managed browsers for customer {{customer_id}}. Policy compliance: {{list-browsers.compliant_count}} compliant."
  consumes:
    - type: http
      namespace: chrome-mgmt
      baseUri: "https://chromemanagement.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: browsers
          path: "/customers/{{customer_id}}/reports:countInstalledApps"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: list-browsers
              method: GET
    - 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

Retrieves DLP rule violation findings from Google Workspace, quarantines the offending content, and creates a Jira compliance incident.

naftiko: "0.5"
info:
  label: "Google Workspace DLP Policy Violation Handler"
  description: "Retrieves DLP rule violation findings from Google Workspace, quarantines the offending content, and creates a Jira compliance incident."
  tags:
    - security
    - google-workspace
    - dlp
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: dlp-ops
      port: 8080
      tools:
        - name: handle-dlp-violation
          description: "Given a DLP finding ID, retrieve violation details, quarantine the content, and create a Jira compliance incident."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID for DLP."
            - name: finding_id
              in: body
              type: string
              description: "The DLP finding resource ID."
          steps:
            - name: get-finding
              type: call
              call: dlp.get-finding
              with:
                project_id: "{{project_id}}"
                finding_id: "{{finding_id}}"
            - name: redact-content
              type: call
              call: dlp.deidentify-content
              with:
                project_id: "{{project_id}}"
                item: "{{get-finding.contentItem}}"
            - name: create-compliance-incident
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "DLP violation: {{get-finding.infoType}} detected"
                description: "Finding: {{finding_id}}\nInfo type: {{get-finding.infoType}}\nLikelihood: {{get-finding.likelihood}}"
  consumes:
    - type: http
      namespace: dlp
      baseUri: "https://dlp.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: findings
          path: "/projects/{{project_id}}/dlpJobs/{{finding_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: finding_id
              in: path
          operations:
            - name: get-finding
              method: GET
        - name: content
          path: "/projects/{{project_id}}/content:deidentify"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: deidentify-content
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves document metadata from Google Docs, checks classification labels, and posts a compliance warning to Google Chat if the document lacks required labels.

naftiko: "0.5"
info:
  label: "Google Workspace Docs Compliance Watermark"
  description: "Retrieves document metadata from Google Docs, checks classification labels, and posts a compliance warning to Google Chat if the document lacks required labels."
  tags:
    - compliance
    - google-workspace
    - google-docs
    - google-chat
    - governance
capability:
  exposes:
    - type: mcp
      namespace: docs-compliance
      port: 8080
      tools:
        - name: check-doc-compliance
          description: "Given a document ID, retrieve its metadata, verify classification labels, and alert Google Chat for unlabeled documents."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Google Docs document ID."
          steps:
            - name: get-document
              type: call
              call: google-docs.get-document
              with:
                document_id: "{{document_id}}"
            - name: get-file-labels
              type: call
              call: google-drive.get-file
              with:
                file_id: "{{document_id}}"
            - name: alert-compliance
              type: call
              call: google-chat.post-message
              with:
                space_name: "compliance"
                text: "Document compliance check: '{{get-document.title}}' (ID: {{document_id}}). Labels present: {{get-file-labels.labelInfo}}. Review required for classification."
  consumes:
    - type: http
      namespace: google-docs
      baseUri: "https://docs.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_docs_token"
      resources:
        - name: documents
          path: "/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: google-drive
      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
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves metadata for a Google Workspace shared drive including name, creation time, and storage quota.

naftiko: "0.5"
info:
  label: "Google Workspace Shared Drive Lookup"
  description: "Retrieves metadata for a Google Workspace shared drive including name, creation time, and storage quota."
  tags:
    - productivity
    - google-workspace
    - google-drive
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: shared-drives
      port: 8080
      tools:
        - name: get-shared-drive
          description: "Given a shared drive ID, return its name, creation date, and restrictions."
          inputParameters:
            - name: drive_id
              in: body
              type: string
              description: "The shared drive ID."
          call: google-drive.get-drive
          with:
            drive_id: "{{drive_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: created_time
              type: string
              mapping: "$.createdTime"
  consumes:
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: drives
          path: "/drives/{{drive_id}}"
          inputParameters:
            - name: drive_id
              in: path
          operations:
            - name: get-drive
              method: GET

Retrieves new responses from a Google Form, formats the data, and appends it to a designated Google Sheets spreadsheet for tracking.

naftiko: "0.5"
info:
  label: "Google Workspace Forms Response to Sheets"
  description: "Retrieves new responses from a Google Form, formats the data, and appends it to a designated Google Sheets spreadsheet for tracking."
  tags:
    - productivity
    - google-workspace
    - google-forms
    - google-sheets
    - automation
capability:
  exposes:
    - type: mcp
      namespace: forms-sync
      port: 8080
      tools:
        - name: sync-form-responses
          description: "Given a form ID and spreadsheet ID, retrieve latest form responses and append them to the tracking sheet."
          inputParameters:
            - name: form_id
              in: body
              type: string
              description: "The Google Forms form ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The target Google Sheets spreadsheet ID."
          steps:
            - name: get-responses
              type: call
              call: google-forms.list-responses
              with:
                form_id: "{{form_id}}"
            - name: append-to-sheet
              type: call
              call: google-sheets.append-values
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Responses!A1"
                values: "{{get-responses.responses}}"
  consumes:
    - type: http
      namespace: google-forms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_forms_token"
      resources:
        - name: responses
          path: "/forms/{{form_id}}/responses"
          inputParameters:
            - name: form_id
              in: path
          operations:
            - name: list-responses
              method: GET
    - type: http
      namespace: google-sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_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

Identifies a suspected phishing email in Gmail, moves it to quarantine, and notifies the security team via Google Chat with sender details.

naftiko: "0.5"
info:
  label: "Google Workspace Gmail Phishing Quarantine"
  description: "Identifies a suspected phishing email in Gmail, moves it to quarantine, and notifies the security team via Google Chat with sender details."
  tags:
    - security
    - google-workspace
    - gmail
    - google-chat
    - phishing
capability:
  exposes:
    - type: mcp
      namespace: email-security
      port: 8080
      tools:
        - name: quarantine-phishing-email
          description: "Given a user email and message ID, retrieve the message, move to quarantine label, and alert security on Google Chat."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The Gmail user email."
            - name: message_id
              in: body
              type: string
              description: "The Gmail message ID."
          steps:
            - name: get-message
              type: call
              call: gmail.get-message
              with:
                user_email: "{{user_email}}"
                message_id: "{{message_id}}"
            - name: quarantine-message
              type: call
              call: gmail.modify-message
              with:
                user_email: "{{user_email}}"
                message_id: "{{message_id}}"
                add_labels: "SPAM"
            - name: alert-security
              type: call
              call: google-chat.post-message
              with:
                space_name: "security-ops"
                text: "Phishing email quarantined for {{user_email}}. Subject: {{get-message.subject}}, Sender: {{get-message.from}}."
  consumes:
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_gmail_token"
      resources:
        - name: messages
          path: "/users/{{user_email}}/messages/{{message_id}}"
          inputParameters:
            - name: user_email
              in: path
            - name: message_id
              in: path
          operations:
            - name: get-message
              method: GET
        - name: message-modify
          path: "/users/{{user_email}}/messages/{{message_id}}/modify"
          inputParameters:
            - name: user_email
              in: path
            - name: message_id
              in: path
          operations:
            - name: modify-message
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Lists members of a Google Workspace group, identifies external members, and creates a Jira access review task for the security team.

naftiko: "0.5"
info:
  label: "Google Workspace Group Access Review"
  description: "Lists members of a Google Workspace group, identifies external members, and creates a Jira access review task for the security team."
  tags:
    - security
    - google-workspace
    - identity
    - jira
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: group-review
      port: 8080
      tools:
        - name: review-group-access
          description: "Given a group email, list all members, flag external users, and create a Jira access review task."
          inputParameters:
            - name: group_email
              in: body
              type: string
              description: "The Google Workspace group email."
          steps:
            - name: list-members
              type: call
              call: admin-directory.list-group-members
              with:
                group_email: "{{group_email}}"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Access review: {{group_email}}"
                description: "Group: {{group_email}}\nTotal members: {{list-members.member_count}}\nReview for external or stale accounts."
  consumes:
    - type: http
      namespace: admin-directory
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: group-members
          path: "/groups/{{group_email}}/members"
          inputParameters:
            - name: group_email
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Synchronizes a Google Workspace group membership based on Okta group assignments, adding and removing users as needed.

naftiko: "0.5"
info:
  label: "Google Workspace Group Membership Sync"
  description: "Synchronizes a Google Workspace group membership based on Okta group assignments, adding and removing users as needed."
  tags:
    - identity
    - google-workspace
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: workspace-sync
      port: 8080
      tools:
        - name: sync-workspace-group
          description: "Given an Okta group ID and corresponding Google Workspace group email, list Okta group members and ensure the Google Workspace group membership matches."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID to read members from."
            - name: workspace_group_email
              in: body
              type: string
              description: "The Google Workspace group email to sync membership to, e.g. engineering@google.com."
          steps:
            - name: get-okta-members
              type: call
              call: okta.list-group-members
              with:
                group_id: "{{okta_group_id}}"
            - name: sync-workspace-members
              type: call
              call: google-admin.update-group-members
              with:
                group_email: "{{workspace_group_email}}"
                members: "{{get-okta-members.members}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://google.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: google-admin
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: group-members
          path: "/groups/{{group_email}}/members"
          inputParameters:
            - name: group_email
              in: path
          operations:
            - name: update-group-members
              method: POST

Assigns the appropriate Google Workspace license SKU to a new hire or role-changed employee via the Google Admin SDK.

naftiko: "0.5"
info:
  label: "Google Workspace License Provisioning"
  description: "Assigns the appropriate Google Workspace license SKU to a new hire or role-changed employee via the Google Admin SDK."
  tags:
    - hr
    - identity
    - google-workspace
    - onboarding
    - license-management
capability:
  exposes:
    - type: mcp
      namespace: workspace-provisioning
      port: 8080
      tools:
        - name: assign-workspace-license
          description: "Given a user email and product SKU, assign the Google Workspace license via the Admin SDK licensing API."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user Google Workspace email address to assign the license to."
            - name: product_id
              in: body
              type: string
              description: "The Google Workspace product ID, e.g. Google-Apps."
            - name: sku_id
              in: body
              type: string
              description: "The Google Workspace SKU ID, e.g. 1010020020 for Business Plus."
          call: google-licensing.assign-license
          with:
            user_email: "{{user_email}}"
            product_id: "{{product_id}}"
            sku_id: "{{sku_id}}"
          outputParameters:
            - name: user_id
              type: string
              mapping: "$.userId"
            - name: product_name
              type: string
              mapping: "$.productName"
  consumes:
    - type: http
      namespace: google-licensing
      baseUri: "https://licensing.googleapis.com/apps/licensing/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: user-licenses
          path: "/product/{{product_id}}/sku/{{sku_id}}/user/{{user_email}}"
          inputParameters:
            - name: product_id
              in: path
            - name: sku_id
              in: path
            - name: user_email
              in: path
          operations:
            - name: assign-license
              method: POST

Retrieves Google Meet recording metadata from Drive, moves recordings to an archive shared drive, and notifies the meeting organizer via Gmail.

naftiko: "0.5"
info:
  label: "Google Workspace Meet Recording Archiver"
  description: "Retrieves Google Meet recording metadata from Drive, moves recordings to an archive shared drive, and notifies the meeting organizer via Gmail."
  tags:
    - productivity
    - google-workspace
    - google-meet
    - google-drive
    - gmail
capability:
  exposes:
    - type: mcp
      namespace: meet-archival
      port: 8080
      tools:
        - name: archive-meet-recording
          description: "Given a recording file ID and archive drive ID, move the recording and notify the organizer via email."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file ID of the Meet recording."
            - name: archive_drive_id
              in: body
              type: string
              description: "The shared drive ID for archived recordings."
            - name: organizer_email
              in: body
              type: string
              description: "The email of the meeting organizer."
          steps:
            - name: get-recording
              type: call
              call: google-drive.get-file
              with:
                file_id: "{{file_id}}"
            - name: move-to-archive
              type: call
              call: google-drive.update-file
              with:
                file_id: "{{file_id}}"
                add_parents: "{{archive_drive_id}}"
            - name: notify-organizer
              type: call
              call: gmail.send-message
              with:
                to: "{{organizer_email}}"
                subject: "Meet recording archived: {{get-recording.name}}"
                body: "Your Meet recording '{{get-recording.name}}' has been moved to the archive drive."
  consumes:
    - type: http
      namespace: google-drive
      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
            - name: update-file
              method: PATCH
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.google_gmail_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-message
              method: POST

Detects suspended Google Workspace users, revokes their OAuth tokens, and notifies the IT security team via Google Chat.

naftiko: "0.5"
info:
  label: "Google Workspace Suspended User Remediation"
  description: "Detects suspended Google Workspace users, revokes their OAuth tokens, and notifies the IT security team via Google Chat."
  tags:
    - security
    - google-workspace
    - identity
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: user-remediation
      port: 8080
      tools:
        - name: remediate-suspended-user
          description: "Given a user email, verify suspension status, revoke all OAuth tokens, and notify IT security on Google Chat."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The email of the suspended user."
          steps:
            - name: get-user-status
              type: call
              call: admin-directory.get-user
              with:
                user_email: "{{user_email}}"
            - name: revoke-tokens
              type: call
              call: admin-directory.delete-tokens
              with:
                user_email: "{{user_email}}"
            - name: notify-it-security
              type: call
              call: google-chat.post-message
              with:
                space_name: "it-security"
                text: "Suspended user remediated: {{user_email}}. OAuth tokens revoked. Previous status: {{get-user-status.suspended}}."
  consumes:
    - type: http
      namespace: admin-directory
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: get-user
              method: GET
        - name: tokens
          path: "/users/{{user_email}}/tokens"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: delete-tokens
              method: DELETE
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves user profile details from the Google Admin Directory API including name, org unit, and last login time.

naftiko: "0.5"
info:
  label: "Google Workspace User Lookup"
  description: "Retrieves user profile details from the Google Admin Directory API including name, org unit, and last login time."
  tags:
    - identity
    - google-workspace
    - hr
capability:
  exposes:
    - type: mcp
      namespace: workspace-directory
      port: 8080
      tools:
        - name: lookup-workspace-user
          description: "Given a user email, return their full name, organizational unit, and last login time from Google Workspace."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The Google Workspace email of the user to look up."
          call: admin-directory.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"
  consumes:
    - type: http
      namespace: admin-directory
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: get-user
              method: GET

Fetches open sprint issues from Jira for a given project and posts a prioritized sprint planning digest to the engineering Google Chat space.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Digest"
  description: "Fetches open sprint issues from Jira for a given project and posts a prioritized sprint planning digest to the engineering Google Chat space."
  tags:
    - devops
    - jira
    - google-chat
    - sprint-planning
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: digest-sprint-backlog
          description: "Given a Jira project key and sprint name, fetch open issues and post a sprint digest to the engineering Google Chat space."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. PLAT."
            - name: sprint_name
              in: body
              type: string
              description: "The sprint name to filter, e.g. Sprint 42."
          steps:
            - name: get-sprint-issues
              type: call
              call: jira.search-issues
              with:
                jql: "project={{project_key}} AND sprint='{{sprint_name}}' AND status!=Done"
            - name: post-digest
              type: call
              call: google-chat.post-sprint-digest
              with:
                space_name: "engineering-platform"
                text: "Sprint digest {{sprint_name}} ({{project_key}}): {{get-sprint-issues.total}} open issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/search"
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-sprint-digest
              method: POST

Retrieves active Google job postings from LinkedIn and posts a weekly talent acquisition pipeline summary to the HR Google Chat space.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Report"
  description: "Retrieves active Google job postings from LinkedIn and posts a weekly talent acquisition pipeline summary to the HR Google Chat space."
  tags:
    - hr
    - recruiting
    - linkedin
    - google-chat
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: talent-reporting
      port: 8080
      tools:
        - name: digest-talent-pipeline
          description: "Fetch active job postings and applicant counts from LinkedIn for Google and post a weekly pipeline summary to the HR Google Chat space."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The LinkedIn organization URN for Google, e.g. urn:li:organization:1337."
          steps:
            - name: get-postings
              type: call
              call: linkedin.list-job-postings
              with:
                organization_id: "{{organization_id}}"
            - name: post-digest
              type: call
              call: google-chat.post-talent-digest
              with:
                space_name: "hr-talent-acquisition"
                text: "Weekly talent pipeline: {{get-postings.total}} active postings, {{get-postings.applicant_count}} total applicants."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: list-job-postings
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-talent-digest
              method: POST

Lists all users assigned to a critical Okta application and posts a quarterly access review summary to the security team Google Chat space.

naftiko: "0.5"
info:
  label: "Okta Application Access Review"
  description: "Lists all users assigned to a critical Okta application and posts a quarterly access review summary to the security team Google Chat space."
  tags:
    - identity
    - security
    - okta
    - google-chat
    - access-review
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-app-access-review
          description: "Given an Okta application ID and name, list all assigned users and post a quarterly access review to the security Google Chat space."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Okta application ID to review."
            - name: app_name
              in: body
              type: string
              description: "Human-readable application name for the report."
          steps:
            - name: list-app-users
              type: call
              call: okta.list-app-users
              with:
                app_id: "{{app_id}}"
            - name: post-review
              type: call
              call: google-chat.post-access-review
              with:
                space_name: "security-access-reviews"
                text: "Quarterly access review for {{app_name}}: {{list-app-users.total}} users assigned. Please certify by end of quarter."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://google.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: list-app-users
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-access-review
              method: POST

Audits all Okta users for MFA enrollment and creates a Jira compliance task when non-compliant users exceed the defined threshold.

naftiko: "0.5"
info:
  label: "Okta MFA Compliance Audit"
  description: "Audits all Okta users for MFA enrollment and creates a Jira compliance task when non-compliant users exceed the defined threshold."
  tags:
    - identity
    - security
    - okta
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: security-compliance
      port: 8080
      tools:
        - name: audit-mfa-compliance
          description: "List all active Okta users, identify those without MFA, and create a Jira security task when the non-compliance rate exceeds the threshold."
          inputParameters:
            - name: compliance_threshold
              in: body
              type: number
              description: "Maximum allowed percentage of non-MFA users before creating a Jira task."
          steps:
            - name: list-users
              type: call
              call: okta.list-active-users
            - name: create-compliance-task
              type: call
              call: jira.create-security-task
              with:
                project_key: "SEC"
                summary: "MFA compliance breach: threshold {{compliance_threshold}}% exceeded"
                priority: "High"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://google.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: list-active-users
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-security-task
              method: POST

On a critical Datadog alert for production infrastructure, creates a PagerDuty incident, opens a Jira P1 issue, and posts to the SRE on-call Google Chat space.

naftiko: "0.5"
info:
  label: "P1 Incident Response Chain"
  description: "On a critical Datadog alert for production infrastructure, creates a PagerDuty incident, opens a Jira P1 issue, and posts to the SRE on-call Google Chat space."
  tags:
    - itsm
    - incident-response
    - datadog
    - pagerduty
    - jira
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-production-incident
          description: "Given a Datadog monitor ID and alert details, trigger a PagerDuty incident, open a Jira P1 issue, and notify the SRE on-call Google Chat space."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired the production alert."
            - name: monitor_name
              in: body
              type: string
              description: "The name of the Datadog monitor that fired."
            - name: service_name
              in: body
              type: string
              description: "The affected production service name."
          steps:
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1: {{monitor_name}}"
                service_id: "$secrets.pagerduty_service_id"
            - name: create-jira-p1
              type: call
              call: jira.create-p1-issue
              with:
                project_key: "SRE"
                summary: "P1 Incident: {{service_name}} — {{monitor_name}}"
                priority: "Highest"
                description: "PagerDuty: {{page-oncall.id}}\nMonitor: {{monitor_id}}"
            - name: notify-sre
              type: call
              call: google-chat.post-incident
              with:
                space_name: "sre-oncall"
                text: "P1 INCIDENT: {{monitor_name}} on {{service_name}} | PD: {{page-oncall.id}} | Jira: {{create-jira-p1.key}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-p1-issue
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-incident
              method: POST

Retrieves the current on-call engineer from PagerDuty for a given schedule and returns their name and contact details.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Engineer Lookup"
  description: "Retrieves the current on-call engineer from PagerDuty for a given schedule and returns their name and contact details."
  tags:
    - itsm
    - pagerduty
    - on-call
    - sre
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-oncall-engineer
          description: "Given a PagerDuty schedule ID, return the currently on-call engineer name, email, and escalation policy. Use to identify the correct escalation target."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID to query for the current on-call user."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: user_email
              type: string
              mapping: "$.oncalls[0].user.email"
            - name: escalation_policy
              type: string
              mapping: "$.oncalls[0].escalation_policy.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

When a Salesforce opportunity closes as Won, creates a Jira customer success epic and links the epic key back to the Salesforce opportunity record.

naftiko: "0.5"
info:
  label: "Salesforce Client Closed-Won to Jira Epic Sync"
  description: "When a Salesforce opportunity closes as Won, creates a Jira customer success epic and links the epic key back to the Salesforce opportunity record."
  tags:
    - sales
    - crm
    - salesforce
    - jira
    - client-onboarding
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: sync-closed-won-to-jira
          description: "Given a Salesforce opportunity ID at Closed-Won, create a Jira epic for GCP customer success and update the Salesforce opportunity with the epic key."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity record ID to sync."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-epic
              type: call
              call: jira.create-epic
              with:
                project_key: "CS"
                summary: "GCP Onboarding: {{get-opportunity.account_name}}"
                description: "Salesforce Opp: {{opportunity_id}} | ARR: {{get-opportunity.amount}}"
            - name: update-opportunity
              type: call
              call: salesforce-write.patch-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                jira_epic_key: "{{create-epic.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://google.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-epic
              method: POST
    - type: http
      namespace: salesforce-write
      baseUri: "https://google.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: patch-opportunity
              method: PATCH

Enriches a new Salesforce lead with firmographic data from ZoomInfo and updates the lead record for Google Cloud sales outreach.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment via ZoomInfo"
  description: "Enriches a new Salesforce lead with firmographic data from ZoomInfo and updates the lead record for Google Cloud sales outreach."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-salesforce-lead
          description: "Given a Salesforce lead ID and company name, fetch firmographic intelligence from ZoomInfo and patch the lead record with revenue, employee count, and industry."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce Lead record ID to enrich."
            - name: company_name
              in: body
              type: string
              description: "The company name to look up in ZoomInfo."
          steps:
            - name: get-company-data
              type: call
              call: zoominfo.search-company
              with:
                company_name: "{{company_name}}"
            - name: update-lead
              type: call
              call: salesforce.patch-lead
              with:
                lead_id: "{{lead_id}}"
                annual_revenue: "{{get-company-data.revenue}}"
                number_of_employees: "{{get-company-data.employee_count}}"
                industry: "{{get-company-data.industry}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://google.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: patch-lead
              method: PATCH

Compiles a weekly Salesforce opportunity pipeline digest for Google Cloud sales and posts it to the sales team Google Chat space.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Digest"
  description: "Compiles a weekly Salesforce opportunity pipeline digest for Google Cloud sales and posts it to the sales team Google Chat space."
  tags:
    - sales
    - crm
    - salesforce
    - google-chat
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-gcp-sales-pipeline
          description: "Retrieve open Salesforce opportunities for Google Cloud by region and post a weekly pipeline digest to the sales Google Chat space."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The Google Cloud sales region to report on, e.g. AMER, EMEA, APAC."
            - name: fiscal_quarter
              in: body
              type: string
              description: "The fiscal quarter to scope the pipeline report, e.g. Q1-2026."
          steps:
            - name: query-opps
              type: call
              call: salesforce.query-cloud-opps
              with:
                region: "{{region}}"
                fiscal_quarter: "{{fiscal_quarter}}"
            - name: post-digest
              type: call
              call: google-chat.post-pipeline-digest
              with:
                space_name: "cloud-sales-pipeline"
                text: "GCP Pipeline ({{region}}, {{fiscal_quarter}}): {{query-opps.total}} open deals, ${{query-opps.pipeline_value}} ARR."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://google.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-cloud-opps
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-pipeline-digest
              method: POST

Retrieves batch prediction job results from Vertex AI and loads the output into a BigQuery table for downstream analytics.

naftiko: "0.5"
info:
  label: "Vertex AI Batch Prediction Results to BigQuery"
  description: "Retrieves batch prediction job results from Vertex AI and loads the output into a BigQuery table for downstream analytics."
  tags:
    - ai-ml
    - gcp
    - vertex-ai
    - bigquery
    - data-analytics
capability:
  exposes:
    - type: mcp
      namespace: ml-pipeline
      port: 8080
      tools:
        - name: sync-prediction-to-bigquery
          description: "Given a project, location, and batch prediction job ID, check job status and insert results into BigQuery."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: location
              in: body
              type: string
              description: "The Vertex AI location."
            - name: job_id
              in: body
              type: string
              description: "The batch prediction job ID."
          steps:
            - name: get-batch-job
              type: call
              call: vertex-ai.get-batch-prediction-job
              with:
                project_id: "{{project_id}}"
                location: "{{location}}"
                job_id: "{{job_id}}"
            - name: load-to-bigquery
              type: call
              call: bigquery.insert-rows
              with:
                project_id: "{{project_id}}"
                dataset_id: "ml_predictions"
                table_id: "batch_results"
                rows: "{{get-batch-job.outputInfo}}"
  consumes:
    - type: http
      namespace: vertex-ai
      baseUri: "https://{{location}}-aiplatform.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: batch-prediction-jobs
          path: "/projects/{{project_id}}/locations/{{location}}/batchPredictionJobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: location
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-batch-prediction-job
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_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 Waymo autonomous vehicle fleet telemetry data from the fleet management API and syncs operational metrics to a BigQuery dataset.

naftiko: "0.5"
info:
  label: "Waymo Fleet Status Dashboard Sync"
  description: "Retrieves Waymo autonomous vehicle fleet telemetry data from the fleet management API and syncs operational metrics to a BigQuery dataset."
  tags:
    - autonomous-vehicles
    - waymo
    - bigquery
    - fleet-management
capability:
  exposes:
    - type: mcp
      namespace: waymo-ops
      port: 8080
      tools:
        - name: sync-fleet-status
          description: "Given a fleet ID and time window, pull vehicle status telemetry and insert rows into a BigQuery fleet metrics table."
          inputParameters:
            - name: fleet_id
              in: body
              type: string
              description: "The Waymo fleet identifier."
            - name: hours_back
              in: body
              type: string
              description: "Number of hours of telemetry to retrieve."
          steps:
            - name: get-fleet-telemetry
              type: call
              call: waymo-fleet.get-status
              with:
                fleet_id: "{{fleet_id}}"
                hours_back: "{{hours_back}}"
            - name: insert-bq-rows
              type: call
              call: bigquery.insert-rows
              with:
                project_id: "waymo-analytics"
                dataset_id: "fleet_metrics"
                table_id: "vehicle_status"
                rows: "{{get-fleet-telemetry.vehicles}}"
  consumes:
    - type: http
      namespace: waymo-fleet
      baseUri: "https://fleet.waymo.com/v1"
      authentication:
        type: bearer
        token: "$secrets.waymo_fleet_token"
      resources:
        - name: fleet-status
          path: "/fleets/{{fleet_id}}/status"
          inputParameters:
            - name: fleet_id
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: bigquery
      baseUri: "https://bigquery.googleapis.com/bigquery/v2"
      authentication:
        type: bearer
        token: "$secrets.gcp_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

Pulls current headcount by organization and cost center from Workday for workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Pulls current headcount by organization and cost center from Workday for workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns active employees grouped by organization and cost center from Workday. Use for headcount planning and finance analysis."
          call: workday.headcount-export
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.displayName"
                - name: organization
                  type: string
                  mapping: "$.organization"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
                - name: level
                  type: string
                  mapping: "$.jobLevel"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/google/workers"
          operations:
            - name: headcount-export
              method: GET

Initiates the annual performance review cycle in Workday and broadcasts a manager notification to the HR Google Chat space.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launcher"
  description: "Initiates the annual performance review cycle in Workday and broadcasts a manager notification to the HR Google Chat space."
  tags:
    - hr
    - performance-management
    - workday
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review cycle name and due date, create performance review tasks in Workday and notify managers in the HR Google Chat space."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "The performance review cycle name, e.g. 2026 Annual Review."
            - name: due_date
              in: body
              type: string
              description: "Completion due date in YYYY-MM-DD format."
          steps:
            - name: create-review-cycle
              type: call
              call: workday.create-review-event
              with:
                cycle_name: "{{cycle_name}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: google-chat.notify-managers
              with:
                space_name: "hr-managers"
                text: "Performance review cycle '{{cycle_name}}' is now open. Due: {{due_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-events
          path: "/google/performanceReviews"
          operations:
            - name: create-review-event
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: notify-managers
              method: POST

When a new job requisition is approved in Workday, creates a Jira recruiting epic and posts the opening to the talent acquisition Google Chat space.

naftiko: "0.5"
info:
  label: "Workday Recruiting Requisition to Jira"
  description: "When a new job requisition is approved in Workday, creates a Jira recruiting epic and posts the opening to the talent acquisition Google Chat space."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - google-chat
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: sync-requisition-to-jira
          description: "Given a Workday job requisition ID, retrieve the opening details, create a Jira recruiting epic, and notify the talent acquisition team in Google Chat."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID to process."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-recruiting-epic
              type: call
              call: jira.create-recruiting-epic
              with:
                project_key: "RECRUIT"
                summary: "Hiring: {{get-requisition.job_title}} — {{get-requisition.department}}"
                description: "Workday Req: {{requisition_id}}\nLevel: {{get-requisition.level}}\nLocation: {{get-requisition.location}}"
            - name: notify-ta
              type: call
              call: google-chat.post-requisition
              with:
                space_name: "talent-acquisition"
                text: "New open req: {{get-requisition.job_title}} in {{get-requisition.department}}. Jira: {{create-recruiting-epic.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/google/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://google.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-recruiting-epic
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-requisition
              method: POST

Retrieves channel metadata including subscriber count, video count, and description from the YouTube Data API.

naftiko: "0.5"
info:
  label: "YouTube Channel Details Lookup"
  description: "Retrieves channel metadata including subscriber count, video count, and description from the YouTube Data API."
  tags:
    - marketing
    - youtube
capability:
  exposes:
    - type: mcp
      namespace: youtube-info
      port: 8080
      tools:
        - name: get-channel-details
          description: "Given a YouTube channel ID, return subscriber count, total video count, and channel description."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The YouTube channel ID."
          call: youtube-data.get-channel
          with:
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: subscriber_count
              type: string
              mapping: "$.items[0].statistics.subscriberCount"
            - name: video_count
              type: string
              mapping: "$.items[0].statistics.videoCount"
            - name: description
              type: string
              mapping: "$.items[0].snippet.description"
  consumes:
    - type: http
      namespace: youtube-data
      baseUri: "https://www.googleapis.com/youtube/v3"
      authentication:
        type: apikey
        key: "key"
        value: "$secrets.youtube_api_key"
        placement: query
      resources:
        - name: channels
          path: "/channels"
          operations:
            - name: get-channel
              method: GET

Retrieves flagged YouTube comments for a video, sets their moderation status to held for review, and notifies the trust and safety team via Google Chat.

naftiko: "0.5"
info:
  label: "YouTube Comment Moderation Escalation"
  description: "Retrieves flagged YouTube comments for a video, sets their moderation status to held for review, and notifies the trust and safety team via Google Chat."
  tags:
    - content-moderation
    - youtube
    - google-chat
    - trust-safety
capability:
  exposes:
    - type: mcp
      namespace: content-moderation
      port: 8080
      tools:
        - name: escalate-flagged-comments
          description: "Given a YouTube video ID, retrieve flagged comments, hold them for review, and alert the trust and safety Google Chat space."
          inputParameters:
            - name: video_id
              in: body
              type: string
              description: "The YouTube video ID to moderate comments for."
          steps:
            - name: get-flagged-comments
              type: call
              call: youtube-data.list-comments
              with:
                video_id: "{{video_id}}"
                moderation_status: "likelySpam"
            - name: hold-comments
              type: call
              call: youtube-data.set-moderation-status
              with:
                comment_ids: "{{get-flagged-comments.comment_ids}}"
                moderation_status: "heldForReview"
            - name: notify-trust-safety
              type: call
              call: google-chat.post-message
              with:
                space_name: "trust-and-safety"
                text: "Flagged {{get-flagged-comments.count}} comments on video {{video_id}} for review."
  consumes:
    - type: http
      namespace: youtube-data
      baseUri: "https://www.googleapis.com/youtube/v3"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: comment-threads
          path: "/commentThreads"
          operations:
            - name: list-comments
              method: GET
        - name: comments
          path: "/comments/setModerationStatus"
          operations:
            - name: set-moderation-status
              method: POST
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves YouTube channel analytics for official Google channels and posts a weekly content performance summary to the marketing Google Chat space.

naftiko: "0.5"
info:
  label: "YouTube Content Performance Digest"
  description: "Retrieves YouTube channel analytics for official Google channels and posts a weekly content performance summary to the marketing Google Chat space."
  tags:
    - marketing
    - youtube
    - google-chat
    - reporting
    - social-content
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-youtube-performance
          description: "Retrieve YouTube channel analytics including views, watch time, and subscriber changes for the past week and post a summary to the marketing Google Chat space."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The YouTube channel ID to retrieve analytics for."
            - name: start_date
              in: body
              type: string
              description: "Analytics period start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Analytics period end date in YYYY-MM-DD format."
          steps:
            - name: get-analytics
              type: call
              call: youtube-analytics.get-channel-report
              with:
                channel_id: "{{channel_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: google-chat.post-marketing-digest
              with:
                space_name: "marketing-analytics"
                text: "YouTube performance ({{start_date}} to {{end_date}}): {{get-analytics.views}} views, {{get-analytics.watchTimeMinutes}} watch-minutes, {{get-analytics.subscribersGained}} new subscribers."
  consumes:
    - type: http
      namespace: youtube-analytics
      baseUri: "https://youtubeanalytics.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-channel-report
              method: GET
    - type: http
      namespace: google-chat
      baseUri: "https://chat.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_chat_token"
      resources:
        - name: messages
          path: "/spaces/{{space_name}}/messages"
          inputParameters:
            - name: space_name
              in: path
          operations:
            - name: post-marketing-digest
              method: POST

Monitors a YouTube live broadcast for health issues, checks stream status, and alerts the content operations team via Slack.

naftiko: "0.5"
info:
  label: "YouTube Live Stream Health Monitor"
  description: "Monitors a YouTube live broadcast for health issues, checks stream status, and alerts the content operations team via Slack."
  tags:
    - content-ops
    - youtube
    - slack
    - live-streaming
capability:
  exposes:
    - type: mcp
      namespace: live-ops
      port: 8080
      tools:
        - name: monitor-live-stream
          description: "Given a broadcast ID, check live stream health status and alert Slack if stream quality degrades."
          inputParameters:
            - name: broadcast_id
              in: body
              type: string
              description: "The YouTube live broadcast ID."
          steps:
            - name: get-broadcast
              type: call
              call: youtube-data.get-broadcast
              with:
                broadcast_id: "{{broadcast_id}}"
            - name: get-stream-health
              type: call
              call: youtube-data.get-stream
              with:
                stream_id: "{{get-broadcast.contentDetails_boundStreamId}}"
            - name: alert-content-ops
              type: call
              call: slack.post-message
              with:
                channel: "content-ops"
                text: "YouTube live stream {{broadcast_id}} health: status={{get-stream-health.status}}, resolution={{get-stream-health.resolution}}, framerate={{get-stream-health.frameRate}}."
  consumes:
    - type: http
      namespace: youtube-data
      baseUri: "https://www.googleapis.com/youtube/v3"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: live-broadcasts
          path: "/liveBroadcasts"
          operations:
            - name: get-broadcast
              method: GET
        - name: live-streams
          path: "/liveStreams"
          operations:
            - name: get-stream
              method: GET
    - 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