Dell Technologies Capabilities

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

Sort
Expand

When Azure Cost Management detects a spending anomaly, annotates Datadog, creates a ServiceNow cost-review incident, and posts to the FinOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Response"
  description: "When Azure Cost Management detects a spending anomaly, annotates Datadog, creates a ServiceNow cost-review incident, and posts to the FinOps Microsoft Teams channel."
  tags:
    - finops
    - cloud
    - azure
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-azure-cost-anomaly
          description: "Given an Azure cost anomaly alert with service and overage amount, annotate Datadog, open a ServiceNow cost-review incident, and notify the FinOps Microsoft Teams channel."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "Azure cost anomaly ID from Cost Management."
            - name: azure_service
              in: body
              type: string
              description: "Azure service name with the anomalous spend."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated spend anomaly in USD."
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID with the anomaly."
          steps:
            - name: annotate-dd
              type: call
              call: datadog.create-event
              with:
                title: "Azure Cost Anomaly: {{azure_service}}"
                text: "Anomaly {{anomaly_id}} on subscription {{subscription_id}} — overage: ${{estimated_overage_usd}}"
                alert_type: warning
            - name: open-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                category: cloud_cost
                short_description: "Azure cost anomaly: {{azure_service}} — ${{estimated_overage_usd}}"
                assigned_group: FinOps_Team
            - name: notify-finops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finops_team_id"
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure Cost Anomaly: {{azure_service}} | ${{estimated_overage_usd}} overage | SNOW: {{open-snow-incident.number}} | Datadog: {{annotate-dd.url}}"
  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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an Azure budget threshold is breached, creates a ServiceNow cost investigation ticket and alerts the FinOps team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure Cost Budget Breach Notification"
  description: "When an Azure budget threshold is breached, creates a ServiceNow cost investigation ticket and alerts the FinOps team in Microsoft Teams."
  tags:
    - finops
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-budget-breach
          description: "Given an Azure subscription and budget breach details, create investigation ticket and notify."
          inputParameters:
            - name: subscription_name
              in: body
              type: string
              description: "Azure subscription name."
            - name: budget_name
              in: body
              type: string
              description: "Budget name."
            - name: current_spend
              in: body
              type: number
              description: "Current spend amount."
            - name: budget_limit
              in: body
              type: number
              description: "Budget limit amount."
          steps:
            - name: create-investigation
              type: call
              call: servicenow.create-incident
              with:
                category: cloud_cost
                short_description: "Azure budget breach: {{budget_name}} on {{subscription_name}} - ${{current_spend}}/${{budget_limit}}"
            - name: notify-finops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finops_team_id"
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Budget Breach: {{subscription_name}} | {{budget_name}} | Spend: ${{current_spend}} / Limit: ${{budget_limit}} | SNOW: {{create-investigation.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an Azure DevOps pipeline build fails, creates a Jira bug and notifies the development team in Microsoft Teams with build logs.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Failure Notification"
  description: "When an Azure DevOps pipeline build fails, creates a Jira bug and notifies the development team in Microsoft Teams with build logs."
  tags:
    - devops
    - azure-devops
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: handle-build-failure
          description: "Given an Azure DevOps build ID and pipeline name, create a Jira bug and notify dev team."
          inputParameters:
            - name: build_id
              in: body
              type: string
              description: "Azure DevOps build ID."
            - name: pipeline_name
              in: body
              type: string
              description: "Pipeline name."
            - name: error_log
              in: body
              type: string
              description: "Build error log excerpt."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: DEV
                issuetype: Bug
                summary: "Build Failure: {{pipeline_name}} #{{build_id}}"
                description: "{{error_log}}"
            - name: notify-dev
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_dev_team_id"
                channel_id: "$secrets.teams_builds_channel_id"
                text: "Build Failed: {{pipeline_name}} #{{build_id}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an Azure DevOps release pipeline is triggered, creates a ServiceNow standard change request and notifies the CAB in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Release to ServiceNow Change"
  description: "When an Azure DevOps release pipeline is triggered, creates a ServiceNow standard change request and notifies the CAB in Microsoft Teams."
  tags:
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: create-change-from-release
          description: "Given an Azure DevOps release, create a ServiceNow change request and notify CAB."
          inputParameters:
            - name: release_name
              in: body
              type: string
              description: "Release pipeline name."
            - name: environment
              in: body
              type: string
              description: "Target environment."
            - name: release_id
              in: body
              type: string
              description: "Release ID."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                type: standard
                short_description: "Release: {{release_name}} to {{environment}} ({{release_id}})"
            - name: notify-cab
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_cab_channel_id"
                text: "Release Change: {{release_name}} -> {{environment}} | SNOW: {{create-change.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Azure Policy detects a non-compliant resource, creates a Jira remediation ticket and notifies the cloud governance team.

naftiko: "0.5"
info:
  label: "Azure Resource Compliance to Jira Remediation"
  description: "When Azure Policy detects a non-compliant resource, creates a Jira remediation ticket and notifies the cloud governance team."
  tags:
    - compliance
    - azure
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-governance
      port: 8080
      tools:
        - name: handle-compliance-violation
          description: "Given a non-compliant Azure resource, create a remediation ticket and notify governance."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Azure resource ID."
            - name: policy_name
              in: body
              type: string
              description: "Azure Policy name."
            - name: compliance_state
              in: body
              type: string
              description: "Compliance state."
          steps:
            - name: create-remediation
              type: call
              call: jira.create-issue
              with:
                project_key: CLOUD
                issuetype: Task
                summary: "Compliance: {{policy_name}} violation on {{resource_id}}"
                description: "State: {{compliance_state}}"
            - name: notify-governance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_cloud_team_id"
                channel_id: "$secrets.teams_governance_channel_id"
                text: "Compliance Violation: {{policy_name}} | Resource: {{resource_id}} | Jira: {{create-remediation.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Lists all resources within an Azure resource group for asset inventory and cost allocation purposes.

naftiko: "0.5"
info:
  label: "Azure Resource Group Inventory"
  description: "Lists all resources within an Azure resource group for asset inventory and cost allocation purposes."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: list-resource-group-resources
          description: "Given an Azure subscription ID and resource group name, return the list of resources with their types and locations."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
          call: azure.list-resources
          with:
            subscriptionId: "{{subscription_id}}"
            resourceGroupName: "{{resource_group}}"
          outputParameters:
            - name: resources
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resources
          path: "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/resources"
          inputParameters:
            - name: subscriptionId
              in: path
            - name: resourceGroupName
              in: path
          operations:
            - name: list-resources
              method: GET

When Azure Defender raises a security alert, creates a ServiceNow security incident and notifies the SOC team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure Security Alert to Incident Response"
  description: "When Azure Defender raises a security alert, creates a ServiceNow security incident and notifies the SOC team in Microsoft Teams."
  tags:
    - security
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: handle-security-alert
          description: "Given an Azure security alert ID and severity, create a ServiceNow security incident and notify SOC."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Azure Defender alert ID."
            - name: alert_name
              in: body
              type: string
              description: "Security alert name."
            - name: severity
              in: body
              type: string
              description: "Alert severity level."
          steps:
            - name: create-sec-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                short_description: "Azure Security: {{alert_name}}"
                urgency: "{{severity}}"
            - name: notify-soc
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_soc_channel_id"
                text: "Azure Security Alert: {{alert_name}} | Severity: {{severity}} | SNOW: {{create-sec-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the current power state of an Azure virtual machine for infrastructure status monitoring.

naftiko: "0.5"
info:
  label: "Azure VM Power State Check"
  description: "Checks the current power state of an Azure virtual machine for infrastructure status monitoring."
  tags:
    - cloud
    - azure
    - compute
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-vm-power-state
          description: "Given a subscription, resource group, and VM name, return the current power state."
          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: vm_name
              in: body
              type: string
              description: "Azure virtual machine name."
          call: azure.get-vm-status
          with:
            subscriptionId: "{{subscription_id}}"
            resourceGroupName: "{{resource_group}}"
            vmName: "{{vm_name}}"
          outputParameters:
            - name: power_state
              type: string
              mapping: "$.statuses[1].displayStatus"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: virtual-machines
          path: "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Compute/virtualMachines/{{vmName}}/instanceView"
          inputParameters:
            - name: subscriptionId
              in: path
            - name: resourceGroupName
              in: path
            - name: vmName
              in: path
          operations:
            - name: get-vm-status
              method: GET

Retrieves the content and metadata of a Confluence page by page ID for knowledge base queries.

naftiko: "0.5"
info:
  label: "Confluence Page Content Lookup"
  description: "Retrieves the content and metadata of a Confluence page by page ID for knowledge base queries."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page-content
          description: "Given a Confluence page ID, return the page title, body content, and last modified date."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID."
          call: confluence.get-page
          with:
            id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
            - name: last_modified
              type: string
              mapping: "$.version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-page
              method: GET

Syncs an updated Confluence runbook page to a ServiceNow knowledge base article and notifies the operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Confluence Runbook to ServiceNow KB Sync"
  description: "Syncs an updated Confluence runbook page to a ServiceNow knowledge base article and notifies the operations team in Microsoft Teams."
  tags:
    - knowledge-management
    - confluence
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: knowledge-management
      port: 8080
      tools:
        - name: sync-runbook-to-kb
          description: "Given a Confluence page ID, sync content to ServiceNow KB and notify operations."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID."
            - name: kb_category
              in: body
              type: string
              description: "ServiceNow KB category."
          steps:
            - name: get-page
              type: call
              call: confluence.get-page
              with:
                id: "{{page_id}}"
            - name: create-kb-article
              type: call
              call: servicenow.create-kb-article
              with:
                title: "{{get-page.title}}"
                category: "{{kb_category}}"
                body: "{{get-page.body}}"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Runbook synced to SNOW KB: {{get-page.title}} | Category: {{kb_category}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: kb-articles
          path: "/table/kb_knowledge"
          operations:
            - name: create-kb-article
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Datadog triggers a critical alert, creates a ServiceNow P1 incident and pages the on-call engineer via PagerDuty.

naftiko: "0.5"
info:
  label: "Datadog Alert to ServiceNow Incident"
  description: "When Datadog triggers a critical alert, creates a ServiceNow P1 incident and pages the on-call engineer via PagerDuty."
  tags:
    - observability
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert ID and service name, create a ServiceNow incident and page on-call engineer."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog alert ID."
            - name: service_name
              in: body
              type: string
              description: "Affected service name."
            - name: alert_message
              in: body
              type: string
              description: "Alert message text."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                short_description: "Datadog Alert: {{service_name}} - {{alert_message}}"
                urgency: "1"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_infra_service_id"
                title: "Datadog Alert: {{service_name}}"
                body: "Alert {{alert_id}}: {{alert_message}} | SNOW: {{create-incident.number}}"
            - name: annotate-dd
              type: call
              call: datadog.create-event
              with:
                title: "Incident created for {{service_name}}"
                text: "SNOW: {{create-incident.number}} | PD: {{page-oncall.id}}"
                alert_type: info
  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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When Datadog APM detects a latency degradation after deployment, triggers a GitHub Actions rollback workflow and creates a Jira incident ticket.

naftiko: "0.5"
info:
  label: "Datadog APM Degradation to Rollback"
  description: "When Datadog APM detects a latency degradation after deployment, triggers a GitHub Actions rollback workflow and creates a Jira incident ticket."
  tags:
    - observability
    - datadog
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: deployment-safety
      port: 8080
      tools:
        - name: handle-apm-degradation
          description: "Given a degraded service and deployment SHA, trigger rollback and create incident ticket."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Degraded service name."
            - name: deployment_sha
              in: body
              type: string
              description: "Git commit SHA of the problematic deployment."
            - name: latency_ms
              in: body
              type: number
              description: "Current P99 latency in milliseconds."
          steps:
            - name: trigger-rollback
              type: call
              call: github.create-dispatch
              with:
                owner: dell-technologies
                repo: "{{service_name}}"
                event_type: rollback
                sha: "{{deployment_sha}}"
            - name: create-incident
              type: call
              call: jira.create-issue
              with:
                project_key: OPS
                issuetype: Bug
                summary: "Latency degradation: {{service_name}} - {{latency_ms}}ms P99"
                description: "Rollback triggered for SHA {{deployment_sha}}"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Rollback triggered: {{service_name}} | SHA: {{deployment_sha}} | P99: {{latency_ms}}ms | Jira: {{create-incident.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dispatches
          path: "/repos/{{owner}}/{{repo}}/dispatches"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-dispatch
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves p95 and p99 latency metrics for a specified service from Datadog APM and returns a structured latency summary for operations review.

naftiko: "0.5"
info:
  label: "Datadog APM Service Latency Monitor"
  description: "Retrieves p95 and p99 latency metrics for a specified service from Datadog APM and returns a structured latency summary for operations review."
  tags:
    - observability
    - monitoring
    - datadog
    - operations
capability:
  exposes:
    - type: mcp
      namespace: apm-monitoring
      port: 8080
      tools:
        - name: get-service-latency
          description: "Given a service name and time window, retrieve p95 and p99 latency metrics from Datadog APM. Use to assess service performance before and after deployments."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Name of the service to query (e.g. order-api, auth-service)."
            - name: from_timestamp
              in: body
              type: integer
              description: "Start of the query window as a Unix epoch timestamp."
            - name: to_timestamp
              in: body
              type: integer
              description: "End of the query window as a Unix epoch timestamp."
          call: datadog.query-metrics
          with:
            query: "avg:trace.web.request.duration.by_service{service:{{service_name}}} by {service}"
            from: "{{from_timestamp}}"
            to: "{{to_timestamp}}"
          outputParameters:
            - name: series
              type: array
              mapping: "$.series"
  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: metrics-query
          path: "/query"
          inputParameters:
            - name: query
              in: query
            - name: from
              in: query
            - name: to
              in: query
          operations:
            - name: query-metrics
              method: GET

When Datadog detects disk usage above 85 percent, creates a ServiceNow capacity planning request and notifies the infrastructure team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Disk Usage to Capacity Planning"
  description: "When Datadog detects disk usage above 85 percent, creates a ServiceNow capacity planning request and notifies the infrastructure team in Microsoft Teams."
  tags:
    - infrastructure
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: capacity-planning
      port: 8080
      tools:
        - name: handle-disk-usage-alert
          description: "Given a host and disk usage percentage, create a capacity request and notify infra."
          inputParameters:
            - name: host_name
              in: body
              type: string
              description: "Hostname with high disk usage."
            - name: disk_usage_pct
              in: body
              type: number
              description: "Current disk usage percentage."
            - name: mount_point
              in: body
              type: string
              description: "Filesystem mount point."
          steps:
            - name: create-request
              type: call
              call: servicenow.create-incident
              with:
                category: capacity
                short_description: "Disk capacity: {{host_name}} at {{disk_usage_pct}}% on {{mount_point}}"
            - name: annotate-dd
              type: call
              call: datadog.create-event
              with:
                title: "Capacity request: {{host_name}}"
                text: "SNOW: {{create-request.number}}"
                alert_type: warning
            - name: notify-infra
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_infra_team_id"
                channel_id: "$secrets.teams_infra_channel_id"
                text: "Disk Alert: {{host_name}} at {{disk_usage_pct}}% on {{mount_point}} | SNOW: {{create-request.number}}"
  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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Datadog detects an error rate spike correlated with a feature flag, creates a Jira incident for the feature team and notifies in Teams.

naftiko: "0.5"
info:
  label: "Datadog Error Rate to Feature Flag Disable"
  description: "When Datadog detects an error rate spike correlated with a feature flag, creates a Jira incident for the feature team and notifies in Teams."
  tags:
    - observability
    - datadog
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: feature-management
      port: 8080
      tools:
        - name: handle-error-rate-spike
          description: "Given a service with error rate spike and feature flag, create incident and notify."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Service name with error rate spike."
            - name: feature_flag
              in: body
              type: string
              description: "Feature flag name."
            - name: error_rate
              in: body
              type: number
              description: "Current error rate percentage."
          steps:
            - name: create-incident
              type: call
              call: jira.create-issue
              with:
                project_key: OPS
                issuetype: Bug
                summary: "Error spike: {{service_name}} ({{error_rate}}%) - flag: {{feature_flag}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Error spike: {{service_name}} at {{error_rate}}% | Flag: {{feature_flag}} | Jira: {{create-incident.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current status of all critical infrastructure monitors from Datadog and returns a structured health summary for operations dashboards.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Summary"
  description: "Retrieves the current status of all critical infrastructure monitors from Datadog and returns a structured health summary for operations dashboards."
  tags:
    - observability
    - operations
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: infra-health
      port: 8080
      tools:
        - name: get-infrastructure-health
          description: "Given a Datadog environment tag, retrieve all monitor statuses for the infrastructure services in that environment and return a structured health report. Use at the start of any incident investigation."
          inputParameters:
            - name: environment_tag
              in: body
              type: string
              description: "Datadog environment tag to filter monitors (e.g. env:production)."
          call: datadog.get-monitors
          with:
            monitor_tags: "{{environment_tag}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  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"
          inputParameters:
            - name: monitor_tags
              in: query
          operations:
            - name: get-monitors
              method: GET

When Datadog detects an anomalous log pattern, creates a ServiceNow security investigation and notifies the SOC via PagerDuty.

naftiko: "0.5"
info:
  label: "Datadog Log Anomaly to Security Investigation"
  description: "When Datadog detects an anomalous log pattern, creates a ServiceNow security investigation and notifies the SOC via PagerDuty."
  tags:
    - security
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: log-security
      port: 8080
      tools:
        - name: handle-log-anomaly
          description: "Given a Datadog log anomaly, create a security investigation and page SOC."
          inputParameters:
            - name: anomaly_type
              in: body
              type: string
              description: "Type of log anomaly detected."
            - name: source
              in: body
              type: string
              description: "Log source."
            - name: sample_log
              in: body
              type: string
              description: "Sample log entry."
          steps:
            - name: create-investigation
              type: call
              call: servicenow.create-incident
              with:
                category: security
                short_description: "Log Anomaly: {{anomaly_type}} from {{source}}"
            - name: page-soc
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_soc_service_id"
                title: "Log Anomaly: {{anomaly_type}} - {{source}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Queries the current health status of a monitored service in Datadog by service name.

naftiko: "0.5"
info:
  label: "Datadog Service Status Check"
  description: "Queries the current health status of a monitored service in Datadog by service name."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-status
          description: "Given a Datadog service name, return the current monitor status and last evaluation timestamp."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Name of the service to check in Datadog."
          call: datadog.search-monitors
          with:
            query: "service:{{service_name}}"
          outputParameters:
            - name: monitor_id
              type: integer
              mapping: "$.monitors[0].id"
            - name: status
              type: string
              mapping: "$.monitors[0].overall_state"
            - name: name
              type: string
              mapping: "$.monitors[0].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/search"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-monitors
              method: GET

When a Datadog synthetic test fails, creates a ServiceNow incident and triggers a PagerDuty alert for the web operations team.

naftiko: "0.5"
info:
  label: "Datadog Synthetic Failure to Incident"
  description: "When a Datadog synthetic test fails, creates a ServiceNow incident and triggers a PagerDuty alert for the web operations team."
  tags:
    - observability
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: synthetic-monitoring
      port: 8080
      tools:
        - name: handle-synthetic-failure
          description: "Given a failed synthetic test, create an incident and page web ops."
          inputParameters:
            - name: test_name
              in: body
              type: string
              description: "Synthetic test name."
            - name: url
              in: body
              type: string
              description: "Monitored URL."
            - name: error_message
              in: body
              type: string
              description: "Test failure error message."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: application
                short_description: "Synthetic test failure: {{test_name}} - {{url}}"
            - name: page-webops
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_webops_service_id"
                title: "Synthetic Failure: {{test_name}}"
                body: "URL: {{url}} | Error: {{error_message}} | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves the health status of a monitored host in Dynatrace by host ID.

naftiko: "0.5"
info:
  label: "Dynatrace Host Health Lookup"
  description: "Retrieves the health status of a monitored host in Dynatrace by host ID."
  tags:
    - observability
    - dynatrace
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-host-health
          description: "Given a Dynatrace host ID, return the host name, health state, and OS type."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "Dynatrace host entity ID."
          call: dynatrace.get-host
          with:
            entityId: "{{host_id}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: health_state
              type: string
              mapping: "$.healthState"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://dell.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{entityId}}"
          inputParameters:
            - name: entityId
              in: path
          operations:
            - name: get-host
              method: GET

When an employee is terminated in Workday, disables their Microsoft 365 account via Microsoft Graph, resolves their open ServiceNow tickets, and notifies IT security in Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Access Revocation"
  description: "When an employee is terminated in Workday, disables their Microsoft 365 account via Microsoft Graph, resolves their open ServiceNow tickets, and notifies IT security in Teams."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: revoke-employee-access
          description: "Given a Workday employee ID and their Microsoft 365 UPN, disable their M365 account, update their ServiceNow user record, and notify IT security in Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the terminated employee."
            - name: upn
              in: body
              type: string
              description: "Microsoft 365 user principal name of the terminated employee."
          steps:
            - name: disable-m365-user
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{upn}}"
                accountEnabled: false
            - name: create-offboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_offboarding
                short_description: "Employee offboarding: {{upn}}"
                assigned_group: IT_Security
            - name: notify-security
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Offboarding complete: {{upn}} (Workday: {{workday_employee_id}}) | M365 disabled | SNOW: {{create-offboarding-ticket.number}}"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new hire is created in Workday, provisions Active Directory access via Microsoft Graph, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestration"
  description: "When a new hire is created in Workday, provisions Active Directory access via Microsoft Graph, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, provision Microsoft 365 access, create a ServiceNow onboarding ticket, and send a Teams welcome message."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format."
            - name: manager_email
              in: body
              type: string
              description: "Email address of the hiring manager."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: provision-user
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-employee.full_name}}"
                userPrincipalName: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
            - name: open-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_onboarding
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                assigned_group: IT_Onboarding
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Dell Technologies, {{get-employee.first_name}}! Your IT ticket: {{open-snow-ticket.number}}"
  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: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When GitHub Actions test suite fails, creates a Jira bug with test logs and alerts the QA channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Actions Test Failure to Teams Alert"
  description: "When GitHub Actions test suite fails, creates a Jira bug with test logs and alerts the QA channel in Microsoft Teams."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: testing
      port: 8080
      tools:
        - name: handle-test-failure
          description: "Given a failed test run, create a Jira bug and notify QA team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository name."
            - name: workflow_name
              in: body
              type: string
              description: "GitHub Actions workflow name."
            - name: failure_summary
              in: body
              type: string
              description: "Test failure summary."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: QA
                issuetype: Bug
                summary: "Test Failure: {{workflow_name}} in {{repo}}"
                description: "{{failure_summary}}"
            - name: notify-qa
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_dev_team_id"
                channel_id: "$secrets.teams_qa_channel_id"
                text: "Test Failure: {{workflow_name}} in {{repo}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub Actions pipeline fails on the main branch, creates a Datadog deployment marker, opens a Jira bug, and sends a Microsoft Teams alert to the engineering channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "When a GitHub Actions pipeline fails on the main branch, creates a Datadog deployment marker, opens a Jira bug, and sends a Microsoft Teams alert to the engineering channel."
  tags:
    - devops
    - cicd
    - github
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow run failure, create a Datadog event, open a Jira bug, and alert the engineering Microsoft Teams channel with full context."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository name where the failure occurred."
            - name: workflow_name
              in: body
              type: string
              description: "Name of the failed GitHub Actions workflow."
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions run ID."
            - name: commit_sha
              in: body
              type: string
              description: "Git commit SHA that triggered the failing run."
            - name: branch
              in: body
              type: string
              description: "Git branch where the failure occurred."
          steps:
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "CI failure: {{workflow_name}} on {{branch}}"
                text: "Run {{run_id}} failed at commit {{commit_sha}} in repo {{repo_name}}"
                alert_type: error
                tags: "env:ci,repo:{{repo_name}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: ENG
                issuetype: Bug
                summary: "[CI Failure] {{repo_name}} / {{workflow_name}} on {{branch}}"
                description: "Run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nDatadog: {{create-dd-event.url}}"
            - name: alert-teams
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_engineering_team_id"
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Pipeline failure: {{workflow_name}} in {{repo_name}} on {{branch}} | Jira: {{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: DD-API-KEY
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When GitHub code scanning finds a high-severity issue, creates a Jira remediation ticket and notifies the security champions in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Code Scanning to Jira Remediation"
  description: "When GitHub code scanning finds a high-severity issue, creates a Jira remediation ticket and notifies the security champions in Microsoft Teams."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: code-security
      port: 8080
      tools:
        - name: handle-code-scanning-alert
          description: "Given a code scanning alert, create a remediation ticket and notify security champions."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository name."
            - name: rule_id
              in: body
              type: string
              description: "Code scanning rule ID."
            - name: file_path
              in: body
              type: string
              description: "Affected file path."
            - name: severity
              in: body
              type: string
              description: "Finding severity."
          steps:
            - name: create-remediation
              type: call
              call: jira.create-issue
              with:
                project_key: SEC
                issuetype: Bug
                summary: "Code Scan: {{rule_id}} in {{repo}} ({{severity}})"
                description: "File: {{file_path}} | Rule: {{rule_id}}"
            - name: notify-security
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_champions_channel_id"
                text: "Code Scanning Alert: {{rule_id}} in {{repo}} | {{severity}} | File: {{file_path}} | Jira: {{create-remediation.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When GitHub Dependabot raises a critical vulnerability, creates a ServiceNow security change request and notifies the AppSec team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Alert to Security Review"
  description: "When GitHub Dependabot raises a critical vulnerability, creates a ServiceNow security change request and notifies the AppSec team in Microsoft Teams."
  tags:
    - security
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: appsec
      port: 8080
      tools:
        - name: handle-dependabot-alert
          description: "Given a GitHub repository and vulnerability details, create a security change request and notify AppSec."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: vulnerability
              in: body
              type: string
              description: "Vulnerability CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Vulnerability severity."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                category: security
                short_description: "Dependabot: {{vulnerability}} in {{repo}} ({{severity}})"
            - name: notify-appsec
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_appsec_channel_id"
                text: "Dependabot Alert: {{vulnerability}} in {{repo}} | Severity: {{severity}} | SNOW: {{create-change.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub pull request is merged, transitions the linked Jira issue to Done and posts a release note to Confluence.

naftiko: "0.5"
info:
  label: "GitHub PR Merge to Jira Transition"
  description: "When a GitHub pull request is merged, transitions the linked Jira issue to Done and posts a release note to Confluence."
  tags:
    - devops
    - github
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: release-management
      port: 8080
      tools:
        - name: handle-pr-merge
          description: "Given a merged PR number and linked Jira issue key, transition the issue and publish a release note."
          inputParameters:
            - name: pr_number
              in: body
              type: integer
              description: "GitHub pull request number."
            - name: issue_key
              in: body
              type: string
              description: "Linked Jira issue key."
            - name: repo
              in: body
              type: string
              description: "Repository name."
          steps:
            - name: transition-jira
              type: call
              call: jira.transition-issue
              with:
                issue_id: "{{issue_key}}"
                transition: Done
            - name: create-release-note
              type: call
              call: confluence.create-page
              with:
                spaceKey: REL
                title: "Release: {{issue_key}} - PR #{{pr_number}}"
                body: "PR #{{pr_number}} merged in {{repo}}. Jira: {{issue_key}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_dev_team_id"
                channel_id: "$secrets.teams_releases_channel_id"
                text: "Merged PR #{{pr_number}} for {{issue_key}} in {{repo}} | Release note: {{create-release-note.id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: transition-issue
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves repository metadata from GitHub including language, default branch, and open issue count.

naftiko: "0.5"
info:
  label: "GitHub Repository Details Lookup"
  description: "Retrieves repository metadata from GitHub including language, default branch, and open issue count."
  tags:
    - devops
    - github
    - repositories
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repository-details
          description: "Given an organization and repository name, return the primary language, default branch, and open issues count."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "GitHub organization name."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
          call: github.get-repo
          with:
            owner: "{{org}}"
            repo: "{{repo}}"
          outputParameters:
            - name: language
              type: string
              mapping: "$.language"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues
              type: integer
              mapping: "$.open_issues_count"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{owner}}/{{repo}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

When GitHub Dependabot or code scanning detects a critical vulnerability, creates a ServiceNow security incident and notifies the security team in Microsoft Teams for immediate remediation.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub Dependabot or code scanning detects a critical vulnerability, creates a ServiceNow security incident and notifies the security team in Microsoft Teams for immediate remediation."
  tags:
    - security
    - devops
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-devops
      port: 8080
      tools:
        - name: triage-security-vulnerability
          description: "Given a GitHub repository, vulnerability ID, and severity level, create a ServiceNow security incident and alert the security engineering Microsoft Teams channel for triage."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository containing the vulnerability."
            - name: vulnerability_id
              in: body
              type: string
              description: "CVE or GitHub advisory ID for the vulnerability."
            - name: severity
              in: body
              type: string
              description: "Vulnerability severity: critical, high, medium, or low."
            - name: package_name
              in: body
              type: string
              description: "Affected dependency package name."
          steps:
            - name: create-security-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security_vulnerability
                impact: 1
                urgency: 1
                short_description: "{{severity}} vulnerability {{vulnerability_id}} in {{repo_name}}: {{package_name}}"
                assigned_group: Security_Engineering
            - name: notify-security-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "{{severity}} vulnerability detected: {{vulnerability_id}} in {{repo_name}} ({{package_name}}) | SNOW: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current stage and amount of a HubSpot deal by deal ID.

naftiko: "0.5"
info:
  label: "HubSpot Deal Stage Lookup"
  description: "Retrieves the current stage and amount of a HubSpot deal by deal ID."
  tags:
    - crm
    - hubspot
    - sales
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-deal-stage
          description: "Given a HubSpot deal ID, return the deal name, stage, and amount."
          inputParameters:
            - name: deal_id
              in: body
              type: string
              description: "HubSpot deal ID."
          call: hubspot.get-deal
          with:
            dealId: "{{deal_id}}"
          outputParameters:
            - name: deal_name
              type: string
              mapping: "$.properties.dealname"
            - name: stage
              type: string
              mapping: "$.properties.dealstage"
            - name: amount
              type: number
              mapping: "$.properties.amount"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: deals
          path: "/objects/deals/{{dealId}}"
          inputParameters:
            - name: dealId
              in: path
          operations:
            - name: get-deal
              method: GET

When a HubSpot marketing form is submitted, creates or updates a Salesforce lead and notifies the SDR team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "HubSpot Form Submission to Salesforce Lead"
  description: "When a HubSpot marketing form is submitted, creates or updates a Salesforce lead and notifies the SDR team in Microsoft Teams."
  tags:
    - marketing
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-management
      port: 8080
      tools:
        - name: import-hubspot-lead
          description: "Given a HubSpot form submission, create a Salesforce lead and notify SDRs."
          inputParameters:
            - name: form_name
              in: body
              type: string
              description: "HubSpot form name."
            - name: lead_email
              in: body
              type: string
              description: "Submitted email address."
            - name: lead_name
              in: body
              type: string
              description: "Submitted name."
            - name: company
              in: body
              type: string
              description: "Company name."
          steps:
            - name: create-sf-lead
              type: call
              call: salesforce.create-lead
              with:
                Email: "{{lead_email}}"
                LastName: "{{lead_name}}"
                Company: "{{company}}"
                LeadSource: "HubSpot - {{form_name}}"
            - name: notify-sdrs
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_sales_team_id"
                channel_id: "$secrets.teams_sdr_channel_id"
                text: "New lead from HubSpot: {{lead_name}} at {{company}} | Form: {{form_name}} | SF: {{create-sf-lead.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When all stories in a Jira epic are completed, generates a summary in Confluence and sends a stakeholder update in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Jira Epic Completion to Stakeholder Update"
  description: "When all stories in a Jira epic are completed, generates a summary in Confluence and sends a stakeholder update in Microsoft Teams."
  tags:
    - project-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: stakeholder-comms
      port: 8080
      tools:
        - name: handle-epic-completion
          description: "Given a completed Jira epic, generate a summary and notify stakeholders."
          inputParameters:
            - name: epic_key
              in: body
              type: string
              description: "Jira epic key."
            - name: epic_summary
              in: body
              type: string
              description: "Epic summary."
            - name: story_count
              in: body
              type: integer
              description: "Number of completed stories."
          steps:
            - name: create-summary
              type: call
              call: confluence.create-page
              with:
                spaceKey: PROJ
                title: "Epic Complete: {{epic_key}} - {{epic_summary}}"
                body: "{{story_count}} stories completed for {{epic_key}}: {{epic_summary}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_product_team_id"
                channel_id: "$secrets.teams_stakeholders_channel_id"
                text: "Epic Complete: {{epic_key}} - {{epic_summary}} | {{story_count}} stories | Summary: {{create-summary.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current status, assignee, and priority of a Jira issue by issue key.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves the current status, assignee, and priority of a Jira issue by issue key."
  tags:
    - project-management
    - jira
    - issue-tracking
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: get-issue-status
          description: "Given a Jira issue key, return the current status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key (e.g. PROJ-1234)."
          call: jira.get-issue
          with:
            issue_id: "{{issue_key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_id}}"
          inputParameters:
            - name: issue_id
              in: path
          operations:
            - name: get-issue
              method: GET

When a Jira release is published, generates a changelog in Confluence and posts a summary to the product Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Release to Confluence Changelog"
  description: "When a Jira release is published, generates a changelog in Confluence and posts a summary to the product Microsoft Teams channel."
  tags:
    - release-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-management
      port: 8080
      tools:
        - name: publish-release-changelog
          description: "Given a Jira project and version, generate a changelog in Confluence and notify."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: version_name
              in: body
              type: string
              description: "Release version name."
            - name: release_date
              in: body
              type: string
              description: "Release date."
          steps:
            - name: create-changelog
              type: call
              call: confluence.create-page
              with:
                spaceKey: REL
                title: "Release {{version_name}} - {{release_date}}"
                body: "Changelog for {{project_key}} {{version_name}}"
            - name: notify-product
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_product_team_id"
                channel_id: "$secrets.teams_releases_channel_id"
                text: "Release {{version_name}} published | Changelog: {{create-changelog.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Jira for unresolved and unestimated backlog items across engineering projects and posts a weekly grooming digest to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Backlog Digest"
  description: "Queries Jira for unresolved and unestimated backlog items across engineering projects and posts a weekly grooming digest to the engineering Microsoft Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: eng-reporting
      port: 8080
      tools:
        - name: digest-sprint-backlog
          description: "Given a Jira project key, retrieve all unestimated and stale backlog items, then post a weekly digest to the engineering Microsoft Teams channel for grooming prioritisation."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key to analyse (e.g. ENG, PLAT)."
          steps:
            - name: search-backlog
              type: call
              call: jira.search-issues
              with:
                jql: "project = {{project_key}} AND status = Backlog AND (story_points is EMPTY OR updated <= -14d) ORDER BY created ASC"
                maxResults: 50
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_engineering_team_id"
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Weekly backlog digest — {{project_key}}: {{search-backlog.total}} items need grooming (unestimated or stale >14d). Review in Jira."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/search"
          inputParameters:
            - name: jql
              in: query
            - name: maxResults
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a LinkedIn campaign generates new leads, imports them into Salesforce and sends a lead notification to the sales team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Campaign to Salesforce Lead Import"
  description: "When a LinkedIn campaign generates new leads, imports them into Salesforce and sends a lead notification to the sales team in Microsoft Teams."
  tags:
    - marketing
    - linkedin
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-generation
      port: 8080
      tools:
        - name: import-linkedin-leads
          description: "Given a LinkedIn campaign ID, import generated leads to Salesforce and notify sales."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "LinkedIn campaign ID."
            - name: lead_name
              in: body
              type: string
              description: "Lead full name."
            - name: lead_email
              in: body
              type: string
              description: "Lead email address."
            - name: company
              in: body
              type: string
              description: "Lead company name."
          steps:
            - name: create-sf-lead
              type: call
              call: salesforce.create-lead
              with:
                LastName: "{{lead_name}}"
                Email: "{{lead_email}}"
                Company: "{{company}}"
                LeadSource: LinkedIn
            - name: notify-sales
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_sales_team_id"
                channel_id: "$secrets.teams_leads_channel_id"
                text: "New LinkedIn lead: {{lead_name}} at {{company}} | Campaign: {{campaign_id}} | SF: {{create-sf-lead.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Enriches a Salesforce lead with LinkedIn profile data to provide the sales team with current title, company, and role context before prospect outreach.

naftiko: "0.5"
info:
  label: "LinkedIn Sales Intelligence Enrichment"
  description: "Enriches a Salesforce lead with LinkedIn profile data to provide the sales team with current title, company, and role context before prospect outreach."
  tags:
    - sales
    - crm
    - salesforce
    - linkedin
    - enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-lead-from-linkedin
          description: "Given a Salesforce lead ID and LinkedIn member URN, retrieve LinkedIn profile data and update the Salesforce lead record with current title, company, and industry for pre-call research."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID to enrich."
            - name: linkedin_member_urn
              in: body
              type: string
              description: "LinkedIn member URN for the prospect."
          steps:
            - name: get-linkedin-profile
              type: call
              call: linkedin.get-profile
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: update-lead
              type: call
              call: salesforce.update-lead
              with:
                lead_id: "{{lead_id}}"
                title: "{{get-linkedin-profile.headline}}"
                linkedin_url: "https://www.linkedin.com/in/{{get-linkedin-profile.vanityName}}"
                industry: "{{get-linkedin-profile.industry}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

Lists all channels in a Microsoft Teams team for routing notifications and messages.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel List"
  description: "Lists all channels in a Microsoft Teams team for routing notifications and messages."
  tags:
    - collaboration
    - microsoft-teams
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: list-team-channels
          description: "Given a Microsoft Teams team ID, return the list of channels with names and IDs."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
          call: msteams.list-channels
          with:
            teamId: "{{team_id}}"
          outputParameters:
            - name: channels
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{teamId}}/channels"
          inputParameters:
            - name: teamId
              in: path
          operations:
            - name: list-channels
              method: GET

Books a Microsoft Teams meeting room via Microsoft Graph Calendar API for a given organizer, time slot, and attendee list, confirming the booking in the Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Teams Meeting Room Booking"
  description: "Books a Microsoft Teams meeting room via Microsoft Graph Calendar API for a given organizer, time slot, and attendee list, confirming the booking in the Teams channel."
  tags:
    - communication
    - microsoft-teams
    - microsoft-365
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: meeting-management
      port: 8080
      tools:
        - name: book-meeting-room
          description: "Given an organizer UPN, meeting subject, start and end time, and list of attendees, create a Microsoft Teams meeting event via Graph API and send the invite to all attendees."
          inputParameters:
            - name: organizer_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the meeting organizer."
            - name: subject
              in: body
              type: string
              description: "Meeting subject or agenda title."
            - name: start_time
              in: body
              type: string
              description: "Meeting start time in ISO 8601 format."
            - name: end_time
              in: body
              type: string
              description: "Meeting end time in ISO 8601 format."
            - name: attendee_upns
              in: body
              type: string
              description: "Comma-separated list of attendee UPNs."
          call: msgraph.create-event
          with:
            organizer: "{{organizer_upn}}"
            subject: "{{subject}}"
            start: "{{start_time}}"
            end: "{{end_time}}"
            attendees: "{{attendee_upns}}"
          outputParameters:
            - name: event_id
              type: string
              mapping: "$.id"
            - name: join_url
              type: string
              mapping: "$.onlineMeeting.joinUrl"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/users/{{organizer_upn}}/events"
          inputParameters:
            - name: organizer_upn
              in: path
          operations:
            - name: create-event
              method: POST

When Okta detects suspicious login activity, creates a ServiceNow security incident and alerts the SOC team via PagerDuty and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Suspicious Activity to SOC Alert"
  description: "When Okta detects suspicious login activity, creates a ServiceNow security incident and alerts the SOC team via PagerDuty and Microsoft Teams."
  tags:
    - security
    - okta
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given an Okta user and suspicious event details, create a security incident and alert SOC."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "Email of the user with suspicious activity."
            - name: event_type
              in: body
              type: string
              description: "Type of suspicious event."
            - name: ip_address
              in: body
              type: string
              description: "Source IP address."
          steps:
            - name: create-sec-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                short_description: "Suspicious Okta activity: {{user_email}} - {{event_type}} from {{ip_address}}"
            - name: page-soc
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_soc_service_id"
                title: "Okta Alert: {{event_type}} - {{user_email}}"
            - name: notify-soc
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_soc_channel_id"
                text: "Okta Alert: {{user_email}} | {{event_type}} | IP: {{ip_address}} | SNOW: {{create-sec-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current status and last login timestamp of an Okta user by email address.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Retrieves the current status and last login timestamp of an Okta user by email address."
  tags:
    - identity
    - okta
    - security
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-status
          description: "Given an email address, retrieve the Okta user status, last login, and MFA enrollment state."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email address of the Okta user."
          call: okta.get-user
          with:
            login: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
            - name: user_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dell.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves the lifecycle state of an Oracle Cloud Infrastructure compute instance.

naftiko: "0.5"
info:
  label: "Oracle Cloud Instance Status"
  description: "Retrieves the lifecycle state of an Oracle Cloud Infrastructure compute instance."
  tags:
    - cloud
    - oracle-cloud
    - compute
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-instance-status
          description: "Given an OCI instance OCID, return the lifecycle state, shape, and availability domain."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "OCI compute instance OCID."
          call: oci.get-instance
          with:
            instanceId: "{{instance_id}}"
          outputParameters:
            - name: lifecycle_state
              type: string
              mapping: "$.lifecycleState"
            - name: shape
              type: string
              mapping: "$.shape"
  consumes:
    - type: http
      namespace: oci
      baseUri: "https://iaas.us-ashburn-1.oraclecloud.com/20160918"
      authentication:
        type: bearer
        token: "$secrets.oci_token"
      resources:
        - name: instances
          path: "/instances/{{instanceId}}"
          inputParameters:
            - name: instanceId
              in: path
          operations:
            - name: get-instance
              method: GET

When PagerDuty creates a major incident, posts a status update to Confluence and creates an incident timeline page.

naftiko: "0.5"
info:
  label: "PagerDuty Incident to Statuspage Update"
  description: "When PagerDuty creates a major incident, posts a status update to Confluence and creates an incident timeline page."
  tags:
    - incident-management
    - pagerduty
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-communications
      port: 8080
      tools:
        - name: publish-incident-status
          description: "Given a PagerDuty incident, create a status update and incident timeline page."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "PagerDuty incident ID."
            - name: incident_title
              in: body
              type: string
              description: "Incident title."
            - name: service_name
              in: body
              type: string
              description: "Affected service name."
          steps:
            - name: create-timeline
              type: call
              call: confluence.create-page
              with:
                spaceKey: INC
                title: "Incident: {{incident_title}} - {{incident_id}}"
                body: "Service: {{service_name}} | PagerDuty: {{incident_id}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_incident_team_id"
                channel_id: "$secrets.teams_status_channel_id"
                text: "Major Incident: {{incident_title}} | Service: {{service_name}} | Timeline: {{create-timeline.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current on-call engineer for a PagerDuty escalation policy.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty escalation policy."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: incident-management
      port: 8080
      tools:
        - name: get-on-call-engineer
          description: "Given a PagerDuty escalation policy ID, return the current on-call engineer name and contact."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "PagerDuty escalation policy ID."
          call: pagerduty.get-on-calls
          with:
            escalation_policy_ids: "{{policy_id}}"
          outputParameters:
            - name: on_call_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: on_call_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: escalation_policy_ids
              in: query
          operations:
            - name: get-on-calls
              method: GET

Checks the last refresh status of a Power BI dataset to verify data currency for reporting.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status of a Power BI dataset to verify data currency for reporting."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Given a Power BI workspace and dataset ID, return the last refresh status and completion time."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: powerbi.get-refresh-history
          with:
            groupId: "{{workspace_id}}"
            datasetId: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{groupId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: groupId
              in: path
            - name: datasetId
              in: path
          operations:
            - name: get-refresh-history
              method: GET

When a Power BI scheduled refresh fails, creates a Jira support ticket and posts the error details to the analytics Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Power BI Report Failure to Jira Ticket"
  description: "When a Power BI scheduled refresh fails, creates a Jira support ticket and posts the error details to the analytics Microsoft Teams channel."
  tags:
    - analytics
    - power-bi
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: handle-report-failure
          description: "Given a Power BI dataset name and error details, create a Jira ticket and notify analytics team."
          inputParameters:
            - name: dataset_name
              in: body
              type: string
              description: "Power BI dataset name."
            - name: workspace_name
              in: body
              type: string
              description: "Power BI workspace name."
            - name: error_message
              in: body
              type: string
              description: "Refresh error message."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: ANALYTICS
                issuetype: Bug
                summary: "Power BI Refresh Failure: {{dataset_name}}"
                description: "Workspace: {{workspace_name}} — Error: {{error_message}}"
            - name: notify-analytics
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_analytics_team_id"
                channel_id: "$secrets.teams_analytics_channel_id"
                text: "Power BI Refresh Failed: {{dataset_name}} in {{workspace_name}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a Power BI dataset refresh for the global sales performance report after Snowflake data pipelines complete, ensuring current revenue data is available to sales leadership.

naftiko: "0.5"
info:
  label: "Power BI Sales Performance Report Refresh"
  description: "Triggers a Power BI dataset refresh for the global sales performance report after Snowflake data pipelines complete, ensuring current revenue data is available to sales leadership."
  tags:
    - analytics
    - sales
    - power-bi
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-sales-performance-report
          description: "Given a Power BI dataset ID and reporting period, trigger a dataset refresh so the global sales performance report reflects the latest Snowflake pipeline data."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period label for logging (e.g. Q1-2026)."
          steps:
            - name: verify-data-load
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT MAX(loaded_at) as last_load FROM pipeline_audit WHERE pipeline = 'sales_data' AND status = 'success'"
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dell.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Escalates a high-severity Salesforce support case by creating a GitHub issue and notifying the engineering on-call via PagerDuty.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to Engineering"
  description: "Escalates a high-severity Salesforce support case by creating a GitHub issue and notifying the engineering on-call via PagerDuty."
  tags:
    - support
    - salesforce
    - github
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: support-escalation
      port: 8080
      tools:
        - name: escalate-case-to-engineering
          description: "Given a Salesforce case number, escalate to engineering by creating a GitHub issue and paging on-call."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID."
            - name: case_subject
              in: body
              type: string
              description: "Case subject line."
            - name: case_description
              in: body
              type: string
              description: "Case description."
          steps:
            - name: create-gh-issue
              type: call
              call: github.create-issue
              with:
                owner: dell-technologies
                repo: product-issues
                title: "Escalation: {{case_subject}}"
                body: "Salesforce Case: {{case_id}} — {{case_description}}"
            - name: page-engineering
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_eng_service_id"
                title: "Case Escalation: {{case_subject}}"
                body: "SF Case: {{case_id}} | GH: {{create-gh-issue.html_url}}"
            - name: update-case
              type: call
              call: salesforce.update-case
              with:
                id: "{{case_id}}"
                Status: Escalated
                Engineering_Ref__c: "{{create-gh-issue.html_url}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-case
              method: PATCH
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{{owner}}/{{repo}}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When Salesforce Einstein predicts churn risk, creates a customer success Jira task and logs the intervention in Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce Churn Signal to Retention Workflow"
  description: "When Salesforce Einstein predicts churn risk, creates a customer success Jira task and logs the intervention in Salesforce."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retention
      port: 8080
      tools:
        - name: handle-churn-signal
          description: "Given a Salesforce account with churn risk, create a retention task and notify CS team."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: account_name
              in: body
              type: string
              description: "Account name."
            - name: churn_probability
              in: body
              type: number
              description: "Predicted churn probability."
          steps:
            - name: create-retention-task
              type: call
              call: jira.create-issue
              with:
                project_key: CS
                issuetype: Task
                summary: "Churn Prevention: {{account_name}} ({{churn_probability}}% risk)"
            - name: notify-cs
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_cs_team_id"
                channel_id: "$secrets.teams_retention_channel_id"
                text: "Churn Risk: {{account_name}} | Probability: {{churn_probability}}% | Jira: {{create-retention-task.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Looks up a Salesforce contact by email address and returns the contact record with account association.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Looks up a Salesforce contact by email address and returns the contact record with account association."
  tags:
    - crm
    - salesforce
    - contacts
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-contact-by-email
          description: "Given an email address, retrieve the matching Salesforce contact record including name, title, and associated account."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email address of the contact to look up."
          call: salesforce.query-contacts
          with:
            q: "SELECT Id, Name, Title, Account.Name, Email FROM Contact WHERE Email = '{{email}}'"
          outputParameters:
            - name: contact_id
              type: string
              mapping: "$.records[0].Id"
            - name: contact_name
              type: string
              mapping: "$.records[0].Name"
            - name: account_name
              type: string
              mapping: "$.records[0].Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-contacts
              method: GET

Retrieves a Salesforce enterprise customer account record and returns key health indicators including open cases, last activity, and contract status for account management review.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Health Review"
  description: "Retrieves a Salesforce enterprise customer account record and returns key health indicators including open cases, last activity, and contract status for account management review."
  tags:
    - sales
    - crm
    - salesforce
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: account-management
      port: 8080
      tools:
        - name: get-account-health
          description: "Given a Salesforce account ID, retrieve the account's health indicators including open support cases, last activity date, and active contract status. Use for quarterly business reviews and customer success planning."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID for the enterprise customer."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: account_name
              type: string
              mapping: "$.Name"
            - name: owner_name
              type: string
              mapping: "$.Owner.Name"
            - name: last_activity_date
              type: string
              mapping: "$.LastActivityDate"
            - name: annual_revenue
              type: number
              mapping: "$.AnnualRevenue"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.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: get-account
              method: GET

When a high-value Salesforce lead submits a product feature request, creates a Jira feature ticket and notifies the product team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead to Jira Feature Request"
  description: "When a high-value Salesforce lead submits a product feature request, creates a Jira feature ticket and notifies the product team in Microsoft Teams."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-feedback
      port: 8080
      tools:
        - name: create-feature-request-from-lead
          description: "Given a Salesforce lead ID and feature description, create a Jira feature request and notify the product team."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID."
            - name: feature_summary
              in: body
              type: string
              description: "Summary of the requested feature."
            - name: feature_description
              in: body
              type: string
              description: "Detailed description of the feature request."
          steps:
            - name: get-lead
              type: call
              call: salesforce.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: PROD
                issuetype: Story
                summary: "Feature Request: {{feature_summary}}"
                description: "Requested by {{get-lead.Name}} ({{get-lead.Company}}): {{feature_description}}"
            - name: notify-product
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_product_team_id"
                channel_id: "$secrets.teams_product_channel_id"
                text: "New feature request from {{get-lead.Company}}: {{feature_summary}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls Salesforce campaign performance metrics for a given quarter and posts a digest summary to the marketing Microsoft Teams channel for leadership review.

naftiko: "0.5"
info:
  label: "Salesforce Marketing Campaign Performance Digest"
  description: "Pulls Salesforce campaign performance metrics for a given quarter and posts a digest summary to the marketing Microsoft Teams channel for leadership review."
  tags:
    - marketing
    - salesforce
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a Salesforce campaign type and date range, retrieve performance metrics across all active campaigns and post a summary digest to the marketing Microsoft Teams channel."
          inputParameters:
            - name: campaign_type
              in: body
              type: string
              description: "Salesforce campaign type to filter (e.g. Email, Webinar, Trade Show)."
            - name: start_date
              in: body
              type: string
              description: "ISO 8601 start date for the performance report."
            - name: end_date
              in: body
              type: string
              description: "ISO 8601 end date for the performance report."
          steps:
            - name: query-campaigns
              type: call
              call: salesforce.search-campaigns
              with:
                type: "{{campaign_type}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_marketing_team_id"
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "Campaign digest ({{campaign_type}}) for {{start_date}} to {{end_date}}: {{query-campaigns.total}} campaigns found. Total responses: {{query-campaigns.total_responses}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: search-campaigns
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Salesforce opportunity reaches the Proposal stage, creates a corresponding SAP quotation and updates the Salesforce opportunity with the SAP quote number.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Quote Sync"
  description: "When a Salesforce opportunity reaches the Proposal stage, creates a corresponding SAP quotation and updates the Salesforce opportunity with the SAP quote number."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: sales-erp
      port: 8080
      tools:
        - name: sync-opportunity-to-quote
          description: "Given a Salesforce opportunity ID at Proposal stage, create a SAP sales quotation and write the SAP quote reference back to the Salesforce opportunity record."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID that has reached the Proposal stage."
            - name: customer_account_id
              in: body
              type: string
              description: "SAP customer account number for the prospect."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-quote
              type: call
              call: sap-sales.create-quotation
              with:
                customer_id: "{{customer_account_id}}"
                description: "{{get-opportunity.name}}"
                total_amount: "{{get-opportunity.amount}}"
                currency: USD
            - name: update-opportunity
              type: call
              call: salesforce-update.update-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_quote_number: "{{create-sap-quote.quotation_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-sales
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/SD_SALES_QUOTATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quotations
          path: "/A_SalesQuotation"
          operations:
            - name: create-quotation
              method: POST
    - type: http
      namespace: salesforce-update
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

When a Salesforce CPQ quote is approved, generates a contract document and sends it for electronic signature, then updates Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce Quote Approval to Contract Send"
  description: "When a Salesforce CPQ quote is approved, generates a contract document and sends it for electronic signature, then updates Salesforce."
  tags:
    - quote-to-cash
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quote-to-cash
      port: 8080
      tools:
        - name: send-quote-for-signature
          description: "Given an approved Salesforce quote, send for electronic signature and update records."
          inputParameters:
            - name: quote_id
              in: body
              type: string
              description: "Salesforce quote ID."
            - name: account_name
              in: body
              type: string
              description: "Account name."
            - name: quote_amount
              in: body
              type: number
              description: "Quote total amount."
          steps:
            - name: update-sf
              type: call
              call: salesforce.update-quote
              with:
                id: "{{quote_id}}"
                Status: "Sent for Signature"
            - name: notify-sales
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_sales_team_id"
                channel_id: "$secrets.teams_deals_channel_id"
                text: "Quote sent for signature: {{account_name}} | ${{quote_amount}} | Quote: {{quote_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: quotes
          path: "/sobjects/Quote/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-quote
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Salesforce opportunity shows renewal risk, creates a Jira customer success task and sends an alert to the account team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Risk to Customer Success"
  description: "When a Salesforce opportunity shows renewal risk, creates a Jira customer success task and sends an alert to the account team in Microsoft Teams."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: handle-renewal-risk
          description: "Given a Salesforce opportunity with renewal risk, create a CS task and notify the account team."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: account_name
              in: body
              type: string
              description: "Account name."
            - name: risk_score
              in: body
              type: number
              description: "Renewal risk score (0-100)."
          steps:
            - name: create-cs-task
              type: call
              call: jira.create-issue
              with:
                project_key: CS
                issuetype: Task
                summary: "Renewal Risk: {{account_name}} (Score: {{risk_score}})"
                description: "Opportunity {{opportunity_id}} flagged for renewal risk."
            - name: notify-account-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_cs_team_id"
                channel_id: "$secrets.teams_cs_channel_id"
                text: "Renewal Risk Alert: {{account_name}} | Risk Score: {{risk_score}} | Jira: {{create-cs-task.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Salesforce territory assignment changes, updates lead routing rules and notifies affected reps in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Territory Change to Routing Update"
  description: "When a Salesforce territory assignment changes, updates lead routing rules and notifies affected reps in Microsoft Teams."
  tags:
    - crm
    - salesforce
    - microsoft-teams
    - sales-ops
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: handle-territory-change
          description: "Given a territory reassignment, update routing rules and notify affected reps."
          inputParameters:
            - name: territory_name
              in: body
              type: string
              description: "Territory name."
            - name: new_owner
              in: body
              type: string
              description: "New territory owner."
            - name: previous_owner
              in: body
              type: string
              description: "Previous territory owner."
          steps:
            - name: update-routing
              type: call
              call: salesforce.update-territory
              with:
                Name: "{{territory_name}}"
                OwnerId: "{{new_owner}}"
            - name: notify-sales-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_sales_team_id"
                channel_id: "$secrets.teams_sales_ops_channel_id"
                text: "Territory Change: {{territory_name}} | From: {{previous_owner}} -> To: {{new_owner}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territories
          path: "/sobjects/Territory2"
          operations:
            - name: update-territory
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Salesforce opportunity is marked Closed Won, creates a sales order in SAP S/4HANA and confirms the order in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Win to SAP Sales Order Creation"
  description: "When a Salesforce opportunity is marked Closed Won, creates a sales order in SAP S/4HANA and confirms the order in Microsoft Teams."
  tags:
    - order-management
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-management
      port: 8080
      tools:
        - name: create-sales-order-from-win
          description: "Given a Salesforce opportunity ID, create a SAP sales order and confirm."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: account_name
              in: body
              type: string
              description: "Customer account name."
            - name: deal_amount
              in: body
              type: number
              description: "Deal amount in USD."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-order
              type: call
              call: sap.create-sales-order
              with:
                order_type: OR
                customer: "{{account_name}}"
                amount: "{{deal_amount}}"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_sales_team_id"
                channel_id: "$secrets.teams_orders_channel_id"
                text: "New sales order: {{account_name}} | ${{deal_amount}} | SAP: {{create-sap-order.order_number}} | SF: {{opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a contract summary from SAP Ariba by contract ID for procurement compliance queries.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Lookup"
  description: "Retrieves a contract summary from SAP Ariba by contract ID for procurement compliance queries."
  tags:
    - procurement
    - sap-ariba
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-contract-summary
          description: "Given a SAP Ariba contract ID, return the contract title, status, and expiration date."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "SAP Ariba contract workspace ID."
          call: ariba.get-contract
          with:
            contractId: "{{contract_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: status
              type: string
              mapping: "$.status"
            - name: expiration_date
              type: string
              mapping: "$.expirationDate"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts/{{contractId}}"
          inputParameters:
            - name: contractId
              in: path
          operations:
            - name: get-contract
              method: GET

When a procurement requisition is submitted in SAP Ariba above the approval threshold, creates a ServiceNow approval task and notifies the procurement manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Requisition Approval"
  description: "When a procurement requisition is submitted in SAP Ariba above the approval threshold, creates a ServiceNow approval task and notifies the procurement manager in Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: initiate-requisition-approval
          description: "Given a SAP Ariba requisition ID and total value, create a ServiceNow approval task and notify the procurement manager in Microsoft Teams to begin the approval workflow."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "SAP Ariba requisition ID requiring approval."
            - name: requisition_value_usd
              in: body
              type: number
              description: "Total value of the procurement requisition in USD."
            - name: requester_name
              in: body
              type: string
              description: "Name of the employee who submitted the requisition."
            - name: manager_upn
              in: body
              type: string
              description: "UPN of the procurement manager who must approve."
          steps:
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                category: procurement
                short_description: "Approval required: SAP Ariba requisition {{requisition_id}} (${{requisition_value_usd}})"
                assigned_to: "{{manager_upn}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Procurement approval needed: Requisition {{requisition_id}} for ${{requisition_value_usd}} submitted by {{requester_name}} | SNOW task: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an expense report exceeds the auto-approval threshold in SAP Concur, creates a ServiceNow approval task and notifies the employee's manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When an expense report exceeds the auto-approval threshold in SAP Concur, creates a ServiceNow approval task and notifies the employee's manager in Microsoft Teams."
  tags:
    - finance
    - expenses
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: escalate-expense-report
          description: "Given a SAP Concur expense report ID and total amount that exceeds the auto-approval threshold, create a ServiceNow approval task and notify the manager in Microsoft Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID requiring manager approval."
            - name: total_amount_usd
              in: body
              type: number
              description: "Total expense report amount in USD."
            - name: employee_name
              in: body
              type: string
              description: "Name of the employee who submitted the expense report."
            - name: manager_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the approving manager."
          steps:
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                category: expense_approval
                short_description: "Expense approval: {{employee_name}} — ${{total_amount_usd}}"
                assigned_to: "{{manager_upn}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Expense approval needed: {{employee_name}} submitted ${{total_amount_usd}} in SAP Concur (Report: {{report_id}}) | Approve in ServiceNow: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an expense report summary from SAP Concur by report ID for audit and approval queries.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Lookup"
  description: "Retrieves an expense report summary from SAP Concur by report ID for audit and approval queries."
  tags:
    - finance
    - sap-concur
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-expense-report
          description: "Given a Concur expense report ID, return the report name, total amount, and approval status."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
          call: concur.get-report
          with:
            id: "{{report_id}}"
          outputParameters:
            - name: report_name
              type: string
              mapping: "$.Name"
            - name: total
              type: number
              mapping: "$.Total"
            - name: status
              type: string
              mapping: "$.ApprovalStatusName"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET

When an SAP Ariba contract approaches expiration, creates a Salesforce renewal opportunity and notifies the procurement manager.

naftiko: "0.5"
info:
  label: "SAP Contract Expiry to Renewal Workflow"
  description: "When an SAP Ariba contract approaches expiration, creates a Salesforce renewal opportunity and notifies the procurement manager."
  tags:
    - procurement
    - sap-ariba
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-management
      port: 8080
      tools:
        - name: handle-contract-expiry
          description: "Given an expiring contract, create a renewal opportunity and notify procurement."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Ariba contract ID."
            - name: contract_title
              in: body
              type: string
              description: "Contract title."
            - name: expiry_date
              in: body
              type: string
              description: "Contract expiration date."
            - name: vendor_name
              in: body
              type: string
              description: "Vendor name."
          steps:
            - name: create-renewal
              type: call
              call: salesforce.create-opportunity
              with:
                Name: "Renewal: {{contract_title}}"
                CloseDate: "{{expiry_date}}"
                StageName: Qualification
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_contracts_channel_id"
                text: "Contract expiring: {{contract_title}} | Vendor: {{vendor_name}} | Expires: {{expiry_date}} | SF Opp: {{create-renewal.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a delivery is confirmed in SAP, updates the Salesforce order record and sends a delivery notification to the customer success team.

naftiko: "0.5"
info:
  label: "SAP Delivery Confirmation to Salesforce Update"
  description: "When a delivery is confirmed in SAP, updates the Salesforce order record and sends a delivery notification to the customer success team."
  tags:
    - logistics
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-fulfillment
      port: 8080
      tools:
        - name: handle-delivery-confirmation
          description: "Given a SAP delivery number, update Salesforce order and notify customer success."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery document number."
            - name: order_id
              in: body
              type: string
              description: "Salesforce order ID."
            - name: tracking_number
              in: body
              type: string
              description: "Shipment tracking number."
          steps:
            - name: update-sf-order
              type: call
              call: salesforce.update-order
              with:
                id: "{{order_id}}"
                Delivery_Status__c: Shipped
                Tracking__c: "{{tracking_number}}"
            - name: notify-cs
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_cs_team_id"
                channel_id: "$secrets.teams_fulfillment_channel_id"
                text: "Delivery confirmed: {{delivery_number}} | Order: {{order_id}} | Tracking: {{tracking_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-order
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a goods receipt is posted in SAP, matches it against pending invoices and notifies accounts payable in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Invoice Match"
  description: "When a goods receipt is posted in SAP, matches it against pending invoices and notifies accounts payable in Microsoft Teams."
  tags:
    - procurement
    - sap
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: match-goods-receipt
          description: "Given a SAP goods receipt number and PO number, match against pending invoices and notify AP."
          inputParameters:
            - name: gr_number
              in: body
              type: string
              description: "SAP goods receipt document number."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
            - name: amount
              in: body
              type: number
              description: "Goods receipt amount."
          steps:
            - name: lookup-invoice
              type: call
              call: sap.lookup-invoice
              with:
                po_number: "{{po_number}}"
                doc_type: invoice
            - name: post-match
              type: call
              call: sap.post-three-way-match
              with:
                gr_number: "{{gr_number}}"
                invoice_ref: "{{lookup-invoice.invoice_number}}"
                match_type: three_way
            - name: notify-ap
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Three-way match: GR {{gr_number}} | PO {{po_number}} | Invoice {{lookup-invoice.invoice_number}} | ${{amount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: lookup-invoice
              method: GET
            - name: post-three-way-match
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When SAP inventory falls below the reorder point, creates an SAP Ariba purchase requisition and notifies the procurement team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Inventory Alert to Procurement Request"
  description: "When SAP inventory falls below the reorder point, creates an SAP Ariba purchase requisition and notifies the procurement team in Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: handle-reorder-alert
          description: "Given a material number and current stock level, create a purchase requisition in Ariba."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: current_stock
              in: body
              type: number
              description: "Current stock quantity."
            - name: reorder_quantity
              in: body
              type: number
              description: "Recommended reorder quantity."
          steps:
            - name: create-pr
              type: call
              call: ariba.create-requisition
              with:
                material: "{{material_number}}"
                quantity: "{{reorder_quantity}}"
                description: "Auto-reorder: stock at {{current_stock}}"
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Reorder triggered: {{material_number}} | Stock: {{current_stock}} | Order Qty: {{reorder_quantity}} | Ariba: {{create-pr.id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves material master data from SAP S/4HANA by material number for procurement and inventory queries.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number for procurement and inventory queries."
  tags:
    - erp
    - sap
    - materials
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material-master
          description: "Given a SAP material number, retrieve the material description, unit of measure, and material group."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number to look up."
          call: sap.get-material
          with:
            Material: "{{material_number}}"
          outputParameters:
            - name: material_description
              type: string
              mapping: "$.d.MaterialName"
            - name: base_unit
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{Material}}')"
          inputParameters:
            - name: Material
              in: path
          operations:
            - name: get-material
              method: GET

When an SAP payment run completes, sends payment remittance details to the vendor management team and updates Salesforce vendor records.

naftiko: "0.5"
info:
  label: "SAP Payment Run to Vendor Notification"
  description: "When an SAP payment run completes, sends payment remittance details to the vendor management team and updates Salesforce vendor records."
  tags:
    - finance
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: accounts-payable
      port: 8080
      tools:
        - name: handle-payment-run
          description: "Given a completed payment run, notify vendor management and update records."
          inputParameters:
            - name: payment_run_id
              in: body
              type: string
              description: "SAP payment run ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: payment_amount
              in: body
              type: number
              description: "Total payment amount."
          steps:
            - name: update-sf-vendor
              type: call
              call: salesforce.update-account
              with:
                Vendor_ID__c: "{{vendor_id}}"
                Last_Payment__c: "{{payment_amount}}"
            - name: notify-ap
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Payment completed: Run {{payment_run_id}} | Vendor: {{vendor_id}} | Amount: ${{payment_amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a purchase order is approved in SAP, syncs the PO to SAP Ariba for supplier collaboration and posts confirmation to the procurement Teams channel.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Approval to Ariba Sync"
  description: "When a purchase order is approved in SAP, syncs the PO to SAP Ariba for supplier collaboration and posts confirmation to the procurement Teams channel."
  tags:
    - procurement
    - sap
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: sync-po-to-ariba
          description: "Given an approved SAP PO number, sync to Ariba and notify procurement."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: total_amount
              in: body
              type: number
              description: "PO total amount."
          steps:
            - name: sync-to-ariba
              type: call
              call: ariba.create-order
              with:
                po_reference: "{{po_number}}"
                vendor: "{{vendor_id}}"
                amount: "{{total_amount}}"
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "PO {{po_number}} synced to Ariba | Vendor: {{vendor_id}} | Amount: ${{total_amount}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a quality inspection in SAP places goods on hold, creates a Jira quality issue and notifies the procurement team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Quality Hold to Supplier Notification"
  description: "When a quality inspection in SAP places goods on hold, creates a Jira quality issue and notifies the procurement team in Microsoft Teams."
  tags:
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-management
      port: 8080
      tools:
        - name: handle-quality-hold
          description: "Given a SAP quality inspection with hold, create a quality issue and notify."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "SAP inspection lot number."
            - name: material
              in: body
              type: string
              description: "Material number."
            - name: vendor_id
              in: body
              type: string
              description: "Supplier vendor ID."
            - name: defect_description
              in: body
              type: string
              description: "Quality defect description."
          steps:
            - name: create-quality-issue
              type: call
              call: jira.create-issue
              with:
                project_key: QA
                issuetype: Bug
                summary: "Quality Hold: {{material}} - {{defect_description}}"
                description: "Inspection lot: {{inspection_lot}} | Vendor: {{vendor_id}}"
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_quality_channel_id"
                text: "Quality Hold: {{material}} | Vendor: {{vendor_id}} | {{defect_description}} | Jira: {{create-quality-issue.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Processes a vendor invoice in SAP S/4HANA by creating an invoice document, matching it to the purchase order, and notifying the accounts payable team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Invoice Processing"
  description: "Processes a vendor invoice in SAP S/4HANA by creating an invoice document, matching it to the purchase order, and notifying the accounts payable team in Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - erp
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: accounts-payable
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given a vendor invoice number, amount, and related PO number, post the invoice in SAP S/4HANA and notify the accounts payable Microsoft Teams channel for payment scheduling."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "Vendor invoice reference number."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number the invoice is matched to."
            - name: invoice_amount_usd
              in: body
              type: number
              description: "Invoice total amount in USD."
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor master ID."
          steps:
            - name: post-invoice
              type: call
              call: sap.create-invoice
              with:
                vendor_id: "{{vendor_id}}"
                invoice_number: "{{invoice_number}}"
                po_number: "{{po_number}}"
                amount: "{{invoice_amount_usd}}"
                currency: USD
            - name: notify-ap-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Invoice posted: {{invoice_number}} for ${{invoice_amount_usd}} from vendor {{vendor_id}} matched to PO {{po_number}} | SAP doc: {{post-invoice.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: create-invoice
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor, and total value for procurement and finance teams.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor, and total value for procurement and finance teams."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total amount, and open line items from SAP S/4HANA. Use for procurement approvals and financial audits."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number (e.g. 4500001234)."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dell-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
              outputRawFormat: xml

Retrieves vendor master data from SAP S/4HANA by vendor ID for procurement and accounts payable queries.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor ID for procurement and accounts payable queries."
  tags:
    - erp
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-vendor-master
          description: "Given a SAP vendor ID, retrieve the vendor name, payment terms, and purchasing organization."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor master ID."
          call: sap.get-vendor
          with:
            Supplier: "{{vendor_id}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dell-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{Supplier}}')"
          inputParameters:
            - name: Supplier
              in: path
          operations:
            - name: get-vendor
              method: GET

When a ServiceNow asset reaches end-of-life, creates an SAP Ariba purchase requisition for replacement and notifies IT asset management.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Refresh to Procurement"
  description: "When a ServiceNow asset reaches end-of-life, creates an SAP Ariba purchase requisition for replacement and notifies IT asset management."
  tags:
    - asset-management
    - servicenow
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-lifecycle
      port: 8080
      tools:
        - name: handle-asset-eol
          description: "Given a ServiceNow asset at end-of-life, create a replacement requisition and notify."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "ServiceNow asset tag."
            - name: asset_type
              in: body
              type: string
              description: "Type of asset."
            - name: assigned_to
              in: body
              type: string
              description: "Current asset assignee."
          steps:
            - name: create-requisition
              type: call
              call: ariba.create-requisition
              with:
                description: "Replacement for {{asset_type}} ({{asset_tag}})"
                assigned_to: "{{assigned_to}}"
            - name: notify-itam
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_team_id"
                channel_id: "$secrets.teams_itam_channel_id"
                text: "Asset EOL: {{asset_tag}} ({{asset_type}}) | Assignee: {{assigned_to}} | Ariba PR: {{create-requisition.id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Creates a ServiceNow change request for planned infrastructure changes, assigns it to the CAB, and posts a Microsoft Teams notification to the change advisory channel.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Workflow"
  description: "Creates a ServiceNow change request for planned infrastructure changes, assigns it to the CAB, and posts a Microsoft Teams notification to the change advisory channel."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: create-change-request
          description: "Given a change description, risk level, and planned change window, create a ServiceNow change request for CAB review and notify the change advisory Microsoft Teams channel."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the planned change."
            - name: change_type
              in: body
              type: string
              description: "Change type: standard, normal, or emergency."
            - name: risk_level
              in: body
              type: string
              description: "Risk assessment: low, medium, or high."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start time in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned change end time in ISO 8601 format."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change-request
              with:
                type: "{{change_type}}"
                risk: "{{risk_level}}"
                short_description: "{{short_description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
            - name: notify-cab
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_cab_team_id"
                channel_id: "$secrets.teams_cab_channel_id"
                text: "Change request submitted: {{short_description}} | Risk: {{risk_level}} | Window: {{planned_start}} to {{planned_end}} | SNOW: {{create-cr.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a ServiceNow change request is approved, triggers a GitHub Actions deployment workflow and updates the change request with deployment status.

naftiko: "0.5"
info:
  label: "ServiceNow Change to GitHub Deployment"
  description: "When a ServiceNow change request is approved, triggers a GitHub Actions deployment workflow and updates the change request with deployment status."
  tags:
    - itsm
    - servicenow
    - github
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: trigger-deployment-from-change
          description: "Given an approved ServiceNow change number, trigger GitHub deployment and update change record."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change request number."
            - name: repo
              in: body
              type: string
              description: "GitHub repository to deploy."
            - name: environment
              in: body
              type: string
              description: "Target deployment environment."
          steps:
            - name: trigger-deploy
              type: call
              call: github.create-dispatch
              with:
                owner: dell-technologies
                repo: "{{repo}}"
                event_type: deploy
                environment: "{{environment}}"
            - name: update-change
              type: call
              call: servicenow.update-change
              with:
                number: "{{change_number}}"
                work_notes: "Deployment triggered for {{repo}} to {{environment}}"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_deployments_channel_id"
                text: "Deployment triggered: {{repo}} -> {{environment}} | Change: {{change_number}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dispatches
          path: "/repos/{{owner}}/{{repo}}/dispatches"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-dispatch
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: update-change
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Looks up a configuration item in the ServiceNow CMDB by hostname or asset tag and returns the full CI record for use in incident response and change management.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Looks up a configuration item in the ServiceNow CMDB by hostname or asset tag and returns the full CI record for use in incident response and change management."
  tags:
    - itsm
    - cmdb
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: cmdb
      port: 8080
      tools:
        - name: get-configuration-item
          description: "Given a hostname or asset tag, retrieve the matching ServiceNow CMDB configuration item record including owner, location, and support group. Use during incident response to identify CI ownership."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "Hostname or asset tag of the configuration item to look up."
          call: servicenow.get-ci
          with:
            name: "{{hostname}}"
          outputParameters:
            - name: ci_name
              type: string
              mapping: "$.result.name"
            - name: support_group
              type: string
              mapping: "$.result.support_group.display_value"
            - name: environment
              type: string
              mapping: "$.result.environment"
            - name: operational_status
              type: string
              mapping: "$.result.operational_status.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb-ci
          path: "/table/cmdb_ci_server"
          inputParameters:
            - name: name
              in: query
          operations:
            - name: get-ci
              method: GET

Retrieves the priority and assignment group for a ServiceNow incident by number to support triage decisions.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Priority Lookup"
  description: "Retrieves the priority and assignment group for a ServiceNow incident by number to support triage decisions."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-priority
          description: "Given a ServiceNow incident number, return the priority, state, and assigned group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g. INC0012345)."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: priority
              type: string
              mapping: "$.result.priority.display_value"
            - name: state
              type: string
              mapping: "$.result.state.display_value"
            - name: assignment_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

When a Datadog monitor detects a P1 infrastructure alert, creates a ServiceNow critical incident, pages the SRE team via PagerDuty, and posts to the IT operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow IT Incident Response"
  description: "When a Datadog monitor detects a P1 infrastructure alert, creates a ServiceNow critical incident, pages the SRE team via PagerDuty, and posts to the IT operations Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-p1-infrastructure-incident
          description: "Given a Datadog P1 alert, create a ServiceNow critical incident, page the on-call SRE team via PagerDuty, and post to the IT operations Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that triggered the P1 alert."
            - name: service_affected
              in: body
              type: string
              description: "Name of the infrastructure service affected."
            - name: alert_message
              in: body
              type: string
              description: "Full alert message from Datadog."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                impact: 1
                urgency: 1
                short_description: "P1: {{service_affected}} — {{alert_message}}"
                assigned_group: SRE_ONCALL
            - name: page-sre
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1 Infrastructure: {{service_affected}}"
                urgency: high
                service_id: "$secrets.pagerduty_infra_service_id"
            - name: notify-teams
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_ops_team_id"
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT: {{service_affected}} | SNOW: {{create-incident.number}} | PD: {{page-sre.html_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: Authorization
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a ServiceNow P1 incident is created, schedules a Microsoft Teams bridge call and pages the incident commander via PagerDuty.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge Setup"
  description: "When a ServiceNow P1 incident is created, schedules a Microsoft Teams bridge call and pages the incident commander via PagerDuty."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: major-incident
      port: 8080
      tools:
        - name: setup-major-incident-bridge
          description: "Given a ServiceNow P1 incident number, set up a Teams bridge and page incident commander."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
            - name: short_description
              in: body
              type: string
              description: "Incident short description."
            - name: business_service
              in: body
              type: string
              description: "Affected business service."
          steps:
            - name: page-ic
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_ic_service_id"
                title: "Major Incident: {{incident_number}} - {{short_description}}"
            - name: create-bridge
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_incident_team_id"
                channel_id: "$secrets.teams_bridge_channel_id"
                text: "MAJOR INCIDENT BRIDGE: {{incident_number}} | {{short_description}} | Service: {{business_service}} | IC paged"
            - name: update-incident
              type: call
              call: servicenow.update-incident
              with:
                number: "{{incident_number}}"
                work_notes: "Bridge created. IC paged via PagerDuty: {{page-ic.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a ServiceNow problem is resolved, creates a knowledge base article in Confluence and updates the ServiceNow known error database.

naftiko: "0.5"
info:
  label: "ServiceNow Problem to Known Error KB"
  description: "When a ServiceNow problem is resolved, creates a knowledge base article in Confluence and updates the ServiceNow known error database."
  tags:
    - itsm
    - servicenow
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: problem-management
      port: 8080
      tools:
        - name: publish-known-error
          description: "Given a resolved ServiceNow problem, create a KB article and update KEDB."
          inputParameters:
            - name: problem_number
              in: body
              type: string
              description: "ServiceNow problem number."
            - name: root_cause
              in: body
              type: string
              description: "Root cause analysis."
            - name: workaround
              in: body
              type: string
              description: "Known workaround."
          steps:
            - name: create-kb-article
              type: call
              call: confluence.create-page
              with:
                spaceKey: KB
                title: "Known Error: {{problem_number}}"
                body: "Root Cause: {{root_cause}} — Workaround: {{workaround}}"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_ops_team_id"
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Known Error published: {{problem_number}} | KB: {{create-kb-article.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Monitors ServiceNow tickets for SLA breaches and escalates overdue tickets by updating priority, assigning to the next tier, and notifying the IT manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Ticket SLA Breach Escalation"
  description: "Monitors ServiceNow tickets for SLA breaches and escalates overdue tickets by updating priority, assigning to the next tier, and notifying the IT manager in Microsoft Teams."
  tags:
    - itsm
    - sla
    - servicenow
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: itsm-sla
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a ServiceNow incident number that has breached its SLA, update the ticket priority, reassign it to tier-2 support, and notify the IT operations manager in Microsoft Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number that has breached its SLA (e.g. INC0012345)."
            - name: breach_minutes
              in: body
              type: integer
              description: "Number of minutes the SLA has been breached."
            - name: it_manager_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the IT operations manager to notify."
          steps:
            - name: escalate-ticket
              type: call
              call: servicenow.update-incident
              with:
                number: "{{incident_number}}"
                priority: 1
                assigned_group: IT_Tier2
                work_notes: "SLA breached by {{breach_minutes}} minutes. Escalated to Tier 2."
            - name: notify-it-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{it_manager_upn}}"
                text: "SLA breach: {{incident_number}} is {{breach_minutes}}min overdue and has been escalated to Tier 2."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When Snowflake credit consumption spikes above threshold, creates a Jira investigation ticket and alerts the FinOps team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Cost Spike to FinOps Alert"
  description: "When Snowflake credit consumption spikes above threshold, creates a Jira investigation ticket and alerts the FinOps team in Microsoft Teams."
  tags:
    - finops
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-cost-spike
          description: "Given Snowflake warehouse and credit usage, create a Jira ticket and notify FinOps."
          inputParameters:
            - name: warehouse_name
              in: body
              type: string
              description: "Snowflake warehouse name."
            - name: credits_used
              in: body
              type: number
              description: "Credits consumed in the period."
            - name: threshold
              in: body
              type: number
              description: "Credit threshold that was exceeded."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: FINOPS
                issuetype: Task
                summary: "Snowflake cost spike: {{warehouse_name}} ({{credits_used}} credits)"
                description: "Warehouse {{warehouse_name}} consumed {{credits_used}} credits, exceeding threshold of {{threshold}}."
            - name: notify-finops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finops_team_id"
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Snowflake Cost Spike: {{warehouse_name}} | Credits: {{credits_used}} (threshold: {{threshold}}) | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Runs daily data quality checks against core Snowflake tables and creates a Jira data quality bug if row counts or null rates fall outside acceptable thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Pipeline Monitor"
  description: "Runs daily data quality checks against core Snowflake tables and creates a Jira data quality bug if row counts or null rates fall outside acceptable thresholds."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table name, expected minimum row count, and check date, execute the data quality check and open a Jira bug if the table fails validation."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name to check (e.g. PROD.SALES.ORDERS)."
            - name: expected_min_rows
              in: body
              type: integer
              description: "Minimum expected row count for the check to pass."
            - name: check_date
              in: body
              type: string
              description: "ISO 8601 date for the data partition being validated."
          steps:
            - name: check-row-count
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT COUNT(*) as row_count FROM {{table_name}} WHERE DATE(created_at) = '{{check_date}}'"
            - name: raise-quality-bug
              type: call
              call: jira.create-issue
              with:
                project_key: DATA
                issuetype: Bug
                summary: "Data quality failure: {{table_name}} on {{check_date}}"
                description: "Table {{table_name}} returned {{check-row-count.row_count}} rows on {{check_date}}, below the minimum threshold of {{expected_min_rows}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dell.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://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a Snowflake ETL pipeline fails, creates a Jira bug ticket and triggers a PagerDuty incident for the data engineering team.

naftiko: "0.5"
info:
  label: "Snowflake ETL Failure to PagerDuty Escalation"
  description: "When a Snowflake ETL pipeline fails, creates a Jira bug ticket and triggers a PagerDuty incident for the data engineering team."
  tags:
    - data-engineering
    - snowflake
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a failed Snowflake task name and error message, create a Jira bug and trigger PagerDuty."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task name that failed."
            - name: error_message
              in: body
              type: string
              description: "Error message from the failed task."
            - name: database
              in: body
              type: string
              description: "Snowflake database name."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: DATA
                issuetype: Bug
                summary: "ETL Failure: {{task_name}} in {{database}}"
                description: "{{error_message}}"
            - name: page-data-eng
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_data_service_id"
                title: "ETL Failure: {{task_name}}"
                body: "Database: {{database}} | Error: {{error_message}} | Jira: {{create-bug.key}}"
            - name: notify-channel
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_data_team_id"
                channel_id: "$secrets.teams_data_alerts_channel_id"
                text: "ETL Failure: {{task_name}} | {{error_message}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a Snowflake stored procedure to refresh sales pipeline aggregates from Salesforce data and notifies the sales analytics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Sales Pipeline Analytics Refresh"
  description: "Triggers a Snowflake stored procedure to refresh sales pipeline aggregates from Salesforce data and notifies the sales analytics team in Microsoft Teams."
  tags:
    - analytics
    - sales
    - snowflake
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-analytics
      port: 8080
      tools:
        - name: refresh-pipeline-analytics
          description: "Given a reporting period, execute the Snowflake sales pipeline refresh procedure and notify the sales analytics Microsoft Teams channel when complete."
          inputParameters:
            - name: period_start
              in: body
              type: string
              description: "ISO 8601 start date for the reporting period."
            - name: period_end
              in: body
              type: string
              description: "ISO 8601 end date for the reporting period."
          steps:
            - name: refresh-pipeline
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL refresh_sales_pipeline_aggregates('{{period_start}}', '{{period_end}}')"
            - name: notify-analytics-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_analytics_team_id"
                channel_id: "$secrets.teams_analytics_channel_id"
                text: "Sales pipeline analytics refreshed for {{period_start}} to {{period_end}}. Status: {{refresh-pipeline.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dell.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Snowflake schema change is detected, creates a Jira data governance review ticket and notifies the data stewards in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Schema Drift to Data Governance"
  description: "When a Snowflake schema change is detected, creates a Jira data governance review ticket and notifies the data stewards in Microsoft Teams."
  tags:
    - data-governance
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: handle-schema-drift
          description: "Given a Snowflake schema change, create a governance review ticket and notify stewards."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database name."
            - name: schema_name
              in: body
              type: string
              description: "Schema name."
            - name: change_description
              in: body
              type: string
              description: "Description of the schema change."
          steps:
            - name: create-review
              type: call
              call: jira.create-issue
              with:
                project_key: DG
                issuetype: Task
                summary: "Schema Drift: {{database}}.{{schema_name}}"
                description: "{{change_description}}"
            - name: notify-stewards
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_data_team_id"
                channel_id: "$secrets.teams_governance_channel_id"
                text: "Schema Drift: {{database}}.{{schema_name}} | {{change_description}} | Jira: {{create-review.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Executes a count query against a Snowflake table and returns the current row count for data validation.

naftiko: "0.5"
info:
  label: "Snowflake Table Row Count"
  description: "Executes a count query against a Snowflake table and returns the current row count for data validation."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: get-table-row-count
          description: "Given a fully qualified Snowflake table name, return the total row count."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name (e.g. PROD.SALES.ORDERS)."
          call: snowflake.execute-query
          with:
            statement: "SELECT COUNT(*) as row_count FROM {{table_name}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.data[0][0]"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a compensation change is finalized in Workday, syncs the update to the payroll system and sends confirmation to the HR business partner.

naftiko: "0.5"
info:
  label: "Workday Compensation Change to Payroll Sync"
  description: "When a compensation change is finalized in Workday, syncs the update to the payroll system and sends confirmation to the HR business partner."
  tags:
    - hr
    - workday
    - microsoft-teams
    - payroll
capability:
  exposes:
    - type: mcp
      namespace: compensation
      port: 8080
      tools:
        - name: sync-compensation-change
          description: "Given a Workday compensation change, sync to payroll and notify HRBP."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_salary
              in: body
              type: number
              description: "New annual salary amount."
            - name: effective_date
              in: body
              type: string
              description: "Change effective date."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: notify-hrbp
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_payroll_channel_id"
                text: "Compensation change synced: {{get-employee.full_name}} | Effective: {{effective_date}} | Payroll updated"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://dell.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an employee profile from Workday by employee ID including job title, department, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by employee ID including job title, department, and manager."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday employee ID, return the employee name, title, department, and manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-worker
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Personal.Name.Full"
            - name: job_title
              type: string
              mapping: "$.Worker.Position.Title"
            - name: department
              type: string
              mapping: "$.Worker.Position.Organization"
            - name: manager
              type: string
              mapping: "$.Worker.Position.Manager.Name"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://dell.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

When Workday headcount changes are approved, updates the Snowflake financial model and refreshes the Power BI headcount dashboard.

naftiko: "0.5"
info:
  label: "Workday Headcount Change to Finance Forecast"
  description: "When Workday headcount changes are approved, updates the Snowflake financial model and refreshes the Power BI headcount dashboard."
  tags:
    - finance
    - workday
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: workforce-planning
      port: 8080
      tools:
        - name: sync-headcount-to-forecast
          description: "Given a headcount change, update financial model and refresh dashboard."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department name."
            - name: headcount_delta
              in: body
              type: integer
              description: "Change in headcount."
            - name: effective_date
              in: body
              type: string
              description: "Change effective date."
          steps:
            - name: update-model
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO FINANCE.HEADCOUNT_CHANGES VALUES ('{{department}}', {{headcount_delta}}, '{{effective_date}}')"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                groupId: "$secrets.powerbi_finance_workspace_id"
                datasetId: "$secrets.powerbi_headcount_dataset_id"
            - name: notify-finance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_fp_and_a_channel_id"
                text: "Headcount change: {{department}} | Delta: {{headcount_delta}} | Effective: {{effective_date}} | Dashboard refreshing"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dell.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{groupId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: groupId
              in: path
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Workday leave request is approved, blocks the employee calendar in Microsoft 365 and notifies the manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Leave Request to Calendar Block"
  description: "When a Workday leave request is approved, blocks the employee calendar in Microsoft 365 and notifies the manager in Microsoft Teams."
  tags:
    - hr
    - workday
    - microsoft-teams
    - calendar
capability:
  exposes:
    - type: mcp
      namespace: leave-management
      port: 8080
      tools:
        - name: handle-leave-approval
          description: "Given an approved leave request, block the employee calendar and notify manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: start_date
              in: body
              type: string
              description: "Leave start date."
            - name: end_date
              in: body
              type: string
              description: "Leave end date."
            - name: leave_type
              in: body
              type: string
              description: "Type of leave."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: notify-manager
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Leave approved: {{get-employee.full_name}} | {{leave_type}} | {{start_date}} to {{end_date}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://dell.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new hire is confirmed in Workday, creates a ServiceNow equipment request and assigns a laptop provisioning task.

naftiko: "0.5"
info:
  label: "Workday New Hire to Equipment Request"
  description: "When a new hire is confirmed in Workday, creates a ServiceNow equipment request and assigns a laptop provisioning task."
  tags:
    - hr
    - workday
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: onboarding
      port: 8080
      tools:
        - name: provision-new-hire-equipment
          description: "Given a new hire employee ID and start date, create an equipment request in ServiceNow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: start_date
              in: body
              type: string
              description: "Employee start date."
            - name: department
              in: body
              type: string
              description: "Department name."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-equip-request
              type: call
              call: servicenow.create-request
              with:
                category: hardware
                short_description: "Equipment request for {{get-employee.full_name}} starting {{start_date}}"
                assigned_group: IT_Asset_Management
            - name: notify-it
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_team_id"
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "New hire equipment: {{get-employee.full_name}} | Dept: {{department}} | Start: {{start_date}} | SNOW: {{create-equip-request.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://dell.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Workday organizational restructure is processed, triggers an Okta access review and creates a ServiceNow audit ticket for compliance.

naftiko: "0.5"
info:
  label: "Workday Org Change to Access Review"
  description: "When a Workday organizational restructure is processed, triggers an Okta access review and creates a ServiceNow audit ticket for compliance."
  tags:
    - compliance
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: handle-org-change
          description: "Given a Workday org change event, trigger access review and create compliance ticket."
          inputParameters:
            - name: org_unit
              in: body
              type: string
              description: "Organizational unit affected."
            - name: change_type
              in: body
              type: string
              description: "Type of organizational change."
            - name: effective_date
              in: body
              type: string
              description: "Change effective date."
          steps:
            - name: create-audit-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: compliance
                short_description: "Org change access review: {{org_unit}} - {{change_type}}"
            - name: notify-compliance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_compliance_team_id"
                channel_id: "$secrets.teams_compliance_channel_id"
                text: "Org Change: {{org_unit}} | {{change_type}} | Effective: {{effective_date}} | SNOW: {{create-audit-ticket.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls the current active headcount from Workday by department and cost center and writes the snapshot to Snowflake for finance planning.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Pulls the current active headcount from Workday by department and cost center and writes the snapshot to Snowflake for finance planning."
  tags:
    - hr
    - finance
    - workday
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Retrieve active employee headcount from Workday segmented by department and cost center, then write the snapshot to Snowflake for workforce planning and finance reporting."
          inputParameters:
            - name: snapshot_date
              in: body
              type: string
              description: "ISO 8601 date for the headcount snapshot."
          steps:
            - name: get-workers
              type: call
              call: workday.list-workers
              with:
                effective_date: "{{snapshot_date}}"
                employment_status: active
            - name: store-snapshot
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO headcount_snapshots (snapshot_date, total_headcount) VALUES ('{{snapshot_date}}', {{get-workers.total_results}})"
  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: "/workers"
          inputParameters:
            - name: effective_date
              in: query
            - name: employment_status
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://dell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a promotion is processed in Workday, updates Okta group memberships and creates a ServiceNow access request for elevated permissions.

naftiko: "0.5"
info:
  label: "Workday Promotion to Access Upgrade"
  description: "When a promotion is processed in Workday, updates Okta group memberships and creates a ServiceNow access request for elevated permissions."
  tags:
    - hr
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-management
      port: 8080
      tools:
        - name: handle-promotion-access
          description: "Given a promoted employee ID and new role, update Okta groups and create access request."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_role
              in: body
              type: string
              description: "New job role title."
            - name: email
              in: body
              type: string
              description: "Employee email address."
          steps:
            - name: update-okta-groups
              type: call
              call: okta.update-user-groups
              with:
                login: "{{email}}"
                new_role: "{{new_role}}"
            - name: create-access-req
              type: call
              call: servicenow.create-request
              with:
                category: access_request
                short_description: "Access upgrade for {{email}} - promoted to {{new_role}}"
            - name: notify-it-sec
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_team_id"
                channel_id: "$secrets.teams_access_channel_id"
                text: "Promotion access update: {{email}} -> {{new_role}} | SNOW: {{create-access-req.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dell.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}/groups"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new headcount requisition is created in Workday, creates a Jira approval task for the hiring committee and notifies the talent acquisition team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Recruiting Position Approval"
  description: "When a new headcount requisition is created in Workday, creates a Jira approval task for the hiring committee and notifies the talent acquisition team in Microsoft Teams."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: initiate-headcount-approval
          description: "Given a Workday requisition ID, job title, and department, create a Jira approval task and notify the talent acquisition Microsoft Teams channel to begin the hiring process."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday position requisition ID."
            - name: job_title
              in: body
              type: string
              description: "Job title for the open position."
            - name: department
              in: body
              type: string
              description: "Department requesting the headcount."
          steps:
            - name: create-approval-task
              type: call
              call: jira.create-issue
              with:
                project_key: HR
                issuetype: Task
                summary: "Headcount approval: {{job_title}} in {{department}}"
                description: "Workday requisition {{requisition_id}} for {{job_title}} in {{department}} requires committee approval before posting."
            - name: notify-ta-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_ta_channel_id"
                text: "New headcount request: {{job_title}} in {{department}} | Jira: {{create-approval-task.key}} | Workday req: {{requisition_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an employee's role changes in Workday, updates their Microsoft 365 group memberships via Microsoft Graph and creates a ServiceNow task to review access rights.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Reprovisioning"
  description: "When an employee's role changes in Workday, updates their Microsoft 365 group memberships via Microsoft Graph and creates a ServiceNow task to review access rights."
  tags:
    - hr
    - access-management
    - workday
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-provisioning
      port: 8080
      tools:
        - name: reprovision-role-change
          description: "Given a Workday employee ID and their new role, update Microsoft 365 security group memberships and create a ServiceNow access review task for IT security to validate the permission changes."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee changing roles."
            - name: upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the employee."
            - name: old_group_id
              in: body
              type: string
              description: "Microsoft 365 group ID of the employee's current role group."
            - name: new_group_id
              in: body
              type: string
              description: "Microsoft 365 group ID of the employee's new role group."
            - name: new_role_title
              in: body
              type: string
              description: "New job title for context in the ServiceNow task."
          steps:
            - name: remove-old-group
              type: call
              call: msgraph.remove-group-member
              with:
                group_id: "{{old_group_id}}"
                user_id: "{{upn}}"
            - name: add-new-group
              type: call
              call: msgraph-new.add-group-member
              with:
                group_id: "{{new_group_id}}"
                user_id: "{{upn}}"
            - name: create-review-task
              type: call
              call: servicenow.create-task
              with:
                category: access_review
                short_description: "Access review: {{upn}} role change to {{new_role_title}}"
                assigned_group: IT_Security
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/{{user_id}}/$ref"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: remove-group-member
              method: DELETE
    - type: http
      namespace: msgraph-new
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/$ref"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a termination is processed in Workday, deactivates the user in Okta and creates a ServiceNow access revocation ticket.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When a termination is processed in Workday, deactivates the user in Okta and creates a ServiceNow access revocation ticket."
  tags:
    - hr
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: handle-termination
          description: "Given a Workday employee ID and termination date, deactivate Okta account and create access revocation ticket."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: termination_date
              in: body
              type: string
              description: "Termination effective date."
            - name: email
              in: body
              type: string
              description: "Employee email address."
          steps:
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                login: "{{email}}"
            - name: create-revocation
              type: call
              call: servicenow.create-incident
              with:
                category: access_revocation
                short_description: "Access revocation for {{email}} - termination {{termination_date}}"
            - name: notify-it
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Terminated: {{email}} | Okta deactivated | SNOW: {{create-revocation.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dell.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Enriches a company record with firmographic data from ZoomInfo by domain name.

naftiko: "0.5"
info:
  label: "ZoomInfo Company Enrichment Lookup"
  description: "Enriches a company record with firmographic data from ZoomInfo by domain name."
  tags:
    - sales
    - zoominfo
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: enrich-company-by-domain
          description: "Given a company website domain, return the ZoomInfo company profile with revenue and employee count."
          inputParameters:
            - name: domain
              in: body
              type: string
              description: "Company website domain (e.g. acme.com)."
          call: zoominfo.enrich-company
          with:
            companyWebsite: "{{domain}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.data[0].companyName"
            - name: revenue
              type: string
              mapping: "$.data[0].revenue"
            - name: employee_count
              type: integer
              mapping: "$.data[0].employeeCount"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-enrich
          path: "/enrich/company"
          operations:
            - name: enrich-company
              method: POST