Procter & Gamble Capabilities

Naftiko 0.5 capability definitions for Procter & Gamble - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Pulls DTC website conversion funnel metrics from Adobe Analytics into Snowflake, refreshes Power BI dashboards, and sends insights to the e-commerce team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Adobe Analytics DTC Conversion Funnel"
  description: "Pulls DTC website conversion funnel metrics from Adobe Analytics into Snowflake, refreshes Power BI dashboards, and sends insights to the e-commerce team via Microsoft Teams."
  tags:
    - analytics
    - adobe-analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: adobe_analytics_dtc_
      port: 8080
      tools:
        - name: adobe-analytics
          description: "Given an execution date, run the adobe analytics dtc conversion funnel process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.ADOBE_ANALYTICS_DTC_CONVERSION_FUNNEL LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.ADOBE_ANALYTICS_DTC_CONVERSION_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_adobe_analytics_dtc__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs Adobe Campaign email performance metrics to Snowflake, analyzes engagement trends, and distributes reports to the digital marketing team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Adobe Campaign Email Performance Sync"
  description: "Syncs Adobe Campaign email performance metrics to Snowflake, analyzes engagement trends, and distributes reports to the digital marketing team via Microsoft Teams."
  tags:
    - marketing
    - adobe-campaign
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: adobe_campaign_email
      port: 8080
      tools:
        - name: adobe-campaign
          description: "Given an execution date, run the adobe campaign email performance sync process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.ADOBE_CAMPAIGN_EMAIL_PERFORMANCE_SYNC LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.ADOBE_CAMPAIGN_EMAIL_PERFORMAN_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_adobe_campaign_email_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Given a consumer complaint narrative, uses Anthropic Claude to classify the complaint category and urgency, then creates a Salesforce case for the consumer affairs team.

naftiko: "0.5"
info:
  label: "AI-Assisted Consumer Complaint Triage"
  description: "Given a consumer complaint narrative, uses Anthropic Claude to classify the complaint category and urgency, then creates a Salesforce case for the consumer affairs team."
  tags:
    - ai
    - consumer-affairs
    - anthropic
    - salesforce
    - customer-support
capability:
  exposes:
    - type: mcp
      namespace: consumer-affairs-ai
      port: 8080
      tools:
        - name: triage-consumer-complaint
          description: "Given a consumer complaint text and product name, invoke Anthropic Claude to classify the complaint type and urgency, then create a Salesforce consumer affairs case."
          inputParameters:
            - name: complaint_text
              in: body
              type: string
              description: "The full consumer complaint narrative text."
            - name: product_name
              in: body
              type: string
              description: "The P&G product associated with the complaint (e.g., 'Tide Pods', 'Pampers Size 4')."
            - name: consumer_email
              in: body
              type: string
              description: "The consumer's email address for case creation."
          steps:
            - name: classify-complaint
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Classify this consumer complaint about {{product_name}} into: 1) Category (Product Quality, Packaging, Performance, Safety, Other), 2) Urgency (Immediate, High, Standard), 3) Recommended action. Complaint: {{complaint_text}}"
            - name: create-sf-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Consumer Complaint — {{product_name}}"
                description: "{{complaint_text}}\n\nAI Classification: {{classify-complaint.content}}"
                suppliedEmail: "{{consumer_email}}"
                origin: "AI Triage"
  consumes:
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://pg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Pulls Azure DevOps sprint velocity data into Snowflake, computes team trends, and sends sprint reports to engineering managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Sprint Velocity Reporter"
  description: "Pulls Azure DevOps sprint velocity data into Snowflake, computes team trends, and sends sprint reports to engineering managers via Microsoft Teams."
  tags:
    - devops
    - azure-devops
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: azure_devops_sprint_
      port: 8080
      tools:
        - name: azure-devops
          description: "Given an execution date, run the azure devops sprint velocity reporter process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.AZURE_DEVOPS_SPRINT_VELOCITY_REPORTER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.AZURE_DEVOPS_SPRINT_VELOCITY_R_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_azure_devops_sprint__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Azure costs approach budget thresholds, logs the alert in Snowflake, creates a ServiceNow request for review, and notifies the cloud governance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure FinOps Budget Alert Handler"
  description: "When Azure costs approach budget thresholds, logs the alert in Snowflake, creates a ServiceNow request for review, and notifies the cloud governance team via Microsoft Teams."
  tags:
    - cloud
    - microsoft-azure
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: azure_finops_budget_
      port: 8080
      tools:
        - name: azure-finops
          description: "Given an execution date, run the azure finops budget alert handler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.AZURE_FINOPS_BUDGET_ALERT_HANDLER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.AZURE_FINOPS_BUDGET_ALERT_HAND_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "cloud"
                short_description: "Azure FinOps Budget Alert Handler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_azure_finops_budget__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Azure Cost Management detects a spend anomaly on a P&G subscription, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel.

naftiko: "0.5"
info:
  label: "Azure FinOps Cost Anomaly Responder"
  description: "When Azure Cost Management detects a spend anomaly on a P&G subscription, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel."
  tags:
    - finops
    - cloud
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-azure-cost-anomaly
          description: "Given an Azure subscription, resource group, and estimated overage in USD, create a ServiceNow financial incident and post a FinOps Teams alert."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the cost anomaly was detected."
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group driving the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated spend overage in US dollars."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure Cost Anomaly — {{resource_group}} — ${{estimated_overage_usd}}"
                category: "cloud_cost"
                urgency: "2"
            - name: post-finops-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "finops-alerts"
                text: "Azure Cost Anomaly: {{resource_group}} ({{subscription_id}}) | Overage: ${{estimated_overage_usd}} | SNOW: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Scans AKS container images for vulnerabilities via Snowflake data, creates Jira remediation tickets, and alerts the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Container Vulnerability Scanner"
  description: "Scans AKS container images for vulnerabilities via Snowflake data, creates Jira remediation tickets, and alerts the security team via Microsoft Teams."
  tags:
    - security
    - microsoft-azure
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: azure_kubernetes_con
      port: 8080
      tools:
        - name: azure-kubernetes
          description: "Given an execution date, run the azure kubernetes container vulnerability scanner process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.AZURE_KUBERNETES_CONTAINER_VULNERABILITY LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.AZURE_KUBERNETES_CONTAINER_VUL_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Azure Kubernetes Container Vulnerability Scanner - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_azure_kubernetes_con_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the health status of a specified Azure resource.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Checks the health status of a specified Azure resource."
  tags:
    - cloud
    - microsoft-azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-resource-health
          description: "Given an Azure resource ID, retrieve its availability status. Use for infrastructure monitoring."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "The Azure resource ID."
          call: "azure.get-resource-health"
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resource-health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-resource-health
              method: GET

Ingests Circana market share data into Snowflake, computes brand performance metrics, refreshes Power BI dashboards, and notifies brand managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Circana Market Share Tracker"
  description: "Ingests Circana market share data into Snowflake, computes brand performance metrics, refreshes Power BI dashboards, and notifies brand managers via Microsoft Teams."
  tags:
    - analytics
    - circana
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: circana_market_share
      port: 8080
      tools:
        - name: circana-market
          description: "Given an execution date, run the circana market share tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CIRCANA_MARKET_SHARE_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CIRCANA_MARKET_SHARE_TRACKER_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_circana_market_share_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects Cisco Webex meeting usage data, aggregates in Snowflake, and distributes adoption reports to IT leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cisco Webex Meeting Usage Analytics"
  description: "Collects Cisco Webex meeting usage data, aggregates in Snowflake, and distributes adoption reports to IT leadership via Microsoft Teams."
  tags:
    - collaboration
    - cisco-webex
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cisco_webex_meeting_
      port: 8080
      tools:
        - name: cisco-webex
          description: "Given an execution date, run the cisco webex meeting usage analytics process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CISCO_WEBEX_MEETING_USAGE_ANALYTICS LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CISCO_WEBEX_MEETING_USAGE_ANAL_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_cisco_webex_meeting__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes Cobalt penetration test findings, logs in Snowflake, creates Jira remediation tickets for critical issues, and alerts the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cobalt Penetration Test Result Processor"
  description: "Processes Cobalt penetration test findings, logs in Snowflake, creates Jira remediation tickets for critical issues, and alerts the security team via Microsoft Teams."
  tags:
    - security
    - cobalt
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cobalt_penetration_t
      port: 8080
      tools:
        - name: cobalt-penetration
          description: "Given an execution date, run the cobalt penetration test result processor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.COBALT_PENETRATION_TEST_RESULT_PROCESSOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.COBALT_PENETRATION_TEST_RESULT_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Cobalt Penetration Test Result Processor - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_cobalt_penetration_t_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Confluence page by ID, returning title, space, and version.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence page by ID, returning title, space, and version."
  tags:
    - documentation
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given a Confluence page ID, retrieve details. Use for documentation reviews."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://pg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=version,space"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

