HP Capabilities

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

Sort
Expand

Submits HP product specifications or internal documents to the Anthropic API for AI-powered summarization and stores the result in SharePoint.

naftiko: "0.5"
info:
  label: "Anthropic Document Summarization"
  description: "Submits HP product specifications or internal documents to the Anthropic API for AI-powered summarization and stores the result in SharePoint."
  tags:
    - ai
    - document-management
    - anthropic
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ai-ops
      port: 8080
      tools:
        - name: summarize-document
          description: "Given a SharePoint document URL, retrieve the document content, send it to the Anthropic API for concise AI summarization, and save the summary back as a new SharePoint page."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "The SharePoint URL of the document to summarize."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the summary should be stored."
          steps:
            - name: get-document
              type: call
              call: "sharepoint-doc.get-file-content"
              with:
                document_url: "{{document_url}}"
            - name: generate-summary
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-opus-4-5"
                prompt: "Summarize the following HP document in 3–5 bullet points: {{get-document.content}}"
            - name: save-summary
              type: call
              call: "sharepoint-save.create-page"
              with:
                site_id: "{{site_id}}"
                title: "AI Summary: {{get-document.filename}}"
                content: "{{generate-summary.completion}}"
  consumes:
    - type: http
      namespace: sharepoint-doc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{document_url}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: document_url
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: sharepoint-save
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: pages
          path: "/sites/{{site_id}}/pages"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-page
              method: POST

Detects HP Azure resource groups exceeding budget and posts a weekly FinOps cost digest to the cloud Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly Responder"
  description: "Detects HP Azure resource groups exceeding budget and posts a weekly FinOps cost digest to the cloud Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finops-reporting
      port: 8080
      tools:
        - name: publish-azure-cost-report
          description: "Query Azure Cost Management for HP resource groups exceeding budget thresholds and post a weekly FinOps digest to the cloud channel in Microsoft Teams."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to query costs for."
            - name: billing_period
              in: body
              type: string
              description: "The billing period in YYYYMM format, e.g. 202603."
          steps:
            - name: get-cost-data
              type: call
              call: "azure-cost.get-usage-details"
              with:
                subscription_id: "{{subscription_id}}"
                billing_period: "{{billing_period}}"
            - name: post-report
              type: call
              call: "msteams-finops.post-channel-message"
              with:
                channel_id: "$secrets.finops_channel_id"
                message: "HP Azure cost report for {{billing_period}}: Total {{get-cost-data.total_cost}} {{get-cost-data.currency}}. Top group: {{get-cost-data.top_group}}."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: usage-details
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Consumption/usageDetails"
          inputParameters:
            - name: subscription_id
              in: path
            - name: billing_period
              in: query
          operations:
            - name: get-usage-details
              method: GET
    - type: http
      namespace: msteams-finops
      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: post-channel-message
              method: POST

When an Azure budget threshold is breached, creates a ServiceNow ticket and alerts FinOps.

naftiko: "0.5"
info:
  label: "Azure Cost Budget Breach Notification"
  description: "When an Azure budget threshold is breached, creates a ServiceNow ticket and alerts FinOps."
  tags:
    - finops
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: azure-cost-budget-breach-notification
          description: "When an Azure budget threshold is breached, creates a ServiceNow ticket and alerts FinOps."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azure
              type: call
              call: azure.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-azure.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              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 Budget Breach Notification: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: records
          path: "/subscriptions"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 build fails, creates a Jira bug and notifies the development team in Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Failure Notification"
  description: "When an Azure DevOps build fails, creates a Jira bug and notifies the development team in Teams."
  tags:
    - devops
    - azure-devops
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: azure-devops-build-failure-notification
          description: "When an Azure DevOps build fails, creates a Jira bug and notifies the development team in Teams."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azdo
              type: call
              call: azdo.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-azdo.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_devops_team_id"
                channel_id: "$secrets.teams_devops_channel_id"
                text: "Azure DevOps Build Failure Notification: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: records
          path: "/pipelines"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 is triggered, creates a ServiceNow standard change and notifies the CAB.

naftiko: "0.5"
info:
  label: "Azure DevOps Release to ServiceNow Change"
  description: "When an Azure DevOps release is triggered, creates a ServiceNow standard change and notifies the CAB."
  tags:
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: azure-devops-release-to-servicenow-change
          description: "When an Azure DevOps release is triggered, creates a ServiceNow standard change and notifies the CAB."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azdo
              type: call
              call: azdo.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-azdo.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_devops_team_id"
                channel_id: "$secrets.teams_devops_channel_id"
                text: "Azure DevOps Release to ServiceNow Change: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: records
          path: "/pipelines"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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.

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."
  tags:
    - compliance
    - azure
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: azure-resource-compliance-to-jira-remediation
          description: "When Azure Policy detects a non-compliant resource, creates a Jira remediation ticket."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azure
              type: call
              call: azure.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-azure.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_compliance_team_id"
                channel_id: "$secrets.teams_compliance_channel_id"
                text: "Azure Resource Compliance to Jira Remediation: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: records
          path: "/subscriptions"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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.

naftiko: "0.5"
info:
  label: "Azure Resource Group Inventory"
  description: "Lists all resources within an Azure resource group."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: list-resources
          description: "Given an Azure resource group, return the resource list."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
          call: azure.list-resources
          with:
            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: 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.

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."
  tags:
    - security
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: azure-security-alert-to-incident-response
          description: "When Azure Defender raises a security alert, creates a ServiceNow security incident and notifies the SOC team."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azure
              type: call
              call: azure.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-azure.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Azure Security Alert to Incident Response: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: records
          path: "/subscriptions"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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.

naftiko: "0.5"
info:
  label: "Azure VM Power State Check"
  description: "Checks the current power state of an Azure virtual machine."
  tags:
    - cloud
    - azure
    - compute
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-vm-power-state
          description: "Given a VM name, return the current power state."
          inputParameters:
            - name: vm_name
              in: body
              type: string
              description: "Azure VM name."
          call: azure.get-vm-status
          with:
            vmName: "{{vm_name}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: vms
          path: "/virtualMachines"
          inputParameters:
            - name: vmName
              in: path
          operations:
            - name: get-vm-status
              method: GET

Retrieves the content and metadata of a Confluence page by page ID.

naftiko: "0.5"
info:
  label: "Confluence Page Content Lookup"
  description: "Retrieves the content and metadata of a Confluence page by page ID."
  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 title and body."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID."
          call: confluence.get-page
          with:
            id: "{{page_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-page
              method: GET

Syncs an updated Confluence runbook to a ServiceNow knowledge base article and notifies operations.

naftiko: "0.5"
info:
  label: "Confluence Runbook to ServiceNow KB Sync"
  description: "Syncs an updated Confluence runbook to a ServiceNow knowledge base article and notifies operations."
  tags:
    - knowledge-management
    - confluence
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: knowledge-management
      port: 8080
      tools:
        - name: confluence-runbook-to-servicenow-kb-sync
          description: "Syncs an updated Confluence runbook to a ServiceNow knowledge base article and notifies operations."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-confluence
              type: call
              call: confluence.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-confluence.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_knowledge_management_team_id"
                channel_id: "$secrets.teams_knowledge_management_channel_id"
                text: "Confluence Runbook to ServiceNow KB Sync: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: records
          path: "/content"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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: observability
      port: 8080
      tools:
        - name: 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."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_observability_team_id"
                channel_id: "$secrets.teams_observability_channel_id"
                text: "Datadog Alert to ServiceNow Incident: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 APM detects latency degradation, triggers a GitHub Actions rollback and creates a Jira incident.

naftiko: "0.5"
info:
  label: "Datadog APM Degradation to Rollback"
  description: "When Datadog APM detects latency degradation, triggers a GitHub Actions rollback and creates a Jira incident."
  tags:
    - observability
    - datadog
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: datadog-apm-degradation-to-rollback
          description: "When Datadog APM detects latency degradation, triggers a GitHub Actions rollback and creates a Jira incident."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-github
              type: call
              call: github.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_observability_team_id"
                channel_id: "$secrets.teams_observability_channel_id"
                text: "Datadog APM Degradation to Rollback: {{source_id}} | {{summary}} | Ref: {{create-github.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: create-record
              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 disk usage above 85 percent, creates a ServiceNow capacity request and notifies infra.

