Sony Capabilities

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

Sort
Expand

Fetches Adobe Analytics content performance metrics for Sony's owned media properties and publishes a weekly report to the digital marketing team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Adobe Analytics Content Performance Report"
  description: "Fetches Adobe Analytics content performance metrics for Sony's owned media properties and publishes a weekly report to the digital marketing team's Microsoft Teams channel."
  tags:
    - marketing
    - analytics
    - adobe
    - reporting
    - microsoft-teams
    - entertainment
capability:
  exposes:
    - type: mcp
      namespace: digital-analytics
      port: 8080
      tools:
        - name: report-content-performance
          description: "Given an Adobe Analytics report suite ID and date range, retrieve page views, unique visitors, and engagement metrics for Sony owned media. Post a content performance digest to the marketing Teams channel."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "The Adobe Analytics report suite ID (e.g., sonymusicom)."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-analytics-report
              type: call
              call: "adobe-analytics.run-report"
              with:
                report_suite_id: "{{report_suite_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-performance-digest
              type: call
              call: "msteams-analytics.post-message"
              with:
                channel_id: "$secrets.digital_teams_channel"
                text: "Content performance {{start_date}}-{{end_date}} | Suite: {{report_suite_id}} | Visits: {{get-analytics-report.visits}} | Unique Visitors: {{get-analytics-report.uniqueVisitors}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/{{company_id}}/reports"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/ranked"
          inputParameters:
            - name: report_suite_id
              in: query
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: msteams-analytics
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a Sony marketing creative asset is finalized in Adobe Creative Cloud Libraries, publishes the asset metadata and preview link to a Confluence brand guidelines page and notifies the marketing team in Teams.

naftiko: "0.5"
info:
  label: "Adobe Creative Cloud Asset Publishing to Confluence"
  description: "When a Sony marketing creative asset is finalized in Adobe Creative Cloud Libraries, publishes the asset metadata and preview link to a Confluence brand guidelines page and notifies the marketing team in Teams."
  tags:
    - marketing
    - creative
    - adobe
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: creative-publishing
      port: 8080
      tools:
        - name: publish-creative-asset
          description: "Given an Adobe Creative Cloud asset ID, retrieve asset metadata and publish it with a preview link to Confluence. Notify the marketing team in Teams. Use when creative assets are approved and ready for brand guidelines publication."
          inputParameters:
            - name: asset_id
              in: body
              type: string
              description: "The Adobe Creative Cloud Library asset ID."
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID of the brand guidelines page to update."
          steps:
            - name: get-asset
              type: call
              call: "adobe-cc.get-asset"
              with:
                asset_id: "{{asset_id}}"
            - name: update-confluence
              type: call
              call: "confluence.update-page"
              with:
                page_id: "{{confluence_page_id}}"
                title: "Brand Asset: {{get-asset.name}}"
                content: "Asset: {{get-asset.name}}\nType: {{get-asset.type}}\nURL: {{get-asset.previewUrl}}"
            - name: notify-marketing
              type: call
              call: "msteams-mktg.post-message"
              with:
                channel_id: "$secrets.marketing_teams_channel"
                text: "Creative asset {{get-asset.name}} published to Confluence brand guidelines."
  consumes:
    - type: http
      namespace: adobe-cc
      baseUri: "https://cc-libraries.adobe.io/api/v1"
      authentication:
        type: bearer
        token: "$secrets.adobe_cc_token"
      resources:
        - name: assets
          path: "/libraries/{{library_id}}/elements/{{asset_id}}"
          inputParameters:
            - name: asset_id
              in: path
          operations:
            - name: get-asset
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://sony.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT
    - type: http
      namespace: msteams-mktg
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Passes user-generated content from Sony's platforms to the Anthropic Claude API for moderation classification, returning a content safety rating and recommended action.

naftiko: "0.5"
info:
  label: "Anthropic AI Content Moderation Classifier"
  description: "Passes user-generated content from Sony's platforms to the Anthropic Claude API for moderation classification, returning a content safety rating and recommended action."
  tags:
    - ai
    - content-moderation
    - anthropic
    - gaming
    - entertainment
capability:
  exposes:
    - type: mcp
      namespace: content-moderation
      port: 8080
      tools:
        - name: classify-content
          description: "Given a piece of user-generated text content (e.g., from PlayStation Network or Sony community forums), send it to Anthropic Claude for content safety classification. Returns a safety rating and recommended moderation action."
          inputParameters:
            - name: content_text
              in: body
              type: string
              description: "The user-generated content text to classify for safety."
            - name: platform
              in: body
              type: string
              description: "The Sony platform the content originates from (e.g., PSN, SonyMusicForum)."
          call: "anthropic.create-message"
          with:
            model: "claude-opus-4-5"
            max_tokens: 256
            system: "You are a content safety classifier for Sony platforms. Classify content as SAFE, WARNING, or REMOVE with a brief reason."
            user_content: "Platform: {{platform}}\nContent: {{content_text}}"
          outputParameters:
            - name: classification
              type: string
              mapping: "$.content[0].text"
  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

