Intel Capabilities

Naftiko 0.5 capability definitions for Intel - 101 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Creates task.

naftiko: "0.5"
info:
  label: "ADP Payroll Discrepancy"
  description: "Creates task."
  tags:
    - hr
    - finance
    - adp
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: adp
      port: 8080
      tools:
        - name: adp-payroll-discrepancy-task
          description: "Creates task."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "adp.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "ADP Payroll Discrepancy"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://adp.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Before each payroll run, compares ADP headcount totals against Workday HCM employee counts and creates a ServiceNow task if discrepancies are found.

naftiko: "0.5"
info:
  label: "ADP Payroll Run Validation"
  description: "Before each payroll run, compares ADP headcount totals against Workday HCM employee counts and creates a ServiceNow task if discrepancies are found."
  tags:
    - hr
    - finance
    - workday
    - servicenow
    - payroll
capability:
  exposes:
    - type: mcp
      namespace: payroll-validation
      port: 8080
      tools:
        - name: validate-payroll-headcount
          description: "Given a payroll period code, compare ADP active employee count against Workday HCM for the same period and raise a ServiceNow task for any headcount mismatch."
          inputParameters:
            - name: payroll_period
              in: body
              type: string
              description: "ADP payroll period code, e.g. 2025-W14."
          steps:
            - name: get-adp-count
              type: call
              call: "adp.get-worker-count"
              with:
                period: "{{payroll_period}}"
            - name: get-wd-count
              type: call
              call: "workday-payroll.get-worker-count"
              with:
                asOfDate: "{{payroll_period}}"
            - name: create-mismatch-task
              type: call
              call: "servicenow-payroll.create-task"
              with:
                short_description: "Payroll headcount mismatch: ADP={{get-adp-count.count}} vs Workday={{get-wd-count.count}}"
                category: "payroll"
                assignment_group: "HR_Payroll"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: worker-count
          path: "/hr/v2/workers"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-worker-count
              method: GET
    - type: http
      namespace: workday-payroll
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/intel/workers"
          inputParameters:
            - name: asOfDate
              in: query
          operations:
            - name: get-worker-count
              method: GET
    - type: http
      namespace: servicenow-payroll
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a CloudWatch alarm fires, creates a ServiceNow incident and notifies infrastructure team.

naftiko: "0.5"
info:
  label: "AWS CloudWatch Alarm to ServiceNow"
  description: "When a CloudWatch alarm fires, creates a ServiceNow incident and notifies infrastructure team."
  tags:
    - cloud
    - itsm
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: handle-alarm
          description: "Given a CloudWatch alarm name, create a ServiceNow incident."
          inputParameters:
            - name: alarm_name
              in: body
              type: string
              description: "CloudWatch alarm name."
          steps:
            - name: get-alarm
              type: call
              call: "cloudwatch.describe-alarm"
              with:
                alarm_name: "{{alarm_name}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "CloudWatch: {{alarm_name}} — {{get-alarm.StateReason}}"
                urgency: "2"
                assignment_group: "Cloud_Infrastructure"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra-alerts"
                text: "ServiceNow {{create-incident.number}} for CloudWatch alarm {{alarm_name}}"
  consumes:
    - type: http
      namespace: cloudwatch
      baseUri: "https://monitoring.us-west-2.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sigv4_token"
        placement: header
      resources:
        - name: alarms
          path: "/?Action=DescribeAlarms&AlarmNames.member.1={{alarm_name}}"
          inputParameters:
            - name: alarm_name
              in: query
          operations:
            - name: describe-alarm
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the running state, type, and availability zone of an AWS EC2 instance.

naftiko: "0.5"
info:
  label: "AWS EC2 Instance Lookup"
  description: "Retrieves the running state, type, and availability zone of an AWS EC2 instance."
  tags:
    - cloud
    - infrastructure
    - aws
capability:
  exposes:
    - type: mcp
      namespace: cloud-infra
      port: 8080
      tools:
        - name: get-ec2-status
          description: "Given an EC2 instance ID, return its running state and type."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "EC2 instance ID."
          call: aws.describe-instance
          with:
            instance_id: "{{instance_id}}"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://ec2.us-west-2.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sigv4_token"
        placement: header
      resources:
        - name: instances
          path: "/?Action=DescribeInstances&InstanceId.1={{instance_id}}"
          inputParameters:
            - name: instance_id
              in: query
          operations:
            - name: describe-instance
              method: GET

Creates tasks.

naftiko: "0.5"
info:
  label: "S3 Compliance Scan"
  description: "Creates tasks."
  tags:
    - security
    - compliance
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: aws
      port: 8080
      tools:
        - name: aws-s3-compliance-to-servicenow-task
          description: "Creates tasks."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "aws.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "S3 Compliance Scan"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "S3 Compliance Scan"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://aws.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates FinOps ticket.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly to Jira"
  description: "Creates FinOps ticket."
  tags:
    - cloud
    - finops
    - azure
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-cost-anomaly-to-jira-ticket
          description: "Creates FinOps ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure Cost Anomaly to Jira"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Azure Cost Anomaly to Jira"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://azure.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Azure Data Factory pipeline run status and creates a Jira bug and a New Relic alert when a pipeline fails in the production data workspace.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Failure Alert"
  description: "Monitors Azure Data Factory pipeline run status and creates a Jira bug and a New Relic alert when a pipeline fails in the production data workspace."
  tags:
    - data
    - cloud
    - azure-data-factory
    - jira
    - new-relic
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: adf-monitoring
      port: 8080
      tools:
        - name: handle-adf-failure
          description: "Given an Azure subscription ID, resource group, data factory name, and pipeline run ID, retrieve failure details and create a Jira bug and New Relic alert event."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
            - name: factory_name
              in: body
              type: string
              description: "Azure Data Factory name."
            - name: pipeline_run_id
              in: body
              type: string
              description: "Azure Data Factory pipeline run ID."
          steps:
            - name: get-pipeline-run
              type: call
              call: "azure-adf.get-pipeline-run"
              with:
                subscriptionId: "{{subscription_id}}"
                resourceGroupName: "{{resource_group}}"
                factoryName: "{{factory_name}}"
                runId: "{{pipeline_run_id}}"
            - name: create-jira-bug
              type: call
              call: "jira-adf.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "ADF Pipeline Failure: {{get-pipeline-run.pipelineName}} in {{factory_name}}"
                description: "Run ID: {{pipeline_run_id}} | Error: {{get-pipeline-run.message}}"
            - name: post-nr-event
              type: call
              call: "newrelic-adf.post-event"
              with:
                eventType: "AdfPipelineFailure"
                pipelineName: "{{get-pipeline-run.pipelineName}}"
                factoryName: "{{factory_name}}"
                jiraKey: "{{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: azure-adf
      baseUri: "https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.DataFactory/factories/{{factoryName}}"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: pipeline-runs
          path: "/pipelineruns/{{runId}}"
          inputParameters:
            - name: subscriptionId
              in: path
            - name: resourceGroupName
              in: path
            - name: factoryName
              in: path
            - name: runId
              in: path
          operations:
            - name: get-pipeline-run
              method: GET
    - type: http
      namespace: jira-adf
      baseUri: "https://intel.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: newrelic-adf
      baseUri: "https://insights-collector.newrelic.com/v1"
      authentication:
        type: apikey
        key: "X-Insert-Key"
        value: "$secrets.newrelic_insert_key"
        placement: header
      resources:
        - name: events
          path: "/accounts/{{account_id}}/events"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: post-event
              method: POST

Creates Jira for Databricks failures.

naftiko: "0.5"
info:
  label: "Azure Databricks Failure to Jira"
  description: "Creates Jira for Databricks failures."
  tags:
    - data
    - devops
    - azure-databricks
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-databricks-failure-to-jira-task
          description: "Creates Jira for Databricks failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure Databricks Failure to Jira"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Azure Databricks Failure to Jira"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Azure Databricks job run status for ML training pipelines and creates a Jira ticket and Datadog alert when a run fails or exceeds duration thresholds.

naftiko: "0.5"
info:
  label: "Azure Databricks ML Pipeline Monitoring"
  description: "Checks Azure Databricks job run status for ML training pipelines and creates a Jira ticket and Datadog alert when a run fails or exceeds duration thresholds."
  tags:
    - ai
    - data
    - azure-databricks
    - jira
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: ml-pipeline-ops
      port: 8080
      tools:
        - name: monitor-databricks-job
          description: "Given an Azure Databricks workspace URL and job ID, check the latest run status and alert via Jira and Datadog if the run has failed or exceeded the allowed duration."
          inputParameters:
            - name: workspace_url
              in: body
              type: string
              description: "Azure Databricks workspace URL, e.g. https://adb-1234.azuredatabricks.net."
            - name: job_id
              in: body
              type: string
              description: "Databricks job ID."
            - name: max_duration_minutes
              in: body
              type: integer
              description: "Maximum allowed job run duration in minutes."
          steps:
            - name: get-job-run
              type: call
              call: "databricks.get-latest-run"
              with:
                job_id: "{{job_id}}"
            - name: create-jira-ticket
              type: call
              call: "jira-ml.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Databricks ML job failure: {{job_id}}"
                description: "Run ID: {{get-job-run.run_id}} | State: {{get-job-run.state.result_state}} | Duration: {{get-job-run.execution_duration}}ms"
            - name: post-dd-alert
              type: call
              call: "datadog-db.post-event"
              with:
                title: "Databricks Job Failed: {{job_id}}"
                text: "Jira: {{create-jira-ticket.key}} | Run: {{get-job-run.run_id}}"
                alert_type: "error"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-{{workspace_id}}.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/get-latest-by-name"
          inputParameters:
            - name: job_id
              in: query
          operations:
            - name: get-latest-run
              method: GET
    - type: http
      namespace: jira-ml
      baseUri: "https://intel.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-db
      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: post-event
              method: POST

Creates bug.

naftiko: "0.5"
info:
  label: "Azure DevOps to Jira"
  description: "Creates bug."
  tags:
    - devops
    - ci-cd
    - azure-devops
    - jira
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-devops-pipeline-to-jira-bug
          description: "Creates bug."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure-devops.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure DevOps to Jira"
  consumes:
    - type: http
      namespace: azure-devops
      baseUri: "https://azure-devops.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries Azure Cost Management for current month spend of a resource group.

naftiko: "0.5"
info:
  label: "Azure Resource Cost Lookup"
  description: "Queries Azure Cost Management for current month spend of a resource group."
  tags:
    - cloud
    - finops
    - azure
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: get-resource-cost
          description: "Given an Azure subscription and resource group, return the current month cost."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Resource group name."
          call: azure-cost.get-cost
          with:
            subscription_id: "{{subscription_id}}"
            resource_group: "{{resource_group}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-cost
              method: POST

Lists DNS records for a Cloudflare zone, returning record types, values, and TTL.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Lookup"
  description: "Lists DNS records for a Cloudflare zone, returning record types, values, and TTL."
  tags:
    - networking
    - dns
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: dns
      port: 8080
      tools:
        - name: list-dns-records
          description: "Given a Cloudflare zone ID, return all DNS records."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "Cloudflare zone ID."
          call: cloudflare.list-records
          with:
            zone_id: "{{zone_id}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: list-records
              method: GET

Blocks and alerts.

naftiko: "0.5"
info:
  label: "Cloudflare WAF to PagerDuty"
  description: "Blocks and alerts."
  tags:
    - security
    - networking
    - cloudflare
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: cloudflare
      port: 8080
      tools:
        - name: cloudflare-waf-block-to-pagerduty-alert
          description: "Blocks and alerts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "cloudflare.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Cloudflare WAF to PagerDuty"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://cloudflare.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Creates tasks.

naftiko: "0.5"
info:
  label: "CMDB Drift Detection"
  description: "Creates tasks."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
    - governance
capability:
  exposes:
    - type: mcp
      namespace: cmdb
      port: 8080
      tools:
        - name: cmdb-drift-detection-task
          description: "Creates tasks."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "CMDB Drift Detection"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Scans newly published Confluence pages in a designated space for completeness criteria and creates a Jira task when pages fail the quality check.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Article Quality Gate"
  description: "Scans newly published Confluence pages in a designated space for completeness criteria and creates a Jira task when pages fail the quality check."
  tags:
    - devops
    - knowledge-management
    - jira
    - governance
capability:
  exposes:
    - type: mcp
      namespace: kb-quality
      port: 8080
      tools:
        - name: gate-confluence-article
          description: "Given a Confluence space key and page ID, validate the page against completeness criteria and create a Jira improvement task if any criteria fail."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "Confluence space key, e.g. ENGDOCS."
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID to validate."
          steps:
            - name: get-page
              type: call
              call: "confluence.get-page"
              with:
                pageId: "{{page_id}}"
            - name: create-jira-task
              type: call
              call: "jira-kb.create-issue"
              with:
                project_key: "DOCS"
                issuetype: "Task"
                summary: "KB quality gate fail: {{get-page.title}} ({{page_id}})"
                description: "Page: {{get-page.title}} in space {{space_key}} failed completeness criteria. Author: {{get-page.version.by.displayName}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://intel.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content/{{pageId}}"
          inputParameters:
            - name: pageId
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: jira-kb
      baseUri: "https://intel.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 a Confluence page by title and space key, returning content body and last modified date.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence page by title and space key, returning content body and last modified date."
  tags:
    - knowledge
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given a space key and page title, return the Confluence page content."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "Confluence space key."
            - name: page_title
              in: body
              type: string
              description: "Page title."
          call: confluence.get-page
          with:
            spaceKey: "{{space_key}}"
            title: "{{page_title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://intel-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: get-page
              method: GET

Posts runbook.

naftiko: "0.5"
info:
  label: "Runbook from PagerDuty"
  description: "Posts runbook."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: confluence
      port: 8080
      tools:
        - name: confluence-runbook-from-pagerduty-inc
          description: "Posts runbook."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "pagerduty.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Runbook from PagerDuty"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Runbook from PagerDuty"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://pagerduty.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Datadog monitor triggers critical, creates a PagerDuty incident and posts a summary to Slack.

naftiko: "0.5"
info:
  label: "Datadog Alert to PagerDuty and Slack"
  description: "When a Datadog monitor triggers critical, creates a PagerDuty incident and posts a summary to Slack."
  tags:
    - observability
    - incident-response
    - datadog
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: escalate-alert
          description: "Given a Datadog monitor ID, create a PagerDuty incident and notify Slack."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID."
            - name: service_id
              in: body
              type: string
              description: "PagerDuty service ID."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{service_id}}"
                title: "Datadog Critical: {{get-monitor.name}}"
                urgency: "high"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#oncall-alerts"
                text: "PagerDuty incident {{create-incident.incident.id}} created for {{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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Datadog monitor transitions to alert state for a production host, creates a P1 ServiceNow incident and notifies the on-call team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert to ServiceNow Incident"
  description: "When a Datadog monitor transitions to alert state for a production host, creates a P1 ServiceNow incident and notifies the on-call team via Microsoft Teams."
  tags:
    - observability
    - itsm
    - datadog
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: infra-incident
      port: 8080
      tools:
        - name: handle-infra-alert
          description: "Given a Datadog monitor ID and host name, retrieve alert details, open a P1 ServiceNow incident, and post an alert notification to the Intel NOC Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that triggered the alert."
            - name: host_name
              in: body
              type: string
              description: "Affected host name."
          steps:
            - name: get-monitor
              type: call
              call: "datadog-monitor.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow-inc.create-incident"
              with:
                short_description: "Infra alert: {{host_name}} — {{get-monitor.name}}"
                urgency: "1"
                impact: "1"
                category: "infrastructure"
            - name: notify-teams
              type: call
              call: "msteams-noc.post-message"
              with:
                channel_id: "$secrets.noc_teams_channel_id"
                message: "P1 INCIDENT: {{get-monitor.name}} on {{host_name}} | SN: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: datadog-monitor
      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: servicenow-inc
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-noc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates ticket.

naftiko: "0.5"
info:
  label: "Latency Spike to Jira"
  description: "Creates ticket."
  tags:
    - observability
    - devops
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: datadog
      port: 8080
      tools:
        - name: datadog-latency-spike-to-jira-ticket
          description: "Creates ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Latency Spike to Jira"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Latency Spike to Jira"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current status and details of a Datadog monitor by ID for observability queries.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Lookup"
  description: "Retrieves the current status and details of a Datadog monitor by ID for observability queries."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Given a Datadog monitor ID, return the current status and trigger details."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
  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

When Dynatrace detects a performance problem affecting a production service, creates a Jira bug with full problem context and links it to the ServiceNow incident.

naftiko: "0.5"
info:
  label: "Dynatrace Problem Detection to Jira Bug"
  description: "When Dynatrace detects a performance problem affecting a production service, creates a Jira bug with full problem context and links it to the ServiceNow incident."
  tags:
    - observability
    - itsm
    - dynatrace
    - jira
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: dynatrace-ops
      port: 8080
      tools:
        - name: handle-dynatrace-problem
          description: "Given a Dynatrace problem ID, retrieve problem details, create a Jira bug for root-cause analysis, and open a ServiceNow incident linked to the Jira ticket."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Dynatrace problem ID, e.g. P-12345."
          steps:
            - name: get-problem
              type: call
              call: "dynatrace.get-problem"
              with:
                problemId: "{{problem_id}}"
            - name: create-jira-bug
              type: call
              call: "jira-bug.create-issue"
              with:
                project_key: "OPS"
                issuetype: "Bug"
                summary: "Dynatrace: {{get-problem.title}} ({{problem_id}})"
                description: "Impact: {{get-problem.impactedEntities}} | Root cause: {{get-problem.rootCauseEntity}}"
            - name: create-sn-incident
              type: call
              call: "servicenow-dt.create-incident"
              with:
                short_description: "Dynatrace problem: {{get-problem.title}}"
                category: "performance"
                urgency: "2"
                description: "Jira: {{create-jira-bug.key}} | Problem: {{problem_id}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://intel.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.dynatrace_token"
        placement: header
      resources:
        - name: problems
          path: "/problems/{{problemId}}"
          inputParameters:
            - name: problemId
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: jira-bug
      baseUri: "https://intel.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: servicenow-dt
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When Dynatrace detects an application problem, creates a ServiceNow incident with root cause details and notifies Slack.

naftiko: "0.5"
info:
  label: "Dynatrace Problem to ServiceNow"
  description: "When Dynatrace detects an application problem, creates a ServiceNow incident with root cause details and notifies Slack."
  tags:
    - observability
    - itsm
    - dynatrace
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: handle-problem
          description: "Given a Dynatrace problem ID, create a ServiceNow incident and notify."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Dynatrace problem ID."
          steps:
            - name: get-problem
              type: call
              call: "dynatrace.get-problem"
              with:
                problem_id: "{{problem_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Dynatrace: {{get-problem.title}}"
                description: "Root cause: {{get-problem.rootCauseEntity.name}}"
                urgency: "1"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#oncall"
                text: "Dynatrace problem — ServiceNow {{create-incident.number}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://intel.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Api-Token $secrets.dynatrace_token"
        placement: header
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Suspends user.

naftiko: "0.5"
info:
  label: "Entra Risk to Okta"
  description: "Suspends user."
  tags:
    - security
    - identity
    - azure
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: entra
      port: 8080
      tools:
        - name: entra-risky-login-to-okta-suspend
          description: "Suspends user."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Entra Risk to Okta"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

After a successful GitHub Actions release workflow, triggers a Kubernetes rolling update via kubectl API and monitors the rollout status in Datadog.

naftiko: "0.5"
info:
  label: "GitHub Actions Deployment to Kubernetes Rollout"
  description: "After a successful GitHub Actions release workflow, triggers a Kubernetes rolling update via kubectl API and monitors the rollout status in Datadog."
  tags:
    - devops
    - cicd
    - github
    - kubernetes
    - datadog
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: k8s-deploy
      port: 8080
      tools:
        - name: trigger-k8s-rollout
          description: "Given a GitHub Actions run ID, deployment namespace, and application name, trigger a Kubernetes rolling deployment update and post a Datadog deployment event."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID for the completed release build."
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace to deploy to."
            - name: app_name
              in: body
              type: string
              description: "Kubernetes deployment name."
            - name: image_tag
              in: body
              type: string
              description: "Docker image tag to deploy."
          steps:
            - name: get-run
              type: call
              call: "github-deploy.get-run"
              with:
                run_id: "{{run_id}}"
            - name: patch-deployment
              type: call
              call: "kubernetes.patch-deployment"
              with:
                namespace: "{{namespace}}"
                name: "{{app_name}}"
                image: "{{app_name}}:{{image_tag}}"
            - name: post-dd-deployment
              type: call
              call: "datadog-deploy.create-deployment"
              with:
                service: "{{app_name}}"
                version: "{{image_tag}}"
                env: "production"
  consumes:
    - type: http
      namespace: github-deploy
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: runs
          path: "/repos/intel/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: kubernetes
      baseUri: "https://k8s-api.intel.internal"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: deployments
          path: "/apis/apps/v1/namespaces/{{namespace}}/deployments/{{name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: name
              in: path
          operations:
            - name: patch-deployment
              method: PATCH
    - type: http
      namespace: datadog-deploy
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: deployments
          path: "/events"
          operations:
            - name: create-deployment
              method: POST

Posts failure to Slack.

naftiko: "0.5"
info:
  label: "GitHub Actions to Slack"
  description: "Posts failure to Slack."
  tags:
    - devops
    - ci-cd
    - github
    - slack
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: github-actions-failure-to-slack-notify
          description: "Posts failure to Slack."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "GitHub Actions to Slack"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves GitHub Copilot seat utilization and acceptance rate metrics for the Intel organization and refreshes a Power BI productivity dashboard.

naftiko: "0.5"
info:
  label: "GitHub Copilot Usage Report to Power BI"
  description: "Retrieves GitHub Copilot seat utilization and acceptance rate metrics for the Intel organization and refreshes a Power BI productivity dashboard."
  tags:
    - devops
    - analytics
    - github
    - power-bi
    - ai
    - developer-experience
capability:
  exposes:
    - type: mcp
      namespace: copilot-reporting
      port: 8080
      tools:
        - name: refresh-copilot-report
          description: "Retrieve GitHub Copilot seat usage and suggestion acceptance rates for the Intel GitHub organization and push the metrics to a Power BI dataset for engineering leadership."
          inputParameters:
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh with Copilot usage data."
          steps:
            - name: get-copilot-usage
              type: call
              call: "github-copilot.get-usage"
              with:
                org: "intel"
            - name: refresh-pbi-dataset
              type: call
              call: "powerbi-copilot.refresh-dataset"
              with:
                datasetId: "{{powerbi_dataset_id}}"
  consumes:
    - type: http
      namespace: github-copilot
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: copilot-usage
          path: "/orgs/{{org}}/copilot/usage"
          inputParameters:
            - name: org
              in: path
          operations:
            - name: get-usage
              method: GET
    - type: http
      namespace: powerbi-copilot
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When Dependabot finds a critical vulnerability, creates a Jira security task and notifies AppSec.

naftiko: "0.5"
info:
  label: "GitHub Dependabot to Jira Security"
  description: "When Dependabot finds a critical vulnerability, creates a Jira security task and notifies AppSec."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: appsec
      port: 8080
      tools:
        - name: handle-vuln
          description: "Given a repo and alert number, create a Jira security task."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository."
            - name: alert_number
              in: body
              type: string
              description: "Alert number."
          steps:
            - name: get-alert
              type: call
              call: "github.get-dependabot-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                issuetype: "Task"
                summary: "Dependabot: {{get-alert.security_advisory.summary}}"
                priority: "Critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#appsec"
                text: "Critical vuln in {{repo}} — Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: alerts
          path: "/repos/{{repo}}/dependabot/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a GitHub PR merges to main, updates the associated ServiceNow change request and posts to Slack.

naftiko: "0.5"
info:
  label: "GitHub PR Merge to ServiceNow Change"
  description: "When a GitHub PR merges to main, updates the associated ServiceNow change request and posts to Slack."
  tags:
    - devops
    - itsm
    - github
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: deploy-tracking
      port: 8080
      tools:
        - name: track-pr-merge
          description: "Given a merged PR and change number, close the change and notify Slack."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository."
            - name: pr_number
              in: body
              type: string
              description: "PR number."
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change number."
          steps:
            - name: get-pr
              type: call
              call: "github.get-pull-request"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: close-change
              type: call
              call: "servicenow-chg.update-change"
              with:
                number: "{{change_number}}"
                state: "closed"
                close_notes: "Deployed via PR #{{pr_number}}: {{get-pr.title}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#deployments"
                text: "Change {{change_number}} closed — PR #{{pr_number}} merged in {{repo}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
    - type: http
      namespace: servicenow-chg
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: update-change
              method: PATCH
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves repository metadata including language, stars, open issues, and default branch from GitHub.

naftiko: "0.5"
info:
  label: "GitHub Repository Info Lookup"
  description: "Retrieves repository metadata including language, stars, open issues, and default branch from GitHub."
  tags:
    - devops
    - github
    - code-management
capability:
  exposes:
    - type: mcp
      namespace: code-mgmt
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given a GitHub repository in owner/repo format, return metadata including language and open issues."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
          call: github.get-repo
          with:
            repo: "{{repo}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Creates incident.

naftiko: "0.5"
info:
  label: "Grafana to ServiceNow"
  description: "Creates incident."
  tags:
    - observability
    - itsm
    - grafana
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: grafana-alert-to-servicenow-incident
          description: "Creates incident."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Grafana to ServiceNow"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Grafana to ServiceNow"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://intel-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Searches HubSpot CRM for a contact by email, returning company, lifecycle stage, and last activity.

naftiko: "0.5"
info:
  label: "HubSpot Contact Search"
  description: "Searches HubSpot CRM for a contact by email, returning company, lifecycle stage, and last activity."
  tags:
    - crm
    - marketing
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: search-contact
          description: "Given an email address, search HubSpot CRM for the contact."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Contact email."
          call: hubspot.search-contacts
          with:
            email: "{{email}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/search"
          operations:
            - name: search-contacts
              method: POST

Retrieves high-scoring leads from HubSpot and creates Salesforce lead records with Slack notification.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce Sync"
  description: "Retrieves high-scoring leads from HubSpot and creates Salesforce lead records with Slack notification."
  tags:
    - crm
    - marketing
    - hubspot
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: lead-ops
      port: 8080
      tools:
        - name: sync-leads
          description: "Given a score threshold, find HubSpot leads and create Salesforce records."
          inputParameters:
            - name: score_threshold
              in: body
              type: number
              description: "Minimum lead score."
          steps:
            - name: get-leads
              type: call
              call: "hubspot.search-contacts"
              with:
                min_score: "{{score_threshold}}"
            - name: create-lead
              type: call
              call: "salesforce.create-lead"
              with:
                Email: "{{get-leads.results[0].properties.email}}"
                Company: "{{get-leads.results[0].properties.company}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#sales"
                text: "Lead synced to Salesforce: {{get-leads.results[0].properties.email}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/search"
          operations:
            - name: search-contacts
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://intel.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Syncs HubSpot marketing campaign performance metrics to the corresponding Salesforce campaign record for unified CRM pipeline reporting.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Campaign to Salesforce Campaign Sync"
  description: "Syncs HubSpot marketing campaign performance metrics to the corresponding Salesforce campaign record for unified CRM pipeline reporting."
  tags:
    - marketing
    - sales
    - hubspot
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: campaign-sync
      port: 8080
      tools:
        - name: sync-hubspot-campaign
          description: "Given a HubSpot campaign ID and Salesforce campaign ID, fetch email campaign metrics from HubSpot and update the Salesforce campaign record with sends, opens, and click rates."
          inputParameters:
            - name: hubspot_campaign_id
              in: body
              type: string
              description: "HubSpot email campaign ID."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "Salesforce campaign record ID to update."
          steps:
            - name: get-hs-campaign
              type: call
              call: "hubspot-campaign.get-campaign-stats"
              with:
                campaignId: "{{hubspot_campaign_id}}"
            - name: update-sf-campaign
              type: call
              call: "salesforce-camp.update-campaign"
              with:
                campaign_id: "{{salesforce_campaign_id}}"
                NumberSent: "{{get-hs-campaign.sent}}"
                NumberOpens: "{{get-hs-campaign.opens}}"
                NumberReplies: "{{get-hs-campaign.clicks}}"
  consumes:
    - type: http
      namespace: hubspot-campaign
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/emails/statistics/list"
          inputParameters:
            - name: campaignId
              in: query
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: salesforce-camp
      baseUri: "https://intel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH

When a Jira bug is marked recurring, creates a ServiceNow problem record and updates the Jira issue with the reference.

naftiko: "0.5"
info:
  label: "Jira Bug to ServiceNow Problem"
  description: "When a Jira bug is marked recurring, creates a ServiceNow problem record and updates the Jira issue with the reference."
  tags:
    - devops
    - itsm
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: problem-mgmt
      port: 8080
      tools:
        - name: escalate-to-problem
          description: "Given a Jira bug key, create a ServiceNow problem and link back."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          steps:
            - name: get-bug
              type: call
              call: "jira.get-issue"
              with:
                issue_key: "{{issue_key}}"
            - name: create-problem
              type: call
              call: "servicenow-prob.create-problem"
              with:
                short_description: "Recurring: {{get-bug.fields.summary}}"
                category: "software"
            - name: update-jira
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{issue_key}}"
                body: "ServiceNow problem {{create-problem.number}} created."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              method: POST
    - type: http
      namespace: servicenow-prob
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST

Updates on completion.

naftiko: "0.5"
info:
  label: "Epic to Salesforce"
  description: "Updates on completion."
  tags:
    - devops
    - crm
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-epic-to-salesforce-update
          description: "Updates on completion."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Epic to Salesforce"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Epic to Salesforce"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current status, assignee, and priority of a Jira issue by key for project tracking queries.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves the current status, assignee, and priority of a Jira issue by key for project tracking queries."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: project-mgmt
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Given a Jira issue key, retrieve status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Publishes release notes.

naftiko: "0.5"
info:
  label: "Jira Release to Confluence"
  description: "Publishes release notes."
  tags:
    - devops
    - documentation
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-release-notes-to-confluence-page
          description: "Publishes release notes."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Jira Release to Confluence"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Jira Release to Confluence"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Extracts completed Jira sprint velocity data for a given board and refreshes a Power BI dataset for engineering leadership reporting.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report to Power BI"
  description: "Extracts completed Jira sprint velocity data for a given board and refreshes a Power BI dataset for engineering leadership reporting."
  tags:
    - devops
    - analytics
    - jira
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: eng-reporting
      port: 8080
      tools:
        - name: refresh-sprint-velocity-report
          description: "Given a Jira board ID and a Power BI dataset ID, extract sprint velocity metrics from Jira and push a dataset refresh to Power BI."
          inputParameters:
            - name: jira_board_id
              in: body
              type: string
              description: "Jira board ID to extract velocity from."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh."
          steps:
            - name: get-sprints
              type: call
              call: "jira-sprints.get-closed-sprints"
              with:
                boardId: "{{jira_board_id}}"
            - name: refresh-dataset
              type: call
              call: "powerbi.refresh-dataset"
              with:
                datasetId: "{{powerbi_dataset_id}}"
  consumes:
    - type: http
      namespace: jira-sprints
      baseUri: "https://intel.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/{{boardId}}/sprint"
          inputParameters:
            - name: boardId
              in: path
          operations:
            - name: get-closed-sprints
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Pulls LinkedIn company page engagement metrics and logs a weekly social performance summary as a Salesforce campaign activity record.

naftiko: "0.5"
info:
  label: "LinkedIn Social Engagement Digest to Salesforce"
  description: "Pulls LinkedIn company page engagement metrics and logs a weekly social performance summary as a Salesforce campaign activity record."
  tags:
    - marketing
    - social
    - linkedin
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-engagement
          description: "Given a LinkedIn organization ID and a Salesforce campaign ID, retrieve weekly company page impressions and engagement data from LinkedIn and log the digest as a Salesforce task."
          inputParameters:
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization (company page) ID."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "Salesforce campaign ID to log the digest against."
          steps:
            - name: get-li-stats
              type: call
              call: "linkedin-org.get-follower-stats"
              with:
                organizationId: "{{linkedin_org_id}}"
            - name: log-sf-task
              type: call
              call: "salesforce-li.create-task"
              with:
                WhatId: "{{salesforce_campaign_id}}"
                Subject: "LinkedIn Engagement Digest"
                Description: "Impressions: {{get-li-stats.impressionCount}} | Clicks: {{get-li-stats.clickCount}} | Engagement rate: {{get-li-stats.engagementRate}}"
  consumes:
    - type: http
      namespace: linkedin-org
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: follower-stats
          path: "/organizationalEntityFollowerStatistics"
          inputParameters:
            - name: organizationalEntity
              in: query
          operations:
            - name: get-follower-stats
              method: GET
    - type: http
      namespace: salesforce-li
      baseUri: "https://intel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

Detects risky sign-in events in Microsoft Entra ID Protection and creates a ServiceNow security incident for the identity security team to investigate.

naftiko: "0.5"
info:
  label: "Microsoft Entra Identity Risk Alert to ServiceNow"
  description: "Detects risky sign-in events in Microsoft Entra ID Protection and creates a ServiceNow security incident for the identity security team to investigate."
  tags:
    - security
    - identity
    - microsoft-entra
    - servicenow
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: handle-identity-risk
          description: "Given a Microsoft Entra risk detection ID, retrieve the risky sign-in details from Microsoft Graph and create a ServiceNow security incident for investigation."
          inputParameters:
            - name: risk_detection_id
              in: body
              type: string
              description: "Microsoft Entra ID risk detection ID."
          steps:
            - name: get-risk-detection
              type: call
              call: "graph-entra.get-risk-detection"
              with:
                riskDetectionId: "{{risk_detection_id}}"
            - name: create-sec-incident
              type: call
              call: "servicenow-iam.create-incident"
              with:
                short_description: "Identity risk: {{get-risk-detection.userDisplayName}} — {{get-risk-detection.riskEventType}}"
                category: "security"
                urgency: "2"
                description: "User: {{get-risk-detection.userPrincipalName}} | Risk level: {{get-risk-detection.riskLevel}} | IP: {{get-risk-detection.ipAddress}}"
  consumes:
    - type: http
      namespace: graph-entra
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: risk-detections
          path: "/identityProtection/riskDetections/{{riskDetectionId}}"
          inputParameters:
            - name: riskDetectionId
              in: path
          operations:
            - name: get-risk-detection
              method: GET
    - type: http
      namespace: servicenow-iam
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves application health status and response time from New Relic APM.

naftiko: "0.5"
info:
  label: "New Relic App Health Lookup"
  description: "Retrieves application health status and response time from New Relic APM."
  tags:
    - observability
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: app-health
      port: 8080
      tools:
        - name: get-app-health
          description: "Given a New Relic application name, return health status and response time."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "Application name."
          call: newrelic.get-application
          with:
            name: "{{app_name}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: applications
          path: "/applications.json"
          inputParameters:
            - name: name
              in: query
          operations:
            - name: get-application
              method: GET

Detects application performance anomalies reported by New Relic and creates a prioritized Jira ticket for the owning engineering team.

naftiko: "0.5"
info:
  label: "New Relic Application Performance Anomaly to Jira"
  description: "Detects application performance anomalies reported by New Relic and creates a prioritized Jira ticket for the owning engineering team."
  tags:
    - observability
    - devops
    - new-relic
    - jira
    - performance
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: handle-apm-anomaly
          description: "Given a New Relic application ID and an anomaly threshold percentage, retrieve the latest throughput and error rate from New Relic and create a Jira performance bug if anomalies are detected."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic application ID."
            - name: error_rate_threshold
              in: body
              type: number
              description: "Error rate percentage above which to create a Jira ticket."
          steps:
            - name: get-app-metrics
              type: call
              call: "newrelic-apm.get-app-summary"
              with:
                applicationId: "{{app_id}}"
            - name: create-perf-bug
              type: call
              call: "jira-perf.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "APM anomaly: App {{app_id}} error rate {{get-app-metrics.error_rate}}%"
                description: "Throughput: {{get-app-metrics.throughput}} rpm | Error rate: {{get-app-metrics.error_rate}}% | Response time: {{get-app-metrics.response_time}}ms"
                priority: "High"
  consumes:
    - type: http
      namespace: newrelic-apm
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: apps
          path: "/applications/{{applicationId}}.json"
          inputParameters:
            - name: applicationId
              in: path
          operations:
            - name: get-app-summary
              method: GET
    - type: http
      namespace: jira-perf
      baseUri: "https://intel.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

When New Relic detects an error rate spike, creates a Jira bug and notifies the team via Slack.

naftiko: "0.5"
info:
  label: "New Relic Error Spike to Jira"
  description: "When New Relic detects an error rate spike, creates a Jira bug and notifies the team via Slack."
  tags:
    - observability
    - devops
    - new-relic
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: error-tracking
      port: 8080
      tools:
        - name: handle-error-spike
          description: "Given a New Relic app ID, check error rate and create Jira bug if exceeded."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic app ID."
          steps:
            - name: get-metrics
              type: call
              call: "newrelic.get-app-metrics"
              with:
                app_id: "{{app_id}}"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project: "ENG"
                issuetype: "Bug"
                summary: "Error spike: {{get-metrics.app_name}} at {{get-metrics.error_rate}}%"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#engineering"
                text: "Error spike: {{get-metrics.app_name}} — Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: apps
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Loads review data.

naftiko: "0.5"
info:
  label: "Okta Access Review"
  description: "Loads review data."
  tags:
    - security
    - compliance
    - okta
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-access-review-to-snowflake-load
          description: "Loads review data."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "okta.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta Access Review"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://okta.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Resets user MFA in Okta based on an approved ServiceNow request and updates the ticket.

naftiko: "0.5"
info:
  label: "Okta MFA Reset with ServiceNow"
  description: "Resets user MFA in Okta based on an approved ServiceNow request and updates the ticket."
  tags:
    - security
    - identity
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: reset-mfa
          description: "Given a ServiceNow request and user email, reset MFA and close the ticket."
          inputParameters:
            - name: request_number
              in: body
              type: string
              description: "ServiceNow request number."
            - name: user_email
              in: body
              type: string
              description: "User email."
          steps:
            - name: reset-factors
              type: call
              call: "okta.reset-factors"
              with:
                user_id: "{{user_email}}"
            - name: close-ticket
              type: call
              call: "servicenow.update-request"
              with:
                number: "{{request_number}}"
                state: "closed_complete"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://intel.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: factors
          path: "/users/{{user_id}}/lifecycle/reset_factors"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: reset-factors
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: update-request
              method: PATCH

Investigates with Splunk.

naftiko: "0.5"
info:
  label: "Okta Risky Login Investigation"
  description: "Investigates with Splunk."
  tags:
    - security
    - identity
    - okta
    - splunk
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-risky-login-to-splunk-query
          description: "Investigates with Splunk."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta Risky Login Investigation"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Lists all Okta groups a user belongs to by email address for identity governance queries.