naftiko: "0.5"
info:
  label: "Datadog Disk Usage to Capacity Planning"
  description: "When Datadog detects disk usage above 85 percent, creates a ServiceNow capacity request and notifies infra."
  tags:
    - infrastructure
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: datadog-disk-usage-to-capacity-planning
          description: "When Datadog detects disk usage above 85 percent, creates a ServiceNow capacity request and notifies infra."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_infrastructure_team_id"
                channel_id: "$secrets.teams_infrastructure_channel_id"
                text: "Datadog Disk Usage to Capacity Planning: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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.

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."
  tags:
    - observability
    - datadog
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: datadog-error-rate-to-feature-flag-disable
          description: "When Datadog detects an error rate spike correlated with a feature flag, creates a Jira incident."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_observability_team_id"
                channel_id: "$secrets.teams_observability_channel_id"
                text: "Datadog Error Rate to Feature Flag Disable: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 fires a critical infrastructure alert, creates a ServiceNow incident and notifies the platform engineering Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert Triage"
  description: "When Datadog fires a critical infrastructure alert, creates a ServiceNow incident and notifies the platform engineering Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog monitor ID that has entered alert state, retrieve the alert details, open a ServiceNow incident, and notify the platform engineering channel in Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow-infra.create-incident"
              with:
                short_description: "Datadog alert: {{get-monitor.name}}"
                description: "Monitor: {{get-monitor.name}}\nStatus: {{get-monitor.overall_state}}\nQuery: {{get-monitor.query}}"
                category: "infrastructure"
            - name: notify-platform
              type: call
              call: "msteams-platform.post-channel-message"
              with:
                channel_id: "$secrets.platform_channel_id"
                message: "Datadog alert: {{get-monitor.name}} | SNOW: {{create-incident.number}} | State: {{get-monitor.overall_state}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow-infra
      baseUri: "https://hp.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-platform
      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: post-channel-message
              method: POST

When Datadog detects an anomalous log pattern, creates a ServiceNow investigation and pages SOC.

naftiko: "0.5"
info:
  label: "Datadog Log Anomaly to Security Investigation"
  description: "When Datadog detects an anomalous log pattern, creates a ServiceNow investigation and pages SOC."
  tags:
    - security
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: datadog-log-anomaly-to-security-investigation
          description: "When Datadog detects an anomalous log pattern, creates a ServiceNow investigation and pages SOC."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Datadog Log Anomaly to Security Investigation: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 the current health status of a monitored service in Datadog.

naftiko: "0.5"
info:
  label: "Datadog Service Status Check"
  description: "Queries the current health status of a monitored service in Datadog."
  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."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Name of the service to check."
          call: datadog.search-monitors
          with:
            query: "service:{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.monitors[0].overall_state"
  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.

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."
  tags:
    - observability
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: datadog-synthetic-failure-to-incident
          description: "When a Datadog synthetic test fails, creates a ServiceNow incident and triggers a PagerDuty alert."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-datadog
              type: call
              call: datadog.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-datadog.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_observability_team_id"
                channel_id: "$secrets.teams_observability_channel_id"
                text: "Datadog Synthetic Failure to Incident: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: records
          path: "/events"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 health status of a monitored host in Dynatrace.

naftiko: "0.5"
info:
  label: "Dynatrace Host Health Lookup"
  description: "Retrieves the health status of a monitored host in Dynatrace."
  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 health state."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "Dynatrace host entity ID."
          call: dynatrace.get-host
          with:
            entityId: "{{host_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://api.example.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities"
          inputParameters:
            - name: entityId
              in: path
          operations:
            - name: get-host
              method: GET

When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence across ServiceNow, Microsoft Graph, and Microsoft Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_to: "IT_Onboarding"
            - name: provision-account
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-employee.full_name}}"
                mail: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-employee.work_email}}"
                message: "Welcome to HP, {{get-employee.first_name}}! Your IT ticket is {{create-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: "/hp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://hp.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: 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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Actions Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event with repo name, workflow name, branch, and run URL, open a Jira bug and post an alert to the engineering Teams channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. hp/print-platform."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the pipeline failed."
            - name: run_url
              in: body
              type: string
              description: "The URL to the failed GitHub Actions run."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the pipeline."
          steps:
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch}} — {{workflow_name}}"
                description: "Repo: {{repo_name}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nRun: {{run_url}}"
            - name: notify-engineering
              type: call
              call: "msteams-eng.post-channel-message"
              with:
                channel_id: "$secrets.engineering_channel_id"
                message: "Pipeline failure in {{repo_name}} on {{branch}} | Jira: {{create-jira-bug.key}} | {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-eng
      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: post-channel-message
              method: POST

When GitHub Actions tests fail, creates a Jira bug and alerts the QA channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Actions Test Failure to Teams Alert"
  description: "When GitHub Actions tests fail, creates a Jira bug and alerts the QA channel in Microsoft Teams."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: github-actions-test-failure-to-teams-alert
          description: "When GitHub Actions tests fail, creates a Jira bug and alerts the QA channel in Microsoft Teams."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-github
              type: call
              call: github.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-github.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_devops_team_id"
                channel_id: "$secrets.teams_devops_channel_id"
                text: "GitHub Actions Test Failure to Teams Alert: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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

On a pull request to main, runs SonarQube code quality analysis via GitHub Actions, retrieves the quality gate result, and comments findings on the PR.

naftiko: "0.5"
info:
  label: "GitHub Code Quality Gate Enforcement"
  description: "On a pull request to main, runs SonarQube code quality analysis via GitHub Actions, retrieves the quality gate result, and comments findings on the PR."
  tags:
    - devops
    - code-quality
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: enforce-quality-gate
          description: "Given a GitHub pull request number and repository, retrieve the SonarQube quality gate status for the PR branch, and if the gate fails, open a Jira task and post a blocking comment on the PR."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. hp-inc/print-platform."
            - name: pr_number
              in: body
              type: integer
              description: "The GitHub pull request number."
            - name: branch_name
              in: body
              type: string
              description: "The source branch name of the pull request."
          steps:
            - name: get-quality-gate
              type: call
              call: "github-checks.list-check-runs"
              with:
                repo: "{{repo_name}}"
                ref: "{{branch_name}}"
                check_name: "SonarQube"
            - name: create-jira-task
              type: call
              call: "jira-quality.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Task"
                summary: "Quality gate failed: {{repo_name}} PR#{{pr_number}}"
                description: "Quality gate status: {{get-quality-gate.conclusion}}\nBranch: {{branch_name}}\nRepo: {{repo_name}}"
            - name: post-pr-comment
              type: call
              call: "github-comments.create-review-comment"
              with:
                repo: "{{repo_name}}"
                pull_number: "{{pr_number}}"
                body: "Quality gate failed. Jira task: {{create-jira-task.key}}. Please resolve issues before merging."
  consumes:
    - type: http
      namespace: github-checks
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: check-runs
          path: "/repos/{{repo}}/commits/{{ref}}/check-runs"
          inputParameters:
            - name: repo
              in: path
            - name: ref
              in: path
            - name: check_name
              in: query
          operations:
            - name: list-check-runs
              method: GET
    - type: http
      namespace: jira-quality
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: github-comments
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-comments
          path: "/repos/{{repo}}/issues/{{pull_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: create-review-comment
              method: POST

When code scanning finds a high-severity issue, creates a Jira remediation ticket and notifies security.

naftiko: "0.5"
info:
  label: "GitHub Code Scanning to Jira Remediation"
  description: "When code scanning finds a high-severity issue, creates a Jira remediation ticket and notifies security."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: github-code-scanning-to-jira-remediation
          description: "When code scanning finds a high-severity issue, creates a Jira remediation ticket and notifies security."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-github
              type: call
              call: github.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-github.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "GitHub Code Scanning to Jira Remediation: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 Dependabot raises a critical vulnerability, creates a ServiceNow security change and notifies AppSec.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Alert to Security Review"
  description: "When Dependabot raises a critical vulnerability, creates a ServiceNow security change and notifies AppSec."
  tags:
    - security
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: github-dependabot-alert-to-security-review
          description: "When Dependabot raises a critical vulnerability, creates a ServiceNow security change and notifies AppSec."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-github
              type: call
              call: github.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-github.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "GitHub Dependabot Alert to Security Review: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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: devops
      port: 8080
      tools:
        - name: 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."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-github
              type: call
              call: github.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-github.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_devops_team_id"
                channel_id: "$secrets.teams_devops_channel_id"
                text: "GitHub PR Merge to Jira Transition: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 and default branch.

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