Detects Azure subscription cost anomalies for Sony's cloud infrastructure, enriches alerts with resource group context, and posts a spend alert to the FinOps team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Alert"
  description: "Detects Azure subscription cost anomalies for Sony's cloud infrastructure, enriches alerts with resource group context, and posts a spend alert to the FinOps team's Microsoft Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: alert-cloud-cost-anomaly
          description: "Given an Azure subscription ID, resource group, and anomalous spend amount, retrieve resource group context from Azure Resource Manager and post a cost anomaly alert to the FinOps Teams channel. Use when Azure Cost Management detects unexpected spend spikes."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the anomaly was detected."
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group name associated with the anomaly."
            - name: anomaly_amount_usd
              in: body
              type: string
              description: "The anomalous spend amount in USD."
          steps:
            - name: get-resource-group
              type: call
              call: "azure-mgmt.get-resource-group"
              with:
                subscription_id: "{{subscription_id}}"
                resource_group: "{{resource_group}}"
            - name: post-cost-alert
              type: call
              call: "msteams-finops.post-message"
              with:
                channel_id: "$secrets.finops_teams_channel"
                text: "Cost anomaly: ${{anomaly_amount_usd}} in {{resource_group}} ({{get-resource-group.location}}) on subscription {{subscription_id}}"
  consumes:
    - type: http
      namespace: azure-mgmt
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resource-groups
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-resource-group
              method: GET
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Azure Cost Budget Breach Notification"
  description: "When an Azure budget threshold is breached, creates a ServiceNow ticket and alerts FinOps."
  tags:
    - finops
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: azure-cost-budget-breach-notification
          description: "When an Azure budget threshold is breached, creates a ServiceNow ticket and alerts FinOps."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-azure
              type: call
              call: azure.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-servicenow
              type: call
              call: servicenow.create-record
              with:
                reference: "{{process-azure.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finops_team_id"
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure Cost Budget Breach Notification: {{source_id}} | {{summary}} | Ref: {{create-servicenow.id}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: records
          path: "/subscriptions"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://sony.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://sony.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://sony.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://sony.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://sony.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 major Sony platform incident is resolved in ServiceNow, generates and publishes a postmortem document to Confluence and notifies the engineering leadership team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Confluence Incident Postmortem Publisher"
  description: "After a major Sony platform incident is resolved in ServiceNow, generates and publishes a postmortem document to Confluence and notifies the engineering leadership team in Microsoft Teams."
  tags:
    - itsm
    - knowledge-management
    - confluence
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: postmortem-ops
      port: 8080
      tools:
        - name: publish-postmortem
          description: "Given a resolved ServiceNow incident number, retrieve resolution notes and root cause, and create a Confluence postmortem article in the engineering space. Notify engineering leadership in Teams. Use after major incidents are closed."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: confluence_space_key
              in: body
              type: string
              description: "The Confluence space key for the engineering postmortem library (e.g., POSTMORTEM)."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-pm.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-postmortem
              type: call
              call: "confluence-pm.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                title: "Postmortem: {{get-incident.short_description}} ({{incident_number}})"
                body: "Incident: {{incident_number}}\nRCA: {{get-incident.rca}}\nResolution: {{get-incident.close_notes}}\nDuration: {{get-incident.duration}}"
            - name: notify-leadership
              type: call
              call: "msteams-leadership.post-message"
              with:
                channel_id: "$secrets.engineering_leadership_teams_channel"
                text: "Postmortem published for {{incident_number}}: {{get-incident.short_description}}. Confluence: {{create-postmortem.pageUrl}}"
  consumes:
    - type: http
      namespace: servicenow-pm
      baseUri: "https://sony.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence-pm
      baseUri: "https://sony.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams-leadership
      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: channel_id
              in: path
          operations:
            - name: post-message
              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://sony.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://sony.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://sony.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://sony.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://sony.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://sony.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Datadog 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://sony.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 SLO breach is detected for a Sony service, opens a ServiceNow incident and triggers a PagerDuty page to the on-call engineer.

naftiko: "0.5"
info:
  label: "Datadog SLO Breach to PagerDuty Escalation"
  description: "When a Datadog SLO breach is detected for a Sony service, opens a ServiceNow incident and triggers a PagerDuty page to the on-call engineer."
  tags:
    - observability
    - slo
    - datadog
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: slo-response
      port: 8080
      tools:
        - name: handle-slo-breach
          description: "Given a Datadog SLO ID, service name, and remaining error budget, open a ServiceNow incident and trigger PagerDuty to page the on-call engineer. Use when a Sony platform SLO drops below its error budget threshold."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "The Datadog SLO ID that breached its threshold."
            - name: service_name
              in: body
              type: string
              description: "The name of the service whose SLO was breached."
            - name: remaining_budget_pct
              in: body
              type: string
              description: "The remaining error budget percentage at time of breach."
          steps:
            - name: get-slo
              type: call
              call: "datadog-slo.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: create-incident
              type: call
              call: "servicenow-slo.create-incident"
              with:
                short_description: "SLO breach: {{service_name}} error budget {{remaining_budget_pct}}% remaining"
                category: "platform"
                urgency: "critical"
            - name: page-oncall
              type: call
              call: "pagerduty-slo.trigger-incident"
              with:
                service_id: "$secrets.pagerduty_service_id"
                summary: "SLO breach for {{service_name}}: {{remaining_budget_pct}}% budget remaining"
                severity: "critical"
  consumes:
    - type: http
      namespace: datadog-slo
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: servicenow-slo
      baseUri: "https://sony.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty-slo
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: trigger-incident
              method: POST

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://sony.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the health status of a monitored host in Dynatrace.

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

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

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, provisions a Microsoft 365 account via Graph API, opens a ServiceNow onboarding ticket, and sends a Teams welcome message to the new hire and their manager."
  tags:
    - hr
    - onboarding
    - workday
    - microsoft-365
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday worker ID and start date, orchestrate the full onboarding sequence: provision a Microsoft 365 account, open a ServiceNow ticket, and send Teams welcome messages. Use when a new hire is confirmed in Workday."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: provision-account
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-worker.firstName}} {{get-worker.lastName}}"
                mail: "{{get-worker.email}}"
                department: "{{get-worker.department}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.firstName}} {{get-worker.lastName}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.post-message"
              with:
                channel_id: "$secrets.hr_teams_channel"
                text: "Welcome {{get-worker.firstName}} {{get-worker.lastName}}! Starting {{start_date}}. ServiceNow 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://sony.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug with pipeline context and posts a failure alert to the Microsoft Teams engineering channel.