naftiko: "0.5"
info:
  label: "Okta User Group Lookup"
  description: "Lists all Okta groups a user belongs to by email address for identity governance queries."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-groups
          description: "Given a user email, retrieve all Okta group memberships."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "User email address."
          call: okta.get-user-groups
          with:
            user_id: "{{user_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://intel.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user-groups
              method: GET

Loads invoices.

naftiko: "0.5"
info:
  label: "Oracle Invoice to Snowflake"
  description: "Loads invoices."
  tags:
    - finance
    - data
    - oracle
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: oracle
      port: 8080
      tools:
        - name: oracle-erp-invoice-to-snowflake-load
          description: "Loads invoices."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

After an Oracle Integration Cloud approval workflow completes, fetches the approved journal entry and loads it into the Snowflake finance data warehouse.

naftiko: "0.5"
info:
  label: "Oracle ERP Journal Approval to Snowflake Finance Ledger"
  description: "After an Oracle Integration Cloud approval workflow completes, fetches the approved journal entry and loads it into the Snowflake finance data warehouse."
  tags:
    - finance
    - erp
    - oracle-integration
    - snowflake
    - data
capability:
  exposes:
    - type: mcp
      namespace: finance-ledger
      port: 8080
      tools:
        - name: load-approved-journal
          description: "Given an Oracle Integration Cloud instance ID for an approved journal entry, retrieve the journal details and load them into the Snowflake FINANCE.GL.JOURNALS table."
          inputParameters:
            - name: oic_instance_id
              in: body
              type: string
              description: "Oracle Integration Cloud process instance ID for the approved journal."
          steps:
            - name: get-journal
              type: call
              call: "oracle-int.get-instance"
              with:
                instanceId: "{{oic_instance_id}}"
            - name: load-to-snowflake
              type: call
              call: "snowflake-gl.insert-journal"
              with:
                journal_data: "{{get-journal.payload}}"
  consumes:
    - type: http
      namespace: oracle-int
      baseUri: "https://intel-oic.integration.ocp.oraclecloud.com/ic/api/integration/v1"
      authentication:
        type: basic
        username: "$secrets.oic_user"
        password: "$secrets.oic_password"
      resources:
        - name: instances
          path: "/processes/{{instanceId}}"
          inputParameters:
            - name: instanceId
              in: path
          operations:
            - name: get-instance
              method: GET
    - type: http
      namespace: snowflake-gl
      baseUri: "https://intel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: journals
          path: "/statements"
          operations:
            - name: insert-journal
              method: POST

When a PagerDuty incident resolves, creates a Confluence postmortem page and notifies the SRE team.

naftiko: "0.5"
info:
  label: "PagerDuty Incident to Confluence Postmortem"
  description: "When a PagerDuty incident resolves, creates a Confluence postmortem page and notifies the SRE team."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Given a PagerDuty incident ID, create a Confluence postmortem."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "PagerDuty incident ID."
          steps:
            - name: get-incident
              type: call
              call: "pagerduty.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "SRE"
                title: "Postmortem: {{get-incident.title}}"
                body: "## Summary\n{{get-incident.title}}\n## Duration\n{{get-incident.duration}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#sre"
                text: "Postmortem created: {{create-page.url}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://intel-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current on-call engineer for a PagerDuty schedule by schedule ID.

naftiko: "0.5"
info:
  label: "PagerDuty Schedule Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty schedule by schedule ID."
  tags:
    - operations
    - pagerduty
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ops
      port: 8080
      tools:
        - name: get-on-call
          description: "Given a PagerDuty schedule ID, return the current on-call engineer."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID."
          call: pagerduty.get-on-call
          with:
            schedule_id: "{{schedule_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: path
          operations:
            - name: get-on-call
              method: GET

Fetches high-severity threat indicators from Palo Alto Networks and creates blocking IP list entries in Cloudflare for unified perimeter enforcement.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Threat Block to Cloudflare"
  description: "Fetches high-severity threat indicators from Palo Alto Networks and creates blocking IP list entries in Cloudflare for unified perimeter enforcement."
  tags:
    - security
    - palo-alto-networks
    - cloudflare
    - threat-intelligence
    - waf
capability:
  exposes:
    - type: mcp
      namespace: perimeter-security
      port: 8080
      tools:
        - name: sync-threat-blocks
          description: "Given a Palo Alto Networks device hostname and a Cloudflare zone ID, pull active high-severity blocked IPs from PAN and synchronize them as Cloudflare WAF IP rules."
          inputParameters:
            - name: pan_hostname
              in: body
              type: string
              description: "Palo Alto Networks firewall hostname."
            - name: cf_zone_id
              in: body
              type: string
              description: "Cloudflare zone ID to update WAF rules on."
          steps:
            - name: get-blocked-ips
              type: call
              call: "pan-fw.get-blocked-ips"
              with:
                hostname: "{{pan_hostname}}"
            - name: update-cf-list
              type: call
              call: "cloudflare-waf.update-ip-list"
              with:
                zone_id: "{{cf_zone_id}}"
                ips: "{{get-blocked-ips.blocked_ips}}"
  consumes:
    - type: http
      namespace: pan-fw
      baseUri: "https://{{pan_hostname}}/restapi/v10.1"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: blocked-ips
          path: "/Objects/AddressGroups"
          operations:
            - name: get-blocked-ips
              method: GET
    - type: http
      namespace: cloudflare-waf
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: ip-lists
          path: "/zones/{{zone_id}}/firewall/rules"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: update-ip-list
              method: PUT

Fetches Pluralsight skill IQ assessment scores for an employee and records the competency levels in Workday Learning for talent profile tracking.

naftiko: "0.5"
info:
  label: "Pluralsight Skill Assessment to Workday Learning"
  description: "Fetches Pluralsight skill IQ assessment scores for an employee and records the competency levels in Workday Learning for talent profile tracking."
  tags:
    - hr
    - learning
    - pluralsight
    - workday
    - talent-management
capability:
  exposes:
    - type: mcp
      namespace: skills-tracking
      port: 8080
      tools:
        - name: sync-skill-assessments
          description: "Given a Pluralsight user email and a Workday worker ID, retrieve the latest Skill IQ scores from Pluralsight and record them as competency assessments in Workday Learning."
          inputParameters:
            - name: pluralsight_email
              in: body
              type: string
              description: "Pluralsight account email address."
            - name: workday_worker_id
              in: body
              type: string
              description: "Workday worker ID to update."
          steps:
            - name: get-skill-scores
              type: call
              call: "pluralsight-skills.get-skill-iq"
              with:
                email: "{{pluralsight_email}}"
            - name: record-competency
              type: call
              call: "workday-learning.create-competency"
              with:
                workerId: "{{workday_worker_id}}"
                skills: "{{get-skill-scores.skills}}"
  consumes:
    - type: http
      namespace: pluralsight-skills
      baseUri: "https://api.pluralsight.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: skill-iq
          path: "/users/{{email}}/skills"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-skill-iq
              method: GET
    - type: http
      namespace: workday-learning
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: competencies
          path: "/intel/workers/{{workerId}}/competencies"
          inputParameters:
            - name: workerId
              in: path
          operations:
            - name: create-competency
              method: POST

Checks the last refresh status of a Power BI dataset for reporting readiness.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Lookup"
  description: "Checks the last refresh status of a Power BI dataset for reporting readiness."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: reporting
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI dataset ID, return the last refresh status and time."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: powerbi.get-refresh-history
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Distributes reports.

naftiko: "0.5"
info:
  label: "Power BI Distribution"
  description: "Distributes reports."
  tags:
    - analytics
    - reporting
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: power
      port: 8080
      tools:
        - name: power-bi-report-dist-via-slack
          description: "Distributes reports."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Power BI Distribution"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Enriches a Salesforce account record with firmographic data from ZoomInfo including employee count, revenue band, and technology install data.

naftiko: "0.5"
info:
  label: "Salesforce Account Enrichment with ZoomInfo"
  description: "Enriches a Salesforce account record with firmographic data from ZoomInfo including employee count, revenue band, and technology install data."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: account-enrichment
      port: 8080
      tools:
        - name: enrich-sf-account
          description: "Given a Salesforce account ID and company domain, look up the company in ZoomInfo and update the Salesforce account with employee count, revenue, and tech stack data."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: company_domain
              in: body
              type: string
              description: "Company domain to look up in ZoomInfo, e.g. acme.com."
          steps:
            - name: lookup-zoominfo
              type: call
              call: "zoominfo.search-company"
              with:
                domain: "{{company_domain}}"
            - name: update-account
              type: call
              call: "salesforce-acct.update-account"
              with:
                account_id: "{{account_id}}"
                NumberOfEmployees: "{{lookup-zoominfo.employeeCount}}"
                AnnualRevenue: "{{lookup-zoominfo.revenue}}"
                Description: "Tech stack: {{lookup-zoominfo.technologies}}"
  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-acct
      baseUri: "https://intel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

When a Salesforce opportunity is Closed-Won, creates a Jira project and notifies the delivery team via Slack.

naftiko: "0.5"
info:
  label: "Salesforce Closed-Won to Jira Project"
  description: "When a Salesforce opportunity is Closed-Won, creates a Jira project and notifies the delivery team via Slack."
  tags:
    - crm
    - devops
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: deal-handoff
      port: 8080
      tools:
        - name: handle-closed-won
          description: "Given an opportunity ID, create a Jira project and notify delivery."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opp
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-project
              type: call
              call: "jira.create-project"
              with:
                name: "{{get-opp.Name}}"
                projectTypeKey: "software"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#delivery"
                text: "New project: {{get-opp.Name}} | Value: {{get-opp.Amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://intel.my.salesforce.com/services/data/v59.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://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Enrolls contracts.