When consumer complaints in Salesforce exceed thresholds for a product, creates a ServiceNow quality investigation, logs in Snowflake, and alerts the quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Consumer Complaint Quality Escalation"
  description: "When consumer complaints in Salesforce exceed thresholds for a product, creates a ServiceNow quality investigation, logs in Snowflake, and alerts the quality team via Microsoft Teams."
  tags:
    - quality
    - salesforce
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer_complaint_q
      port: 8080
      tools:
        - name: consumer-complaint
          description: "Given an execution date, run the consumer complaint quality escalation process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CONSUMER_COMPLAINT_QUALITY_ESCALATION LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CONSUMER_COMPLAINT_QUALITY_ESC_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "quality"
                short_description: "Consumer Complaint Quality Escalation processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_consumer_complaint_q_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches Adobe Analytics campaign performance data for a P&G brand campaign and posts a consumer engagement digest to the brand marketing Teams channel.

naftiko: "0.5"
info:
  label: "Consumer Insight Campaign Performance Digest"
  description: "Fetches Adobe Analytics campaign performance data for a P&G brand campaign and posts a consumer engagement digest to the brand marketing Teams channel."
  tags:
    - marketing
    - analytics
    - reporting
    - microsoft-teams
    - campaign
    - consumer
capability:
  exposes:
    - type: mcp
      namespace: brand-analytics
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given an Adobe Analytics report suite ID and campaign ID, retrieve visits, conversions, and revenue metrics, then post a performance digest to the brand marketing Teams channel."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "The Adobe Analytics report suite ID for the brand (e.g., 'pg-tide-global')."
            - name: campaign_id
              in: body
              type: string
              description: "The campaign tracking code or ID to filter metrics."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the brand marketing digest."
          steps:
            - name: get-campaign-metrics
              type: call
              call: adobe-analytics.get-report
              with:
                report_suite: "{{report_suite_id}}"
                campaign: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Brand Campaign Digest — {{campaign_id}}: Visits: {{get-campaign-metrics.visits}} | Conversions: {{get-campaign-metrics.conversions}} | Revenue: ${{get-campaign-metrics.revenue}} | Bounce Rate: {{get-campaign-metrics.bounce_rate}}%"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{report_suite_id}}/reports"
          inputParameters:
            - name: report_suite_id
              in: path
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors consumer panel data refresh status in Snowflake, flags delayed feeds, creates ServiceNow incidents, and alerts the analytics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Consumer Panel Data Refresh Monitor"
  description: "Monitors consumer panel data refresh status in Snowflake, flags delayed feeds, creates ServiceNow incidents, and alerts the analytics team via Microsoft Teams."
  tags:
    - analytics
    - consumer-insights
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer_panel_data_
      port: 8080
      tools:
        - name: consumer-panel
          description: "Given an execution date, run the consumer panel data refresh monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CONSUMER_PANEL_DATA_REFRESH_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CONSUMER_PANEL_DATA_REFRESH_MO_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "analytics"
                short_description: "Consumer Panel Data Refresh Monitor processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_consumer_panel_data__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates social media sentiment data in Snowflake, runs trend analysis, refreshes Power BI dashboards, and notifies the consumer insights team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Consumer Sentiment Analysis Pipeline"
  description: "Aggregates social media sentiment data in Snowflake, runs trend analysis, refreshes Power BI dashboards, and notifies the consumer insights team via Microsoft Teams."
  tags:
    - analytics
    - consumer-insights
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consumer_sentiment_a
      port: 8080
      tools:
        - name: consumer-sentiment
          description: "Given an execution date, run the consumer sentiment analysis pipeline process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.CONSUMER_SENTIMENT_ANALYSIS_PIPELINE LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.CONSUMER_SENTIMENT_ANALYSIS_PI_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_consumer_sentiment_a_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes Coupa procurement spend data in Snowflake, identifies savings opportunities, creates Jira action items, and notifies the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Coupa Procurement Spend Analyzer"
  description: "Analyzes Coupa procurement spend data in Snowflake, identifies savings opportunities, creates Jira action items, and notifies the procurement team via Microsoft Teams."
  tags:
    - procurement
    - coupa
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: coupa_procurement_sp
      port: 8080
      tools:
        - name: coupa-procurement
          description: "Given an execution date, run the coupa procurement spend analyzer process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.COUPA_PROCUREMENT_SPEND_ANALYZER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.COUPA_PROCUREMENT_SPEND_ANALYZ_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Coupa Procurement Spend Analyzer - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_coupa_procurement_sp_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Datadog for eCommerce application performance alerts and creates a ServiceNow incident when a critical monitor fires on the P&G.com platform.

naftiko: "0.5"
info:
  label: "Datadog eCommerce Monitoring Alert"
  description: "Monitors Datadog for eCommerce application performance alerts and creates a ServiceNow incident when a critical monitor fires on the P&G.com platform."
  tags:
    - observability
    - datadog
    - servicenow
    - ecommerce
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: handle-ecommerce-alert
          description: "Given a Datadog monitor ID, alert severity, and affected eCommerce service, create a ServiceNow incident and alert the digital operations team in Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired the eCommerce alert."
            - name: monitor_name
              in: body
              type: string
              description: "The human-readable Datadog monitor name."
            - name: severity
              in: body
              type: string
              description: "Alert severity: 'critical' or 'warning'."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the digital operations team."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "eCommerce Alert [{{severity}}]: {{monitor_name}}"
                category: "ecommerce_monitoring"
                urgency: "1"
            - name: alert-digital-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "eCommerce Alert [{{severity}}]: {{monitor_name}} | Monitor: {{monitor_id}} | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for the health of P&G e-commerce platform services.

naftiko: "0.5"
info:
  label: "Datadog E-Commerce Service Health"
  description: "Queries Datadog for the health of P&G e-commerce platform services."
  tags:
    - monitoring
    - datadog
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-ecommerce-health
          description: "Given a Datadog service name, retrieve health status. Use for e-commerce platform monitoring."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: "datadog.get-service-health"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
  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: services
          path: "/service_level_objectives?query={{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-health
              method: GET

Compares demand forecasts against actual sales in Snowflake, flags significant variances, and notifies the demand planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Demand Forecast Accuracy Monitor"
  description: "Compares demand forecasts against actual sales in Snowflake, flags significant variances, and notifies the demand planning team via Microsoft Teams."
  tags:
    - supply-chain
    - forecasting
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: demand_forecast_accu
      port: 8080
      tools:
        - name: demand-forecast
          description: "Given an execution date, run the demand forecast accuracy monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.DEMAND_FORECAST_ACCURACY_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.DEMAND_FORECAST_ACCURACY_MONIT_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_demand_forecast_accu_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors e-commerce order fulfillment metrics in Snowflake, flags delayed shipments, creates ServiceNow incidents, and alerts the fulfillment team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "E-Commerce Order Fulfillment Tracker"
  description: "Monitors e-commerce order fulfillment metrics in Snowflake, flags delayed shipments, creates ServiceNow incidents, and alerts the fulfillment team via Microsoft Teams."
  tags:
    - e-commerce
    - fulfillment
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ecommerce_order_fulf
      port: 8080
      tools:
        - name: ecommerce-order
          description: "Given an execution date, run the e-commerce order fulfillment tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.ECOMMERCE_ORDER_FULFILLMENT_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.ECOMMERCE_ORDER_FULFILLMENT_TR_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "e-commerce"
                short_description: "E-Commerce Order Fulfillment Tracker processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_ecommerce_order_fulf_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, creates a ServiceNow offboarding ticket and notifies IT security in Microsoft Teams to revoke system access.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is processed in Workday, creates a ServiceNow offboarding ticket and notifies IT security in Microsoft Teams to revoke system access."
  tags:
    - hr
    - offboarding
    - workday
    - 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, create a ServiceNow offboarding ticket and alert the IT security team in Teams to begin access revocation."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-offboard-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Offboarding: {{get-employee.full_name}} — last day {{termination_date}}"
                category: "hr_offboarding"
                assigned_group: "IT_Security"
            - name: notify-it
              type: call
              call: msteams.send-message
              with:
                channel_id: "it-security-channel"
                text: "Offboarding started for {{get-employee.full_name}} (last day {{termination_date}}). SNOW: {{create-offboard-ticket.number}}. Begin access revocation."
  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: "/pg/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Figma design is marked for review, creates Jira review tasks, assigns to the UX team, and notifies stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Figma Design Review Workflow"
  description: "When a Figma design is marked for review, creates Jira review tasks, assigns to the UX team, and notifies stakeholders via Microsoft Teams."
  tags:
    - design
    - figma
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: figma_design_review_
      port: 8080
      tools:
        - name: figma-design
          description: "Given an execution date, run the figma design review workflow process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.FIGMA_DESIGN_REVIEW_WORKFLOW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.FIGMA_DESIGN_REVIEW_WORKFLOW_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Figma Design Review Workflow - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_figma_design_review__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes GitHub Actions build quality metrics in Snowflake, flags degrading build success rates, creates Jira tickets, and notifies engineering via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Build Quality Monitor"
  description: "Analyzes GitHub Actions build quality metrics in Snowflake, flags degrading build success rates, creates Jira tickets, and notifies engineering via Microsoft Teams."
  tags:
    - devops
    - github
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: github_cicd_build_qu
      port: 8080
      tools:
        - name: github-cicd
          description: "Given an execution date, run the github ci/cd build quality monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.GITHUB_CICD_BUILD_QUALITY_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.GITHUB_CICD_BUILD_QUALITY_MONI_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "GitHub CI/CD Build Quality Monitor - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_github_cicd_build_qu_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a GitHub repository including default branch and open issues.