naftiko: "0.5"
info:
  label: "GitHub Actions CI/CD Pipeline Failure Handler"
  description: "When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug with pipeline context and posts a failure alert to the Microsoft Teams engineering channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cicd-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a failed GitHub Actions run ID, repo, and branch, open a Jira bug and post a Teams alert with full context. Use when automated pipelines fail on protected branches requiring engineering triage."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: branch
              in: body
              type: string
              description: "The branch where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA associated with the failed run."
          steps:
            - name: get-run
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: "jira-ci.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}}"
                description: "Run: {{run_id}}\nCommit: {{commit_sha}}\nConclusion: {{get-run.conclusion}}"
            - name: post-alert
              type: call
              call: "msteams-ci.post-message"
              with:
                channel_id: "$secrets.cicd_teams_channel"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}}"
  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-ci
      baseUri: "https://sony.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-ci
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

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

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

naftiko: "0.5"
info:
  label: "GitHub PR Merge to Jira Transition"
  description: "When a GitHub pull request is merged, transitions the linked Jira issue to Done and posts a release note to Confluence."
  tags:
    - devops
    - github
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: github-pr-merge-to-jira-transition
          description: "When a GitHub pull request is merged, transitions the linked Jira issue to Done and posts a release note to Confluence."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-github
              type: call
              call: github.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-github.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_devops_team_id"
                channel_id: "$secrets.teams_devops_channel_id"
                text: "GitHub PR Merge to Jira Transition: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: records
          path: "/repos"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://sony.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 Dependabot security vulnerability alerts from GitHub for Sony engineering repositories and creates Jira security tickets for high or critical severity findings.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Alert to Jira"
  description: "Retrieves Dependabot security vulnerability alerts from GitHub for Sony engineering repositories and creates Jira security tickets for high or critical severity findings."
  tags:
    - security
    - devops
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: scan-repo-vulnerabilities
          description: "Given a GitHub repository and severity threshold, retrieve Dependabot vulnerability alerts and create Jira security tickets for each finding at or above the threshold. Use for weekly security posture reviews."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format (e.g., SonyPictures/content-delivery)."
            - name: severity_threshold
              in: body
              type: string
              description: "Minimum severity to report: low, medium, high, or critical."
          steps:
            - name: get-vuln-alerts
              type: call
              call: "github-sec.list-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "{{severity_threshold}}"
            - name: create-sec-ticket
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Security vulnerability in {{repo}}: {{get-vuln-alerts.securityVulnerability.package.name}}"
                description: "Severity: {{get-vuln-alerts.severity}}\nRepo: {{repo}}\nPackage: {{get-vuln-alerts.securityVulnerability.package.name}}"
  consumes:
    - type: http
      namespace: github-sec
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira-sec
      baseUri: "https://sony.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

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://sony.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 all stories in a Jira epic are completed, generates a Confluence summary and notifies stakeholders.

naftiko: "0.5"
info:
  label: "Jira Epic Completion to Stakeholder Update"
  description: "When all stories in a Jira epic are completed, generates a Confluence summary and notifies stakeholders."
  tags:
    - project-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: jira-epic-completion-to-stakeholder-update
          description: "When all stories in a Jira epic are completed, generates a Confluence summary and notifies stakeholders."
          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_project_management_team_id"
                channel_id: "$secrets.teams_project_management_channel_id"
                text: "Jira Epic Completion to Stakeholder Update: {{source_id}} | {{summary}} | Ref: {{create-confluence.id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://sony.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://sony.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 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://sony.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://sony.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://sony.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 completed sprint issues from Jira at sprint close, calculates velocity and bug rate metrics, and publishes a sprint retrospective summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Retrospective Publisher"
  description: "Retrieves completed sprint issues from Jira at sprint close, calculates velocity and bug rate metrics, and publishes a sprint retrospective summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - agile
    - jira
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: publish-sprint-retrospective
          description: "Given a Jira board ID and sprint ID, retrieve completed and incomplete issues, calculate velocity, and post a sprint retrospective summary to the engineering Teams channel. Use after each sprint close."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID (numeric)."
            - name: sprint_id
              in: body
              type: string
              description: "The completed Jira sprint ID."
          steps:
            - name: get-sprint
              type: call
              call: "jira-sprint.get-sprint"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: get-sprint-issues
              type: call
              call: "jira-sprint-issues.search-issues"
              with:
                sprint_id: "{{sprint_id}}"
            - name: post-retro
              type: call
              call: "msteams-retro.post-message"
              with:
                channel_id: "$secrets.engineering_teams_channel"
                text: "Sprint {{get-sprint.name}} closed. Completed: {{get-sprint-issues.total}} issues. Sprint ID: {{sprint_id}}"
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://sony.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint/{{sprint_id}}"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
    - type: http
      namespace: jira-sprint-issues
      baseUri: "https://sony.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/search"
          inputParameters:
            - name: sprint_id
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams-retro
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Fetches post performance metrics from LinkedIn and Meta for Sony's brand channels and publishes a unified weekly social media performance report to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn and Meta Social Content Performance Report"
  description: "Fetches post performance metrics from LinkedIn and Meta for Sony's brand channels and publishes a unified weekly social media performance report to the marketing Teams channel."
  tags:
    - marketing
    - social
    - linkedin
    - meta
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-social-performance
          description: "Retrieve post engagement metrics from LinkedIn and Meta for the past week and post a unified social performance digest to the marketing Teams channel. Use for weekly social media review meetings."
          inputParameters:
            - name: linkedin_org_id
              in: body
              type: string
              description: "The LinkedIn organization URN for Sony's company page."
            - name: meta_page_id
              in: body
              type: string
              description: "The Meta Facebook page ID for Sony's brand page."
          steps:
            - name: get-linkedin-stats
              type: call
              call: "linkedin.get-org-stats"
              with:
                org_id: "{{linkedin_org_id}}"
            - name: get-meta-stats
              type: call
              call: "meta.get-page-insights"
              with:
                page_id: "{{meta_page_id}}"
            - name: post-report
              type: call
              call: "msteams-social.post-message"
              with:
                channel_id: "$secrets.marketing_teams_channel"
                text: "Weekly Social Report | LinkedIn Impressions: {{get-linkedin-stats.impressions}} | Meta Reach: {{get-meta-stats.reach}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: org-stats
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: org_id
              in: query
          operations:
            - name: get-org-stats
              method: GET
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_access_token"
      resources:
        - name: page-insights
          path: "/{{page_id}}/insights"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page-insights
              method: GET
    - type: http
      namespace: msteams-social
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

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