naftiko: "0.5"
info:
  label: "Contract to HubSpot"
  description: "Enrolls contracts."
  tags:
    - crm
    - marketing
    - salesforce
    - hubspot
    - slack
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: salesforce-contract-to-hubspot-workflow
          description: "Enrolls contracts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Contract to HubSpot"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name."
  tags:
    - crm
    - salesforce
    - sales
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Given a Salesforce opportunity ID, return the stage, amount, and close date."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          call: salesforce.get-opportunity
          with:
            opportunity_id: "{{opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://intel.my.salesforce.com/services/data/v59.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

Notifies at-risk renewals.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Risk"
  description: "Notifies at-risk renewals."
  tags:
    - crm
    - sales
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: salesforce-renewal-risk-notification
          description: "Notifies at-risk renewals."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Salesforce Renewal Risk"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves pending expense reports from SAP Concur, validates amounts against policy, and either auto-approves or escalates to a manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval Workflow"
  description: "Retrieves pending expense reports from SAP Concur, validates amounts against policy, and either auto-approves or escalates to a manager via Microsoft Teams."
  tags:
    - finance
    - hr
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: process-expense-reports
          description: "Given an approver employee ID and a daily spend limit, retrieve pending SAP Concur expense reports and auto-approve those within policy or send a Teams approval request for those exceeding the limit."
          inputParameters:
            - name: approver_id
              in: body
              type: string
              description: "SAP Concur approver employee ID."
            - name: auto_approve_limit
              in: body
              type: number
              description: "USD amount below which expense reports are auto-approved."
          steps:
            - name: get-pending-reports
              type: call
              call: "sap-concur.get-pending-reports"
              with:
                approverId: "{{approver_id}}"
            - name: send-approval-request
              type: call
              call: "msteams-approval.post-message"
              with:
                recipient_upn: "$secrets.approver_upn"
                message: "Expense approval needed: {{get-pending-reports.count}} reports exceeding ${{auto_approve_limit}} threshold."
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: approverLoginID
              in: query
          operations:
            - name: get-pending-reports
              method: GET
    - type: http
      namespace: msteams-approval
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: post-message
              method: POST

Creates compliance task for violations.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Violation"
  description: "Creates compliance task for violations."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-concur-expense-violation-task
          description: "Creates compliance task for violations."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "sap-concur.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "SAP Concur Expense Violation"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "SAP Concur Expense Violation"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://sap-concur.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_concur_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Updates opportunity.

naftiko: "0.5"
info:
  label: "SAP to Salesforce"
  description: "Updates opportunity."
  tags:
    - erp
    - crm
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-delivery-to-salesforce-update
          description: "Updates opportunity."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Alerts low stock.

naftiko: "0.5"
info:
  label: "SAP Stock Alert"
  description: "Alerts low stock."
  tags:
    - erp
    - supply-chain
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-material-stock-to-slack-alert
          description: "Alerts low stock."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "SAP Stock Alert"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a SAP S/4HANA purchase order by number, returning status, vendor, and total value.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves a SAP S/4HANA purchase order by number, returning status, vendor, and total value."
  tags:
    - finance
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP PO number, return the PO status, vendor, and total amount."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://intel-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

When a goods receipt is posted in SAP S/4HANA, updates the associated cost center budget in Workday Financials to reflect actual spend.

naftiko: "0.5"
info:
  label: "SAP S/4HANA PO Receipt to Workday Cost Update"
  description: "When a goods receipt is posted in SAP S/4HANA, updates the associated cost center budget in Workday Financials to reflect actual spend."
  tags:
    - finance
    - erp
    - sap-s4hana
    - workday
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: budget-sync
      port: 8080
      tools:
        - name: sync-po-receipt-to-budget"
          description: "Given a SAP material document number and Workday cost center ID, fetch the goods receipt value from SAP and record the actual spend against the Workday budget."
          inputParameters:
            - name: material_doc
              in: body
              type: string
              description: "SAP material document number for the goods receipt."
            - name: cost_center_id
              in: body
              type: string
              description: "Workday cost center ID to update."
          steps:
            - name: get-receipt
              type: call
              call: "sap-gr.get-material-doc"
              with:
                materialDocument: "{{material_doc}}"
            - name: update-budget
              type: call
              call: "workday-fin.update-budget"
              with:
                costCenterId: "{{cost_center_id}}"
                actualAmount: "{{get-receipt.GoodsMovementAmount}}"
                currency: "{{get-receipt.DocumentCurrency}}"
  consumes:
    - type: http
      namespace: sap-gr
      baseUri: "https://intel-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-docs
          path: "/A_MaterialDocumentHeader('{{materialDocument}}')"
          inputParameters:
            - name: materialDocument
              in: path
          operations:
            - name: get-material-doc
              method: GET
    - type: http
      namespace: workday-fin
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/intel/budgets/{{costCenterId}}/actuals"
          inputParameters:
            - name: costCenterId
              in: path
          operations:
            - name: update-budget
              method: POST

Notifies procurement.

naftiko: "0.5"
info:
  label: "SAP Stock Procurement Alert"
  description: "Notifies procurement."
  tags:
    - erp
    - supply-chain
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-stock-alert-procurement
          description: "Notifies procurement."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "SAP Stock Procurement Alert"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Aggregates pending ServiceNow change requests for the weekly CAB meeting and posts a digest to a Microsoft Teams channel with links to each change record.

naftiko: "0.5"
info:
  label: "ServiceNow Change Advisory Board Digest"
  description: "Aggregates pending ServiceNow change requests for the weekly CAB meeting and posts a digest to a Microsoft Teams channel with links to each change record."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: cab-digest
      port: 8080
      tools:
        - name: digest-cab-changes
          description: "Retrieve all ServiceNow change requests in Scheduled or Pending Approval state for the next 7 days and post a CAB meeting digest to the designated Microsoft Teams channel."
          inputParameters:
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the CAB digest to."
          steps:
            - name: get-pending-changes
              type: call
              call: "servicenow-cab-read.list-changes"
              with:
                state: "scheduled"
            - name: post-cab-digest
              type: call
              call: "msteams-cab.post-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "CAB Digest: {{get-pending-changes.total}} changes pending. Top changes: {{get-pending-changes.summary}}"
  consumes:
    - type: http
      namespace: servicenow-cab-read
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request"
          inputParameters:
            - name: state
              in: query
          operations:
            - name: list-changes
              method: GET
    - type: http
      namespace: msteams-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Applies Terraform.

naftiko: "0.5"
info:
  label: "Change Approval Apply"
  description: "Applies Terraform."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: servicenow-change-approval-terraform
          description: "Applies Terraform."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Change Approval Apply"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Applies on approval.

naftiko: "0.5"
info:
  label: "Change to Terraform"
  description: "Applies on approval."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: servicenow-change-to-terraform-run
          description: "Applies on approval."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Change to Terraform"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves the current state, priority, and assignment group of a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves the current state, priority, and assignment group of a ServiceNow incident by number."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, return state, priority, and assignment group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Creates bridge for P1.

naftiko: "0.5"
info:
  label: "Major Incident Bridge"
  description: "Creates bridge for P1."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: servicenow-major-incident-bridge-setup
          description: "Creates bridge for P1."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "servicenow.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Major Incident Bridge"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Major Incident Bridge"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://servicenow.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Posts a formatted message to a Slack channel for notifications and team communication.

naftiko: "0.5"
info:
  label: "Slack Message Poster"
  description: "Posts a formatted message to a Slack channel for notifications and team communication."
  tags:
    - communication
    - slack
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: post-message
          description: "Given a Slack channel and message text, post to the channel."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "Slack channel."
            - name: message
              in: body
              type: string
              description: "Message text."
          call: slack.post-message
          with:
            channel: "{{channel}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks credits and alerts when over budget.

naftiko: "0.5"
info:
  label: "Snowflake Cost Alert to FinOps"
  description: "Checks credits and alerts when over budget."
  tags:
    - data
    - finops
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: snowflake-cost-alert-to-finops
          description: "Checks credits and alerts when over budget."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Snowflake Cost Alert to FinOps"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Snowflake Cost Alert to FinOps"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Runs a Snowflake data quality query and creates a Jira task if anomalies exceed threshold, notifying Slack.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Check to Jira"
  description: "Runs a Snowflake data quality query and creates a Jira task if anomalies exceed threshold, notifying Slack."
  tags:
    - data
    - quality
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: check-quality
          description: "Execute a quality check query and create Jira task if anomalies found."
          inputParameters:
            - name: quality_query
              in: body
              type: string
              description: "SQL quality check query."
          steps:
            - name: run-check
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "{{quality_query}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                issuetype: "Task"
                summary: "Data quality anomaly: {{run-check.anomaly_count}} records"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#data-engineering"
                text: "Data quality alert: {{run-check.anomaly_count}} anomalies — Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://intel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://intel-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Runs a Snowflake data quality validation query and creates a Datadog event and a Jira bug when row counts or null rates fall outside acceptable bounds.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Pipeline Alert"
  description: "Runs a Snowflake data quality validation query and creates a Datadog event and a Jira bug when row counts or null rates fall outside acceptable bounds."
  tags:
    - data
    - analytics
    - snowflake
    - datadog
    - jira
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake database, schema, table, and quality thresholds, run a validation query and alert via Datadog and Jira if quality rules fail."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database name."
            - name: schema
              in: body
              type: string
              description: "Snowflake schema name."
            - name: table
              in: body
              type: string
              description: "Snowflake table name to validate."
            - name: null_rate_threshold
              in: body
              type: number
              description: "Maximum acceptable null rate (0.0 to 1.0) for key columns."
          steps:
            - name: run-validation
              type: call
              call: "snowflake.run-query"
              with:
                database: "{{database}}"
                schema: "{{schema}}"
                table: "{{table}}"
            - name: post-dd-event
              type: call
              call: "datadog-dq.post-event"
              with:
                title: "Data Quality Failure: {{database}}.{{schema}}.{{table}}"
                text: "Null rate: {{run-validation.null_rate}} | Row count: {{run-validation.row_count}}"
                alert_type: "warning"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "DQ failure: {{database}}.{{schema}}.{{table}} null rate {{run-validation.null_rate}}"
                description: "Threshold: {{null_rate_threshold}} | Actual: {{run-validation.null_rate}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://intel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: datadog-dq
      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: post-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://intel.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