naftiko: "0.5"
info:
  label: "GitHub Repository Info Lookup"
  description: "Retrieves metadata for a GitHub repository including default branch and open issues."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given a GitHub org and repo name, retrieve metadata. Use for developer onboarding."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "The GitHub organization."
            - name: repo
              in: body
              type: string
              description: "The repository name."
          call: "github.get-repo"
          with:
            org: "{{org}}"
            repo: "{{repo}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.full_name"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{org}}/{{repo}}"
          inputParameters:
            - name: org
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Audits Google Tag Manager containers for compliance with tagging standards, logs findings in Snowflake, and notifies the web analytics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Tag Manager Container Audit"
  description: "Audits Google Tag Manager containers for compliance with tagging standards, logs findings in Snowflake, and notifies the web analytics team via Microsoft Teams."
  tags:
    - analytics
    - google-tag-manager
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: google_tag_manager_c
      port: 8080
      tools:
        - name: google-tag
          description: "Given an execution date, run the google tag manager container audit process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.GOOGLE_TAG_MANAGER_CONTAINER_AUDIT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.GOOGLE_TAG_MANAGER_CONTAINER_A_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_google_tag_manager_c_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Informatica data quality job results in Snowflake, creates Jira tickets for failed rules, and notifies the data governance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Job Monitor"
  description: "Monitors Informatica data quality job results in Snowflake, creates Jira tickets for failed rules, and notifies the data governance team via Microsoft Teams."
  tags:
    - data-quality
    - informatica
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: informatica_data_qua
      port: 8080
      tools:
        - name: informatica-data
          description: "Given an execution date, run the informatica data quality job monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.INFORMATICA_DATA_QUALITY_JOB_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.INFORMATICA_DATA_QUALITY_JOB_M_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Informatica Data Quality Job Monitor - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_informatica_data_qua_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Jira issue by key, returning summary, status, and assignee.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, and assignee."
  tags:
    - project-management
    - jira
    - issue-tracking
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, retrieve details. Use for status updates and triage."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Fetches P&G LinkedIn company page engagement metrics and posts a monthly brand performance digest to the global communications Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Performance Digest"
  description: "Fetches P&G LinkedIn company page engagement metrics and posts a monthly brand performance digest to the global communications Microsoft Teams channel."
  tags:
    - marketing
    - linkedin
    - social
    - reporting
    - microsoft-teams
    - brand
capability:
  exposes:
    - type: mcp
      namespace: brand-social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-performance
          description: "Retrieve LinkedIn company page follower and engagement statistics for the past 30 days and post a brand performance digest to the global communications Teams channel."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The LinkedIn organization ID for P&G's company page."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the global communications team."
          steps:
            - name: get-follower-stats
              type: call
              call: linkedin.get-follower-statistics
              with:
                organization_id: "{{organization_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "P&G LinkedIn Performance (30d): Followers: {{get-follower-stats.follower_count}} | New Followers: +{{get-follower-stats.gained_30d}} | Engagement Rate: {{get-follower-stats.engagement_rate}}%"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: follower-statistics
          path: "/organizationalEntityFollowerStatistics"
          inputParameters:
            - name: organization_id
              in: query
          operations:
            - name: get-follower-statistics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls LinkedIn employer brand metrics, stores in Snowflake, and distributes talent acquisition insights to the HR team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Analytics"
  description: "Pulls LinkedIn employer brand metrics, stores in Snowflake, and distributes talent acquisition insights to the HR team via Microsoft Teams."
  tags:
    - hr
    - linkedin
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: linkedin_employer_br
      port: 8080
      tools:
        - name: linkedin-employer
          description: "Given an execution date, run the linkedin employer brand analytics process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.LINKEDIN_EMPLOYER_BRAND_ANALYTICS LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.LINKEDIN_EMPLOYER_BRAND_ANALYT_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_linkedin_employer_br_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sends a message to a specified Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Sender"
  description: "Sends a message to a specified Microsoft Teams channel."
  tags:
    - collaboration
    - microsoft-teams
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: send-channel-message
          description: "Given a Teams team ID, channel ID, and message, post to the channel. Use for automated notifications."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The channel ID."
            - name: message_text
              in: body
              type: string
              description: "The message body."
          call: "msteams.send-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message_text}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
  consumes:
    - 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 MuleSoft API integration health metrics in Snowflake, creates ServiceNow incidents for failing integrations, and alerts the integration team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "MuleSoft API Integration Health Check"
  description: "Monitors MuleSoft API integration health metrics in Snowflake, creates ServiceNow incidents for failing integrations, and alerts the integration team via Microsoft Teams."
  tags:
    - integration
    - mulesoft
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mulesoft_api_integra
      port: 8080
      tools:
        - name: mulesoft-api
          description: "Given an execution date, run the mulesoft api integration health check process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.MULESOFT_API_INTEGRATION_HEALTH_CHECK LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.MULESOFT_API_INTEGRATION_HEALT_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "integration"
                short_description: "MuleSoft API Integration Health Check processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_mulesoft_api_integra_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors NetApp storage utilization from Snowflake metrics, forecasts capacity needs, creates Jira procurement tasks, and notifies the infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "NetApp Storage Capacity Planner"
  description: "Monitors NetApp storage utilization from Snowflake metrics, forecasts capacity needs, creates Jira procurement tasks, and notifies the infrastructure team via Microsoft Teams."
  tags:
    - infrastructure
    - netapp
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: netapp_storage_capac
      port: 8080
      tools:
        - name: netapp-storage
          description: "Given an execution date, run the netapp storage capacity planner process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.NETAPP_STORAGE_CAPACITY_PLANNER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.NETAPP_STORAGE_CAPACITY_PLANNE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "NetApp Storage Capacity Planner - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_netapp_storage_capac_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates new product launch readiness across SAP material master, marketing assets, and retail distribution, then notifies the brand team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Product Launch Readiness Checker"
  description: "Validates new product launch readiness across SAP material master, marketing assets, and retail distribution, then notifies the brand team via Microsoft Teams."
  tags:
    - product-launch
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: new_product_launch_r
      port: 8080
      tools:
        - name: new-product
          description: "Given an execution date, run the new product launch readiness checker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.NEW_PRODUCT_LAUNCH_READINESS_CHECKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.NEW_PRODUCT_LAUNCH_READINESS_C_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_new_product_launch_r_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs product roadmap items from Notion to Jira epics, logs the mapping in Snowflake, and notifies the product management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Notion Product Roadmap Sync"
  description: "Syncs product roadmap items from Notion to Jira epics, logs the mapping in Snowflake, and notifies the product management team via Microsoft Teams."
  tags:
    - product-management
    - notion
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: notion_product_roadm
      port: 8080
      tools:
        - name: notion-product
          description: "Given an execution date, run the notion product roadmap sync process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.NOTION_PRODUCT_ROADMAP_SYNC LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.NOTION_PRODUCT_ROADMAP_SYNC_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Notion Product Roadmap Sync - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_notion_product_roadm_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Identifies privileged access accounts in Okta for certification review, logs in Snowflake, creates ServiceNow audit tasks, and notifies the IAM team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Certification"
  description: "Identifies privileged access accounts in Okta for certification review, logs in Snowflake, creates ServiceNow audit tasks, and notifies the IAM team via Microsoft Teams."
  tags:
    - security
    - okta
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: okta_privileged_acce
      port: 8080
      tools:
        - name: okta-privileged
          description: "Given an execution date, run the okta privileged access certification process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.OKTA_PRIVILEGED_ACCESS_CERTIFICATION LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.OKTA_PRIVILEGED_ACCESS_CERTIFI_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "security"
                short_description: "Okta Privileged Access Certification processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_okta_privileged_acce_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Lists Okta users in privileged groups who lack MFA enrollment and creates a ServiceNow security task for remediation.