Lists critical Dependabot alerts across HP GitHub repositories and creates Jira security issues for unresolved critical dependencies.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Lists critical Dependabot alerts across HP GitHub repositories and creates Jira security issues for unresolved critical dependencies."
  tags:
    - devops
    - security
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-triage
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given the HP GitHub organization name, list all open Dependabot alerts with critical severity and create a Jira security issue summarizing the findings."
          inputParameters:
            - name: org_name
              in: body
              type: string
              description: "The GitHub organization name, e.g. hp-inc."
          steps:
            - name: get-alerts
              type: call
              call: "github.list-org-dependabot-alerts"
              with:
                org: "{{org_name}}"
                severity: "critical"
                state: "open"
            - name: create-jira-issue
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Dependabot critical alerts: {{get-alerts.total_count}} open in {{org_name}}"
                description: "Organization: {{org_name}}\nCritical alerts: {{get-alerts.total_count}}\nTop package: {{get-alerts.top_package}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/orgs/{{org}}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-org-dependabot-alerts
              method: GET
    - type: http
      namespace: jira-sec
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Looks up an HP SAP S/4HANA purchase order by number and returns header status, vendor, and total value.

naftiko: "0.5"
info:
  label: "HP SAP Purchase Order Lookup"
  description: "Looks up an HP SAP S/4HANA purchase order by number and returns header status, vendor, and total value."
  tags:
    - finance
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and currency from HP's SAP S/4HANA instance."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500012345."
          call: "sap-erp.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-erp
      baseUri: "https://hp-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

Fetches a supplier invoice from SAP Ariba, matches it to the SAP S/4HANA purchase order, and approves the payment workflow.

naftiko: "0.5"
info:
  label: "HP Supplier Invoice Processing"
  description: "Fetches a supplier invoice from SAP Ariba, matches it to the SAP S/4HANA purchase order, and approves the payment workflow."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - invoice-processing
capability:
  exposes:
    - type: mcp
      namespace: ap-automation
      port: 8080
      tools:
        - name: process-supplier-invoice
          description: "Given a SAP Ariba invoice ID, retrieve invoice details, match against the HP SAP S/4HANA purchase order, and submit the payment approval workflow."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba supplier invoice ID."
          steps:
            - name: get-invoice
              type: call
              call: "ariba-inv.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po-match
              type: call
              call: "sap-po-match.get-po"
              with:
                po_number: "{{get-invoice.purchase_order_number}}"
            - name: approve-payment
              type: call
              call: "ariba-pay.approve-invoice"
              with:
                invoice_id: "{{invoice_id}}"
                po_total: "{{get-po-match.total_value}}"
  consumes:
    - type: http
      namespace: ariba-inv
      baseUri: "https://openapi.ariba.com/api/invoice-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-po-match
      baseUri: "https://hp-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
    - type: http
      namespace: ariba-pay
      baseUri: "https://openapi.ariba.com/api/invoice-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoice-approvals
          path: "/{{invoice_id}}/approve"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: approve-invoice
              method: POST

Retrieves the current stage and amount of a HubSpot deal.

naftiko: "0.5"
info:
  label: "HubSpot Deal Stage Lookup"
  description: "Retrieves the current stage and amount of a HubSpot deal."
  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 stage."
          inputParameters:
            - name: deal_id
              in: body
              type: string
              description: "HubSpot deal ID."
          call: hubspot.get-deal
          with:
            dealId: "{{deal_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  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"
          inputParameters:
            - name: dealId
              in: path
          operations:
            - name: get-deal
              method: GET

When a HubSpot form is submitted, creates a Salesforce lead and notifies the SDR team.

naftiko: "0.5"
info:
  label: "HubSpot Form Submission to Salesforce Lead"
  description: "When a HubSpot form is submitted, creates a Salesforce lead and notifies the SDR team."
  tags:
    - marketing
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: hubspot-form-submission-to-salesforce-lead
          description: "When a HubSpot form is submitted, creates a Salesforce lead and notifies the SDR team."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-hubspot
              type: call
              call: hubspot.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-salesforce
              type: call
              call: salesforce.create-record
              with:
                reference: "{{process-hubspot.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_marketing_team_id"
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "HubSpot Form Submission to Salesforce Lead: {{source_id}} | {{summary}} | Ref: {{create-salesforce.id}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: records
          path: "/objects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              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.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves the current status, assignee, and priority of a Jira issue."
  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 and assignee."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          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"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hp.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 notifies the product 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 notifies the product Teams channel."
  tags:
    - release-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-management
      port: 8080
      tools:
        - name: jira-release-to-confluence-changelog
          description: "When a Jira release is published, generates a changelog in Confluence and notifies the product Teams channel."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-jira
              type: call
              call: jira.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-confluence
              type: call
              call: confluence.create-record
              with:
                reference: "{{process-jira.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_release_management_team_id"
                channel_id: "$secrets.teams_release_management_channel_id"
                text: "Jira Release to Confluence Changelog: {{source_id}} | {{summary}} | Ref: {{create-confluence.id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: records
          path: "/content"
          operations:
            - name: create-record
              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

Fetches sprint velocity data from Jira for an HP engineering team and publishes a digest to Confluence and a Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report to Confluence"
  description: "Fetches sprint velocity data from Jira for an HP engineering team and publishes a digest to Confluence and a Teams channel."
  tags:
    - devops
    - reporting
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity-report
          description: "Given a Jira board ID and sprint ID, retrieve completed story points, update the team Confluence velocity page, and post a summary to the team's Microsoft Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID for the engineering team."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-report
              type: call
              call: "jira-agile.get-sprint-report"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: update-confluence
              type: call
              call: "confluence.update-page"
              with:
                page_id: "$secrets.velocity_confluence_page_id"
                content: "Sprint {{sprint_id}} Velocity: {{get-sprint-report.completed_points}} points."
            - name: notify-team
              type: call
              call: "msteams-agile.post-channel-message"
              with:
                channel_id: "$secrets.engineering_channel_id"
                message: "Sprint {{sprint_id}} complete. Velocity: {{get-sprint-report.completed_points}} pts. Confluence updated."
  consumes:
    - type: http
      namespace: jira-agile
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT
    - type: http
      namespace: msteams-agile
      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: post-channel-message
              method: POST

When a LinkedIn campaign generates leads, imports them into Salesforce and notifies the sales team.

naftiko: "0.5"
info:
  label: "LinkedIn Campaign to Salesforce Lead Import"
  description: "When a LinkedIn campaign generates leads, imports them into Salesforce and notifies the sales team."
  tags:
    - marketing
    - linkedin
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: linkedin-campaign-to-salesforce-lead-import
          description: "When a LinkedIn campaign generates leads, imports them into Salesforce and notifies the sales team."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-linkedin
              type: call
              call: linkedin.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-salesforce
              type: call
              call: salesforce.create-record
              with:
                reference: "{{process-linkedin.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_marketing_team_id"
                channel_id: "$secrets.teams_marketing_channel_id"
                text: "LinkedIn Campaign to Salesforce Lead Import: {{source_id}} | {{summary}} | Ref: {{create-salesforce.id}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: records
          path: "/campaigns"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              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

Fetches LinkedIn Campaign Manager performance data for HP employer brand campaigns and publishes a weekly digest to SharePoint.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Brand Campaign Digest"
  description: "Fetches LinkedIn Campaign Manager performance data for HP employer brand campaigns and publishes a weekly digest to SharePoint."
  tags:
    - marketing
    - social
    - linkedin
    - sharepoint
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: talent-brand
      port: 8080
      tools:
        - name: digest-linkedin-campaign
          description: "Given a LinkedIn campaign ID and date range, retrieve impressions, clicks, and applications, then publish a formatted digest to the HP Talent Brand SharePoint page."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn Campaign Manager campaign ID."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-campaign-stats
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: publish-digest
              type: call
              call: "sharepoint.create-page"
              with:
                site_id: "$secrets.talent_brand_site_id"
                title: "LinkedIn Campaign Report {{campaign_id}} {{start_date}} to {{end_date}}"
                content: "Impressions: {{get-campaign-stats.impressions}} | Clicks: {{get-campaign-stats.clicks}} | Applications: {{get-campaign-stats.applications}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2"
          inputParameters:
            - name: campaign_id
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: pages
          path: "/sites/{{site_id}}/pages"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-page
              method: POST

Lists all channels in a Microsoft Teams team.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel List"
  description: "Lists all channels in a Microsoft Teams team."
  tags:
    - collaboration
    - microsoft-teams
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: list-team-channels
          description: "Given a Teams team ID, return the channel list."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
          call: msteams.list-channels
          with:
            teamId: "{{team_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://api.example.com/v1"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams"
          inputParameters:
            - name: teamId
              in: path
          operations:
            - name: list-channels
              method: GET

Lists Okta users without MFA enrolled in HP's tenant and opens a ServiceNow compliance task for the IT security team.

naftiko: "0.5"
info:
  label: "Okta MFA Compliance Audit"
  description: "Lists Okta users without MFA enrolled in HP's tenant and opens a ServiceNow compliance task for the IT security team."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-compliance
      port: 8080
      tools:
        - name: audit-mfa-compliance
          description: "Retrieve a list of active Okta users in HP's tenant without MFA enrolled and create a ServiceNow compliance task summarizing non-compliant accounts."
          steps:
            - name: get-non-mfa-users
              type: call
              call: "okta-audit.list-users-without-mfa"
              with:
                filter: "status eq ACTIVE"
            - name: create-compliance-task
              type: call
              call: "servicenow-audit.create-incident"
              with:
                short_description: "MFA Compliance: {{get-non-mfa-users.count}} active users without MFA"
                description: "Users without MFA enrolled: {{get-non-mfa-users.count}}. Review required for HP security policy compliance."
                category: "security_compliance"
  consumes:
    - type: http
      namespace: okta-audit
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          inputParameters:
            - name: filter
              in: query
          operations:
            - name: list-users-without-mfa
              method: GET
    - type: http
      namespace: servicenow-audit
      baseUri: "https://hp.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

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

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 SOC via PagerDuty."
  tags:
    - security
    - okta
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: okta-suspicious-activity-to-soc-alert
          description: "When Okta detects suspicious login activity, creates a ServiceNow security incident and alerts SOC via PagerDuty."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-okta
              type: call
              call: okta.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-okta.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Okta Suspicious Activity to SOC Alert: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: records
          path: "/users"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 termination is processed in Workday, deactivates the Okta account, revokes Salesforce license, and closes open ServiceNow tickets.

naftiko: "0.5"
info:
  label: "Okta User Deprovisioning on Termination"
  description: "When an employee termination is processed in Workday, deactivates the Okta account, revokes Salesforce license, and closes open ServiceNow tickets."
  tags:
    - hr
    - security
    - offboarding
    - workday
    - okta
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a Workday employee ID for a terminated employee, deactivate their Okta account, revoke Salesforce license, and close open ServiceNow tickets assigned to them."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the terminated employee."
          steps:
            - name: get-employee
              type: call
              call: "workday-term.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: revoke-salesforce
              type: call
              call: "salesforce-depro.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                is_active: "false"
  consumes:
    - type: http
      namespace: workday-term
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/hp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: salesforce-depro
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH

Retrieves the current status and last login of an Okta user.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Retrieves the current status and last login of an Okta user."
  tags:
    - identity
    - okta
    - security
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-status
          description: "Given an email, retrieve the Okta user status."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Okta user email."
          call: okta.get-user
          with:
            login: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://hp.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

When PagerDuty creates a major incident, posts a status update to Confluence and creates a 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 a timeline page."
  tags:
    - incident-management
    - pagerduty
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-management
      port: 8080
      tools:
        - name: pagerduty-incident-to-statuspage-update
          description: "When PagerDuty creates a major incident, posts a status update to Confluence and creates a timeline page."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-pagerduty
              type: call
              call: pagerduty.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-confluence
              type: call
              call: confluence.create-record
              with:
                reference: "{{process-pagerduty.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_incident_management_team_id"
                channel_id: "$secrets.teams_incident_management_channel_id"
                text: "PagerDuty Incident to Statuspage Update: {{source_id}} | {{summary}} | Ref: {{create-confluence.id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: records
          path: "/incidents"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: records
          path: "/content"
          operations:
            - name: create-record
              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 on-call engineer."
          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: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  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

Retrieves the current PagerDuty on-call engineer for an HP service and posts the contact to the operations Teams channel.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current PagerDuty on-call engineer for an HP service and posts the contact to the operations Teams channel."
  tags:
    - itsm
    - operations
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: oncall-ops
      port: 8080
      tools:
        - name: get-oncall-contact
          description: "Given a PagerDuty schedule ID, return the name and contact details of the currently on-call engineer and post the information to the HP ops Teams channel."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID for the HP service team."
          steps:
            - name: get-oncall
              type: call
              call: "pagerduty-oncall.get-oncall"
              with:
                schedule_id: "{{schedule_id}}"
            - name: notify-channel
              type: call
              call: "msteams-oncall.post-channel-message"
              with:
                channel_id: "$secrets.ops_channel_id"
                message: "On-call for schedule {{schedule_id}}: {{get-oncall.user_name}} ({{get-oncall.user_email}})"
  consumes:
    - type: http
      namespace: pagerduty-oncall
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-oncall
              method: GET
    - type: http
      namespace: msteams-oncall
      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: post-channel-message
              method: POST

Checks the last refresh status of a Power BI dataset.

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

Triggers a Power BI dataset refresh for the HP finance reporting dashboard and notifies the finance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Finance Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the HP finance reporting dashboard and notifies the finance team via Microsoft Teams."
  tags:
    - finance
    - reporting
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: refresh-finance-dashboard
          description: "Trigger a Power BI dataset refresh for the HP financial reporting dashboard, then notify the finance Teams channel that data is current."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the finance dashboard."
            - name: period
              in: body
              type: string
              description: "The fiscal period being refreshed, e.g. 2026-Q1."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: "msteams-finance.post-channel-message"
              with:
                channel_id: "$secrets.finance_channel_id"
                message: "HP finance dashboard refreshed for {{period}}. Dataset {{dataset_id}} is now current."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-finance
      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: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Power BI Report Failure to Jira Ticket"
  description: "When a Power BI refresh fails, creates a Jira ticket and posts error details to the analytics Teams channel."
  tags:
    - analytics
    - power-bi
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: power-bi-report-failure-to-jira-ticket
          description: "When a Power BI refresh fails, creates a Jira ticket and posts error details to the analytics Teams channel."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-powerbi
              type: call
              call: powerbi.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-powerbi.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              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 Report Failure to Jira Ticket: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: records
          path: "/datasets"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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

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

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to Engineering"
  description: "Escalates a high-severity Salesforce case by creating a GitHub issue and paging engineering on-call via PagerDuty."
  tags:
    - support
    - salesforce
    - github
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: salesforce-case-escalation-to-engineering
          description: "Escalates a high-severity Salesforce case by creating a GitHub issue and paging engineering on-call via PagerDuty."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-github
              type: call
              call: github.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_support_team_id"
                channel_id: "$secrets.teams_support_channel_id"
                text: "Salesforce Case Escalation to Engineering: {{source_id}} | {{summary}} | Ref: {{create-github.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: create-record
              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 Salesforce predicts churn risk, creates a CS Jira task and logs the intervention.

naftiko: "0.5"
info:
  label: "Salesforce Churn Signal to Retention Workflow"
  description: "When Salesforce predicts churn risk, creates a CS Jira task and logs the intervention."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-churn-signal-to-retention-workflow
          description: "When Salesforce predicts churn risk, creates a CS Jira task and logs the intervention."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Churn Signal to Retention Workflow: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 Salesforce contact by email address with account association.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves a Salesforce contact by email address 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, retrieve the matching Salesforce contact."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Contact email address."
          call: salesforce.query-contacts
          with:
            q: "SELECT Id, Name, Account.Name FROM Contact WHERE Email = '{{email}}'"
          outputParameters:
            - name: contact_id
              type: string
              mapping: "$.records[0].Id"
            - name: contact_name
              type: string
              mapping: "$.records[0].Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.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

After an HP Salesforce opportunity closes, creates an NPS survey follow-up task for the account owner and logs it on the opportunity timeline.

naftiko: "0.5"
info:
  label: "Salesforce Customer NPS Survey Trigger"
  description: "After an HP Salesforce opportunity closes, creates an NPS survey follow-up task for the account owner and logs it on the opportunity timeline."
  tags:
    - sales
    - customer-success
    - salesforce
    - nps
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: trigger-nps-survey
          description: "Given a closed Salesforce opportunity ID, create an NPS follow-up task assigned to the account owner and log a completed activity on the opportunity record."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity ID (18-char) that has been closed."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-nps.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-survey-task
              type: call
              call: "salesforce-task.create-task"
              with:
                what_id: "{{opportunity_id}}"
                owner_id: "{{get-opportunity.owner_id}}"
                subject: "Send NPS survey to {{get-opportunity.account_name}}"
                status: "Not Started"
  consumes:
    - type: http
      namespace: salesforce-nps
      baseUri: "https://hp.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: salesforce-task
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

Enriches new Salesforce leads with firmographic data from ZoomInfo and updates the lead record with company size, revenue, and industry.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment via ZoomInfo"
  description: "Enriches new Salesforce leads with firmographic data from ZoomInfo and updates the lead record with company size, revenue, and industry."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-lead
          description: "Given a Salesforce lead ID, look up the lead's company in ZoomInfo, retrieve firmographic data, and update the Salesforce lead record with enriched fields."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead record ID (18-char SFDC ID)."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-lead.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-company
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{get-lead.company}}"
            - name: update-lead
              type: call
              call: "salesforce-lead-update.update-lead"
              with:
                lead_id: "{{lead_id}}"
                employee_count: "{{enrich-company.employee_count}}"
                annual_revenue: "{{enrich-company.annual_revenue}}"
                industry: "{{enrich-company.industry}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://hp.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: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-lead-update
      baseUri: "https://hp.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

When a high-value Salesforce lead submits a feature request, creates a Jira 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 feature request, creates a Jira ticket and notifies the product team in Microsoft Teams."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-lead-to-jira-feature-request
          description: "When a high-value Salesforce lead submits a feature request, creates a Jira ticket and notifies the product team in Microsoft Teams."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Lead to Jira Feature Request: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 opportunity reaches Closed Won, creates a corresponding SAP S/4HANA sales order and notifies the account team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Sales Order Sync"
  description: "When a Salesforce opportunity reaches Closed Won, creates a corresponding SAP S/4HANA sales order and notifies the account team via Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-erp-sync
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce Opportunity ID that has moved to Closed Won, create a corresponding sales order in SAP S/4HANA and notify the account team channel in Microsoft Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity record ID (18-char SFDC ID)."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: "sap-so.create-sales-order"
              with:
                customer_id: "{{get-opportunity.account_sap_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
            - name: notify-team
              type: call
              call: "msteams-sales.post-channel-message"
              with:
                channel_id: "$secrets.sales_teams_channel"
                message: "Opportunity {{get-opportunity.name}} closed won. SAP SO {{create-sales-order.order_id}} created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.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-so
      baseUri: "https://hp-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-sales
      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: post-channel-message
              method: POST

When a Salesforce CPQ quote is approved, sends it for signature and updates Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce Quote Approval to Contract Send"
  description: "When a Salesforce CPQ quote is approved, sends it for signature and updates Salesforce."
  tags:
    - quote-to-cash
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quote-to-cash
      port: 8080
      tools:
        - name: salesforce-quote-approval-to-contract-send
          description: "When a Salesforce CPQ quote is approved, sends it for signature and updates Salesforce."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_quote_to_cash_team_id"
                channel_id: "$secrets.teams_quote_to_cash_channel_id"
                text: "Salesforce Quote Approval to Contract Send: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 opportunity shows renewal risk, creates a Jira CS task and alerts the account team.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Risk to Customer Success"
  description: "When a Salesforce opportunity shows renewal risk, creates a Jira CS task and alerts the account team."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-renewal-risk-to-customer-success
          description: "When a Salesforce opportunity shows renewal risk, creates a Jira CS task and alerts the account team."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Renewal Risk to Customer Success: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 territory assignment changes, updates lead routing and notifies affected reps.

naftiko: "0.5"
info:
  label: "Salesforce Territory Change to Routing Update"
  description: "When a territory assignment changes, updates lead routing and notifies affected reps."
  tags:
    - crm
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-territory-change-to-routing-update
          description: "When a territory assignment changes, updates lead routing and notifies affected reps."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Territory Change to Routing Update: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 opportunity is Closed Won, creates a SAP sales order and confirms in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Win to SAP Sales Order Creation"
  description: "When a Salesforce opportunity is Closed Won, creates a SAP sales order and confirms in Microsoft Teams."
  tags:
    - order-management
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-management
      port: 8080
      tools:
        - name: salesforce-win-to-sap-sales-order-creation
          description: "When a Salesforce opportunity is Closed Won, creates a SAP sales order and confirms in Microsoft Teams."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-sap
              type: call
              call: sap.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_order_management_team_id"
                channel_id: "$secrets.teams_order_management_channel_id"
                text: "Salesforce Win to SAP Sales Order Creation: {{source_id}} | {{summary}} | Ref: {{create-sap.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: create-record
              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.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Lookup"
  description: "Retrieves a contract summary from SAP Ariba by contract ID."
  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 status."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "SAP Ariba contract ID."
          call: ariba.get-contract
          with:
            contractId: "{{contract_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.example.com/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          inputParameters:
            - name: contractId
              in: path
          operations:
            - name: get-contract
              method: GET

Fetches a pending SAP Ariba purchase requisition, validates budget in SAP S/4HANA, and submits approval or rejection back to Ariba.

naftiko: "0.5"
info:
  label: "SAP Ariba Purchase Requisition Approval"
  description: "Fetches a pending SAP Ariba purchase requisition, validates budget in SAP S/4HANA, and submits approval or rejection back to Ariba."
  tags:
    - procurement
    - finance
    - sap-ariba
    - sap
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: approve-purchase-requisition
          description: "Given a SAP Ariba requisition ID, validate available budget in SAP S/4HANA and approve or reject the requisition based on the budget check."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba purchase requisition ID."
            - name: cost_center
              in: body
              type: string
              description: "The cost center to validate budget against."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: "sap-budget.get-budget-status"
              with:
                cost_center: "{{cost_center}}"
            - name: approve-req
              type: call
              call: "ariba-approval.approve-requisition"
              with:
                requisition_id: "{{requisition_id}}"
                decision: "{{check-budget.status}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap-budget
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget-status
              method: GET
    - type: http
      namespace: ariba-approval
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: approvals
          path: "/{{requisition_id}}/approve"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: approve-requisition
              method: POST

Retrieves submitted SAP Concur expense reports, validates line items against HP T&E policy, and flags non-compliant reports in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Audit"
  description: "Retrieves submitted SAP Concur expense reports, validates line items against HP T&E policy, and flags non-compliant reports in ServiceNow."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: finance-compliance
      port: 8080
      tools:
        - name: audit-expense-report
          description: "Given a SAP Concur expense report ID, retrieve the line items, validate against HP travel and expense policy thresholds, and open a ServiceNow task if violations are found."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: flag-violation
              type: call
              call: "servicenow-fin.create-incident"
              with:
                short_description: "Expense policy violation: Report {{report_id}}"
                description: "Concur report {{report_id}} submitted by {{get-report.employee_name}} contains items requiring review."
                category: "finance_compliance"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow-fin
      baseUri: "https://hp.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

Retrieves an expense report summary from SAP Concur by report ID.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Lookup"
  description: "Retrieves an expense report summary from SAP Concur by report ID."
  tags:
    - finance
    - sap-concur
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-expense-report
          description: "Given a Concur report ID, return the summary."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
          call: concur.get-report
          with:
            id: "{{report_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://api.example.com/v1"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET

When an SAP Ariba contract approaches expiration, creates a Salesforce renewal opportunity.

naftiko: "0.5"
info:
  label: "SAP Contract Expiry to Renewal Workflow"
  description: "When an SAP Ariba contract approaches expiration, creates a Salesforce renewal opportunity."
  tags:
    - procurement
    - sap-ariba
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: sap-contract-expiry-to-renewal-workflow
          description: "When an SAP Ariba contract approaches expiration, creates a Salesforce renewal opportunity."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-ariba
              type: call
              call: ariba.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-salesforce
              type: call
              call: salesforce.create-record
              with:
                reference: "{{process-ariba.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "SAP Contract Expiry to Renewal Workflow: {{source_id}} | {{summary}} | Ref: {{create-salesforce.id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              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 and notifies customer success.

naftiko: "0.5"
info:
  label: "SAP Delivery Confirmation to Salesforce Update"
  description: "When a delivery is confirmed in SAP, updates the Salesforce order and notifies customer success."
  tags:
    - logistics
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: sap-delivery-confirmation-to-salesforce-update
          description: "When a delivery is confirmed in SAP, updates the Salesforce order and notifies customer success."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-salesforce
              type: call
              call: salesforce.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_logistics_team_id"
                channel_id: "$secrets.teams_logistics_channel_id"
                text: "SAP Delivery Confirmation to Salesforce Update: {{source_id}} | {{summary}} | Ref: {{create-salesforce.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              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 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
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: 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."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "SAP Goods Receipt to Invoice Match: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 reorder point, creates an Ariba purchase requisition and notifies procurement.

naftiko: "0.5"
info:
  label: "SAP Inventory Alert to Procurement Request"
  description: "When SAP inventory falls below reorder point, creates an Ariba purchase requisition and notifies procurement."
  tags:
    - supply-chain
    - sap
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: sap-inventory-alert-to-procurement-request
          description: "When SAP inventory falls below reorder point, creates an Ariba purchase requisition and notifies procurement."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-ariba
              type: call
              call: ariba.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_supply_chain_team_id"
                channel_id: "$secrets.teams_supply_chain_channel_id"
                text: "SAP Inventory Alert to Procurement Request: {{source_id}} | {{summary}} | Ref: {{create-ariba.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: create-record
              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 by material number.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP by material number."
  tags:
    - erp
    - sap
    - materials
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material-master
          description: "Given a SAP material number, retrieve the material description."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: sap.get-material
          with:
            Material: "{{material_number}}"
          outputParameters:
            - name: material_description
              type: string
              mapping: "$.d.MaterialName"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-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, notifies vendor management and updates Salesforce records.

naftiko: "0.5"
info:
  label: "SAP Payment Run to Vendor Notification"
  description: "When an SAP payment run completes, notifies vendor management and updates Salesforce records."
  tags:
    - finance
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: sap-payment-run-to-vendor-notification
          description: "When an SAP payment run completes, notifies vendor management and updates Salesforce records."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-salesforce
              type: call
              call: salesforce.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_finance_channel_id"
                text: "SAP Payment Run to Vendor Notification: {{source_id}} | {{summary}} | Ref: {{create-salesforce.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              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 purchase order is approved in SAP, syncs the PO to Ariba 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 Ariba 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: sap-purchase-order-approval-to-ariba-sync
          description: "When a purchase order is approved in SAP, syncs the PO to Ariba and posts confirmation to the procurement Teams channel."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-ariba
              type: call
              call: ariba.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "SAP Purchase Order Approval to Ariba Sync: {{source_id}} | {{summary}} | Ref: {{create-ariba.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: create-record
              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 places goods on hold, creates a Jira quality issue and notifies procurement.

naftiko: "0.5"
info:
  label: "SAP Quality Hold to Supplier Notification"
  description: "When a quality inspection places goods on hold, creates a Jira quality issue and notifies procurement."
  tags:
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: sap-quality-hold-to-supplier-notification
          description: "When a quality inspection places goods on hold, creates a Jira quality issue and notifies procurement."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_quality_team_id"
                channel_id: "$secrets.teams_quality_channel_id"
                text: "SAP Quality Hold to Supplier Notification: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 vendor master data from SAP by vendor ID.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor ID."
  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."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor master ID."
          call: sap.get-vendor
          with:
            Supplier: "{{vendor_id}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://hp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: suppliers
          path: "/A_Supplier"
          inputParameters:
            - name: Supplier
              in: path
          operations:
            - name: get-vendor
              method: GET

When a ServiceNow asset reaches end-of-life, creates an Ariba requisition 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 Ariba requisition and notifies IT asset management."
  tags:
    - asset-management
    - servicenow
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-management
      port: 8080
      tools:
        - name: servicenow-asset-refresh-to-procurement
          description: "When a ServiceNow asset reaches end-of-life, creates an Ariba requisition and notifies IT asset management."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-servicenow
              type: call
              call: servicenow.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-ariba
              type: call
              call: ariba.create-record
              with:
                reference: "{{process-servicenow.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_asset_management_team_id"
                channel_id: "$secrets.teams_asset_management_channel_id"
                text: "ServiceNow Asset Refresh to Procurement: {{source_id}} | {{summary}} | Ref: {{create-ariba.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: create-record
              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 a planned HP system update and notifies IT stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Submission"
  description: "Creates a ServiceNow change request for a planned HP system update and notifies IT stakeholders via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a system name, change description, and implementation window, create a ServiceNow normal change request, assign it to the CAB group, and notify stakeholders in Teams."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "The name of the system or service being changed."
            - name: change_description
              in: body
              type: string
              description: "A detailed description of the planned change."
            - name: planned_start
              in: body
              type: string
              description: "Planned start datetime in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned end datetime in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow-chg.create-change-request"
              with:
                short_description: "Change: {{system_name}}"
                description: "{{change_description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
                type: "normal"
                assignment_group: "CAB"
            - name: notify-stakeholders
              type: call
              call: "msteams-chg.post-channel-message"
              with:
                channel_id: "$secrets.itops_channel_id"
                message: "Change request submitted for {{system_name}}. SNOW: {{create-change.number}}. Planned: {{planned_start}} to {{planned_end}}."
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://hp.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-chg
      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: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "ServiceNow Change to GitHub Deployment"
  description: "When a ServiceNow change is approved, triggers a GitHub deployment and updates the change with status."
  tags:
    - itsm
    - servicenow
    - github
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: servicenow-change-to-github-deployment
          description: "When a ServiceNow change is approved, triggers a GitHub deployment and updates the change with status."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-servicenow
              type: call
              call: servicenow.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-github
              type: call
              call: github.create-record
              with:
                reference: "{{process-servicenow.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_itsm_team_id"
                channel_id: "$secrets.teams_itsm_channel_id"
                text: "ServiceNow Change to GitHub Deployment: {{source_id}} | {{summary}} | Ref: {{create-github.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: create-record
              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 priority and assignment group for a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Priority Lookup"
  description: "Retrieves the priority and assignment group for a ServiceNow incident by number."
  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 and assigned group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          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"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hp.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 ServiceNow P1 incident is created, schedules a Teams bridge 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 Teams bridge and pages the incident commander via PagerDuty."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: servicenow-major-incident-bridge-setup
          description: "When a ServiceNow P1 incident is created, schedules a Teams bridge and pages the incident commander via PagerDuty."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-servicenow
              type: call
              call: servicenow.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-servicenow.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_itsm_team_id"
                channel_id: "$secrets.teams_itsm_channel_id"
                text: "ServiceNow Major Incident Bridge Setup: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 P1 incident is raised in ServiceNow, pages the on-call engineer via PagerDuty and opens a war-room channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Response Chain"
  description: "When a P1 incident is raised in ServiceNow, pages the on-call engineer via PagerDuty and opens a war-room channel in Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow P1 incident number, trigger a PagerDuty incident for on-call escalation and post a war-room message to the IT ops Teams channel."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-read.get-incident"
              with:
                number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "P1: {{get-incident.short_description}}"
                service_id: "$secrets.pagerduty_service_id"
                details: "SNOW: {{incident_number}}"
            - name: post-warroom
              type: call
              call: "msteams-war.post-channel-message"
              with:
                channel_id: "$secrets.warroom_channel_id"
                message: "P1 INCIDENT: {{get-incident.short_description}} | PagerDuty: {{page-oncall.incident_id}}"
  consumes:
    - type: http
      namespace: servicenow-read
      baseUri: "https://hp.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
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-war
      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: post-channel-message
              method: POST

When a ServiceNow problem is resolved, creates a Confluence KB article and updates the KEDB.

naftiko: "0.5"
info:
  label: "ServiceNow Problem to Known Error KB"
  description: "When a ServiceNow problem is resolved, creates a Confluence KB article and updates the KEDB."
  tags:
    - itsm
    - servicenow
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: servicenow-problem-to-known-error-kb
          description: "When a ServiceNow problem is resolved, creates a Confluence KB article and updates the KEDB."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-servicenow
              type: call
              call: servicenow.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-confluence
              type: call
              call: confluence.create-record
              with:
                reference: "{{process-servicenow.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_itsm_team_id"
                channel_id: "$secrets.teams_itsm_channel_id"
                text: "ServiceNow Problem to Known Error KB: {{source_id}} | {{summary}} | Ref: {{create-confluence.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: records
          path: "/content"
          operations:
            - name: create-record
              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 Snowflake credit consumption spikes, creates a Jira investigation ticket and alerts the FinOps team.

naftiko: "0.5"
info:
  label: "Snowflake Cost Spike to FinOps Alert"
  description: "When Snowflake credit consumption spikes, creates a Jira investigation ticket and alerts the FinOps team."
  tags:
    - finops
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: snowflake-cost-spike-to-finops-alert
          description: "When Snowflake credit consumption spikes, creates a Jira investigation ticket and alerts the FinOps team."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-snowflake
              type: call
              call: snowflake.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-snowflake.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              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 to FinOps Alert: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: records
          path: "/statements"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 Snowflake data quality checks on HP's analytics datasets and alerts the data engineering team via Microsoft Teams if quality scores drop below thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Pipeline Monitor"
  description: "Runs Snowflake data quality checks on HP's analytics datasets and alerts the data engineering team via Microsoft Teams if quality scores drop below thresholds."
  tags:
    - data
    - analytics
    - snowflake
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Execute a named Snowflake data quality stored procedure and send a Teams alert to the data engineering channel if the quality score is below the defined threshold."
          inputParameters:
            - name: check_name
              in: body
              type: string
              description: "The name of the Snowflake data quality check stored procedure to run."
            - name: quality_threshold
              in: body
              type: number
              description: "Minimum acceptable quality score (0–100)."
          steps:
            - name: run-check
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL data_quality.{{check_name}}()"
            - name: send-alert
              type: call
              call: "msteams-data.post-channel-message"
              with:
                channel_id: "$secrets.data_eng_channel_id"
                message: "Data quality check {{check_name}} complete. Score: {{run-check.quality_score}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams-data
      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: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Snowflake ETL Failure to PagerDuty Escalation"
  description: "When a Snowflake ETL pipeline fails, creates a Jira bug and triggers a PagerDuty incident for data engineering."
  tags:
    - data-engineering
    - snowflake
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: snowflake-etl-failure-to-pagerduty-escalation
          description: "When a Snowflake ETL pipeline fails, creates a Jira bug and triggers a PagerDuty incident for data engineering."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-snowflake
              type: call
              call: snowflake.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-snowflake.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_data_engineering_team_id"
                channel_id: "$secrets.teams_data_engineering_channel_id"
                text: "Snowflake ETL Failure to PagerDuty Escalation: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: records
          path: "/statements"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 governance review and notifies data stewards.

naftiko: "0.5"
info:
  label: "Snowflake Schema Drift to Data Governance"
  description: "When a Snowflake schema change is detected, creates a Jira governance review and notifies data stewards."
  tags:
    - data-governance
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: snowflake-schema-drift-to-data-governance
          description: "When a Snowflake schema change is detected, creates a Jira governance review and notifies data stewards."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-snowflake
              type: call
              call: snowflake.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-snowflake.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_data_governance_team_id"
                channel_id: "$secrets.teams_data_governance_channel_id"
                text: "Snowflake Schema Drift to Data Governance: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: records
          path: "/statements"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://hp.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              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 row count.

naftiko: "0.5"
info:
  label: "Snowflake Table Row Count"
  description: "Executes a count query against a Snowflake table and returns the row count."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: get-table-row-count
          description: "Given a Snowflake table name, return the total row count."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name."
          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://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Creates and configures a new Terraform Cloud workspace for an HP product team, applies standard variable sets, and notifies the team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Provisioner"
  description: "Creates and configures a new Terraform Cloud workspace for an HP product team, applies standard variable sets, and notifies the team via Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-terraform-workspace
          description: "Given a team name and environment, create a Terraform Cloud workspace, apply the HP standard variable set, and notify the team's Microsoft Teams channel."
          inputParameters:
            - name: team_name
              in: body
              type: string
              description: "The product team name, used as the workspace prefix."
            - name: environment
              in: body
              type: string
              description: "The target environment: dev, staging, or prod."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to notify upon completion."
          steps:
            - name: create-workspace
              type: call
              call: "terraform.create-workspace"
              with:
                name: "{{team_name}}-{{environment}}"
                organization: "hp"
            - name: assign-varset
              type: call
              call: "terraform-varset.assign-variable-set"
              with:
                workspace_id: "{{create-workspace.workspace_id}}"
                varset_id: "$secrets.terraform_standard_varset_id"
            - name: notify-team
              type: call
              call: "msteams-infra.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Workspace {{team_name}}-{{environment}} created in Terraform Cloud. ID: {{create-workspace.workspace_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/hp/workspaces"
          operations:
            - name: create-workspace
              method: POST
    - type: http
      namespace: terraform-varset
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: variable-set-workspaces
          path: "/varsets/{{varset_id}}/relationships/workspaces"
          inputParameters:
            - name: varset_id
              in: path
          operations:
            - name: assign-variable-set
              method: POST
    - type: http
      namespace: msteams-infra
      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: post-channel-message
              method: POST

When a compensation change is finalized in Workday, syncs to payroll and confirms with HRBP.

naftiko: "0.5"
info:
  label: "Workday Compensation Change to Payroll Sync"
  description: "When a compensation change is finalized in Workday, syncs to payroll and confirms with HRBP."
  tags:
    - hr
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: workday-compensation-change-to-payroll-sync
          description: "When a compensation change is finalized in Workday, syncs to payroll and confirms with HRBP."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Workday Compensation Change to Payroll Sync: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 an employee profile from Workday by employee ID.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by employee ID."
  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 and title."
          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"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.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 headcount changes are approved, updates the Snowflake model and refreshes the Power BI dashboard.

naftiko: "0.5"
info:
  label: "Workday Headcount Change to Finance Forecast"
  description: "When headcount changes are approved, updates the Snowflake model and refreshes the Power BI dashboard."
  tags:
    - finance
    - workday
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: workday-headcount-change-to-finance-forecast
          description: "When headcount changes are approved, updates the Snowflake model and refreshes the Power BI dashboard."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-snowflake
              type: call
              call: snowflake.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finance_team_id"
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Workday Headcount Change to Finance Forecast: {{source_id}} | {{summary}} | Ref: {{create-snowflake.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://hp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: records
          path: "/statements"
          operations:
            - name: create-record
              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, notifies the manager and blocks the calendar.

naftiko: "0.5"
info:
  label: "Workday Leave Request to Calendar Block"
  description: "When a Workday leave request is approved, notifies the manager and blocks the calendar."
  tags:
    - hr
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: workday-leave-request-to-calendar-block
          description: "When a Workday leave request is approved, notifies the manager and blocks the calendar."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Workday Leave Request to Calendar Block: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: records
          path: "/teams"
          operations:
            - name: create-record
              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 confirmed in Workday, creates a ServiceNow equipment request for laptop provisioning.

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 for laptop provisioning."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: workday-new-hire-to-equipment-request
          description: "When a new hire is confirmed in Workday, creates a ServiceNow equipment request for laptop provisioning."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Workday New Hire to Equipment Request: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://hp.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: 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 org restructure is processed, triggers an Okta access review and creates a compliance ticket.

naftiko: "0.5"
info:
  label: "Workday Org Change to Access Review"
  description: "When a Workday org restructure is processed, triggers an Okta access review and creates a compliance ticket."
  tags:
    - compliance
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: workday-org-change-to-access-review
          description: "When a Workday org restructure is processed, triggers an Okta access review and creates a compliance ticket."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-okta
              type: call
              call: okta.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_compliance_team_id"
                channel_id: "$secrets.teams_compliance_channel_id"
                text: "Workday Org Change to Access Review: {{source_id}} | {{summary}} | Ref: {{create-okta.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: records
          path: "/users"
          operations:
            - name: create-record
              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

Exports current headcount by department and cost center from Workday for HP finance and workforce planning reports.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Exports current headcount by department and cost center from Workday for HP finance and workforce planning reports."
  tags:
    - hr
    - finance
    - reporting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns the current headcount grouped by department and cost center from Workday. Use for monthly headcount planning, finance reviews, or cost center allocation audits."
          call: "workday-hcm.get-headcount"
          outputParameters:
            - name: workers
              type: array
              mapping: "$.Report_Entry"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.Employee_ID"
                - name: full_name
                  type: string
                  mapping: "$.Full_Name"
                - name: department
                  type: string
                  mapping: "$.Department"
                - name: cost_center
                  type: string
                  mapping: "$.Cost_Center"
                - name: employment_type
                  type: string
                  mapping: "$.Employment_Type"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount-report
          path: "/hp/reports/headcount_by_department"
          operations:
            - name: get-headcount
              method: GET

When a promotion is processed in Workday, updates Okta groups and creates a ServiceNow access request.

naftiko: "0.5"
info:
  label: "Workday Promotion to Access Upgrade"
  description: "When a promotion is processed in Workday, updates Okta groups and creates a ServiceNow access request."
  tags:
    - hr
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: workday-promotion-to-access-upgrade
          description: "When a promotion is processed in Workday, updates Okta groups and creates a ServiceNow access request."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-okta
              type: call
              call: okta.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Workday Promotion to Access Upgrade: {{source_id}} | {{summary}} | Ref: {{create-okta.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: records
          path: "/users"
          operations:
            - name: create-record
              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 open job requisitions from Workday Recruiting and publishes a weekly status digest to the HR Confluence page.

naftiko: "0.5"
info:
  label: "Workday Recruiting Pipeline Digest"
  description: "Retrieves open job requisitions from Workday Recruiting and publishes a weekly status digest to the HR Confluence page."
  tags:
    - hr
    - recruiting
    - workday
    - confluence
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: talent-ops
      port: 8080
      tools:
        - name: publish-recruiting-digest
          description: "Retrieve all open job requisitions from Workday Recruiting, count openings by department, and publish a weekly summary to the HR Confluence space."
          inputParameters:
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID where the recruiting digest should be published."
          steps:
            - name: get-open-reqs
              type: call
              call: "workday-recruit.list-job-requisitions"
              with:
                status: "Open"
            - name: publish-page
              type: call
              call: "confluence-hr.update-page"
              with:
                page_id: "{{confluence_page_id}}"
                content: "Open Requisitions: {{get-open-reqs.total_count}}. By Department: {{get-open-reqs.by_department}}"
  consumes:
    - type: http
      namespace: workday-recruit
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/hp/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-job-requisitions
              method: GET
    - type: http
      namespace: confluence-hr
      baseUri: "https://hp.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT

When an employee's role changes in Workday, updates their Salesforce profile, adjusts Okta group memberships, and notifies the manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Propagation"
  description: "When an employee's role changes in Workday, updates their Salesforce profile, adjusts Okta group memberships, and notifies the manager via Microsoft Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: propagate-role-change
          description: "Given a Workday employee ID and new role, update the employee's Salesforce user profile, adjust Okta group memberships, and send a Teams notification to their manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role changed."
            - name: new_role
              in: body
              type: string
              description: "The new job role or title as defined in Workday."
          steps:
            - name: get-employee
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-salesforce-profile
              type: call
              call: "salesforce-role.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                title: "{{new_role}}"
            - name: update-okta-groups
              type: call
              call: "okta-role.update-user-groups"
              with:
                user_id: "{{get-employee.okta_user_id}}"
                role: "{{new_role}}"
            - name: notify-manager
              type: call
              call: "msteams-role.send-message"
              with:
                recipient: "{{get-employee.manager_email}}"
                message: "{{get-employee.full_name}} has been updated to {{new_role}} in Salesforce and Okta."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/hp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce-role
      baseUri: "https://hp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: okta-role
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              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: hr
      port: 8080
      tools:
        - name: 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."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-workday
              type: call
              call: workday.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-okta
              type: call
              call: okta.create-record
              with:
                reference: "{{process-workday.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Workday Termination to Okta Deprovisioning: {{source_id}} | {{summary}} | Ref: {{create-okta.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://hp.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: records
          path: "/workers"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://hp.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: records
          path: "/users"
          operations:
            - name: create-record
              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 pending Workday time-off request, checks team coverage, and approves or queues for manager review.

naftiko: "0.5"
info:
  label: "Workday Time-Off Request Processing"
  description: "Retrieves a pending Workday time-off request, checks team coverage, and approves or queues for manager review."
  tags:
    - hr
    - absence-management
    - workday
    - approval
capability:
  exposes:
    - type: mcp
      namespace: absence-management
      port: 8080
      tools:
        - name: process-time-off-request
          description: "Given a Workday time-off request ID, retrieve request details, check team schedule for coverage, and automatically approve if coverage is adequate or escalate to manager."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The Workday absence request ID."
          steps:
            - name: get-request
              type: call
              call: "workday-absence.get-absence-request"
              with:
                request_id: "{{request_id}}"
            - name: check-coverage
              type: call
              call: "workday-team.get-team-schedule"
              with:
                cost_center: "{{get-request.cost_center}}"
                start_date: "{{get-request.start_date}}"
                end_date: "{{get-request.end_date}}"
            - name: approve-request
              type: call
              call: "workday-absence-approve.approve-absence"
              with:
                request_id: "{{request_id}}"
                decision: "approved"
  consumes:
    - type: http
      namespace: workday-absence
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absence-requests
          path: "/hp/absenceRequests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-absence-request
              method: GET
    - type: http
      namespace: workday-team
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: team-schedule
          path: "/hp/teamSchedule"
          inputParameters:
            - name: cost_center
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-team-schedule
              method: GET
    - type: http
      namespace: workday-absence-approve
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absence-approvals
          path: "/hp/absenceRequests/{{request_id}}/approve"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: approve-absence
              method: POST

Creates a Zoom meeting for an HP customer executive briefing and sends calendar invites via Microsoft Graph to all attendees.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler for Customer Briefings"
  description: "Creates a Zoom meeting for an HP customer executive briefing and sends calendar invites via Microsoft Graph to all attendees."
  tags:
    - sales
    - communication
    - zoom
    - salesforce
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: customer-engagement
      port: 8080
      tools:
        - name: schedule-customer-briefing
          description: "Given a Salesforce account ID and meeting date/time, create a Zoom meeting and send calendar invites to all account contacts via Microsoft Graph."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the HP customer."
            - name: meeting_time
              in: body
              type: string
              description: "The meeting start time in ISO 8601 format."
            - name: duration_minutes
              in: body
              type: integer
              description: "Meeting duration in minutes."
          steps:
            - name: get-account
              type: call
              call: "salesforce-acct.get-account"
              with:
                account_id: "{{account_id}}"
            - name: create-meeting
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "HP Executive Briefing — {{get-account.name}}"
                start_time: "{{meeting_time}}"
                duration: "{{duration_minutes}}"
            - name: send-invite
              type: call
              call: "msgraph-cal.create-event"
              with:
                subject: "HP Executive Briefing — {{get-account.name}}"
                start: "{{meeting_time}}"
                join_url: "{{create-meeting.join_url}}"
  consumes:
    - type: http
      namespace: salesforce-acct
      baseUri: "https://hp.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
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: msgraph-cal
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/me/events"
          operations:
            - name: create-event
              method: POST

Enriches a company record with firmographic data from ZoomInfo.

naftiko: "0.5"
info:
  label: "ZoomInfo Company Enrichment Lookup"
  description: "Enriches a company record with firmographic data from ZoomInfo."
  tags:
    - sales
    - zoominfo
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: enrich-company
          description: "Given a domain, return the ZoomInfo company profile."
          inputParameters:
            - name: domain
              in: body
              type: string
              description: "Company website domain."
          call: zoominfo.enrich-company
          with:
            companyWebsite: "{{domain}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.example.com/v1"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: enrich
          path: "/enrich/company"
          inputParameters:
            - name: companyWebsite
              in: query
          operations:
            - name: enrich-company
              method: GET