Publishes approved job requisitions from Workday Recruiting to LinkedIn Jobs and notifies the talent acquisition team in Microsoft Teams when postings go live.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting for Sony Talent Acquisition"
  description: "Publishes approved job requisitions from Workday Recruiting to LinkedIn Jobs and notifies the talent acquisition team in Microsoft Teams when postings go live."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: publish-job-to-linkedin
          description: "Given a Workday job requisition ID, retrieve job details and publish the posting to LinkedIn under Sony's company page. Notify the TA team in Teams when the posting is live. Use when requisitions are approved for external posting."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: linkedin_org_id
              in: body
              type: string
              description: "The LinkedIn organization URN for the Sony entity posting the role."
          steps:
            - name: get-requisition
              type: call
              call: "workday-recruiting.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-job
              type: call
              call: "linkedin-jobs.create-job-posting"
              with:
                organization_id: "{{linkedin_org_id}}"
                title: "{{get-requisition.jobTitle}}"
                description: "{{get-requisition.jobDescription}}"
                location: "{{get-requisition.location}}"
            - name: notify-ta-team
              type: call
              call: "msteams-ta.post-message"
              with:
                channel_id: "$secrets.recruiting_teams_channel"
                text: "Job {{get-requisition.jobTitle}} posted to LinkedIn. LinkedIn Posting ID: {{post-job.postingId}}"
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin-jobs
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST
    - type: http
      namespace: msteams-ta
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Fetches campaign performance metrics from Marketo for Sony's marketing programs and publishes a weekly digest to the marketing team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Marketo Campaign Performance Digest"
  description: "Fetches campaign performance metrics from Marketo for Sony's marketing programs and publishes a weekly digest to the marketing team's Microsoft Teams channel."
  tags:
    - marketing
    - marketo
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a Marketo program ID and date range, retrieve email performance metrics (opens, clicks, conversions) and post a weekly campaign digest to the marketing Teams channel. Use for weekly marketing performance reviews."
          inputParameters:
            - name: program_id
              in: body
              type: string
              description: "The Marketo program ID to report on."
            - name: start_date
              in: body
              type: string
              description: "Report start date in ISO 8601 format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in ISO 8601 format."
          steps:
            - name: get-program-stats
              type: call
              call: "marketo.get-program-stats"
              with:
                program_id: "{{program_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams-mktg-digest.post-message"
              with:
                channel_id: "$secrets.marketing_teams_channel"
                text: "Campaign digest {{start_date}} to {{end_date}} | Program {{program_id}} | Opens: {{get-program-stats.opens}} | Clicks: {{get-program-stats.clicks}}"
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://sony.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: program-stats
          path: "/stats/usage/last7days.json"
          inputParameters:
            - name: program_id
              in: query
          operations:
            - name: get-program-stats
              method: GET
    - type: http
      namespace: msteams-mktg-digest
      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: channel_id
              in: path
          operations:
            - name: post-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

Assigns appropriate Okta application groups to new employees based on their department and role from Workday, enabling single sign-on access to Sony's SaaS applications.

naftiko: "0.5"
info:
  label: "Okta Identity Provisioning for New Hires"
  description: "Assigns appropriate Okta application groups to new employees based on their department and role from Workday, enabling single sign-on access to Sony's SaaS applications."
  tags:
    - identity
    - security
    - okta
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-provisioning
      port: 8080
      tools:
        - name: provision-okta-access
          description: "Given a Workday worker ID, retrieve the employee's role and department, look up their Okta profile, and assign the appropriate application groups. Notify IT in Teams on completion. Use during onboarding or role changes."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the employee."
            - name: okta_group_ids
              in: body
              type: string
              description: "Comma-separated Okta group IDs to assign based on department and role."
          steps:
            - name: get-worker
              type: call
              call: "workday-okta.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: find-okta-user
              type: call
              call: "okta-lookup.get-user"
              with:
                email: "{{get-worker.email}}"
            - name: assign-groups
              type: call
              call: "okta-groups.assign-user-to-group"
              with:
                user_id: "{{find-okta-user.id}}"
                group_ids: "{{okta_group_ids}}"
            - name: notify-it
              type: call
              call: "msteams-it.post-message"
              with:
                channel_id: "$secrets.it_teams_channel"
                text: "Okta access provisioned for {{get-worker.email}}. Groups: {{okta_group_ids}}"
  consumes:
    - type: http
      namespace: workday-okta
      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: okta-lookup
      baseUri: "https://sony.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: okta-groups
      baseUri: "https://sony.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: assign-user-to-group
              method: PUT
    - type: http
      namespace: msteams-it
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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://sony.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 Okta detects a suspicious login for a Sony employee, suspends the account, opens a ServiceNow security incident, and alerts the security operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Security Response"
  description: "When Okta detects a suspicious login for a Sony employee, suspends the account, opens a ServiceNow security incident, and alerts the security operations team in Microsoft Teams."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-response
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given an Okta user ID and suspicious event details, suspend the account, open a ServiceNow security incident, and notify the SOC team in Teams. Use when Okta threat intelligence flags an anomalous login attempt."
          inputParameters:
            - name: okta_user_id
              in: body
              type: string
              description: "The Okta user ID with the suspicious login."
            - name: event_description
              in: body
              type: string
              description: "Description of the suspicious event from Okta ThreatInsight."
          steps:
            - name: suspend-user
              type: call
              call: "okta-suspend.suspend-user"
              with:
                user_id: "{{okta_user_id}}"
            - name: create-sec-incident
              type: call
              call: "servicenow-sec.create-incident"
              with:
                short_description: "Suspicious login: Okta user {{okta_user_id}}"
                category: "security"
                urgency: "high"
                description: "{{event_description}}\nAccount suspended pending review."
            - name: notify-soc
              type: call
              call: "msteams-soc.post-message"
              with:
                channel_id: "$secrets.security_teams_channel"
                text: "Security alert: Okta account {{okta_user_id}} suspended. ServiceNow: {{create-sec-incident.number}}"
  consumes:
    - type: http
      namespace: okta-suspend
      baseUri: "https://sony.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow-sec
      baseUri: "https://sony.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-soc
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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

At financial period close, validates that all Oracle ERP journal entries are complete for Sony's fiscal entities and posts a close status report to the controller team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Oracle ERP Financial Period Close Validation"
  description: "At financial period close, validates that all Oracle ERP journal entries are complete for Sony's fiscal entities and posts a close status report to the controller team in Microsoft Teams."
  tags:
    - finance
    - period-close
    - oracle
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: validate-period-close
          description: "Given a fiscal year, period, and Sony legal entity code, query Oracle ERP for unposted journal entries and report close readiness to the controller Teams channel. Use at month-end before finalizing close."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year (e.g., 2026)."
            - name: period_name
              in: body
              type: string
              description: "The Oracle period name (e.g., Apr-26)."
            - name: ledger_id
              in: body
              type: string
              description: "The Oracle ledger ID for the Sony legal entity."
          steps:
            - name: get-unposted-entries
              type: call
              call: "oracle-gl.get-unposted-journals"
              with:
                fiscal_year: "{{fiscal_year}}"
                period_name: "{{period_name}}"
                ledger_id: "{{ledger_id}}"
            - name: post-close-status
              type: call
              call: "msteams-close.post-message"
              with:
                channel_id: "$secrets.controller_teams_channel"
                text: "Period close check FY{{fiscal_year}} {{period_name}} Ledger {{ledger_id}}: {{get-unposted-entries.count}} unposted journals remaining."
  consumes:
    - type: http
      namespace: oracle-gl
      baseUri: "https://sony.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: journals
          path: "/generalLedgerJournals"
          inputParameters:
            - name: fiscal_year
              in: query
            - name: period_name
              in: query
            - name: ledger_id
              in: query
          operations:
            - name: get-unposted-journals
              method: GET
    - type: http
      namespace: msteams-close
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up an Oracle ERP purchase order by PO number and returns header status, supplier, amount, and line-item summary for finance and procurement review.

naftiko: "0.5"
info:
  label: "Oracle ERP Purchase Order Lookup"
  description: "Looks up an Oracle ERP purchase order by PO number and returns header status, supplier, amount, and line-item summary for finance and procurement review."
  tags:
    - finance
    - procurement
    - oracle
    - erp
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given an Oracle ERP purchase order number, return the PO header status, supplier name, total amount, and currency. Use for procurement approvals and spend visibility reviews."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The Oracle ERP purchase order number."
          call: "oracle-po.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.items[0].Status"
            - name: supplier
              type: string
              mapping: "$.items[0].SupplierName"
            - name: total_amount
              type: string
              mapping: "$.items[0].Amount"
            - name: currency
              type: string
              mapping: "$.items[0].CurrencyCode"
  consumes:
    - type: http
      namespace: oracle-po
      baseUri: "https://sony.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders"
          inputParameters:
            - name: po_number
              in: query
          operations:
            - name: get-po
              method: GET

Queries Oracle Hyperion for budget-vs-actual variance data for Sony divisions, identifies significant variances, and sends a variance alert report to the finance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Oracle Hyperion Budget Variance Alert"
  description: "Queries Oracle Hyperion for budget-vs-actual variance data for Sony divisions, identifies significant variances, and sends a variance alert report to the finance team via Microsoft Teams."
  tags:
    - finance
    - budgeting
    - oracle
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-variance
      port: 8080
      tools:
        - name: report-budget-variance
          description: "Given a Sony division code and fiscal period, query Oracle Hyperion for budget-vs-actual variance. Post a variance alert to the finance Teams channel if variance exceeds threshold. Use for monthly financial review."
          inputParameters:
            - name: division_code
              in: body
              type: string
              description: "The Sony division code to analyze (e.g., SPSE for Sony Pictures, SME for Sony Music)."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period in YYYY-MM format."
            - name: variance_threshold_pct
              in: body
              type: number
              description: "The percentage variance threshold above which to send an alert (e.g., 10 for 10%)."
          steps:
            - name: get-variance
              type: call
              call: "oracle-hyperion.get-budget-variance"
              with:
                division_code: "{{division_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: post-variance-alert
              type: call
              call: "msteams-budget.post-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Budget variance alert for {{division_code}} in {{fiscal_period}}: {{get-variance.variancePct}}% vs threshold {{variance_threshold_pct}}%"
  consumes:
    - type: http
      namespace: oracle-hyperion
      baseUri: "https://sony-hyperion.fa.us2.oraclecloud.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: budget-variance
          path: "/applications/{{app}}/plantypes/{{plan_type}}/forms/{{form_id}}"
          inputParameters:
            - name: division_code
              in: query
            - name: fiscal_period
              in: query
          operations:
            - name: get-budget-variance
              method: GET
    - type: http
      namespace: msteams-budget
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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://sony.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 Datadog monitor detects a PSN service degradation, opens a PagerDuty incident, creates a Jira P1 bug for the platform team, and posts a status alert to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "PlayStation Network Incident Response"
  description: "When a Datadog monitor detects a PSN service degradation, opens a PagerDuty incident, creates a Jira P1 bug for the platform team, and posts a status alert to the engineering Microsoft Teams channel."
  tags:
    - gaming
    - incident-response
    - datadog
    - pagerduty
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: psn-ops
      port: 8080
      tools:
        - name: handle-psn-service-degradation
          description: "Given a Datadog monitor ID and service name, trigger a PagerDuty incident, create a Jira P1 bug, and alert the engineering channel in Teams. Use when PSN core services show degradation or outage signals."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired the alert."
            - name: service_name
              in: body
              type: string
              description: "The PSN service name experiencing degradation (e.g., psn-auth, psn-store)."
            - name: severity
              in: body
              type: string
              description: "Incident severity: P1, P2, or P3."
          steps:
            - name: get-monitor-status
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: trigger-page
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "$secrets.pagerduty_psn_service_id"
                summary: "{{severity}} PSN service degradation: {{service_name}}"
                severity: "critical"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PSN"
                issuetype: "Bug"
                summary: "[{{severity}}] Service degradation: {{service_name}}"
                description: "Monitor: {{monitor_id}}\nState: {{get-monitor-status.overall_state}}\nPagerDuty: {{trigger-page.incidentId}}"
            - name: post-alert
              type: call
              call: "msteams-eng.post-message"
              with:
                channel_id: "$secrets.engineering_teams_channel"
                text: "{{severity}} PSN Incident: {{service_name}} | PagerDuty: {{trigger-page.incidentId}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://sony.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-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the last refresh status of a Power BI dataset.

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

Triggers a Power BI dataset refresh for the Sony Entertainment revenue dashboard and notifies the finance team in Teams when the refresh completes.

naftiko: "0.5"
info:
  label: "Power BI Entertainment Revenue Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the Sony Entertainment revenue dashboard and notifies the finance team in Teams when the refresh completes."
  tags:
    - finance
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - entertainment
capability:
  exposes:
    - type: mcp
      namespace: entertainment-reporting
      port: 8080
      tools:
        - name: refresh-revenue-dashboard
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh for the Sony Entertainment revenue dashboard and notify the finance team in Teams. Use at period close or on demand before executive reviews."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the entertainment revenue dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: "msteams-report.post-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Entertainment revenue dashboard refresh triggered. Dataset: {{dataset_id}} in workspace {{workspace_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-report
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

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

Syncs closed-won Salesforce opportunities for Sony Pictures and Sony Music content licensing deals to Oracle ERP for contract and revenue management.

naftiko: "0.5"
info:
  label: "Salesforce Entertainment Account Opportunity Sync"
  description: "Syncs closed-won Salesforce opportunities for Sony Pictures and Sony Music content licensing deals to Oracle ERP for contract and revenue management."
  tags:
    - sales
    - entertainment
    - salesforce
    - oracle
    - crm
capability:
  exposes:
    - type: mcp
      namespace: entertainment-sales
      port: 8080
      tools:
        - name: sync-opportunity-to-oracle
          description: "Given a Salesforce opportunity ID for a closed content licensing deal, retrieve deal details and create a revenue contract record in Oracle ERP. Use when licensing deals close in Salesforce CRM."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID (18-character Salesforce ID)."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-contract
              type: call
              call: "oracle-erp.create-contract"
              with:
                contract_name: "{{get-opportunity.Name}}"
                amount: "{{get-opportunity.Amount}}"
                close_date: "{{get-opportunity.CloseDate}}"
                account_name: "{{get-opportunity.AccountName}}"
            - name: notify-finance
              type: call
              call: "msteams-fin.post-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Contract created in Oracle for {{get-opportunity.Name}}. Oracle ID: {{create-contract.contractId}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://sony.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: oracle-erp
      baseUri: "https://sony.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: contracts
          path: "/contracts"
          operations:
            - name: create-contract
              method: POST
    - type: http
      namespace: msteams-fin
      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: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new lead is created in Salesforce for Sony B2B sales, enriches the record with company firmographic data from ZoomInfo and updates lead scoring fields.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment with ZoomInfo"
  description: "When a new lead is created in Salesforce for Sony B2B sales, enriches the record with company firmographic data from ZoomInfo and updates lead scoring fields."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: lead-enrichment
      port: 8080
      tools:
        - name: enrich-salesforce-lead
          description: "Given a Salesforce lead ID, retrieve the lead's company info, look up firmographic data in ZoomInfo, and update the Salesforce record with employee count, revenue, and industry. Use when B2B leads are created from campaigns."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID (18-character Salesforce ID)."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-lead.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-company
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{get-lead.Company}}"
            - name: update-lead
              type: call
              call: "salesforce-lead-update.update-lead"
              with:
                lead_id: "{{lead_id}}"
                employee_count: "{{enrich-company.employeeCount}}"
                industry: "{{enrich-company.industry}}"
                revenue: "{{enrich-company.revenue}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://sony.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-lead-update
      baseUri: "https://sony.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

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

naftiko: "0.5"
info:
  label: "Salesforce Lead to Jira Feature Request"
  description: "When a high-value Salesforce lead submits a feature request, creates a Jira ticket and notifies the product team in Microsoft Teams."
  tags:
    - crm
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-lead-to-jira-feature-request
          description: "When a high-value Salesforce lead submits a feature request, creates a Jira ticket and notifies the product team in Microsoft Teams."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Lead to Jira Feature Request: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://sony.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://sony.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 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://sony.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://sony.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://sony.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: records
          path: "/issue"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a territory assignment changes, updates lead routing and notifies affected reps.

naftiko: "0.5"
info:
  label: "Salesforce Territory Change to Routing Update"
  description: "When a territory assignment changes, updates lead routing and notifies affected reps."
  tags:
    - crm
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: salesforce-territory-change-to-routing-update
          description: "When a territory assignment changes, updates lead routing and notifies affected reps."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-salesforce
              type: call
              call: salesforce.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-msteams
              type: call
              call: msteams.create-record
              with:
                reference: "{{process-salesforce.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_crm_team_id"
                channel_id: "$secrets.teams_crm_channel_id"
                text: "Salesforce Territory Change to Routing Update: {{source_id}} | {{summary}} | Ref: {{create-msteams.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://sony.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://sony.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://sony-erp.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

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://sony.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://sony-erp.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://sony.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://sony-erp.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://sony-erp.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves material master data from SAP by material number.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP by material number."
  tags:
    - erp
    - sap
    - materials
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material-master
          description: "Given a SAP material number, retrieve the material description."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: sap.get-material
          with:
            Material: "{{material_number}}"
          outputParameters:
            - name: result_id
              type: string
              mapping: "$.id"
            - name: result_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sony-erp.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://sony-erp.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://sony.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Purchase Order Approval to Ariba Sync"
  description: "When a purchase order is approved in SAP, syncs the PO to Ariba and posts confirmation to the procurement Teams channel."
  tags:
    - procurement
    - sap
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: sap-purchase-order-approval-to-ariba-sync
          description: "When a purchase order is approved in SAP, syncs the PO to Ariba and posts confirmation to the procurement Teams channel."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-ariba
              type: call
              call: ariba.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_procurement_team_id"
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "SAP Purchase Order Approval to Ariba Sync: {{source_id}} | {{summary}} | Ref: {{create-ariba.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sony-erp.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: records
          path: "/A_BusinessPartner"
          operations:
            - name: process-record
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: records
          path: "/requisitions"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a quality inspection places goods on hold, creates a Jira quality issue and notifies procurement.

naftiko: "0.5"
info:
  label: "SAP Quality Hold to Supplier Notification"
  description: "When a quality inspection places goods on hold, creates a Jira quality issue and notifies procurement."
  tags:
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: sap-quality-hold-to-supplier-notification
          description: "When a quality inspection places goods on hold, creates a Jira quality issue and notifies procurement."
          inputParameters:
            - name: source_id
              in: body
              type: string
              description: "Source record identifier."
            - name: summary
              in: body
              type: string
              description: "Summary of the event."
            - name: severity
              in: body
              type: string
              description: "Priority or severity level."
          steps:
            - name: process-sap
              type: call
              call: sap.process-record
              with:
                id: "{{source_id}}"
                description: "{{summary}}"
            - name: create-jira
              type: call
              call: jira.create-record
              with:
                reference: "{{process-sap.id}}"
                summary: "{{summary}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_quality_team_id"
                channel_id: "$secrets.teams_quality_channel_id"
                text: "SAP Quality Hold to Supplier Notification: {{source_id}} | {{summary}} | Ref: {{create-jira.id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sony-erp.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://sony.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://sony-erp.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://sony.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

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://sony.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://sony.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Creates a ServiceNow change request for planned PlayStation or Sony infrastructure changes, routes it for CAB approval, and notifies stakeholders in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request Workflow"
  description: "Creates a ServiceNow change request for planned PlayStation or Sony infrastructure changes, routes it for CAB approval, and notifies stakeholders in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Given a change summary, risk level, and assignment group, create a ServiceNow change request and notify the change advisory board in Teams. Use to initiate controlled infrastructure changes for PlayStation or Sony IT systems."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the planned infrastructure change."
            - name: risk
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: assignment_group
              in: body
              type: string
              description: "The ServiceNow group responsible for implementing the change."
          steps:
            - name: create-cr
              type: call
              call: "servicenow-cr.create-change"
              with:
                short_description: "{{short_description}}"
                risk: "{{risk}}"
                assignment_group: "{{assignment_group}}"
            - name: notify-cab
              type: call
              call: "msteams-cab.post-message"
              with:
                channel_id: "$secrets.cab_teams_channel"
                text: "Change request {{create-cr.number}} submitted. Risk: {{risk}}. {{short_description}}"
  consumes:
    - type: http
      namespace: servicenow-cr
      baseUri: "https://sony.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
              method: POST
    - type: http
      namespace: msteams-cab
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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://sony.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://sony.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://sony.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://sony.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 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://sony.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://sony.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

Monitors Sony Pictures and Sony Music streaming analytics pipelines in Snowflake, detects stalled or failed jobs, and opens a Jira data engineering ticket for triage.

naftiko: "0.5"
info:
  label: "Snowflake Media Analytics Pipeline Monitor"
  description: "Monitors Sony Pictures and Sony Music streaming analytics pipelines in Snowflake, detects stalled or failed jobs, and opens a Jira data engineering ticket for triage."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - entertainment
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: media-analytics-ops
      port: 8080
      tools:
        - name: monitor-streaming-analytics
          description: "Check Snowflake task history for failed streaming analytics jobs in a given database. Open a Jira ticket if critical failures are detected. Use for daily monitoring of media analytics pipelines."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "The Snowflake database containing streaming analytics tasks (e.g., SONY_MEDIA_ANALYTICS)."
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours to look back for task failures."
          steps:
            - name: check-tasks
              type: call
              call: "snowflake.get-task-history"
              with:
                database: "{{database}}"
                lookback_hours: "{{lookback_hours}}"
            - name: create-ticket
              type: call
              call: "jira-data.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Snowflake pipeline failure in {{database}}"
                description: "Failed tasks detected over last {{lookback_hours}} hours in {{database}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://sony.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/INFORMATION_SCHEMA/task-history"
          inputParameters:
            - name: database
              in: path
          operations:
            - name: get-task-history
              method: GET
    - type: http
      namespace: jira-data
      baseUri: "https://sony.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 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://sony.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://sony.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://sony.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

When Terraform Cloud detects infrastructure drift, creates a Jira remediation ticket and notifies the platform engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Drift Detection"
  description: "When Terraform Cloud detects infrastructure drift, creates a Jira remediation ticket and notifies the platform engineering team in Microsoft Teams."
  tags:
    - infrastructure
    - terraform
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: handle-drift-detection
          description: "Given a Terraform workspace with drift, create a remediation ticket and notify the platform team."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name."
            - name: drift_summary
              in: body
              type: string
              description: "Summary of detected drift."
            - name: resource_count
              in: body
              type: integer
              description: "Number of drifted resources."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: PLATFORM
                issuetype: Bug
                summary: "Terraform Drift: {{workspace_name}} ({{resource_count}} resources)"
                description: "{{drift_summary}}"
            - name: notify-platform
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_platform_team_id"
                channel_id: "$secrets.teams_platform_channel_id"
                text: "Terraform Drift: {{workspace_name}} | {{resource_count}} resources | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://sony.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a 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://sony.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://sony.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://sony.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://sony.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

Retrieves current headcount by department and cost center from Workday and publishes a structured snapshot to the finance team's Teams channel for workforce planning.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot for Finance"
  description: "Retrieves current headcount by department and cost center from Workday and publishes a structured snapshot to the finance team's Teams channel for workforce planning."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-analytics
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Return current headcount grouped by department and cost center from Workday. Post the summary to the finance Teams channel. Use for quarterly workforce planning and budget reviews."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The Workday company code to filter headcount by."
          steps:
            - name: get-headcount
              type: call
              call: "workday-hc.get-workers"
              with:
                company_code: "{{company_code}}"
            - name: post-snapshot
              type: call
              call: "msteams-hc.post-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Headcount snapshot for {{company_code}}: {{get-headcount.totalCount}} active employees across {{get-headcount.departmentCount}} departments."
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: company_code
              in: query
          operations:
            - name: get-workers
              method: GET
    - type: http
      namespace: msteams-hc
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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://sony.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://sony.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an employee termination is processed in Workday, disables the Microsoft 365 account, resolves open ServiceNow tickets, and notifies HR via Teams.

naftiko: "0.5"
info:
  label: "Workday Offboarding Orchestrator"
  description: "When an employee termination is processed in Workday, disables the Microsoft 365 account, resolves open ServiceNow tickets, and notifies HR via Teams."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday worker ID and termination date, disable the Microsoft 365 account and notify HR in Teams. Use when a termination is confirmed in Workday."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The effective termination date in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: "workday-offboard.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: disable-account
              type: call
              call: "msgraph-offboard.disable-user"
              with:
                user_id: "{{get-worker.email}}"
            - name: notify-hr
              type: call
              call: "msteams-hr.post-message"
              with:
                channel_id: "$secrets.hr_teams_channel"
                text: "Offboarding complete for {{get-worker.firstName}} {{get-worker.lastName}}. Account disabled as of {{termination_date}}."
  consumes:
    - type: http
      namespace: workday-offboard
      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-offboard
      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: msteams-hr
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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://sony.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

At payroll period close, retrieves headcount and total compensation data from Workday and publishes a period close summary to the finance team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Workday Payroll Period Close Report"
  description: "At payroll period close, retrieves headcount and total compensation data from Workday and publishes a period close summary to the finance team's Microsoft Teams channel."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: payroll-close
      port: 8080
      tools:
        - name: publish-payroll-close-report
          description: "Given a Workday payroll period ID and company code, retrieve period headcount and total compensation and post a close summary to the finance Teams channel. Use at the end of each Sony payroll period."
          inputParameters:
            - name: period_id
              in: body
              type: string
              description: "The Workday payroll period ID."
            - name: company_code
              in: body
              type: string
              description: "The Workday company code (e.g., Sony Corporation)."
          steps:
            - name: get-payroll-results
              type: call
              call: "workday-payroll.get-period-results"
              with:
                period_id: "{{period_id}}"
                company_code: "{{company_code}}"
            - name: post-close-report
              type: call
              call: "msteams-payroll.post-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Payroll period {{period_id}} closed for {{company_code}}. Headcount: {{get-payroll-results.headcount}}. Total compensation: {{get-payroll-results.totalCompensation}}"
  consumes:
    - type: http
      namespace: workday-payroll
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll-results
          path: "/payrollResults"
          inputParameters:
            - name: period_id
              in: query
            - name: company_code
              in: query
          operations:
            - name: get-period-results
              method: GET
    - type: http
      namespace: msteams-payroll
      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: channel_id
              in: path
          operations:
            - name: post-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://sony.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://sony.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 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://sony.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://sony.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