naftiko: "0.5"
info:
  label: "Okta Privileged Access MFA Audit"
  description: "Lists Okta users in privileged groups who lack MFA enrollment and creates a ServiceNow security task for remediation."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - compliance
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: security-audit
      port: 8080
      tools:
        - name: audit-privileged-mfa
          description: "Given an Okta privileged access group ID, list members without MFA enrollment and create a ServiceNow security remediation task."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta privileged group ID to audit for MFA compliance."
          steps:
            - name: list-users-without-mfa
              type: call
              call: okta.list-users
              with:
                group_id: "{{okta_group_id}}"
            - name: create-remediation-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "MFA Remediation — {{list-users-without-mfa.count}} privileged users lack MFA"
                category: "security_compliance"
                description: "Users without MFA in privileged group {{okta_group_id}}: {{list-users-without-mfa.emails}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://pg.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_key"
        placement: header
      resources:
        - name: users
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pg.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

Looks up an Okta user by login email, returning profile status and last login time.

naftiko: "0.5"
info:
  label: "Okta User Lookup"
  description: "Looks up an Okta user by login email, returning profile status and last login time."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Given an Okta user login email, retrieve profile details. Use for identity verification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login email."
          call: "okta.get-user"
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://pg.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_login}}"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user
              method: GET

When a P1 production incident is declared, creates a ServiceNow P1 incident, annotates Datadog, and alerts the IT engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "P1 Production Incident Response Chain"
  description: "When a P1 production incident is declared, creates a ServiceNow P1 incident, annotates Datadog, and alerts the IT engineering team in Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given an affected P&G system and impact description, create a ServiceNow P1 incident, add a Datadog event annotation, and alert the engineering team via Teams."
          inputParameters:
            - name: affected_system
              in: body
              type: string
              description: "The P&G system or service experiencing the incident."
            - name: impact_description
              in: body
              type: string
              description: "Brief description of the business impact."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the engineering on-call alert."
          steps:
            - name: create-p1-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "P1: {{affected_system}} — {{impact_description}}"
                urgency: "1"
                priority: "1"
            - name: annotate-datadog
              type: call
              call: datadog.create-event
              with:
                title: "P1 Incident: {{affected_system}}"
                text: "SNOW {{create-p1-incident.number}} — {{impact_description}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "P1 INCIDENT: {{affected_system}} | Impact: {{impact_description}} | SNOW: {{create-p1-incident.number}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pg.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes plant energy consumption data in Snowflake, identifies optimization opportunities, creates Jira improvement tasks, and notifies the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plant Energy Consumption Optimizer"
  description: "Analyzes plant energy consumption data in Snowflake, identifies optimization opportunities, creates Jira improvement tasks, and notifies the sustainability team via Microsoft Teams."
  tags:
    - sustainability
    - manufacturing
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant_energy_consump
      port: 8080
      tools:
        - name: plant-energy
          description: "Given an execution date, run the plant energy consumption optimizer process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.PLANT_ENERGY_CONSUMPTION_OPTIMIZER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.PLANT_ENERGY_CONSUMPTION_OPTIM_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Plant Energy Consumption Optimizer - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_plant_energy_consump_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the refresh status of consumer insights Power BI datasets.

naftiko: "0.5"
info:
  label: "Power BI Consumer Dashboard Refresh Status"
  description: "Checks the refresh status of consumer insights Power BI datasets."
  tags:
    - analytics
    - power-bi
    - consumer-insights
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI dataset ID, check the last refresh status. Use for dashboard monitoring."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers a Power BI dataset refresh for the global consumer goods revenue dashboard and notifies the commercial analytics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Consumer Goods Revenue Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the global consumer goods revenue dashboard and notifies the commercial analytics team in Microsoft Teams."
  tags:
    - data
    - analytics
    - power-bi
    - finance
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-ops
      port: 8080
      tools:
        - name: refresh-revenue-dashboard
          description: "Trigger a Power BI refresh for the P&G global revenue dashboard and notify the commercial analytics team in Teams."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the global revenue dashboard."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the analytics team notification."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Global revenue dashboard refresh initiated. Dataset: {{dataset_id}} | Status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors retail POS data ingestion pipelines in Snowflake, flags missing retailer feeds, creates ServiceNow incidents, and alerts the data operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Retail POS Data Ingestion Monitor"
  description: "Monitors retail POS data ingestion pipelines in Snowflake, flags missing retailer feeds, creates ServiceNow incidents, and alerts the data operations team via Microsoft Teams."
  tags:
    - data-engineering
    - retail
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail_pos_data_inge
      port: 8080
      tools:
        - name: retail-pos
          description: "Given an execution date, run the retail pos data ingestion monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.RETAIL_POS_DATA_INGESTION_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.RETAIL_POS_DATA_INGESTION_MONI_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "data-engineering"
                short_description: "Retail POS Data Ingestion Monitor processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_retail_pos_data_inge_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors retail shelf availability data in Snowflake, creates Jira tasks for field reps when out-of-stock thresholds are breached, and notifies the sales team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Retail Shelf Availability Alert"
  description: "Monitors retail shelf availability data in Snowflake, creates Jira tasks for field reps when out-of-stock thresholds are breached, and notifies the sales team via Microsoft Teams."
  tags:
    - retail
    - supply-chain
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail_shelf_availab
      port: 8080
      tools:
        - name: retail-shelf
          description: "Given an execution date, run the retail shelf availability alert process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.RETAIL_SHELF_AVAILABILITY_ALERT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.RETAIL_SHELF_AVAILABILITY_ALER_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Retail Shelf Availability Alert - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_retail_shelf_availab_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Revert API integration fails, logs the error in Snowflake, creates a ServiceNow incident, and notifies the integration team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Revert API Integration Failure Handler"
  description: "When a Revert API integration fails, logs the error in Snowflake, creates a ServiceNow incident, and notifies the integration team via Microsoft Teams."
  tags:
    - integration
    - revert
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: revert_api_integrati
      port: 8080
      tools:
        - name: revert-api
          description: "Given an execution date, run the revert api integration failure handler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.REVERT_API_INTEGRATION_FAILURE_HANDLER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.REVERT_API_INTEGRATION_FAILURE_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "integration"
                short_description: "Revert API Integration Failure Handler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_revert_api_integrati_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves Salesforce retail account metrics for a P&G brand and posts an account health digest to the key account manager's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Brand Account Health Digest"
  description: "Retrieves Salesforce retail account metrics for a P&G brand and posts an account health digest to the key account manager's Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - key-account
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: kam-reporting
      port: 8080
      tools:
        - name: digest-account-health
          description: "Given a Salesforce account ID and KAM Teams UPN, fetch open opportunities, recent activity date, and revenue metrics, then post an account health digest."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the retail partner account."
            - name: kam_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the key account manager to notify."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{kam_teams_upn}}"
                text: "Account Health: {{get-account.Name}} | Annual Revenue: ${{get-account.AnnualRevenue}} | Open Cases: {{get-account.OpenCasesCount}} | Last Activity: {{get-account.LastActivityDate}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates brand health metrics from Salesforce and Snowflake, refreshes Power BI dashboards, and sends weekly digests to brand leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Brand Health Digest"
  description: "Aggregates brand health metrics from Salesforce and Snowflake, refreshes Power BI dashboards, and sends weekly digests to brand leadership via Microsoft Teams."
  tags:
    - marketing
    - salesforce
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce_brand_hea
      port: 8080
      tools:
        - name: salesforce-brand
          description: "Given an execution date, run the salesforce brand health digest process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SALESFORCE_BRAND_HEALTH_DIGEST LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SALESFORCE_BRAND_HEALTH_DIGEST_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_salesforce_brand_hea_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs trade promotion opportunities from Salesforce to Snowflake, computes pipeline forecasts, and notifies sales leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce CPG Promotion Pipeline Sync"
  description: "Syncs trade promotion opportunities from Salesforce to Snowflake, computes pipeline forecasts, and notifies sales leadership via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce_cpg_promo
      port: 8080
      tools:
        - name: salesforce-cpg
          description: "Given an execution date, run the salesforce cpg promotion pipeline sync process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SALESFORCE_CPG_PROMOTION_PIPELINE_SYNC LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SALESFORCE_CPG_PROMOTION_PIPEL_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_salesforce_cpg_promo_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes Salesforce Einstein lead scores into Snowflake, identifies high-priority leads, and notifies the sales team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Einstein Lead Scoring Pipeline"
  description: "Processes Salesforce Einstein lead scores into Snowflake, identifies high-priority leads, and notifies the sales team via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce_einstein_
      port: 8080
      tools:
        - name: salesforce-einstein
          description: "Given an execution date, run the salesforce einstein lead scoring pipeline process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SALESFORCE_EINSTEIN_LEAD_SCORING_PIPELIN LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SALESFORCE_EINSTEIN_LEAD_SCORI_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_salesforce_einstein__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a new retailer account and primary contact in Salesforce, opens a ServiceNow onboarding task, and notifies the assigned key account manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce New Retailer Account Onboarding"
  description: "Creates a new retailer account and primary contact in Salesforce, opens a ServiceNow onboarding task, and notifies the assigned key account manager in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - servicenow
    - onboarding
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retailer-onboarding
      port: 8080
      tools:
        - name: onboard-retailer
          description: "Given retailer company name, primary contact details, region, and assigned KAM Teams UPN, create a Salesforce account and contact, open a ServiceNow onboarding task, and notify the KAM."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "The retailer's legal company name."
            - name: contact_name
              in: body
              type: string
              description: "Primary contact's full name at the retailer."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact's email address."
            - name: region
              in: body
              type: string
              description: "The sales region (e.g., 'NA', 'EMEA', 'APAC')."
            - name: kam_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the assigned key account manager."
          steps:
            - name: create-account
              type: call
              call: salesforce.create-account
              with:
                name: "{{company_name}}"
                type: "Retailer"
                region: "{{region}}"
            - name: create-contact
              type: call
              call: salesforce.create-contact
              with:
                account_id: "{{create-account.id}}"
                name: "{{contact_name}}"
                email: "{{contact_email}}"
            - name: open-onboarding-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Retailer Onboarding: {{company_name}} — {{region}}"
                category: "retailer_onboarding"
                description: "Salesforce Account: {{create-account.id}}. Contact: {{contact_name}} ({{contact_email}})."
            - name: notify-kam
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{kam_teams_upn}}"
                text: "New retailer onboarded: {{company_name}} ({{region}}). Salesforce account: {{create-account.id}}. SNOW setup task: {{open-onboarding-task.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: create-contact
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce retail account by ID, returning retailer name, tier, and annual volume.

naftiko: "0.5"
info:
  label: "Salesforce Retail Account Lookup"
  description: "Retrieves a Salesforce retail account by ID, returning retailer name, tier, and annual volume."
  tags:
    - sales
    - salesforce
    - retail
capability:
  exposes:
    - type: mcp
      namespace: retail-sales
      port: 8080
      tools:
        - name: get-retail-account
          description: "Given a Salesforce account ID, retrieve retail account details. Use for trade promotion planning."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: tier
              type: string
              mapping: "$.Account_Tier__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Queries Salesforce for open retail opportunities by brand category and posts a pipeline digest to the commercial sales leadership Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Retail Opportunity Pipeline Digest"
  description: "Queries Salesforce for open retail opportunities by brand category and posts a pipeline digest to the commercial sales leadership Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - microsoft-teams
    - commercial
capability:
  exposes:
    - type: mcp
      namespace: commercial-reporting
      port: 8080
      tools:
        - name: digest-retail-pipeline
          description: "Given a Salesforce brand category and Teams channel, query open opportunities and post a retail pipeline digest with deal counts and total value."
          inputParameters:
            - name: brand_category
              in: body
              type: string
              description: "The P&G brand category to filter opportunities (e.g., 'Fabric Care', 'Baby Care', 'Beauty')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the sales leadership digest."
          steps:
            - name: query-opportunities
              type: call
              call: salesforce.query-records
              with:
                q: "SELECT Id,Name,StageName,Amount,CloseDate FROM Opportunity WHERE Brand_Category__c = '{{brand_category}}' AND IsClosed = false"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Retail Pipeline — {{brand_category}}: {{query-opportunities.totalSize}} open opportunities | Pipeline value: ${{query-opportunities.total_amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pg.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-records
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Evaluates supplier risk scores in SAP Ariba, logs assessments in Snowflake, creates Jira mitigation tasks, and alerts procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Risk Assessment"
  description: "Evaluates supplier risk scores in SAP Ariba, logs assessments in Snowflake, creates Jira mitigation tasks, and alerts procurement via Microsoft Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_ariba_supplier_r
      port: 8080
      tools:
        - name: sap-ariba
          description: "Given an execution date, run the sap ariba supplier risk assessment process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_ARIBA_SUPPLIER_RISK_ASSESSMENT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_ARIBA_SUPPLIER_RISK_ASSESS_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "SAP Ariba Supplier Risk Assessment - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_ariba_supplier_r_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a new vendor profile in SAP Ariba for a qualified supplier and opens a ServiceNow vendor setup task for the procurement team.

naftiko: "0.5"
info:
  label: "SAP Ariba Vendor Onboarding"
  description: "Creates a new vendor profile in SAP Ariba for a qualified supplier and opens a ServiceNow vendor setup task for the procurement team."
  tags:
    - procurement
    - sap-ariba
    - vendor-management
    - servicenow
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: vendor-onboarding
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given a vendor company name, contact email, and country, register the vendor in SAP Ariba and create a ServiceNow vendor setup task for procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "The legal company name of the new vendor."
            - name: vendor_email
              in: body
              type: string
              description: "The primary contact email address at the vendor."
            - name: country
              in: body
              type: string
              description: "The vendor's country of incorporation (ISO 2-letter code)."
          steps:
            - name: register-vendor
              type: call
              call: ariba.create-supplier
              with:
                name: "{{vendor_name}}"
                email: "{{vendor_email}}"
                country: "{{country}}"
            - name: create-setup-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Vendor Onboarding: {{vendor_name}} ({{country}})"
                category: "vendor_management"
                description: "New vendor registered in Ariba: {{register-vendor.vendor_id}}. Contact: {{vendor_email}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a product recall is initiated, traces affected batches in SAP, logs the scope in Snowflake, creates a ServiceNow crisis case, and alerts the quality and legal teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Batch Recall Coordination Chain"
  description: "When a product recall is initiated, traces affected batches in SAP, logs the scope in Snowflake, creates a ServiceNow crisis case, and alerts the quality and legal teams via Microsoft Teams."
  tags:
    - quality
    - recall
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_batch_recall_coo
      port: 8080
      tools:
        - name: sap-batch
          description: "Given an execution date, run the sap batch recall coordination chain process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_BATCH_RECALL_COORDINATION_CHAIN LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_BATCH_RECALL_COORDINATION__RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "quality"
                short_description: "SAP Batch Recall Coordination Chain processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_batch_recall_coo_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves batch traceability data from SAP for a given material and batch number.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Retrieves batch traceability data from SAP for a given material and batch number."
  tags:
    - quality
    - sap
    - traceability
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: get-batch-trace
          description: "Given a material and batch number, retrieve traceability data. Use for quality investigations and recalls."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: batch_number
              in: body
              type: string
              description: "The batch number."
          call: "sap.get-batch"
          with:
            material_number: "{{material_number}}"
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: production_date
              type: string
              mapping: "$.d.ManufactureDate"
            - name: shelf_life_date
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/Batch(Material='{{material_number}}',BatchIdentifyingPlant='*',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET

Retrieves a pending SAP Concur expense report, approves it, and notifies the submitter via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves a pending SAP Concur expense report, approves it, and notifies the submitter via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given a SAP Concur report ID and approver comment, retrieve the report, approve it, and notify the submitter via Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to approve."
            - name: approver_comment
              in: body
              type: string
              description: "Approval comment to attach to the submission."
          steps:
            - name: get-report
              type: call
              call: concur.get-report
              with:
                report_id: "{{report_id}}"
            - name: approve-report
              type: call
              call: concur.approve-report
              with:
                report_id: "{{report_id}}"
                comment: "{{approver_comment}}"
            - name: notify-submitter
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{get-report.submitter_email}}"
                text: "Your expense report '{{get-report.name}}' (${{get-report.total}}) has been approved in SAP Concur."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
            - name: approve-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reviews SAP Concur travel bookings for policy compliance in Snowflake, creates ServiceNow exceptions for violations, and notifies the travel team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Booking Compliance"
  description: "Reviews SAP Concur travel bookings for policy compliance in Snowflake, creates ServiceNow exceptions for violations, and notifies the travel team via Microsoft Teams."
  tags:
    - travel
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_concur_travel_bo
      port: 8080
      tools:
        - name: sap-concur
          description: "Given an execution date, run the sap concur travel booking compliance process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_CONCUR_TRAVEL_BOOKING_COMPLIANCE LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_CONCUR_TRAVEL_BOOKING_COMP_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "travel"
                short_description: "SAP Concur Travel Booking Compliance processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_concur_travel_bo_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves cost center details from SAP including responsible person and hierarchy.

naftiko: "0.5"
info:
  label: "SAP Cost Center Lookup"
  description: "Retrieves cost center details from SAP including responsible person and hierarchy."
  tags:
    - finance
    - sap
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-cost-center
          description: "Given a SAP cost center ID, retrieve master data. Use for financial reporting."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID."
          call: "sap.get-cost-center"
          with:
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.CostCenterDescription"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center
              method: GET

When SAP blocks a sales order due to credit limits, logs the event in Snowflake, creates a ServiceNow case, and notifies the credit management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Credit Management Block Handler"
  description: "When SAP blocks a sales order due to credit limits, logs the event in Snowflake, creates a ServiceNow case, and notifies the credit management team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_credit_managemen
      port: 8080
      tools:
        - name: sap-credit
          description: "Given an execution date, run the sap credit management block handler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_CREDIT_MANAGEMENT_BLOCK_HANDLER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_CREDIT_MANAGEMENT_BLOCK_HA_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "finance"
                short_description: "SAP Credit Management Block Handler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_credit_managemen_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors customs declaration status from SAP in Snowflake, flags delayed clearances, creates ServiceNow cases, and alerts the trade compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Customs Declaration Monitor"
  description: "Monitors customs declaration status from SAP in Snowflake, flags delayed clearances, creates ServiceNow cases, and alerts the trade compliance team via Microsoft Teams."
  tags:
    - compliance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_customs_declarat
      port: 8080
      tools:
        - name: sap-customs
          description: "Given an execution date, run the sap customs declaration monitor process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_CUSTOMS_DECLARATION_MONITOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_CUSTOMS_DECLARATION_MONITO_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "compliance"
                short_description: "SAP Customs Declaration Monitor processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_customs_declarat_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a delivery document from SAP by number, returning ship-to party, planned goods issue date, and items.

naftiko: "0.5"
info:
  label: "SAP Delivery Document Lookup"
  description: "Retrieves a delivery document from SAP by number, returning ship-to party, planned goods issue date, and items."
  tags:
    - logistics
    - sap
    - shipping
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery
          description: "Given a SAP delivery document number, retrieve details. Use for logistics tracking."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: "sap.get-delivery"
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: ship_to
              type: string
              mapping: "$.d.ShipToParty"
            - name: planned_goods_issue
              type: string
              mapping: "$.d.PlannedGoodsIssueDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Retrieves a goods movement document from SAP by document number, returning material, quantity, movement type, and posting date.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Lookup"
  description: "Retrieves a goods movement document from SAP by document number, returning material, quantity, movement type, and posting date."
  tags:
    - logistics
    - sap
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: goods-movement
      port: 8080
      tools:
        - name: get-goods-movement
          description: "Given a SAP material document number, retrieve goods movement details including movement type, quantity, and storage location. Use for inventory transaction audits."
          inputParameters:
            - name: document_number
              in: body
              type: string
              description: "The SAP material document number."
          call: "sap.get-goods-movement"
          with:
            document_number: "{{document_number}}"
          outputParameters:
            - name: movement_type
              type: string
              mapping: "$.d.GoodsMovementType"
            - name: quantity
              type: string
              mapping: "$.d.QuantityInEntryUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader('{{document_number}}')"
          inputParameters:
            - name: document_number
              in: path
          operations:
            - name: get-goods-movement
              method: GET

Reconciles intercompany billing documents in SAP against Snowflake records, flags discrepancies, and notifies the accounting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing documents in SAP against Snowflake records, flags discrepancies, and notifies the accounting team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_intercompany_bil
      port: 8080
      tools:
        - name: sap-intercompany
          description: "Given an execution date, run the sap intercompany billing reconciliation process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_INTERCOMPANY_BILLING_RECONCILIATION LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_INTERCOMPANY_BILLING_RECON_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_intercompany_bil_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves material master data from SAP by material number, returning description, UOM, and material group.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP by material number, returning description, UOM, and material group."
  tags:
    - supply-chain
    - sap
    - product-data
capability:
  exposes:
    - type: mcp
      namespace: product-data
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number, retrieve the material master record. Use for product inquiries."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Monitors MRP exception messages in SAP via Snowflake, flags critical shortages, creates ServiceNow tickets, and alerts the supply planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Material Requirements Planning Alert"
  description: "Monitors MRP exception messages in SAP via Snowflake, flags critical shortages, creates ServiceNow tickets, and alerts the supply planning team via Microsoft Teams."
  tags:
    - supply-chain
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_material_require
      port: 8080
      tools:
        - name: sap-material
          description: "Given an execution date, run the sap material requirements planning alert process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_MATERIAL_REQUIREMENTS_PLANNING_ALERT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_MATERIAL_REQUIREMENTS_PLAN_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "supply-chain"
                short_description: "SAP Material Requirements Planning Alert processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_material_require_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates SAP period-close readiness by checking open items in Snowflake, creates ServiceNow tasks for blockers, and notifies the accounting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Period Close Readiness Checker"
  description: "Validates SAP period-close readiness by checking open items in Snowflake, creates ServiceNow tasks for blockers, and notifies the accounting team via Microsoft Teams."
  tags:
    - finance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_period_close_rea
      port: 8080
      tools:
        - name: sap-period
          description: "Given an execution date, run the sap period close readiness checker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PERIOD_CLOSE_READINESS_CHECKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PERIOD_CLOSE_READINESS_CHE_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "finance"
                short_description: "SAP Period Close Readiness Checker processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_period_close_rea_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks SAP period-end close task completion for a fiscal period and company code, posting a status digest to the finance leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period-End Close Monitor"
  description: "Checks SAP period-end close task completion for a fiscal period and company code, posting a status digest to the finance leadership Microsoft Teams channel."
  tags:
    - finance
    - sap
    - period-close
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: monitor-period-close
          description: "Given a fiscal period and company code, check SAP period-end close completion percentage and post a status digest to the finance Teams channel."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The SAP fiscal period to monitor (e.g., '006/2026')."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code (e.g., 'US01')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance leadership status digest."
          steps:
            - name: get-close-status
              type: call
              call: sap.get-close-tasks
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Period Close Status {{fiscal_period}} ({{company_code}}): {{get-close-status.completion_pct}}% complete. Open tasks: {{get-close-status.open_count}}. Blockers: {{get-close-status.blockers}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/FCO_PI_CLOSE_COCKPIT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: close-tasks
          path: "/ClosingTaskSet"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: get-close-tasks
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Identifies equipment due for planned maintenance in SAP via Snowflake, creates ServiceNow work orders, and notifies plant maintenance teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Planned Maintenance Scheduler"
  description: "Identifies equipment due for planned maintenance in SAP via Snowflake, creates ServiceNow work orders, and notifies plant maintenance teams via Microsoft Teams."
  tags:
    - maintenance
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_planned_maintena
      port: 8080
      tools:
        - name: sap-planned
          description: "Given an execution date, run the sap planned maintenance scheduler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PLANNED_MAINTENANCE_SCHEDULER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PLANNED_MAINTENANCE_SCHEDU_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "maintenance"
                short_description: "SAP Planned Maintenance Scheduler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_planned_maintena_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves stock overview for a material across all plants in SAP.

naftiko: "0.5"
info:
  label: "SAP Plant Stock Overview"
  description: "Retrieves stock overview for a material across all plants in SAP."
  tags:
    - supply-chain
    - sap
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-stock-overview
          description: "Given a SAP material number, retrieve stock levels across all plants. Use for inventory management."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-stock"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: total_stock
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-stock
              method: GET

Aggregates production line downtime events from SAP in Snowflake, creates Jira improvement tasks, and notifies plant management via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Production Line Downtime Reporter"
  description: "Aggregates production line downtime events from SAP in Snowflake, creates Jira improvement tasks, and notifies plant management via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_production_line_
      port: 8080
      tools:
        - name: sap-production
          description: "Given an execution date, run the sap production line downtime reporter process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_PRODUCTION_LINE_DOWNTIME_REPORTER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_PRODUCTION_LINE_DOWNTIME_R_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "SAP Production Line Downtime Reporter - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_production_line__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a production order from SAP by number, returning material, quantity, and status.

naftiko: "0.5"
info:
  label: "SAP Production Order Lookup"
  description: "Retrieves a production order from SAP by number, returning material, quantity, and status."
  tags:
    - manufacturing
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Given a SAP production order number, retrieve the order details. Use for production scheduling."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap.get-production-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Retrieves a SAP S/4HANA purchase order by number and returns the header status, supplier, and total amount for procurement tracking.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Retrieves a SAP S/4HANA purchase order by number and returns the header status, supplier, and total amount for procurement tracking."
  tags:
    - finance
    - procurement
    - sap
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: erp-lookup
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO status, supplier name, total amount, and currency."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., '4500054321')."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: supplier
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

When a quality hold is placed on a batch in SAP, creates a ServiceNow investigation case, logs in Snowflake, and notifies the quality assurance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Quality Hold Release Workflow"
  description: "When a quality hold is placed on a batch in SAP, creates a ServiceNow investigation case, logs in Snowflake, and notifies the quality assurance team via Microsoft Teams."
  tags:
    - quality
    - sap
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_quality_hold_rel
      port: 8080
      tools:
        - name: sap-quality
          description: "Given an execution date, run the sap quality hold release workflow process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_QUALITY_HOLD_RELEASE_WORKFLOW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_QUALITY_HOLD_RELEASE_WORKF_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "quality"
                short_description: "SAP Quality Hold Release Workflow processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_quality_hold_rel_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a quality inspection lot from SAP, returning inspection result, material, and batch.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves a quality inspection lot from SAP, returning inspection result, material, and batch."
  tags:
    - quality
    - sap
    - quality-management
capability:
  exposes:
    - type: mcp
      namespace: qm
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Given a SAP inspection lot number, retrieve results. Use for quality release decisions."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: "sap.get-inspection-lot"
          with:
            inspection_lot: "{{inspection_lot}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.d.InspectionLotResult"
            - name: material
              type: string
              mapping: "$.d.Material"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{inspection_lot}}')"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Monitors recipe formula changes in SAP, validates compliance in Snowflake, creates ServiceNow change records, and notifies the R&D team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Recipe Management Change Tracker"
  description: "Monitors recipe formula changes in SAP, validates compliance in Snowflake, creates ServiceNow change records, and notifies the R&D team via Microsoft Teams."
  tags:
    - manufacturing
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_recipe_managemen
      port: 8080
      tools:
        - name: sap-recipe
          description: "Given an execution date, run the sap recipe management change tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_RECIPE_MANAGEMENT_CHANGE_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_RECIPE_MANAGEMENT_CHANGE_T_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "manufacturing"
                short_description: "SAP Recipe Management Change Tracker processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_recipe_managemen_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP sales order by number, returning customer, items, delivery status, and value.

naftiko: "0.5"
info:
  label: "SAP Sales Order Lookup"
  description: "Retrieves a SAP sales order by number, returning customer, items, delivery status, and value."
  tags:
    - sales
    - sap
    - order-management
capability:
  exposes:
    - type: mcp
      namespace: order-management
      port: 8080
      tools:
        - name: get-sales-order
          description: "Given a SAP sales order number, retrieve order details. Use for order status inquiries."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP sales order number."
          call: "sap.get-sales-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: customer
              type: string
              mapping: "$.d.SoldToParty"
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET

Analyzes transportation costs from SAP in Snowflake, identifies routing optimizations, creates Jira action items, and notifies the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Transportation Cost Optimizer"
  description: "Analyzes transportation costs from SAP in Snowflake, identifies routing optimizations, creates Jira action items, and notifies the logistics team via Microsoft Teams."
  tags:
    - logistics
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_transportation_c
      port: 8080
      tools:
        - name: sap-transportation
          description: "Given an execution date, run the sap transportation cost optimizer process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_TRANSPORTATION_COST_OPTIMIZER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_TRANSPORTATION_COST_OPTIMI_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "SAP Transportation Cost Optimizer - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_transportation_c_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors in-transit shipments in SAP via Snowflake, flags delayed deliveries, creates ServiceNow cases, and alerts the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Transportation Shipment Tracker"
  description: "Monitors in-transit shipments in SAP via Snowflake, flags delayed deliveries, creates ServiceNow cases, and alerts the logistics team via Microsoft Teams."
  tags:
    - logistics
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_transportation_s
      port: 8080
      tools:
        - name: sap-transportation
          description: "Given an execution date, run the sap transportation shipment tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_TRANSPORTATION_SHIPMENT_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_TRANSPORTATION_SHIPMENT_TR_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "logistics"
                short_description: "SAP Transportation Shipment Tracker processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_transportation_s_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves vendor master data from SAP by vendor number.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor number."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, retrieve vendor master data. Use for supplier verification."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: "sap.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Computes vendor performance scorecards from SAP data in Snowflake, flags underperforming suppliers, creates Jira review tasks, and notifies procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Vendor Performance Scorecard"
  description: "Computes vendor performance scorecards from SAP data in Snowflake, flags underperforming suppliers, creates Jira review tasks, and notifies procurement via Microsoft Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_vendor_performan
      port: 8080
      tools:
        - name: sap-vendor
          description: "Given an execution date, run the sap vendor performance scorecard process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_VENDOR_PERFORMANCE_SCORECARD LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_VENDOR_PERFORMANCE_SCORECA_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "SAP Vendor Performance Scorecard - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_vendor_performan_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Calculates warehouse space utilization from SAP data in Snowflake, flags facilities approaching capacity, and notifies the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Space Utilization Report"
  description: "Calculates warehouse space utilization from SAP data in Snowflake, flags facilities approaching capacity, and notifies the logistics team via Microsoft Teams."
  tags:
    - logistics
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap_warehouse_space_
      port: 8080
      tools:
        - name: sap-warehouse
          description: "Given an execution date, run the sap warehouse space utilization report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SAP_WAREHOUSE_SPACE_UTILIZATION_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SAP_WAREHOUSE_SPACE_UTILIZATIO_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sap_warehouse_space__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Submits a ServiceNow change request for a planned IT or manufacturing system change and notifies the change advisory board in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Request"
  description: "Submits a ServiceNow change request for a planned IT or manufacturing system change and notifies the change advisory board in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-ops
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, affected system, planned start date, and CAB Teams channel, create a ServiceNow change request and notify the CAB."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Full description of the planned change, scope, and rollback plan."
            - name: affected_system
              in: body
              type: string
              description: "The P&G system or service being changed."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start datetime in ISO 8601 format."
            - name: cab_channel_id
              in: body
              type: string
              description: "Teams channel ID for the change advisory board."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Change: {{affected_system}} — {{change_description}}"
                planned_start: "{{planned_start}}"
                category: "application"
            - name: notify-cab
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change Request: {{affected_system}} | CHG: {{create-change.number}} | Planned: {{planned_start}} | Scope: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a ServiceNow incident status, priority, and assignment group by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves a ServiceNow incident status, priority, and assignment group by number."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, retrieve its current state. Use for status checks."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Executes a read-only SQL query against the P&G Snowflake data warehouse.

naftiko: "0.5"
info:
  label: "Snowflake Query Executor"
  description: "Executes a read-only SQL query against the P&G Snowflake data warehouse."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: execute-query
          description: "Given a SQL statement, execute it against Snowflake and return results. Use for ad-hoc analytics."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL query to execute."
          call: "snowflake.execute-statement"
          with:
            statement: "{{sql_statement}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.data.rowCount"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Monitors Snowflake task execution for the retail analytics pipelines and alerts the data engineering team in Teams if failures are detected in the last 24 hours.

naftiko: "0.5"
info:
  label: "Snowflake Retail Analytics Pipeline Monitor"
  description: "Monitors Snowflake task execution for the retail analytics pipelines and alerts the data engineering team in Teams if failures are detected in the last 24 hours."
  tags:
    - data
    - analytics
    - snowflake
    - monitoring
    - microsoft-teams
    - retail
capability:
  exposes:
    - type: mcp
      namespace: retail-data-ops
      port: 8080
      tools:
        - name: monitor-retail-pipelines
          description: "Given a Snowflake database and schema for retail analytics, check for task failures in the past 24 hours and post an alert to the data engineering Teams channel."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "The Snowflake database name for retail analytics (e.g., 'RETAIL_ANALYTICS')."
            - name: schema
              in: body
              type: string
              description: "The Snowflake schema containing retail pipeline tasks."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for data engineering alerts."
          steps:
            - name: check-failures
              type: call
              call: snowflake.query-task-history
              with:
                database: "{{database}}"
                schema: "{{schema}}"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Retail Pipeline Health ({{database}}.{{schema}}): {{check-failures.failed_count}} failures in 24h. Failed: {{check-failures.failed_task_names}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/{{schema}}/tasks"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Executes a Splunk search query and returns matching events.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Executes a Splunk search query and returns matching events."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: search-logs
          description: "Given a Splunk search query and time range, execute the search. Use for investigations."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk SPL query."
            - name: earliest_time
              in: body
              type: string
              description: "Search start time."
          call: "splunk.create-search"
          with:
            search: "{{search_query}}"
            earliest_time: "{{earliest_time}}"
          outputParameters:
            - name: result_count
              type: integer
              mapping: "$.entry.content.resultCount"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://pg-splunk.example.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Queries SAP S/4HANA for materials below safety stock at a given manufacturing plant and posts a restocking alert to the supply chain Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Supply Chain Inventory Low-Stock Alert"
  description: "Queries SAP S/4HANA for materials below safety stock at a given manufacturing plant and posts a restocking alert to the supply chain Microsoft Teams channel."
  tags:
    - supply-chain
    - sap
    - inventory
    - microsoft-teams
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: alert-low-inventory
          description: "Given a SAP plant code, query for materials at or below their safety stock threshold and post a restocking alert to the supply chain Teams channel."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code to check inventory for (e.g., 'US10')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the supply chain alert."
          steps:
            - name: get-low-stock
              type: call
              call: sap.get-low-stock-materials
              with:
                plant: "{{plant_code}}"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Inventory Alert — Plant {{plant_code}}: {{get-low-stock.count}} materials below safety stock. Critical SKUs: {{get-low-stock.critical_materials}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pg-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: get-low-stock-materials
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks packaging waste metrics from manufacturing in Snowflake, computes progress against sustainability goals, and notifies the ESG team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sustainability Packaging Waste Tracker"
  description: "Tracks packaging waste metrics from manufacturing in Snowflake, computes progress against sustainability goals, and notifies the ESG team via Microsoft Teams."
  tags:
    - sustainability
    - manufacturing
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability_packa
      port: 8080
      tools:
        - name: sustainability-packaging
          description: "Given an execution date, run the sustainability packaging waste tracker process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.SUSTAINABILITY_PACKAGING_WASTE_TRACKER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.SUSTAINABILITY_PACKAGING_WASTE_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sustainability_packa_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Temporal workflow fails, captures error details, creates a ServiceNow incident, logs in Snowflake, and notifies the platform team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Temporal Workflow Failure Handler"
  description: "When a Temporal workflow fails, captures error details, creates a ServiceNow incident, logs in Snowflake, and notifies the platform team via Microsoft Teams."
  tags:
    - automation
    - temporal
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: temporal_workflow_fa
      port: 8080
      tools:
        - name: temporal-workflow
          description: "Given an execution date, run the temporal workflow failure handler process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.TEMPORAL_WORKFLOW_FAILURE_HANDLER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.TEMPORAL_WORKFLOW_FAILURE_HAND_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "automation"
                short_description: "Temporal Workflow Failure Handler processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_temporal_workflow_fa_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Calculates trade promotion ROI from Snowflake retail sales data, compares against planned spend, and sends performance digests to the trade marketing team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Promotion ROI Calculator"
  description: "Calculates trade promotion ROI from Snowflake retail sales data, compares against planned spend, and sends performance digests to the trade marketing team via Microsoft Teams."
  tags:
    - marketing
    - trade-promotion
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade_promotion_roi_
      port: 8080
      tools:
        - name: trade-promotion
          description: "Given an execution date, run the trade promotion roi calculator process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.TRADE_PROMOTION_ROI_CALCULATOR LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.TRADE_PROMOTION_ROI_CALCULATOR_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_trade_promotion_roi__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Extracts diversity metrics from Workday into Snowflake, refreshes Power BI dashboards, and distributes to HR leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Extracts diversity metrics from Workday into Snowflake, refreshes Power BI dashboards, and distributes to HR leadership via Microsoft Teams."
  tags:
    - hr
    - diversity
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_diversity_me
      port: 8080
      tools:
        - name: workday-diversity
          description: "Given an execution date, run the workday diversity metrics report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_DIVERSITY_METRICS_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_DIVERSITY_METRICS_REPO_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_diversity_me_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Exports active headcount from Workday grouped by region and business unit, then posts a summary to the HR leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot by Region"
  description: "Exports active headcount from Workday grouped by region and business unit, then posts a summary to the HR leadership Microsoft Teams channel."
  tags:
    - hr
    - workforce-planning
    - workday
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-regional-headcount
          description: "Retrieve active employee headcount from Workday grouped by region and post a formatted headcount digest to the HR Teams channel."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "The snapshot date in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the HR leadership headcount report."
          steps:
            - name: export-headcount
              type: call
              call: workday.list-workers
              with:
                status: "active"
                as_of_date: "{{as_of_date}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "P&G Headcount Snapshot ({{as_of_date}}): {{export-headcount.total}} active employees across {{export-headcount.region_count}} regions."
  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: "/pg/workers"
          inputParameters:
            - name: status
              in: query
            - name: as_of_date
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compares actual Workday headcount against plan in Snowflake, flags variances, refreshes Power BI dashboards, and notifies HR leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Headcount vs Plan Variance"
  description: "Compares actual Workday headcount against plan in Snowflake, flags variances, refreshes Power BI dashboards, and notifies HR leadership via Microsoft Teams."
  tags:
    - hr
    - workforce-planning
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_headcount_vs
      port: 8080
      tools:
        - name: workday-headcount
          description: "Given an execution date, run the workday headcount vs plan variance process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_HEADCOUNT_VS_PLAN_VARIANCE LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_HEADCOUNT_VS_PLAN_VARI_RESULTS SELECT * FROM staging"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_headcount_vs_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Identifies employees with incomplete mandatory training in Workday, logs in Snowflake, creates ServiceNow follow-up tasks, and sends reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Enrollment Reminder"
  description: "Identifies employees with incomplete mandatory training in Workday, logs in Snowflake, creates ServiceNow follow-up tasks, and sends reminders via Microsoft Teams."
  tags:
    - hr
    - learning
    - workday
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_learning_enr
      port: 8080
      tools:
        - name: workday-learning
          description: "Given an execution date, run the workday learning enrollment reminder process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_LEARNING_ENROLLMENT_REMINDER LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_LEARNING_ENROLLMENT_RE_RESULTS SELECT * FROM staging"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "hr"
                short_description: "Workday Learning Enrollment Reminder processing complete"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_learning_enr_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, sends a Microsoft Teams welcome message, and provisions a SharePoint document workspace.

naftiko: "0.5"
info:
  label: "Workday New Hire Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, sends a Microsoft Teams welcome message, and provisions a SharePoint document workspace."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the P&G onboarding sequence across ServiceNow, Microsoft Teams, and SharePoint."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new P&G hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: create-sharepoint-workspace
              type: call
              call: sharepoint.create-folder
              with:
                site_id: "hr-onboarding-site"
                folder_path: "NewHires/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-new-hires"
                text: "Welcome to P&G, {{get-employee.full_name}}! Your onboarding ticket: {{create-snow-ticket.number}}. Start date: {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/pg/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pg.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: folders
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks aging of open requisitions from Workday in Snowflake, creates Jira follow-up tasks for stale positions, and alerts recruiting managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Open Position Aging Report"
  description: "Tracks aging of open requisitions from Workday in Snowflake, creates Jira follow-up tasks for stale positions, and alerts recruiting managers via Microsoft Teams."
  tags:
    - hr
    - recruiting
    - workday
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_open_positio
      port: 8080
      tools:
        - name: workday-open
          description: "Given an execution date, run the workday open position aging report process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_OPEN_POSITION_AGING_REPORT LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_OPEN_POSITION_AGING_RE_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Workday Open Position Aging Report - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_open_positio_channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates performance calibration sessions by pulling ratings from Snowflake, creates Jira tasks for HR partners, and notifies managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Calibration Workflow"
  description: "Initiates performance calibration sessions by pulling ratings from Snowflake, creates Jira tasks for HR partners, and notifies managers via Microsoft Teams."
  tags:
    - hr
    - performance
    - workday
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workday_performance_
      port: 8080
      tools:
        - name: workday-performance
          description: "Given an execution date, run the workday performance calibration workflow process. Use for scheduled operations."
          inputParameters:
            - name: execution_date
              in: body
              type: string
              description: "The execution date in YYYY-MM-DD format."
          steps:
            - name: get-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ANALYTICS.WORKDAY_PERFORMANCE_CALIBRATION_WORKFLOW LIMIT 100"
            - name: process-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ANALYTICS.WORKDAY_PERFORMANCE_CALIBRATIO_RESULTS SELECT * FROM staging"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PGOPS"
                issue_type: "Task"
                summary: "Workday Performance Calibration Workflow - review required"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_workday_performance__channel"
                text: "Process complete. Results logged."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates a performance review cycle in Workday for a given P&G business unit and notifies all managers via Microsoft Teams to begin evaluations.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Trigger"
  description: "Initiates a performance review cycle in Workday for a given P&G business unit and notifies all managers via Microsoft Teams to begin evaluations."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: trigger-review-cycle
          description: "Given a business unit code and review period, initiate the Workday performance review cycle and notify all managers in the unit via Teams."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "The P&G business unit code (e.g., 'NA_FABRIC', 'EMEA_BEAUTY')."
            - name: review_period
              in: body
              type: string
              description: "The review period label (e.g., 'Annual-2025')."
            - name: due_date
              in: body
              type: string
              description: "Review completion deadline in YYYY-MM-DD format."
            - name: manager_channel_id
              in: body
              type: string
              description: "Teams channel ID for manager notification."
          steps:
            - name: initiate-cycle
              type: call
              call: workday.create-review-cycle
              with:
                business_unit: "{{business_unit}}"
                review_period: "{{review_period}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{manager_channel_id}}"
                text: "Performance Review Cycle '{{review_period}}' launched for {{business_unit}}. Complete all Workday evaluations by {{due_date}}. Cycle ID: {{initiate-cycle.cycle_id}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/pg/performanceReviews"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a Workday worker profile by employee ID, returning name, title, and department.

naftiko: "0.5"
info:
  label: "Workday Worker Profile Lookup"
  description: "Looks up a Workday worker profile by employee ID, returning name, title, and department."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-worker-profile
          description: "Given a Workday employee ID, retrieve the worker profile. Use for HR inquiries."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.fullName"
            - name: job_title
              type: string
              mapping: "$.worker.jobTitle"
  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: "/pg/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET