Emerson Electric Capabilities

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

Sort
Expand

When an RFQ document is received, uses Anthropic Claude to extract key requirements and draft a structured proposal outline, then stores the draft in Salesforce for the sales team.

naftiko: "0.5"
info:
  label: "AI-Assisted RFQ Response Generation"
  description: "When an RFQ document is received, uses Anthropic Claude to extract key requirements and draft a structured proposal outline, then stores the draft in Salesforce for the sales team."
  tags:
    - ai
    - sales
    - procurement
    - anthropic
    - salesforce
    - automation
capability:
  exposes:
    - type: mcp
      namespace: ai-sales
      port: 8080
      tools:
        - name: draft-rfq-response
          description: "Given a Salesforce opportunity ID and RFQ text, call Anthropic Claude to extract technical requirements and draft a response outline, then store the draft on the Salesforce opportunity. Use when a customer RFQ is received."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID linked to the RFQ."
            - name: rfq_text
              in: body
              type: string
              description: "Full RFQ document text to analyze."
          steps:
            - name: generate-draft
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                max_tokens: "1000"
                system: "You are a technical sales assistant for an industrial automation company. Extract key technical requirements from the RFQ and draft a structured proposal outline covering scope, solution approach, and key differentiators."
                user_content: "{{rfq_text}}"
            - name: save-draft
              type: call
              call: salesforce.update-opportunity-notes
              with:
                opportunity_id: "{{opportunity_id}}"
                RFQ_Draft_Response__c: "{{generate-draft.content}}"
  consumes:
    - 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: salesforce
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity-notes
              method: PATCH

Monitors Azure daily spend against budget thresholds, records anomalies in Snowflake, and opens a ServiceNow incident with cost details for the cloud operations team.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly Detection"
  description: "Monitors Azure daily spend against budget thresholds, records anomalies in Snowflake, and opens a ServiceNow incident with cost details for the cloud operations team."
  tags:
    - cloud
    - finops
    - azure
    - snowflake
    - servicenow
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost
      port: 8080
      tools:
        - name: detect-cost-anomaly
          description: "Given an Azure subscription ID and a daily budget threshold in USD, query the current day's spend, record it to Snowflake, and raise a ServiceNow incident if the threshold is exceeded."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID to monitor for cost anomalies."
            - name: budget_threshold_usd
              in: body
              type: number
              description: "Daily spend budget threshold in USD."
          steps:
            - name: get-daily-cost
              type: call
              call: azure.query-cost
              with:
                subscription_id: "{{subscription_id}}"
            - name: log-cost
              type: call
              call: snowflake.insert-cost-record
              with:
                subscription_id: "{{subscription_id}}"
                daily_cost: "{{get-daily-cost.total_cost}}"
            - name: open-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure cost anomaly: ${{get-daily-cost.total_cost}} exceeds ${{budget_threshold_usd}}/day on {{subscription_id}}"
                urgency: "2"
                category: "cloud_cost"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-query
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: query-cost
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: cost-records
          path: "/statements"
          operations:
            - name: insert-cost-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.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 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://emerson.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://emerson.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://emerson.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://emerson.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: 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: resources
          path: "/subscriptions"
          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://emerson.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

After a ServiceNow change request is closed, automatically creates or updates the corresponding Confluence knowledge article with the post-implementation review notes.

naftiko: "0.5"
info:
  label: "Confluence Change Management Knowledge Update"
  description: "After a ServiceNow change request is closed, automatically creates or updates the corresponding Confluence knowledge article with the post-implementation review notes."
  tags:
    - itsm
    - knowledge-management
    - servicenow
    - confluence
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: change-knowledge
      port: 8080
      tools:
        - name: update-change-kb-article
          description: "Given a closed ServiceNow change request number, fetch its post-implementation review notes and create or update a Confluence page in the IT knowledge base space. Use after change closure to maintain institutional knowledge."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change request number (e.g., CHG0012345)."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key where the KB article should be created (e.g., ITOPS)."
          steps:
            - name: get-change-details
              type: call
              call: servicenow.get-change-request
              with:
                number: "{{change_number}}"
            - name: create-kb-page
              type: call
              call: confluence.create-page
              with:
                space_key: "{{confluence_space_key}}"
                title: "Change {{change_number}}: {{get-change-details.short_description}}"
                body: "Change Number: {{change_number}}\nDescription: {{get-change-details.description}}\nPIR Notes: {{get-change-details.close_notes}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://emerson.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

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://emerson.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://emerson.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://emerson.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://emerson.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://emerson.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://emerson.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

Fetches Datadog host and monitor status across production infrastructure, aggregates results in Snowflake, and publishes a daily health digest to the operations Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Digest"
  description: "Fetches Datadog host and monitor status across production infrastructure, aggregates results in Snowflake, and publishes a daily health digest to the operations Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - snowflake
    - msteams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: infra-health
      port: 8080
      tools:
        - name: publish-infra-health-digest
          description: "Fetch all Datadog monitor statuses for a given environment tag, record the results to Snowflake, and post a digest summary to the ops Teams channel. Use for daily infrastructure health reporting."
          inputParameters:
            - name: environment_tag
              in: body
              type: string
              description: "Datadog environment tag to filter monitors (e.g., env:production)."
          steps:
            - name: get-monitor-status
              type: call
              call: datadog.list-monitors
              with:
                tags: "{{environment_tag}}"
            - name: write-health-record
              type: call
              call: snowflake.insert-health-snapshot
              with:
                environment: "{{environment_tag}}"
                alert_count: "{{get-monitor-status.alert_count}}"
                ok_count: "{{get-monitor-status.ok_count}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel: "infrastructure-ops"
                text: "Infrastructure Health ({{environment_tag}}): {{get-monitor-status.ok_count}} OK, {{get-monitor-status.alert_count}} alerting monitors."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: list-monitors
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: health-snapshots
          path: "/statements"
          operations:
            - name: insert-health-snapshot
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/infrastructure/messages"
          operations:
            - name: send-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://emerson.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_name}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      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://emerson.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

On confirmed termination in Workday, disables the Microsoft 365 account, removes GitHub organization access, and creates a ServiceNow offboarding checklist ticket.

naftiko: "0.5"
info:
  label: "Employee Offboarding"
  description: "On confirmed termination in Workday, disables the Microsoft 365 account, removes GitHub organization access, and creates a ServiceNow offboarding checklist ticket."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - github
    - servicenow
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, disable Microsoft 365 access, remove GitHub org membership, and open a ServiceNow offboarding checklist ticket. Use on Workday termination events."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Effective termination date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-m365
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{get-worker.email}}"
            - name: remove-github
              type: call
              call: github.remove-org-member
              with:
                org: "emerson-electric"
                username: "{{get-worker.github_username}}"
            - name: open-offboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Offboarding: {{get-worker.full_name}} — {{termination_date}}"
                category: "offboarding"
                assignment_group: "IT_Security"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-members
          path: "/orgs/{{org}}/members/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: remove-org-member
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.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

Correlates IoT sensor telemetry anomalies from Datadog with SAP equipment master data to create predictive maintenance work orders before failures occur.

naftiko: "0.5"
info:
  label: "Equipment Predictive Maintenance Alert"
  description: "Correlates IoT sensor telemetry anomalies from Datadog with SAP equipment master data to create predictive maintenance work orders before failures occur."
  tags:
    - manufacturing
    - iot
    - predictive-maintenance
    - datadog
    - sap
    - servicenow
    - ot
capability:
  exposes:
    - type: mcp
      namespace: predictive-maintenance
      port: 8080
      tools:
        - name: handle-sensor-anomaly
          description: "Given a Datadog monitor alert ID for an equipment sensor, retrieve alert details and the SAP equipment record, then create a predictive maintenance work order in SAP and a ServiceNow incident for the operations team."
          inputParameters:
            - name: datadog_alert_id
              in: body
              type: string
              description: "Datadog monitor alert ID from the IoT telemetry integration."
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number associated with the sensor."
          steps:
            - name: get-alert
              type: call
              call: datadog.get-monitor
              with:
                alert_id: "{{datadog_alert_id}}"
            - name: get-equipment
              type: call
              call: sap.get-equipment
              with:
                equipment_number: "{{equipment_number}}"
            - name: create-pm-order
              type: call
              call: sap-pm.create-pm-work-order
              with:
                equipment: "{{equipment_number}}"
                short_text: "Predictive maintenance: {{get-alert.message}}"
                priority: "HI"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Predictive alert: equipment {{equipment_number}} — {{get-alert.message}}"
                urgency: "2"
                description: "SAP equipment: {{get-equipment.description}}. Datadog alert: {{datadog_alert_id}}. SAP order: {{create-pm-order.order_number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment('{{equipment_number}}')"
          inputParameters:
            - name: equipment_number
              in: path
          operations:
            - name: get-equipment
              method: GET
    - type: http
      namespace: sap-pm
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pm-work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.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 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://emerson.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 GitHub Actions pipeline failure on a main branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team via Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a main branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team via Teams."
  tags:
    - devops
    - ci-cd
    - github
    - jira
    - datadog
    - msteams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions run ID, repository, branch, and commit SHA, create a Jira bug for the failure, post a Datadog deployment marker, and alert the engineering channel in Teams."
          inputParameters:
            - name: repo_full_name
              in: body
              type: string
              description: "GitHub repository full name (e.g., emerson-electric/firmware-platform)."
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID."
            - name: branch
              in: body
              type: string
              description: "Branch name where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "Commit SHA of the failing run."
          steps:
            - name: get-run-details
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo_full_name}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_full_name}} / {{branch}}"
                description: "Run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nConclusion: {{get-run-details.conclusion}}"
            - name: post-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "CI Failure: {{repo_full_name}} {{branch}}"
                text: "Run {{run_id}} failed on commit {{commit_sha}}"
                alert_type: "error"
                tags: "repo:{{repo_full_name}},branch:{{branch}}"
            - name: alert-engineering
              type: call
              call: msteams.send-message
              with:
                channel: "engineering-alerts"
                text: "Pipeline failure: {{repo_full_name}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{run_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://emerson.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/engineering/channels/alerts/messages"
          operations:
            - name: send-message
              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://emerson.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://emerson.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

Scans GitHub organization repositories for critical Dependabot alerts, creates Jira security issues for each critical finding, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Security Triage"
  description: "Scans GitHub organization repositories for critical Dependabot alerts, creates Jira security issues for each critical finding, and notifies the security team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - msteams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-security-alerts
          description: "Given a GitHub organization and severity level, list open Dependabot vulnerability alerts, create a Jira security issue summarizing findings, and post a summary to the security Teams channel."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "GitHub organization to scan (e.g., emerson-electric)."
            - name: severity
              in: body
              type: string
              description: "Minimum severity level: critical, high, medium, or low."
          steps:
            - name: list-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                org: "{{github_org}}"
                severity: "{{severity}}"
            - name: create-jira-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Security Vulnerability"
                summary: "Dependabot {{severity}} alerts in {{github_org}}: {{list-alerts.alert_count}} findings"
                description: "Affected repos: {{list-alerts.repo_names}}. Packages: {{list-alerts.package_names}}"
            - name: notify-security
              type: call
              call: msteams.send-message
              with:
                channel: "security-ops"
                text: "Dependabot triage: {{list-alerts.alert_count}} {{severity}} alerts | Org: {{github_org}} | Jira: {{create-jira-issue.key}}"
  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
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://emerson.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/security/channels/ops/messages"
          operations:
            - name: send-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://emerson.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."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
          call: github.get-repo
          with:
            repo: "{{repo}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

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://emerson.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."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: jira.get-issue
          with:
            issue_id: "{{issue_key}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://emerson.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          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://emerson.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://emerson.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 Jira sprint completion data, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh.

naftiko: "0.5"
info:
  label: "Jira Sprint Retrospective Report"
  description: "Fetches Jira sprint completion data, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh."
  tags:
    - devops
    - agile
    - reporting
    - jira
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: engineering-metrics
      port: 8080
      tools:
        - name: publish-sprint-report
          description: "Given a Jira board ID and sprint ID, fetch completed story points and issue counts, write to Snowflake, and trigger a Power BI refresh for engineering leadership."
          inputParameters:
            - name: board_id
              in: body
              type: integer
              description: "Jira board ID for the engineering team."
            - name: sprint_id
              in: body
              type: integer
              description: "Jira sprint ID to report on."
          steps:
            - name: get-sprint
              type: call
              call: jira.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: write-metrics
              type: call
              call: snowflake.insert-sprint-metrics
              with:
                sprint_id: "{{sprint_id}}"
                completed_points: "{{get-sprint.completedIssuesEstimateSum}}"
                total_issues: "{{get-sprint.completedIssues}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_engineering_dataset_id"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://emerson.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sprint-metrics
          path: "/statements"
          operations:
            - name: insert-sprint-metrics
              method: POST
    - 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: trigger-refresh
              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://emerson.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

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

When a new hire record is created in Workday, provisions a Microsoft 365 account, creates a ServiceNow onboarding ticket, and sends a Teams welcome message to the new hire and their manager.

naftiko: "0.5"
info:
  label: "New Employee Onboarding"
  description: "When a new hire record is created in Workday, provisions a Microsoft 365 account, creates a ServiceNow onboarding ticket, and sends a Teams welcome message to the new hire and their manager."
  tags:
    - hr
    - onboarding
    - workday
    - microsoft-365
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, provision a Microsoft 365 account, open a ServiceNow IT onboarding ticket, and send a Teams welcome. Use when HR creates a new hire in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                userPrincipalName: "{{get-worker.email}}"
                department: "{{get-worker.department}}"
            - name: open-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Onboarding: {{get-worker.full_name}} — start {{start_date}}"
                category: "onboarding"
                assignment_group: "IT_Onboarding"
            - name: welcome-message
              type: call
              call: msteams.send-message
              with:
                channel: "hr-announcements"
                text: "Welcome {{get-worker.full_name}} to Emerson Electric! Start date: {{start_date}}. IT ticket: {{open-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/announcements/messages"
          operations:
            - name: send-message
              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://emerson.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://emerson.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 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: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://emerson.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          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://emerson.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

When a field technician reports equipment failure, creates a corrective maintenance work order in SAP PM, assigns the appropriate technician in Workday, and sends a priority alert via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plant Work Order Creation"
  description: "When a field technician reports equipment failure, creates a corrective maintenance work order in SAP PM, assigns the appropriate technician in Workday, and sends a priority alert via Microsoft Teams."
  tags:
    - manufacturing
    - maintenance
    - sap
    - workday
    - msteams
    - ot
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-work-order
          description: "Given equipment functional location, failure description, and priority, create a SAP PM corrective maintenance work order, look up an available technician in Workday, and notify the maintenance supervisor via Teams."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location code for the failing equipment (e.g., PLT-LINE3-PUMP1)."
            - name: failure_description
              in: body
              type: string
              description: "Short description of the equipment failure."
            - name: priority
              in: body
              type: string
              description: "Work order priority: VH (very high), HI (high), ME (medium), LO (low)."
          steps:
            - name: get-technician
              type: call
              call: workday.get-available-technician
              with:
                functional_location: "{{functional_location}}"
            - name: create-wo
              type: call
              call: sap.create-work-order
              with:
                functional_location: "{{functional_location}}"
                short_text: "{{failure_description}}"
                priority: "{{priority}}"
                person_responsible: "{{get-technician.personnel_number}}"
            - name: notify-supervisor
              type: call
              call: msteams.send-message
              with:
                channel: "plant-maintenance"
                text: "Work order {{create-wo.order_number}} created | Priority: {{priority}} | Location: {{functional_location}} | Technician: {{get-technician.full_name}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: technicians
          path: "/workers"
          inputParameters:
            - name: functional_location
              in: query
          operations:
            - name: get-available-technician
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/plant-ops/channels/maintenance/messages"
          operations:
            - name: send-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

Queries SAP production order actuals, writes KPI metrics to Snowflake, and triggers a Power BI manufacturing operations dashboard refresh for plant managers.

naftiko: "0.5"
info:
  label: "Power BI Manufacturing KPI Refresh"
  description: "Queries SAP production order actuals, writes KPI metrics to Snowflake, and triggers a Power BI manufacturing operations dashboard refresh for plant managers."
  tags:
    - manufacturing
    - analytics
    - sap
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-reporting
      port: 8080
      tools:
        - name: refresh-manufacturing-kpis
          description: "Given a SAP plant code and reporting period, fetch production order actuals, write aggregated KPIs to Snowflake, and trigger a Power BI dashboard refresh for plant management."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code (e.g., 1001)."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYYMM format."
          steps:
            - name: get-production-actuals
              type: call
              call: sap.get-production-actuals
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: write-kpis
              type: call
              call: snowflake.insert-kpi-row
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
                units_produced: "{{get-production-actuals.units_produced}}"
                oee: "{{get-production-actuals.oee_percentage}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_manufacturing_dataset_id"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder"
          inputParameters:
            - name: plant
              in: query
            - name: period
              in: query
          operations:
            - name: get-production-actuals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: kpi-table
          path: "/statements"
          operations:
            - name: insert-kpi-row
              method: POST
    - 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: trigger-refresh
              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://emerson.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://emerson.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://emerson.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://emerson.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: "{{email}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.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

Synchronizes a newly closed Salesforce opportunity to SAP as a sales order, creating the order header and notifying the account manager via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Customer Opportunity Sync"
  description: "Synchronizes a newly closed Salesforce opportunity to SAP as a sales order, creating the order header and notifying the account manager via Teams."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: sales-erp-sync
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce opportunity ID that has been closed-won, fetch its details and create a corresponding SAP sales order, then notify the account manager via Teams. Use on opportunity stage-change events."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID that has transitioned to Closed Won."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: sap.create-sales-order
              with:
                sold_to_party: "{{get-opportunity.account_sap_id}}"
                net_value: "{{get-opportunity.amount}}"
                currency: "USD"
                reference: "{{opportunity_id}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                channel: "sales-ops"
                text: "Opportunity {{get-opportunity.name}} closed! SAP order {{create-sales-order.order_number}} created. Value: ${{get-opportunity.amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/sales/channels/ops/messages"
          operations:
            - name: send-message
              method: POST

When a new lead is created in Salesforce, enriches it with company data from LinkedIn, scores it in HubSpot, and notifies the inside sales team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead Qualification Workflow"
  description: "When a new lead is created in Salesforce, enriches it with company data from LinkedIn, scores it in HubSpot, and notifies the inside sales team via Teams."
  tags:
    - sales
    - crm
    - lead-enrichment
    - salesforce
    - linkedin
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: lead-qualification
      port: 8080
      tools:
        - name: qualify-new-lead
          description: "Given a Salesforce lead ID, fetch company details from LinkedIn, update the Salesforce lead record with enriched data, and post a qualification summary to the inside-sales Teams channel."
          inputParameters:
            - name: salesforce_lead_id
              in: body
              type: string
              description: "Salesforce lead record ID for the new inquiry."
            - name: company_linkedin_id
              in: body
              type: string
              description: "LinkedIn company URN for the lead's organization."
          steps:
            - name: get-lead
              type: call
              call: salesforce.get-lead
              with:
                lead_id: "{{salesforce_lead_id}}"
            - name: get-company-data
              type: call
              call: linkedin.get-organization
              with:
                organization_id: "{{company_linkedin_id}}"
            - name: update-lead
              type: call
              call: salesforce-update.patch-lead
              with:
                lead_id: "{{salesforce_lead_id}}"
                Company_Size__c: "{{get-company-data.staffCount}}"
                Industry__c: "{{get-company-data.industries}}"
            - name: notify-sales
              type: call
              call: msteams.send-message
              with:
                channel: "inside-sales"
                text: "New lead qualified: {{get-lead.company}} | Industry: {{get-company-data.industries}} | Size: {{get-company-data.staffCount}} employees."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.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: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organizations
          path: "/organizations/{{organization_id}}"
          inputParameters:
            - name: organization_id
              in: path
          operations:
            - name: get-organization
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: patch-lead
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/sales/channels/inside-sales/messages"
          operations:
            - name: send-message
              method: POST

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://emerson.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://emerson.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

Exports open and committed Salesforce opportunities for the current fiscal quarter, writes them to Snowflake, and triggers a Power BI revenue forecast dashboard refresh.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Forecast Sync"
  description: "Exports open and committed Salesforce opportunities for the current fiscal quarter, writes them to Snowflake, and triggers a Power BI revenue forecast dashboard refresh."
  tags:
    - sales
    - forecasting
    - salesforce
    - snowflake
    - power-bi
    - finance
capability:
  exposes:
    - type: mcp
      namespace: revenue-forecasting
      port: 8080
      tools:
        - name: sync-quarterly-forecast
          description: "Given a fiscal quarter label, export pipeline opportunities from Salesforce, persist to Snowflake, and trigger a Power BI forecast refresh. Use before quarterly business reviews."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Salesforce fiscal quarter label (e.g., Q2-2026)."
          steps:
            - name: export-pipeline
              type: call
              call: salesforce.query-opportunities
              with:
                fiscal_quarter: "{{fiscal_quarter}}"
                stage: "open"
            - name: write-forecast
              type: call
              call: snowflake.insert-forecast-rows
              with:
                fiscal_quarter: "{{fiscal_quarter}}"
                records: "{{export-pipeline.records}}"
            - name: refresh-powerbi
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_forecast_dataset_id"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: fiscal_quarter
              in: query
            - name: stage
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: forecast-table
          path: "/statements"
          operations:
            - name: insert-forecast-rows
              method: POST
    - 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: trigger-refresh
              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://emerson.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://emerson.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://emerson.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 Service Cloud customer case is escalated due to equipment failure, creates a SAP service notification and notifies the field service team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Service Cloud Case Escalation"
  description: "When a Salesforce Service Cloud customer case is escalated due to equipment failure, creates a SAP service notification and notifies the field service team via Teams."
  tags:
    - customer-support
    - crm
    - salesforce
    - sap
    - msteams
    - field-service
capability:
  exposes:
    - type: mcp
      namespace: field-service
      port: 8080
      tools:
        - name: escalate-service-case
          description: "Given a Salesforce case ID, fetch case details, create a SAP service notification for field dispatch, and alert the field service manager via Teams. Use when a customer reports critical equipment failure."
          inputParameters:
            - name: salesforce_case_id
              in: body
              type: string
              description: "Salesforce Service Cloud case ID."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{salesforce_case_id}}"
            - name: create-sap-notification
              type: call
              call: sap.create-service-notification
              with:
                short_text: "{{get-case.subject}}"
                equipment: "{{get-case.equipment_serial_number}}"
                customer: "{{get-case.account_name}}"
                priority: "HI"
            - name: notify-field-service
              type: call
              call: msteams.send-message
              with:
                channel: "field-service"
                text: "Case escalated: {{get-case.case_number}} | Customer: {{get-case.account_name}} | SAP notification: {{create-sap-notification.notification_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_SERVICE_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: service-notifications
          path: "/A_ServiceNotification"
          operations:
            - name: create-service-notification
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/service/channels/field-service/messages"
          operations:
            - name: send-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://emerson.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://emerson.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://emerson-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

Queries SAP Concur for expense reports pending approval, identifies overdue items, and sends reminder notifications via Teams to the relevant approvers.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Approval Reminder"
  description: "Queries SAP Concur for expense reports pending approval, identifies overdue items, and sends reminder notifications via Teams to the relevant approvers."
  tags:
    - finance
    - expense-management
    - sap-concur
    - msteams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approvals
      port: 8080
      tools:
        - name: remind-expense-approvers
          description: "Query SAP Concur for expense reports pending approval beyond a configurable days threshold, then send Teams reminders to each overdue approver. Use as part of daily AP operations."
          inputParameters:
            - name: pending_days_threshold
              in: body
              type: integer
              description: "Business days threshold above which a reminder is sent (e.g., 5)."
          steps:
            - name: get-pending-reports
              type: call
              call: concur.list-pending-reports
              with:
                approval_status: "A_PEND"
            - name: send-reminder
              type: call
              call: msteams.send-message
              with:
                channel: "finance-approvals"
                text: "Expense report reminder: {{get-pending-reports.report_count}} reports pending over {{pending_days_threshold}} days. Approvers: {{get-pending-reports.approver_list}}"
  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"
          inputParameters:
            - name: approval_status
              in: query
          operations:
            - name: list-pending-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/approvals/messages"
          operations:
            - name: send-message
              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://emerson.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://emerson-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://emerson.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://emerson-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://emerson-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

Checks SAP material stock levels against reorder points, creates SAP purchase requisitions for materials below minimum stock, and notifies the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Inventory Reorder Alert"
  description: "Checks SAP material stock levels against reorder points, creates SAP purchase requisitions for materials below minimum stock, and notifies the procurement team via Teams."
  tags:
    - supply-chain
    - procurement
    - sap
    - msteams
    - inventory
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: inventory-replenishment
      port: 8080
      tools:
        - name: check-reorder-alerts
          description: "Given a SAP plant code and MRP area, query materials below reorder point, create purchase requisitions for each, and notify the procurement team in Teams with a reorder summary."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code to check for low stock (e.g., 1001)."
            - name: mrp_area
              in: body
              type: string
              description: "SAP MRP area identifier for the inventory scope."
          steps:
            - name: get-low-stock
              type: call
              call: sap.get-materials-below-reorder
              with:
                plant: "{{plant_code}}"
                mrp_area: "{{mrp_area}}"
            - name: create-requisitions
              type: call
              call: sap-pr.create-purchase-requisition
              with:
                plant: "{{plant_code}}"
                materials: "{{get-low-stock.material_list}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel: "procurement"
                text: "Reorder alert: {{get-low-stock.count}} materials below threshold at plant {{plant_code}}. Requisitions created: {{create-requisitions.requisition_numbers}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: mrp-materials
          path: "/A_MRPMaterial"
          inputParameters:
            - name: plant
              in: query
            - name: mrp_area
              in: query
          operations:
            - name: get-materials-below-reorder
              method: GET
    - type: http
      namespace: sap-pr
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/MM_PUR_REQ_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/procurement/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Retrieves SAP material master data including description, unit of measure, plant stock levels, and valuation class for supply chain and production planning queries.

naftiko: "0.5"
info:
  label: "SAP Material Master Data Lookup"
  description: "Retrieves SAP material master data including description, unit of measure, plant stock levels, and valuation class for supply chain and production planning queries."
  tags:
    - supply-chain
    - erp
    - sap
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: material-master
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number and plant code, return the material description, base unit of measure, current plant stock, and valuation class. Use to verify material availability before production planning."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number (18-character alphanumeric)."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code (4-character, e.g., 1001)."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: stock_quantity
              type: string
              mapping: "$.d.MRPArea[0].TotalStock"
            - name: valuation_class
              type: string
              mapping: "$.d.ValuationClass"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant_code
              in: query
          operations:
            - name: get-material
              method: GET
              outputRawFormat: xml

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: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: products
          path: "/A_Product"
          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://emerson-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://emerson.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

At month-end close, queries SAP for open FI documents, creates a ServiceNow change request for the close checklist, and notifies the controller team via Teams.

naftiko: "0.5"
info:
  label: "SAP Period Close Verification"
  description: "At month-end close, queries SAP for open FI documents, creates a ServiceNow change request for the close checklist, and notifies the controller team via Teams."
  tags:
    - finance
    - erp
    - sap
    - servicenow
    - msteams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: verify-period-close
          description: "Given a SAP fiscal period and company code, check for open FI posting documents, create a ServiceNow change for the close workflow, and notify the controller channel in Teams."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "SAP fiscal period in YYYYMM format (e.g., 202503)."
            - name: company_code
              in: body
              type: string
              description: "SAP company code (e.g., EM01)."
          steps:
            - name: get-open-docs
              type: call
              call: sap.get-open-fi-documents
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: create-change
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "Period close {{fiscal_period}} — {{company_code}}"
                category: "financial_close"
                description: "Open FI documents: {{get-open-docs.count}}"
            - name: notify-controller
              type: call
              call: msteams.send-message
              with:
                channel: "finance-controllers"
                text: "Period close initiated {{fiscal_period}} / {{company_code}}. Open docs: {{get-open-docs.count}}. Change: {{create-change.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fi-documents
          path: "/A_JournalEntryItem"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: get-open-fi-documents
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/controllers/messages"
          operations:
            - name: send-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://emerson-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

Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement review."
  tags:
    - procurement
    - finance
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, currency, and open delivery line items. Use to verify procurement status or resolve vendor queries."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number (10-digit, e.g., 4500012345)."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://emerson-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

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://emerson-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://emerson.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://emerson-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://emerson.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

Verifies daily backup completion for critical systems by querying ServiceNow backup records, and alerts the IT operations team via Teams if any backup fails.

naftiko: "0.5"
info:
  label: "ServiceNow Backup Verification"
  description: "Verifies daily backup completion for critical systems by querying ServiceNow backup records, and alerts the IT operations team via Teams if any backup fails."
  tags:
    - itsm
    - backup
    - servicenow
    - msteams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: verify-daily-backups
          description: "Query ServiceNow for backup job records from the last 24 hours, identify any failures or missed jobs, and send a Teams summary to IT operations. Use as a daily scheduled health check."
          inputParameters:
            - name: configuration_item_group
              in: body
              type: string
              description: "ServiceNow configuration item group to scope the backup check (e.g., SAP_Production)."
          steps:
            - name: get-backup-records
              type: call
              call: servicenow.list-backup-records
              with:
                ci_group: "{{configuration_item_group}}"
            - name: send-summary
              type: call
              call: msteams.send-message
              with:
                channel: "it-operations"
                text: "Backup verification ({{configuration_item_group}}): {{get-backup-records.success_count}} succeeded, {{get-backup-records.failure_count}} failed."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: backup-records
          path: "/table/cmdb_ci_backup_job"
          inputParameters:
            - name: ci_group
              in: query
          operations:
            - name: list-backup-records
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/it/channels/operations/messages"
          operations:
            - name: send-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://emerson.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: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

When a ServiceNow incident has been open beyond SLA thresholds, escalates it to P1, reassigns to the on-call team via Datadog, and alerts the IT director via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow IT Incident Escalation"
  description: "When a ServiceNow incident has been open beyond SLA thresholds, escalates it to P1, reassigns to the on-call team via Datadog, and alerts the IT director via Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - msteams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Given a ServiceNow incident number and an escalation reason, update the incident to P1 priority, post a Datadog event for the on-call rotation, and alert IT leadership via Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g., INC0045678)."
            - name: escalation_reason
              in: body
              type: string
              description: "Reason for escalation — e.g., SLA breach, business impact."
          steps:
            - name: escalate-servicenow
              type: call
              call: servicenow.patch-incident
              with:
                number: "{{incident_number}}"
                priority: "1"
                urgency: "1"
                escalation_reason: "{{escalation_reason}}"
            - name: post-datadog-event
              type: call
              call: datadog.create-event
              with:
                title: "P1 Escalation: {{incident_number}}"
                text: "{{escalation_reason}}"
                alert_type: "error"
                tags: "incident:{{incident_number}},env:production"
            - name: alert-it-leadership
              type: call
              call: msteams.send-message
              with:
                channel: "it-leadership"
                text: "P1 ESCALATION: Incident {{incident_number}} | Reason: {{escalation_reason}} | On-call paged via Datadog."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.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: patch-incident
              method: PATCH
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/it/channels/leadership/messages"
          operations:
            - name: send-message
              method: POST

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://emerson.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 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://emerson.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://emerson.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://emerson.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://emerson.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 data quality checks on Snowflake tables for critical supply chain datasets, logs failures in Datadog, and opens Jira tasks for the data engineering team to remediate.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert"
  description: "Runs data quality checks on Snowflake tables for critical supply chain datasets, logs failures in Datadog, and opens Jira tasks for the data engineering team to remediate."
  tags:
    - data-engineering
    - data-quality
    - snowflake
    - datadog
    - jira
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table name and a null-rate threshold, execute a data quality count query, submit a Datadog metric for the null rate, and open a Jira task if the threshold is breached. Use for daily supply chain data validation."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name (e.g., SUPPLY_CHAIN.PUBLIC.ORDERS)."
            - name: null_rate_threshold
              in: body
              type: number
              description: "Maximum acceptable null rate (0.0–1.0) for key columns before raising a Jira task."
          steps:
            - name: run-quality-query
              type: call
              call: snowflake.execute-quality-check
              with:
                table_name: "{{table_name}}"
            - name: post-metric
              type: call
              call: datadog.submit-metric
              with:
                metric: "emerson.snowflake.null_rate"
                points: "{{run-quality-query.null_rate}}"
                tags: "table:{{table_name}}"
            - name: create-remediation-task
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                issuetype: "Task"
                summary: "Data quality failure: {{table_name}} null rate {{run-quality-query.null_rate}}"
                description: "Table {{table_name}} exceeded null rate threshold {{null_rate_threshold}}. Actual: {{run-quality-query.null_rate}}. Row count: {{run-quality-query.row_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-quality-check
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/series"
          operations:
            - name: submit-metric
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://emerson.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

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://emerson.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://emerson.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://emerson.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://emerson.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: "{{table_name}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          inputParameters:
            - name: statement
              in: query
          operations:
            - name: execute-query
              method: GET

Matches incoming supplier invoices in SAP Ariba against open purchase orders in SAP S/4HANA, flags discrepancies, and routes mismatches to the AP team in ServiceNow.

naftiko: "0.5"
info:
  label: "Supplier Invoice Matching"
  description: "Matches incoming supplier invoices in SAP Ariba against open purchase orders in SAP S/4HANA, flags discrepancies, and routes mismatches to the AP team in ServiceNow."
  tags:
    - procurement
    - finance
    - sap-ariba
    - sap
    - servicenow
    - ap
    - invoice-matching
capability:
  exposes:
    - type: mcp
      namespace: ap-matching
      port: 8080
      tools:
        - name: match-supplier-invoice
          description: "Given an SAP Ariba invoice ID and the associated PO number, compare invoice line amounts against the SAP purchase order, flag any discrepancies, and create a ServiceNow approval task if amounts differ by more than 2%."
          inputParameters:
            - name: ariba_invoice_id
              in: body
              type: string
              description: "SAP Ariba invoice document ID."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number to match against."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{ariba_invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-purchase-order
              with:
                po_number: "{{po_number}}"
            - name: create-mismatch-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Invoice mismatch: Ariba {{ariba_invoice_id}} vs SAP PO {{po_number}}"
                assignment_group: "AP_Team"
                description: "Invoice amount: {{get-invoice.net_amount}}. PO amount: {{get-po.total_amount}}. Review required."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/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
      baseUri: "https://emerson-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-purchase-order
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Triggers a Terraform Cloud workspace run to provision or update infrastructure, monitors run completion, and notifies the platform engineering team via Teams with the plan outcome.

naftiko: "0.5"
info:
  label: "Terraform Cloud Provisioning Run"
  description: "Triggers a Terraform Cloud workspace run to provision or update infrastructure, monitors run completion, and notifies the platform engineering team via Teams with the plan outcome."
  tags:
    - cloud
    - infrastructure
    - terraform
    - msteams
    - devops
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and a change description, queue a new Terraform plan-and-apply run, then notify the platform-engineering Teams channel with the run ID and workspace name."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID (e.g., ws-XXXXXXXXX)."
            - name: change_description
              in: body
              type: string
              description: "Human-readable reason for the Terraform run (e.g., 'Add IoT gateway subnet')."
          steps:
            - name: queue-run
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: notify-platform
              type: call
              call: msteams.send-message
              with:
                channel: "platform-engineering"
                text: "Terraform run queued: {{queue-run.run_id}} in workspace {{workspace_id}} — {{change_description}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/engineering/channels/platform/messages"
          operations:
            - name: send-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://emerson.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: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://emerson.workday.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          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://emerson.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://emerson.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://emerson.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://emerson.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://emerson.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://emerson.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://emerson.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 active headcount by department and cost center from Workday, writes a snapshot row to Snowflake, and triggers a Power BI workforce planning dashboard refresh.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Exports active headcount by department and cost center from Workday, writes a snapshot row to Snowflake, and triggers a Power BI workforce planning dashboard refresh."
  tags:
    - hr
    - finance
    - workday
    - snowflake
    - power-bi
    - headcount
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Fetch active employee headcount by department and cost center from Workday, write the snapshot to Snowflake, and trigger a Power BI refresh. Use for monthly workforce cost reporting."
          inputParameters:
            - name: snapshot_date
              in: body
              type: string
              description: "Snapshot date in ISO 8601 format (YYYY-MM-DD) to tag the record."
          steps:
            - name: export-workers
              type: call
              call: workday.export-workers
              with:
                status: "active"
            - name: write-snapshot
              type: call
              call: snowflake.insert-headcount-snapshot
              with:
                snapshot_date: "{{snapshot_date}}"
                records: "{{export-workers.rows}}"
            - name: refresh-report
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_workforce_dataset_id"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers-export
          path: "/workers"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: export-workers
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://emerson.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: headcount-table
          path: "/statements"
          operations:
            - name: insert-headcount-snapshot
              method: POST
    - 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: trigger-refresh
              method: POST

When a hiring manager opens a position requisition in Workday, creates a ServiceNow approval task, routes it to the HRBP, and notifies the Talent Acquisition team via Teams.

naftiko: "0.5"
info:
  label: "Workday Position Requisition Approval"
  description: "When a hiring manager opens a position requisition in Workday, creates a ServiceNow approval task, routes it to the HRBP, and notifies the Talent Acquisition team via Teams."
  tags:
    - hr
    - recruiting
    - workday
    - servicenow
    - msteams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: route-position-requisition
          description: "Given a Workday position requisition ID, fetch its details, create a ServiceNow approval task for the HRBP, and notify the Talent Acquisition team channel in Teams."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday position requisition ID (e.g., REQ-000123)."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-position-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Position requisition approval: {{requisition_id}} — {{get-requisition.job_title}}"
                assignment_group: "HRBP_Team"
                description: "Department: {{get-requisition.department}}. Hiring manager: {{get-requisition.manager_name}}. Headcount type: {{get-requisition.headcount_type}}"
            - name: notify-ta
              type: call
              call: msteams.send-message
              with:
                channel: "talent-acquisition"
                text: "New requisition: {{get-requisition.job_title}} in {{get-requisition.department}}. Approval task: {{create-approval-task.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: position-requisitions
          path: "/positionRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-position-requisition
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://emerson.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/talent-acquisition/messages"
          operations:
            - name: send-message
              method: POST

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://emerson.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://emerson.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

When an employee's position changes in Workday, updates their Salesforce user profile, adjusts Microsoft 365 group membership, and notifies their new manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Propagation"
  description: "When an employee's position changes in Workday, updates their Salesforce user profile, adjusts Microsoft 365 group membership, and notifies their new manager via Teams."
  tags:
    - hr
    - identity
    - workday
    - salesforce
    - microsoft-365
    - msteams
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: role-change
      port: 8080
      tools:
        - name: propagate-role-change
          description: "Given a Workday employee ID and new job profile, update Salesforce user permissions, update Microsoft 365 group membership, and notify the new manager via Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee with a role change."
            - name: new_job_profile
              in: body
              type: string
              description: "New Workday job profile code or title."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-salesforce-user
              type: call
              call: salesforce.patch-user-profile
              with:
                email: "{{get-worker.email}}"
                Title: "{{new_job_profile}}"
                Department: "{{get-worker.department}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Role change completed for {{get-worker.full_name}}: now {{new_job_profile}}. Salesforce profile updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://emerson.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User"
          operations:
            - name: patch-user-profile
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              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://emerson.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://emerson.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

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