Executes a read-only SQL query against a Snowflake warehouse and returns results for analytics queries.

naftiko: "0.5"
info:
  label: "Snowflake Query Runner"
  description: "Executes a read-only SQL query against a Snowflake warehouse and returns results for analytics queries."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Given a SQL statement, execute it against the Snowflake warehouse."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "SQL query to execute."
          call: snowflake.execute-query
          with:
            statement: "{{sql_statement}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://intel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Pulls SolarWinds network interface utilization data for core switches and publishes a weekly performance digest to a Power BI dataset.

naftiko: "0.5"
info:
  label: "SolarWinds Network Performance Digest"
  description: "Pulls SolarWinds network interface utilization data for core switches and publishes a weekly performance digest to a Power BI dataset."
  tags:
    - network
    - observability
    - solarwinds
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: network-reporting
      port: 8080
      tools:
        - name: publish-network-digest
          description: "Given a SolarWinds node group and a Power BI dataset ID, extract weekly interface utilization metrics and push a dataset refresh for network performance reporting."
          inputParameters:
            - name: node_group
              in: body
              type: string
              description: "SolarWinds node group name to query."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh with network data."
          steps:
            - name: get-utilization
              type: call
              call: "solarwinds-net.query-interfaces"
              with:
                nodeGroup: "{{node_group}}"
            - name: refresh-pbi
              type: call
              call: "powerbi-net.refresh-dataset"
              with:
                datasetId: "{{powerbi_dataset_id}}"
  consumes:
    - type: http
      namespace: solarwinds-net
      baseUri: "https://intel-solarwinds.internal:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: interfaces
          path: "/Query"
          operations:
            - name: query-interfaces
              method: POST
    - type: http
      namespace: powerbi-net
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Creates incident for down.

naftiko: "0.5"
info:
  label: "SolarWinds to PagerDuty"
  description: "Creates incident for down."
  tags:
    - networking
    - incident-response
    - solarwinds
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: solarwinds
      port: 8080
      tools:
        - name: solarwinds-node-down-to-pagerduty-alert
          description: "Creates incident for down."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "solarwinds.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "SolarWinds to PagerDuty"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.solarwinds_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Executes a Splunk search query over a specified time range for security and incident investigation.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Executes a Splunk search query over a specified time range for security and incident investigation."
  tags:
    - security
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: log-analysis
      port: 8080
      tools:
        - name: search-logs
          description: "Given a Splunk SPL query and time range, execute the search and return events."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk SPL search query."
            - name: earliest_time
              in: body
              type: string
              description: "Search start time."
          call: splunk.create-search
          with:
            search: "{{search_query}}"
            earliest_time: "{{earliest_time}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.intel.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

When Splunk detects a security anomaly, creates a ServiceNow security incident and notifies the SOC via Slack.

naftiko: "0.5"
info:
  label: "Splunk Security Alert to ServiceNow"
  description: "When Splunk detects a security anomaly, creates a ServiceNow security incident and notifies the SOC via Slack."
  tags:
    - security
    - siem
    - splunk
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: soc-ops
      port: 8080
      tools:
        - name: handle-security-alert
          description: "Given a Splunk alert, create a ServiceNow security incident and notify SOC."
          inputParameters:
            - name: alert_description
              in: body
              type: string
              description: "Alert description."
            - name: severity
              in: body
              type: string
              description: "Severity level."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-sec.create-incident"
              with:
                short_description: "Splunk alert: {{alert_description}}"
                severity: "{{severity}}"
                assignment_group: "SOC_Team"
            - name: notify-soc
              type: call
              call: "slack.post-message"
              with:
                channel: "#soc-alerts"
                text: "Security incident {{create-incident.number}} — {{alert_description}}"
  consumes:
    - type: http
      namespace: servicenow-sec
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Splunk for high-severity security events in the last 15 minutes and creates a ServiceNow security incident for each correlated event cluster.

naftiko: "0.5"
info:
  label: "Splunk Security Event Correlation to ServiceNow"
  description: "Queries Splunk for high-severity security events in the last 15 minutes and creates a ServiceNow security incident for each correlated event cluster."
  tags:
    - security
    - observability
    - splunk
    - servicenow
    - siem
capability:
  exposes:
    - type: mcp
      namespace: siem-ops
      port: 8080
      tools:
        - name: correlate-security-events
          description: "Given a Splunk search query for high-severity security events and a lookback window, run the search and create a ServiceNow security incident for each event cluster found."
          inputParameters:
            - name: splunk_query
              in: body
              type: string
              description: "Splunk SPL query to find high-severity security events."
            - name: lookback_minutes
              in: body
              type: integer
              description: "Lookback window in minutes for the Splunk search."
          steps:
            - name: run-splunk-search
              type: call
              call: "splunk.run-search"
              with:
                search: "{{splunk_query}}"
                earliest_time: "-{{lookback_minutes}}m"
            - name: create-security-incident
              type: call
              call: "servicenow-siem.create-incident"
              with:
                short_description: "SIEM: High-severity security events detected"
                category: "security"
                urgency: "1"
                description: "Event count: {{run-splunk-search.result_count}} | Query: {{splunk_query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.intel.internal:8089"
      authentication:
        type: basic
        username: "$secrets.splunk_user"
        password: "$secrets.splunk_password"
      resources:
        - name: searches
          path: "/services/search/jobs"
          operations:
            - name: run-search
              method: POST
    - type: http
      namespace: servicenow-siem
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Triggers a Tableau workbook refresh and, on completion, posts the dashboard URL to a Microsoft Teams channel for stakeholder distribution.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh and Distribution"
  description: "Triggers a Tableau workbook refresh and, on completion, posts the dashboard URL to a Microsoft Teams channel for stakeholder distribution."
  tags:
    - analytics
    - reporting
    - tableau
    - microsoft-teams
    - data
capability:
  exposes:
    - type: mcp
      namespace: bi-distribution
      port: 8080
      tools:
        - name: refresh-and-distribute-dashboard
          description: "Given a Tableau workbook ID and a Microsoft Teams channel ID, trigger a full workbook refresh and post the dashboard URL to the channel when complete."
          inputParameters:
            - name: tableau_workbook_id
              in: body
              type: string
              description: "Tableau workbook LUID (content URL identifier)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the dashboard link to."
          steps:
            - name: refresh-workbook
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbookId: "{{tableau_workbook_id}}"
            - name: post-to-teams
              type: call
              call: "msteams-bi.post-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Dashboard refreshed: {{refresh-workbook.contentUrl}} — ready for review."
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.intel.com/api/2.8"
      authentication:
        type: apikey
        key: "X-Tableau-Auth"
        value: "$secrets.tableau_token"
        placement: header
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbookId}}/refresh"
          inputParameters:
            - name: workbookId
              in: path
          operations:
            - name: refresh-workbook
              method: POST
    - type: http
      namespace: msteams-bi
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Alerts on failure.

naftiko: "0.5"
info:
  label: "Tableau Extract Alert"
  description: "Alerts on failure."
  tags:
    - analytics
    - itsm
    - tableau
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: tableau
      port: 8080
      tools:
        - name: tableau-extract-failure-alert
          description: "Alerts on failure."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Tableau Extract Alert"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Tableau Extract Alert"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates incident.

naftiko: "0.5"
info:
  label: "Tableau to ServiceNow"
  description: "Creates incident."
  tags:
    - analytics
    - itsm
    - tableau
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: tableau
      port: 8080
      tools:
        - name: tableau-failure-to-servicenow-incident
          description: "Creates incident."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Tableau to ServiceNow"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Tableau to ServiceNow"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates page.

naftiko: "0.5"
info:
  label: "Teams to Confluence"
  description: "Creates page."
  tags:
    - communication
    - documentation
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: teams
      port: 8080
      tools:
        - name: teams-meeting-to-confluence-page
          description: "Creates page."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "microsoft-teams.get-data"
              with:
                id: "{{input_id}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Teams to Confluence"
  consumes:
    - type: http
      namespace: microsoft-teams
      baseUri: "https://microsoft-teams.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.microsoft_teams_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://intel-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a Terraform Cloud plan is created, fetches the cost estimate and routes it to a ServiceNow approval workflow if projected monthly cost exceeds a defined budget threshold.

naftiko: "0.5"
info:
  label: "Terraform Cloud Cost Estimate to ServiceNow Approval"
  description: "When a Terraform Cloud plan is created, fetches the cost estimate and routes it to a ServiceNow approval workflow if projected monthly cost exceeds a defined budget threshold."
  tags:
    - cloud
    - infrastructure
    - terraform
    - servicenow
    - finops
    - approval
capability:
  exposes:
    - type: mcp
      namespace: infra-approval
      port: 8080
      tools:
        - name: gate-terraform-cost
          description: "Given a Terraform Cloud run ID and monthly cost threshold, retrieve the cost estimate from Terraform and route to ServiceNow for approval if the estimate exceeds the threshold."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Terraform Cloud run ID."
            - name: monthly_limit_usd
              in: body
              type: number
              description: "Monthly cost threshold in USD above which approval is required."
          steps:
            - name: get-cost-estimate
              type: call
              call: "terraform-est.get-cost-estimate"
              with:
                runId: "{{run_id}}"
            - name: create-approval
              type: call
              call: "servicenow-appr.create-approval"
              with:
                short_description: "Terraform cost approval: Run {{run_id}} — ${{get-cost-estimate.proposed_monthly_cost}}/mo"
                category: "cloud_spend"
                description: "Proposed monthly cost: ${{get-cost-estimate.proposed_monthly_cost}} exceeds limit ${{monthly_limit_usd}}"
  consumes:
    - type: http
      namespace: terraform-est
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: cost-estimates
          path: "/runs/{{runId}}/cost-estimate"
          inputParameters:
            - name: runId
              in: path
          operations:
            - name: get-cost-estimate
              method: GET
    - type: http
      namespace: servicenow-appr
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST

When a Terraform plan has resource changes, creates a ServiceNow change request for approval.

naftiko: "0.5"
info:
  label: "Terraform Plan to ServiceNow Change"
  description: "When a Terraform plan has resource changes, creates a ServiceNow change request for approval."
  tags:
    - infrastructure
    - itsm
    - terraform
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: infra-governance
      port: 8080
      tools:
        - name: create-change-for-plan
          description: "Given a Terraform run ID, create a ServiceNow change request."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Terraform run ID."
          steps:
            - name: get-run
              type: call
              call: "terraform.get-run"
              with:
                run_id: "{{run_id}}"
            - name: create-change
              type: call
              call: "servicenow-chg.create-change"
              with:
                short_description: "Terraform: {{get-run.plan_summary.resource_additions}} add, {{get-run.plan_summary.resource_changes}} change"
                category: "infrastructure"
                assignment_group: "Cloud_Platform"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: servicenow-chg
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves the current state and last run status of a Terraform Cloud workspace.

naftiko: "0.5"
info:
  label: "Terraform Workspace Lookup"
  description: "Retrieves the current state and last run status of a Terraform Cloud workspace."
  tags:
    - infrastructure
    - terraform
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: infra
      port: 8080
      tools:
        - name: get-workspace
          description: "Given a Terraform Cloud organization and workspace, return the workspace status."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Workspace name."
          call: terraform.get-workspace
          with:
            workspace: "{{workspace_name}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/intel/workspaces/{{workspace}}"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: get-workspace
              method: GET

Reminds employees.

naftiko: "0.5"
info:
  label: "Benefits Enrollment"
  description: "Reminds employees."
  tags:
    - hr
    - workday
    - servicenow
    - slack
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-benefits-enrollment-notify
          description: "Reminds employees."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Benefits Enrollment"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Benefits Enrollment"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates tasks.

naftiko: "0.5"
info:
  label: "Benefits Reminder"
  description: "Creates tasks."
  tags:
    - hr
    - workday
    - servicenow
    - slack
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-benefits-reminder-task
          description: "Creates tasks."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Benefits Reminder"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Benefits Reminder"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Refreshes dashboard.

naftiko: "0.5"
info:
  label: "Workday Comp to Power BI"
  description: "Refreshes dashboard."
  tags:
    - hr
    - analytics
    - workday
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-comp-to-power-bi-refresh
          description: "Refreshes dashboard."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Workday Comp to Power BI"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves employee profile details from Workday HCM by worker ID, returning name, department, title, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile details from Workday HCM by worker ID, returning name, department, title, and manager."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday worker ID, retrieve the employee full name, department, job title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.fullName"
            - name: department
              type: string
              mapping: "$.worker.department"
  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: "/intel/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Exports a headcount snapshot from Workday HCM and loads it into a Snowflake table for workforce analytics and Power BI reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot to Snowflake"
  description: "Exports a headcount snapshot from Workday HCM and loads it into a Snowflake table for workforce analytics and Power BI reporting."
  tags:
    - hr
    - analytics
    - workday
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: workforce-analytics
      port: 8080
      tools:
        - name: sync-headcount-to-snowflake
          description: "Given a Workday organization ID and a target Snowflake table, export the current headcount snapshot from Workday and load it into Snowflake for BI consumption."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "Workday organization ID for headcount export."
            - name: snowflake_table
              in: body
              type: string
              description: "Snowflake target table in format DATABASE.SCHEMA.TABLE."
          steps:
            - name: export-headcount
              type: call
              call: "workday-hc.export-workers"
              with:
                orgId: "{{org_id}}"
            - name: load-snowflake
              type: call
              call: "snowflake-load.insert-rows"
              with:
                table: "{{snowflake_table}}"
                rows: "{{export-headcount.workers}}"
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/intel/workers"
          inputParameters:
            - name: organizationId
              in: query
          operations:
            - name: export-workers
              method: GET
    - type: http
      namespace: snowflake-load
      baseUri: "https://intel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: rows
          path: "/statements"
          operations:
            - name: insert-rows
              method: POST

Loads headcount snapshot.

naftiko: "0.5"
info:
  label: "Workday Headcount to Snowflake"
  description: "Loads headcount snapshot."
  tags:
    - hr
    - data
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-headcount-to-snowflake-load
          description: "Loads headcount snapshot."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.intel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

When a new hire is created in Workday, provisions access in ServiceNow, sends a Microsoft Teams welcome message, and creates a SharePoint onboarding folder.

naftiko: "0.5"
info:
  label: "Workday New Hire Onboarding Orchestrator"
  description: "When a new hire is created in Workday, provisions access in ServiceNow, sends a Microsoft Teams welcome message, and creates a SharePoint onboarding folder."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full new hire onboarding sequence across ServiceNow, Microsoft Teams, and SharePoint."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                workerId: "{{workday_employee_id}}"
            - name: open-onboard-ticket
              type: call
              call: "servicenow.create-ticket"
              with:
                short_description: "New hire onboarding: {{get-employee.preferredName}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.workEmail}}"
                message: "Welcome to Intel, {{get-employee.preferredName}}! Your onboarding ticket: {{open-onboard-ticket.number}}"
            - name: create-folder
              type: call
              call: "graph-sp.create-folder"
              with:
                site_id: "intel-hr-onboarding"
                folder_name: "{{get-employee.preferredName}}_{{start_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: workers
          path: "/intel/workers/{{workerId}}"
          inputParameters:
            - name: workerId
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: tickets
          path: "/table/sc_request"
          operations:
            - name: create-ticket
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: graph-sp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.graph_token"
      resources:
        - name: folders
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST

When a new hire is detected in Workday, creates an Okta account and assigns standard applications for onboarding.

naftiko: "0.5"
info:
  label: "Workday New Hire to Okta Provisioning"
  description: "When a new hire is detected in Workday, creates an Okta account and assigns standard applications for onboarding."
  tags:
    - hr
    - security
    - workday
    - okta
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: onboarding
      port: 8080
      tools:
        - name: provision-new-hire
          description: "Given a Workday worker ID, create Okta user and assign applications."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: create-okta-user
              type: call
              call: "okta.create-user"
              with:
                email: "{{get-worker.email}}"
                firstName: "{{get-worker.firstName}}"
                lastName: "{{get-worker.lastName}}"
            - name: assign-apps
              type: call
              call: "okta.assign-app"
              with:
                user_id: "{{get-worker.email}}"
                app_id: "$secrets.okta_standard_app_id"
  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: "/intel/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://intel.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: assign-app
              method: POST

When a Workday employee changes roles, updates Okta group memberships and logs the change in ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Role Change to Okta Sync"
  description: "When a Workday employee changes roles, updates Okta group memberships and logs the change in ServiceNow."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: role-sync
      port: 8080
      tools:
        - name: sync-role
          description: "Given a worker ID and new department, update Okta groups and log in ServiceNow."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: new_department
              in: body
              type: string
              description: "New department."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: update-groups
              type: call
              call: "okta.update-groups"
              with:
                user_id: "{{get-worker.email}}"
                group_name: "{{new_department}}"
            - name: log-change
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Role change: {{get-worker.full_name}} to {{new_department}}"
  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: "/intel/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://intel.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: update-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/sys_audit"
          operations:
            - name: create-record
              method: POST

When an employee's role changes in Workday, automatically updates their Salesforce permission set assignments to match the new job profile.

naftiko: "0.5"
info:
  label: "Workday Role Change to Salesforce Permission Update"
  description: "When an employee's role changes in Workday, automatically updates their Salesforce permission set assignments to match the new job profile."
  tags:
    - hr
    - security
    - workday
    - salesforce
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: role-provisioning
      port: 8080
      tools:
        - name: sync-role-to-salesforce
          description: "Given a Workday employee ID and new job profile name, look up the current Salesforce user for this employee and update their permission set assignments to reflect the new role."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_job_profile
              in: body
              type: string
              description: "New Workday job profile name."
            - name: employee_email
              in: body
              type: string
              description: "Employee corporate email address for Salesforce user lookup."
          steps:
            - name: get-wd-worker
              type: call
              call: "workday-role.get-worker"
              with:
                workerId: "{{employee_id}}"
            - name: get-sf-user
              type: call
              call: "salesforce-user-lookup.query-user"
              with:
                email: "{{employee_email}}"
            - name: update-permissions
              type: call
              call: "salesforce-perms.update-permission-set"
              with:
                user_id: "{{get-sf-user.Id}}"
                permission_set: "{{new_job_profile}}_Access"
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/intel/workers/{{workerId}}"
          inputParameters:
            - name: workerId
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce-user-lookup
      baseUri: "https://intel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-user
              method: GET
    - type: http
      namespace: salesforce-perms
      baseUri: "https://intel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: permission-sets
          path: "/sobjects/PermissionSetAssignment"
          operations:
            - name: update-permission-set
              method: POST

When a Workday termination event fires, deactivates the user in Okta and creates a ServiceNow offboarding task.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When a Workday termination event fires, deactivates the user in Okta and creates a ServiceNow offboarding task."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: handle-termination
          description: "Given a Workday worker ID, deactivate the Okta user and create a ServiceNow offboarding task."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_id: "{{get-worker.email}}"
            - name: create-task
              type: call
              call: "servicenow-hr.create-task"
              with:
                short_description: "Offboarding: {{get-worker.full_name}} deprovisioned"
                assignment_group: "HR_Operations"
  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: "/intel/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://intel.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow-hr
      baseUri: "https://intel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST