Bayer Capabilities

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

Sort
Expand

Tracks logistics from SAP and Snowflake, notifying via Teams.

naftiko: "0.5"
info:
  label: "Agricultural Supply Chain Logistics Tracker"
  description: "Tracks logistics from SAP and Snowflake, notifying via Teams."
  tags:
    - agriculture
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agricultural-ops
      port: 8080
      tools:
        - name: agricultural-logistics-tracker
          description: "Tracks logistics from SAP and Snowflake, notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Agricultural Supply Chain Logistics Tracker completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates analytics from Datadog, Snowflake, and Power BI.

naftiko: "0.5"
info:
  label: "API Platform Usage Analytics Generator"
  description: "Generates analytics from Datadog, Snowflake, and Power BI."
  tags:
    - platform-engineering
    - datadog
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: api-ops
      port: 8080
      tools:
        - name: api-usage-analytics
          description: "Generates analytics from Datadog, Snowflake, and Power BI."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: check-monitors
              type: call
              call: "datadog.get-monitors"
              with:
                tags: "service:{{service_name}}"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.dashboard_dataset_id"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"

          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Tracks variances from SAP and Snowflake, notifying via Teams.

naftiko: "0.5"
info:
  label: "Clinical Study Budget Variance Tracker"
  description: "Tracks variances from SAP and Snowflake, notifying via Teams."
  tags:
    - clinical
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: clinical-budget-variance
          description: "Tracks variances from SAP and Snowflake, notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Clinical Study Budget Variance Tracker completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reconciles clinical data from Snowflake and notifies via Teams.

naftiko: "0.5"
info:
  label: "Clinical Data Management Reconciliation"
  description: "Reconciles clinical data from Snowflake and notifies via Teams."
  tags:
    - clinical
    - data-management
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: clinical-data-reconciliation
          description: "Reconciles clinical data from Snowflake and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Clinical Data Management Reconciliation completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates safety reporting from Snowflake and Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Safety Reporting Workflow"
  description: "Orchestrates safety reporting from Snowflake and Teams."
  tags:
    - clinical
    - pharmacovigilance
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: clinical-safety-reporting
          description: "Orchestrates safety reporting from Snowflake and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Clinical Trial Safety Reporting Workflow completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a clinical trial protocol or results document from SharePoint and generates a structured scientific summary using OpenAI, supporting Bayer's pharmaceutical research workflows.

naftiko: "0.5"
info:
  label: "Clinical Trial Document Summarization"
  description: "Retrieves a clinical trial protocol or results document from SharePoint and generates a structured scientific summary using OpenAI, supporting Bayer's pharmaceutical research workflows."
  tags:
    - ai
    - pharma
    - openai
    - sharepoint
    - document-processing
    - r-and-d
capability:
  exposes:
    - type: mcp
      namespace: rd-ai
      port: 8080
      tools:
        - name: summarize-clinical-document
          description: "Given a SharePoint site ID and document item ID containing a clinical trial protocol or results report, generate a structured scientific summary using OpenAI GPT-4o. Returns key endpoints, safety signals, and conclusions."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the clinical document is stored."
            - name: item_id
              in: body
              type: string
              description: "The SharePoint drive item ID for the clinical document."
            - name: document_type
              in: body
              type: string
              description: "Document type: 'clinical protocol', 'interim results', 'final study report', or 'safety report'."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-document-content"
              with:
                site_id: "{{site_id}}"
                item_id: "{{item_id}}"
            - name: generate-summary
              type: call
              call: "openai.create-chat-completion"
              with:
                model: "gpt-4o"
                system_prompt: "You are a pharmaceutical research scientist. Summarize this {{document_type}} document highlighting primary endpoints, safety signals, patient population, dosing, and key conclusions."
                user_message: "{{get-document.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: document-content
          path: "/sites/{{site_id}}/drive/items/{{item_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-document-content
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: create-chat-completion
              method: POST

Onboards sites via ServiceNow, Snowflake tracking, and Teams notification.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Onboarding"
  description: "Onboards sites via ServiceNow, Snowflake tracking, and Teams notification."
  tags:
    - clinical
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: clinical-trial-site-onboarding
          description: "Onboards sites via ServiceNow, Snowflake tracking, and Teams notification."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Clinical Trial Site Onboarding action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Clinical Trial Site Onboarding completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an Azure cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow change request for FinOps review, and notifies the Cloud Cost Management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Response"
  description: "When an Azure cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow change request for FinOps review, and notifies the Cloud Cost Management team via Microsoft Teams."
  tags:
    - finops
    - cloud
    - azure
    - datadog
    - servicenow
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure service name, overage in EUR, and subscription ID, create a Datadog event annotation, open a ServiceNow change request, and notify the FinOps Teams channel."
          inputParameters:
            - name: azure_service
              in: body
              type: string
              description: "Azure service with the cost anomaly, e.g. 'Azure Machine Learning'."
            - name: overage_eur
              in: body
              type: number
              description: "Estimated cost overage in EUR."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the anomaly was detected."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Azure Cost Anomaly: {{azure_service}}"
                text: "Subscription {{subscription_id}} — overage: €{{overage_eur}}"
                alert_type: "warning"
            - name: open-change-request
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "FinOps review: {{azure_service}} overage €{{overage_eur}}"
                category: "finops"
                justification: "Azure anomaly on subscription {{subscription_id}}"
            - name: notify-finops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "cloud-cost-management"
                message: "Cost anomaly: {{azure_service}} | Overage: €{{overage_eur}} | SNOW: {{open-change-request.number}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors cold chain from Snowflake, ServiceNow, and Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Cold Chain Monitoring"
  description: "Monitors cold chain from Snowflake, ServiceNow, and Teams."
  tags:
    - supply-chain
    - quality
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-ops
      port: 8080
      tools:
        - name: cold-chain-monitoring
          description: "Monitors cold chain from Snowflake, ServiceNow, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Supply Chain Cold Chain Monitoring action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Supply Chain Cold Chain Monitoring completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Syncs compensation from SuccessFactors to Snowflake, notifying via Teams.

naftiko: "0.5"
info:
  label: "Workday Compensation Planning Sync"
  description: "Syncs compensation from SuccessFactors to Snowflake, notifying via Teams."
  tags:
    - hr
    - compensation
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compensation-ops
      port: 8080
      tools:
        - name: compensation-planning-sync
          description: "Syncs compensation from SuccessFactors to Snowflake, notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Workday Compensation Planning Sync completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Confluence page.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves Confluence page."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: km-docs
      port: 8080
      tools:
        - name: get-page
          description: "Look up page."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "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://bayer.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

When a critical Datadog alert fires for a Bayer platform, creates a ServiceNow P1 incident, pages the on-call engineer via PagerDuty, and opens a war-room notification in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Critical IT Incident Response Workflow"
  description: "When a critical Datadog alert fires for a Bayer platform, creates a ServiceNow P1 incident, pages the on-call engineer via PagerDuty, and opens a war-room notification in Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-critical-incident
          description: "Given a Datadog monitor ID, severity, and affected service, create a ServiceNow P1 incident, page PagerDuty on-call, and post a war-room alert to Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the critical alert."
            - name: affected_service
              in: body
              type: string
              description: "The affected service or platform name, e.g. 'SAP ERP Production', 'Clinical Data Portal'."
            - name: alert_message
              in: body
              type: string
              description: "The Datadog alert message describing the failure condition."
          steps:
            - name: create-p1-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "P1: {{affected_service}} — {{alert_message}}"
                urgency: "1"
                impact: "1"
                category: "infrastructure"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "CRITICAL: {{affected_service}} — {{alert_message}}"
                service_id: "$secrets.pagerduty_service_id"
                severity: "critical"
                body: "Monitor: {{monitor_id}} | SNOW: {{create-p1-incident.number}}"
            - name: open-war-room
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "incident-war-room"
                message: "P1 INCIDENT: {{affected_service}} | {{alert_message}} | SNOW: {{create-p1-incident.number}} | PD: {{page-oncall.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Refreshes dashboards from Snowflake, Power BI, and Teams.

naftiko: "0.5"
info:
  label: "Power BI Crop Science Analytics Refresh"
  description: "Refreshes dashboards from Snowflake, Power BI, and Teams."
  tags:
    - agriculture
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crop-ops
      port: 8080
      tools:
        - name: crop-science-analytics-refresh
          description: "Refreshes dashboards from Snowflake, Power BI, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.dashboard_dataset_id"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Power BI Crop Science Analytics Refresh completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Integrates field trial data by loading to Snowflake, checking quality, and notifying via Teams.

naftiko: "0.5"
info:
  label: "Crop Science Field Trial Data Integration"
  description: "Integrates field trial data by loading to Snowflake, checking quality, and notifying via Teams."
  tags:
    - agriculture
    - research
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crop-ops
      port: 8080
      tools:
        - name: crop-science-field-trial-integration
          description: "Integrates field trial data by loading to Snowflake, checking quality, and notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Crop Science Field Trial Data Integration completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks registrations from Snowflake, SharePoint, and Teams.

naftiko: "0.5"
info:
  label: "Crop Science Product Registration Tracker"
  description: "Tracks registrations from Snowflake, SharePoint, and Teams."
  tags:
    - agriculture
    - regulatory
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crop-ops
      port: 8080
      tools:
        - name: crop-science-registration
          description: "Tracks registrations from Snowflake, SharePoint, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: get-documents
              type: call
              call: "sharepoint.list-items"
              with:
                site_id: "$secrets.default_site_id"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Crop Science Product Registration Tracker completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drives
          path: "/sites/{{site_id}}/drives"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: list-items
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Assembles dossiers from SharePoint, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Crop Science Regulatory Dossier Assembly"
  description: "Assembles dossiers from SharePoint, Snowflake, and Teams."
  tags:
    - agriculture
    - regulatory
    - sharepoint
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crop-ops
      port: 8080
      tools:
        - name: crop-science-regulatory-dossier
          description: "Assembles dossiers from SharePoint, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-documents
              type: call
              call: "sharepoint.list-items"
              with:
                site_id: "$secrets.default_site_id"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Crop Science Regulatory Dossier Assembly completed successfully."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drives
          path: "/sites/{{site_id}}/drives"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: list-items
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors SLAs from Snowflake, creating ServiceNow tickets and Teams alerts.

naftiko: "0.5"
info:
  label: "Data Pipeline SLA Monitor and Escalator"
  description: "Monitors SLAs from Snowflake, creating ServiceNow tickets and Teams alerts."
  tags:
    - data-engineering
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: data-pipeline-sla-monitor
          description: "Monitors SLAs from Snowflake, creating ServiceNow tickets and Teams alerts."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Data Pipeline SLA Monitor and Escalator action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Data Pipeline SLA Monitor and Escalator completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks platform health from Datadog.

naftiko: "0.5"
info:
  label: "Datadog Platform Health Check"
  description: "Checks platform health from Datadog."
  tags:
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: observability-platform
      port: 8080
      tools:
        - name: check-health
          description: "Check health."
          inputParameters:
            - name: env
              in: body
              type: string
              description: "Environment."
          call: "datadog.get-monitor-status"
          with:
            env: "{{env}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"

          operations:
            - name: get-monitor-status
              method: GET

Queries Datadog for SLO compliance metrics across Bayer's production platforms and posts a daily health digest to the Operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Platform SLO Monitoring Digest"
  description: "Queries Datadog for SLO compliance metrics across Bayer's production platforms and posts a daily health digest to the Operations Microsoft Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - slo
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: platform-observability
      port: 8080
      tools:
        - name: digest-platform-slos
          description: "Query Datadog SLOs tagged for a target environment and time window, then post a structured daily health report to the Operations Teams channel."
          inputParameters:
            - name: environment
              in: body
              type: string
              description: "Target environment: 'production', 'staging', or 'dr'."
            - name: time_window_hours
              in: body
              type: integer
              description: "Look-back window in hours. Typically 24."
          steps:
            - name: get-slos
              type: call
              call: "datadog.list-slos"
              with:
                tags: "env:{{environment}}"
                limit: "50"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "platform-operations"
                message: "SLO Report ({{environment}}, last {{time_window_hours}}h): {{get-slos.passing}} passing, {{get-slos.failing}} failing. Compliance: {{get-slos.compliance_pct}}%"
  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: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates incidents from Datadog SLO breaches and notifies via Teams.

naftiko: "0.5"
info:
  label: "Datadog SLO Breach to ServiceNow"
  description: "Creates incidents from Datadog SLO breaches and notifies via Teams."
  tags:
    - observability
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: datadog-ops
      port: 8080
      tools:
        - name: datadog-slo-breach-servicenow
          description: "Creates incidents from Datadog SLO breaches and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: check-monitors
              type: call
              call: "datadog.get-monitors"
              with:
                tags: "service:{{service_name}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Datadog SLO Breach to ServiceNow action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Datadog SLO Breach to ServiceNow completed successfully."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"

          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes surveys from Snowflake and posts to Teams.

naftiko: "0.5"
info:
  label: "Employee Engagement Survey Processor"
  description: "Processes surveys from Snowflake and posts to Teams."
  tags:
    - hr
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: employee-ops
      port: 8080
      tools:
        - name: employee-engagement-survey
          description: "Processes surveys from Snowflake and posts to Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Employee Engagement Survey Processor completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee termination is processed in SAP SuccessFactors, disables their Microsoft 365 account, revokes Okta sessions, and opens a ServiceNow offboarding ticket for equipment recovery.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When an employee termination is processed in SAP SuccessFactors, disables their Microsoft 365 account, revokes Okta sessions, and opens a ServiceNow offboarding ticket for equipment recovery."
  tags:
    - hr
    - offboarding
    - sap-successfactors
    - okta
    - servicenow
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a SuccessFactors employee ID and termination date, disable their Microsoft 365 account, revoke all Okta sessions, and create a ServiceNow offboarding checklist ticket."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last day in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-employee
              type: call
              call: "successfactors.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: disable-m365
              type: call
              call: "msgraph.disable-user"
              with:
                user_id: "{{get-employee.work_email}}"
            - name: revoke-okta
              type: call
              call: "okta.revoke-user-sessions"
              with:
                user_login: "{{get-employee.work_email}}"
            - name: create-offboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Offboarding: {{get-employee.full_name}} — last day {{termination_date}}"
                category: "hr_offboarding"
                assignment_group: "IT_Asset_Recovery"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employees
          path: "/PerPerson({{employee_id}})"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{user_login}}/sessions"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: revoke-user-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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

Deprovisions employees across Okta, ServiceNow, and Snowflake.

naftiko: "0.5"
info:
  label: "Employee Offboarding Access Deprovisioning"
  description: "Deprovisions employees across Okta, ServiceNow, and Snowflake."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: employee-ops
      port: 8080
      tools:
        - name: employee-offboarding-deprovisioning
          description: "Deprovisions employees across Okta, ServiceNow, and Snowflake."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: check-identity
              type: call
              call: "okta.get-users"
              with:
                filter: "status eq ACTIVE"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Employee Offboarding Access Deprovisioning action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users"

          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST

Provisions new hires across Okta, ServiceNow, and Teams.

naftiko: "0.5"
info:
  label: "Employee Onboarding Cross-System Provisioning"
  description: "Provisions new hires across Okta, ServiceNow, and Teams."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: employee-ops
      port: 8080
      tools:
        - name: employee-onboarding-provisioning
          description: "Provisions new hires across Okta, ServiceNow, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: check-identity
              type: call
              call: "okta.get-users"
              with:
                filter: "status eq ACTIVE"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Employee Onboarding Cross-System Provisioning action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Employee Onboarding Cross-System Provisioning completed successfully."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users"

          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Syncs master data across SAP, Snowflake, Salesforce, and Teams.

naftiko: "0.5"
info:
  label: "Enterprise Master Data Sync Orchestrator"
  description: "Syncs master data across SAP, Snowflake, Salesforce, and Teams."
  tags:
    - data-governance
    - sap
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: enterprise-ops
      port: 8080
      tools:
        - name: enterprise-master-data-sync
          description: "Syncs master data across SAP, Snowflake, Salesforce, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: get-sf-data
              type: call
              call: "salesforce.query"
              with:
                q: "SELECT Id, Name FROM Account LIMIT 10"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Enterprise Master Data Sync Orchestrator completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/Account"

          operations:
            - name: query
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates close from SAP, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Financial Period Close Checklist"
  description: "Orchestrates close from SAP, Snowflake, and Teams."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: financial-ops
      port: 8080
      tools:
        - name: financial-period-close-checklist
          description: "Orchestrates close from SAP, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Financial Period Close Checklist completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a GitHub Actions deployment to a Bayer production environment fails, creates a Jira incident ticket and notifies the DevOps engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Deployment Pipeline Failure Handler"
  description: "When a GitHub Actions deployment to a Bayer production environment fails, creates a Jira incident ticket and notifies the DevOps engineering team via Microsoft Teams."
  tags:
    - devops
    - ci-cd
    - github
    - jira
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-deployment-failure
          description: "Given a failed GitHub Actions workflow run ID and repository, fetch run details, open a Jira incident, and post a failure notification to the DevOps Teams channel."
          inputParameters:
            - name: repo_full_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. 'bayer-group/crop-science-api'."
            - name: run_id
              in: body
              type: integer
              description: "The failed GitHub Actions workflow run ID."
            - name: branch
              in: body
              type: string
              description: "The target branch, typically 'main' or 'release'."
          steps:
            - name: get-run
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo_full_name}}"
                run_id: "{{run_id}}"
            - name: create-jira-incident
              type: call
              call: "jira.create-issue"
              with:
                project_key: "OPS"
                issuetype: "Incident"
                summary: "Deployment failure: {{repo_full_name}} on {{branch}}"
                description: "Run: {{run_id}} | Conclusion: {{get-run.conclusion}} | URL: {{get-run.html_url}}"
            - name: alert-devops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "devops-alerts"
                message: "Deployment FAILED: {{repo_full_name}} | Branch: {{branch}} | Jira: {{create-jira-incident.key}} | Run: {{get-run.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates Jira tickets from GitHub failures, alerting via Teams.

naftiko: "0.5"
info:
  label: "GitHub Pipeline Failure to Jira"
  description: "Creates Jira tickets from GitHub failures, alerting via Teams."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: github-ops
      port: 8080
      tools:
        - name: github-pipeline-failure-jira
          description: "Creates Jira tickets from GitHub failures, alerting via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-repo-info
              type: call
              call: "github.get-repo"
              with:
                repo: "{{repo_name}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "GitHub Pipeline Failure to Jira follow-up"
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "GitHub Pipeline Failure to Jira completed successfully."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves GitHub repo metadata.

naftiko: "0.5"
info:
  label: "GitHub Repo Metadata Lookup"
  description: "Retrieves GitHub repo metadata."
  tags:
    - devops
    - github
capability:
  exposes:
    - type: mcp
      namespace: devops-repos
      port: 8080
      tools:
        - name: get-metadata
          description: "Look up repo."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo (org/repo)."
          call: "github.get-repo"
          with:
            repo: "{{repo}}"
          outputParameters:
            - name: language
              type: string
              mapping: "$.language"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Orchestrates scanning from GitHub, Jira, and Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Scanning Orchestrator"
  description: "Orchestrates scanning from GitHub, Jira, and Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: github-ops
      port: 8080
      tools:
        - name: github-security-scanning
          description: "Orchestrates scanning from GitHub, Jira, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-repo-info
              type: call
              call: "github.get-repo"
              with:
                repo: "{{repo_name}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "GitHub Security Scanning Orchestrator follow-up"
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "GitHub Security Scanning Orchestrator completed successfully."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Submits changes via ServiceNow, Snowflake impact, and Teams.

naftiko: "0.5"
info:
  label: "IT Change Advisory Board Submission"
  description: "Submits changes via ServiceNow, Snowflake impact, and Teams."
  tags:
    - it-service-management
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: it-change-advisory-board
          description: "Submits changes via ServiceNow, Snowflake impact, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IT Change Advisory Board Submission action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "IT Change Advisory Board Submission completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks DR from ServiceNow, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "IT Disaster Recovery Readiness Check"
  description: "Checks DR from ServiceNow, Snowflake, and Teams."
  tags:
    - infrastructure
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: it-disaster-recovery
          description: "Checks DR from ServiceNow, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IT Disaster Recovery Readiness Check action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "IT Disaster Recovery Readiness Check completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triages vulnerabilities via ServiceNow and Teams alerts.

naftiko: "0.5"
info:
  label: "IT Security Vulnerability Triage"
  description: "Triages vulnerabilities via ServiceNow and Teams alerts."
  tags:
    - security
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: it-security-vulnerability-triage
          description: "Triages vulnerabilities via ServiceNow and Teams alerts."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IT Security Vulnerability Triage action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "IT Security Vulnerability Triage completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Facilitates planning from Jira and Snowflake, posting to Teams.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Facilitator"
  description: "Facilitates planning from Jira and Snowflake, posting to Teams."
  tags:
    - project-management
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: jira-ops
      port: 8080
      tools:
        - name: jira-sprint-planning
          description: "Facilitates planning from Jira and Snowflake, posting to Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "Jira Sprint Planning Facilitator follow-up"
                issue_type: "Task"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Jira Sprint Planning Facilitator completed successfully."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Jira sprint status.

naftiko: "0.5"
info:
  label: "Jira Board Sprint Status"
  description: "Checks Jira sprint status."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: pm-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Check sprint."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Board ID."
          call: "jira.get-active-sprint"
          with:
            board_id: "{{board_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bayer.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: get-active-sprint
              method: GET

Retrieves sprint data from Jira for a Bayer engineering team, calculates velocity metrics, and posts a sprint velocity summary to the Engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Reporting"
  description: "Retrieves sprint data from Jira for a Bayer engineering team, calculates velocity metrics, and posts a sprint velocity summary to the Engineering Microsoft Teams channel."
  tags:
    - devops
    - jira
    - agile
    - reporting
    - microsoft-teams
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity-report
          description: "Given a Jira board ID and completed sprint ID, retrieve sprint issue data, compute velocity, and post a sprint performance summary to the Engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: integer
              description: "The Jira board ID for the engineering team."
            - name: sprint_id
              in: body
              type: integer
              description: "The completed sprint ID to report on."
          steps:
            - name: get-sprint
              type: call
              call: "jira.get-sprint"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: get-sprint-issues
              type: call
              call: "jira.list-sprint-issues"
              with:
                sprint_id: "{{sprint_id}}"
            - name: post-velocity-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "engineering-metrics"
                message: "Sprint {{get-sprint.name}}: {{get-sprint-issues.completed_points}} story pts | {{get-sprint-issues.count}} issues closed | Velocity: {{get-sprint-issues.velocity}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bayer.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint/{{sprint_id}}"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
        - name: sprint-issues
          path: "/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: list-sprint-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Escalates overdue training via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Escalation"
  description: "Escalates overdue training via ServiceNow and Teams."
  tags:
    - hr
    - compliance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: learning-ops
      port: 8080
      tools:
        - name: learning-compliance-escalation
          description: "Escalates overdue training via ServiceNow and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Workday Learning Compliance Escalation action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Workday Learning Compliance Escalation completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls LinkedIn Talent Solutions job posting metrics and career page follower data to produce a weekly employer brand digest for the Talent Acquisition Teams channel at Bayer.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand and Talent Campaign Report"
  description: "Pulls LinkedIn Talent Solutions job posting metrics and career page follower data to produce a weekly employer brand digest for the Talent Acquisition Teams channel at Bayer."
  tags:
    - hr
    - recruiting
    - linkedin
    - microsoft-teams
    - reporting
    - employer-brand
capability:
  exposes:
    - type: mcp
      namespace: talent-brand
      port: 8080
      tools:
        - name: digest-linkedin-talent-metrics
          description: "Given a LinkedIn organization URN and date range, fetch job posting performance and follower growth metrics, then post a weekly talent brand digest to the Talent Acquisition Teams channel."
          inputParameters:
            - name: org_urn
              in: body
              type: string
              description: "The LinkedIn organization URN for Bayer."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: "linkedin.get-follower-stats"
              with:
                organizationalEntity: "{{org_urn}}"
            - name: get-job-metrics
              type: call
              call: "linkedin.get-job-postings"
              with:
                organizationalEntity: "{{org_urn}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "talent-acquisition"
                message: "LinkedIn Talent Report ({{start_date}} to {{end_date}}): Followers {{get-linkedin-metrics.followerCount}}, Job views {{get-job-metrics.views}}, Applications {{get-job-metrics.applications}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: follower-stats
          path: "/organizationalEntityFollowerStatistics"
          operations:
            - name: get-follower-stats
              method: GET
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: get-job-postings
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates campaigns from LinkedIn, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Campaign Orchestrator"
  description: "Orchestrates campaigns from LinkedIn, Snowflake, and Teams."
  tags:
    - hr
    - marketing
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: linkedin-ops
      port: 8080
      tools:
        - name: linkedin-employer-brand
          description: "Orchestrates campaigns from LinkedIn, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "LinkedIn Employer Brand Campaign Orchestrator completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves LinkedIn page analytics.

naftiko: "0.5"
info:
  label: "LinkedIn Company Page Analytics"
  description: "Retrieves LinkedIn page analytics."
  tags:
    - marketing
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: marketing-social
      port: 8080
      tools:
        - name: get-analytics
          description: "Get analytics."
          inputParameters:
            - name: time_range
              in: body
              type: string
              description: "Time range."
          call: "linkedin.get-analytics"
          with:
            range: "{{time_range}}"
          outputParameters:
            - name: impressions
              type: string
              mapping: "$.impressions"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/organizationalEntityShareStatistics"

          operations:
            - name: get-analytics
              method: GET

Generates analytics from Snowflake, Power BI, and Teams.

naftiko: "0.5"
info:
  label: "Pharmaceutical Market Access Analytics"
  description: "Generates analytics from Snowflake, Power BI, and Teams."
  tags:
    - commercial
    - market-access
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: market-ops
      port: 8080
      tools:
        - name: market-access-analytics
          description: "Generates analytics from Snowflake, Power BI, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.dashboard_dataset_id"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Pharmaceutical Market Access Analytics completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Entra user status.

naftiko: "0.5"
info:
  label: "Microsoft Entra User Check"
  description: "Checks Entra user status."
  tags:
    - identity
    - microsoft-entra
capability:
  exposes:
    - type: mcp
      namespace: identity-status
      port: 8080
      tools:
        - name: check-user
          description: "Check user."
          inputParameters:
            - name: upn
              in: body
              type: string
              description: "UPN."
          call: "msgraph.get-user"
          with:
            upn: "{{upn}}"
          outputParameters:
            - name: enabled
              type: boolean
              mapping: "$.accountEnabled"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET

When a new hire is created in SAP SuccessFactors, provisions an Active Directory account via Microsoft Graph, opens a ServiceNow IT onboarding ticket, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new hire is created in SAP SuccessFactors, provisions an Active Directory account via Microsoft Graph, opens a ServiceNow IT onboarding ticket, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - sap-successfactors
    - servicenow
    - microsoft-graph
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a SuccessFactors employee ID and start date, provision an Active Directory account via Microsoft Graph, open a ServiceNow IT onboarding ticket, and send a Teams welcome message."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in ISO 8601 format (YYYY-MM-DD)."
            - name: division
              in: body
              type: string
              description: "Bayer division the employee is joining: 'Pharmaceuticals', 'Consumer Health', or 'Crop Science'."
          steps:
            - name: get-employee
              type: call
              call: "successfactors.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: provision-ad
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-employee.full_name}}"
                userPrincipalName: "{{get-employee.work_email}}"
                department: "{{division}}"
            - name: create-it-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IT Onboarding: {{get-employee.full_name}} — starts {{start_date}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                message: "Welcome to Bayer, {{get-employee.first_name}}! Your IT setup ticket is {{create-it-ticket.number}}."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employees
          path: "/PerPerson({{employee_id}})"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Generates digests from Jira, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Cross-Functional OKR Tracking Digest"
  description: "Generates digests from Jira, Snowflake, and Teams."
  tags:
    - project-management
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: okr-ops
      port: 8080
      tools:
        - name: okr-tracking-digest
          description: "Generates digests from Jira, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "Cross-Functional OKR Tracking Digest follow-up"
                issue_type: "Task"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Cross-Functional OKR Tracking Digest completed successfully."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves all Okta application assignments and group memberships for a user and posts a formatted access certification report to the Cybersecurity Microsoft Teams channel for quarterly review.

naftiko: "0.5"
info:
  label: "Okta Identity Access Review"
  description: "Retrieves all Okta application assignments and group memberships for a user and posts a formatted access certification report to the Cybersecurity Microsoft Teams channel for quarterly review."
  tags:
    - identity
    - security
    - okta
    - microsoft-teams
    - access-review
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: certify-user-access
          description: "Given an Okta user login, retrieve all application assignments and group memberships, and post a structured access report to the Cybersecurity Teams channel for quarterly access certification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login (email) to certify."
          steps:
            - name: get-user-apps
              type: call
              call: "okta.list-user-apps"
              with:
                user_login: "{{user_login}}"
            - name: get-user-groups
              type: call
              call: "okta.list-user-groups"
              with:
                user_login: "{{user_login}}"
            - name: post-cert-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "cybersecurity-access-certs"
                message: "Access cert for {{user_login}}: {{get-user-apps.count}} apps | {{get-user-groups.count}} groups | Apps: {{get-user-apps.names}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-apps
          path: "/users/{{user_login}}/appLinks"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: list-user-apps
              method: GET
        - name: user-groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: list-user-groups
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Manages identity lifecycle across Okta, ServiceNow, and Snowflake.

naftiko: "0.5"
info:
  label: "Okta Identity Lifecycle Orchestrator"
  description: "Manages identity lifecycle across Okta, ServiceNow, and Snowflake."
  tags:
    - identity
    - okta
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: okta-ops
      port: 8080
      tools:
        - name: okta-identity-lifecycle
          description: "Manages identity lifecycle across Okta, ServiceNow, and Snowflake."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: check-identity
              type: call
              call: "okta.get-users"
              with:
                filter: "status eq ACTIVE"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Okta Identity Lifecycle Orchestrator action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users"

          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST

Retrieves Okta user profile.

naftiko: "0.5"
info:
  label: "Okta User Profile Lookup"
  description: "Retrieves Okta user profile."
  tags:
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity-user
      port: 8080
      tools:
        - name: get-user
          description: "Look up Okta user."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "User email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: name
              type: string
              mapping: "$.profile.displayName"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Scans compliance from GitHub, Snowflake, and Jira.

naftiko: "0.5"
info:
  label: "GitHub Open Source Compliance Scanner"
  description: "Scans compliance from GitHub, Snowflake, and Jira."
  tags:
    - security
    - compliance
    - github
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: open-ops
      port: 8080
      tools:
        - name: open-source-compliance
          description: "Scans compliance from GitHub, Snowflake, and Jira."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-repo-info
              type: call
              call: "github.get-repo"
              with:
                repo: "{{repo_name}}"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "GitHub Open Source Compliance Scanner follow-up"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bayer.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

Checks PagerDuty incident.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Status"
  description: "Checks PagerDuty incident."
  tags:
    - observability
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: ops-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check PD incident."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          call: "pagerduty.get-incident"
          with:
            id: "{{incident_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.incident.status"
            - name: urgency
              type: string
              mapping: "$.incident.urgency"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET

Retrieves the current on-call engineer from a PagerDuty escalation policy to support incident routing and stakeholder notification.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer from a PagerDuty escalation policy to support incident routing and stakeholder notification."
  tags:
    - itsm
    - pagerduty
    - on-call
    - incident-response
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-current-oncall
          description: "Given a PagerDuty escalation policy ID, return the current on-call engineer's name and email. Use when routing production incidents to the correct responder."
          inputParameters:
            - name: escalation_policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID for the relevant system team."
          call: "pagerduty.get-oncall"
          with:
            escalation_policy_id: "{{escalation_policy_id}}"
          outputParameters:
            - name: oncall_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: oncall_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Bridges PagerDuty to ServiceNow and notifies via Teams.

naftiko: "0.5"
info:
  label: "PagerDuty to ServiceNow Incident Bridge"
  description: "Bridges PagerDuty to ServiceNow and notifies via Teams."
  tags:
    - observability
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pagerduty-ops
      port: 8080
      tools:
        - name: pagerduty-servicenow-bridge
          description: "Bridges PagerDuty to ServiceNow and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "PagerDuty to ServiceNow Incident Bridge action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "PagerDuty to ServiceNow Incident Bridge completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates digests from Salesforce, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Salesforce Pharma Pipeline Digest"
  description: "Generates digests from Salesforce, Snowflake, and Teams."
  tags:
    - commercial
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pharma-ops
      port: 8080
      tools:
        - name: pharma-pipeline-digest
          description: "Generates digests from Salesforce, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sf-data
              type: call
              call: "salesforce.query"
              with:
                q: "SELECT Id, Name FROM Account LIMIT 10"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Salesforce Pharma Pipeline Digest completed successfully."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/Account"

          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates batch release from SAP QM, verifying compliance, and notifying quality via Teams.

naftiko: "0.5"
info:
  label: "Pharmaceutical Batch Release Workflow"
  description: "Orchestrates batch release from SAP QM, verifying compliance, and notifying quality via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pharmaceutical-ops
      port: 8080
      tools:
        - name: pharmaceutical-batch-release
          description: "Orchestrates batch release from SAP QM, verifying compliance, and notifying quality via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Pharmaceutical Batch Release Workflow completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors stability from Snowflake and alerts quality via Teams.

naftiko: "0.5"
info:
  label: "Pharmaceutical Stability Study Monitor"
  description: "Monitors stability from Snowflake and alerts quality via Teams."
  tags:
    - quality
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pharmaceutical-ops
      port: 8080
      tools:
        - name: pharmaceutical-stability-monitor
          description: "Monitors stability from Snowflake and alerts quality via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Pharmaceutical Stability Study Monitor completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Handles PV cases in Snowflake and notifies via Teams.

naftiko: "0.5"
info:
  label: "Pharmaceutical Pharmacovigilance Case Handler"
  description: "Handles PV cases in Snowflake and notifies via Teams."
  tags:
    - pharmacovigilance
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pharmacovigilance-ops
      port: 8080
      tools:
        - name: pharmacovigilance-case-handler
          description: "Handles PV cases in Snowflake and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Pharmaceutical Pharmacovigilance Case Handler completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Power BI refresh status.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh Check"
  description: "Checks Power BI refresh status."
  tags:
    - analytics
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "powerbi.get-refresh-history"
          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: refresh
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Triggers a Power BI dataset refresh for Bayer's R&D and pharma research dashboards and notifies the Research Analytics team via Microsoft Teams on completion.

naftiko: "0.5"
info:
  label: "Power BI Research Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for Bayer's R&D and pharma research dashboards and notifies the Research Analytics team via Microsoft Teams on completion."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - r-and-d
capability:
  exposes:
    - type: mcp
      namespace: research-bi
      port: 8080
      tools:
        - name: trigger-research-dashboard-refresh
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh and notify the Research Analytics Teams channel with the status."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the research dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.trigger-refresh"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-research
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "research-analytics"
                message: "Power BI research dataset {{dataset_id}} refresh triggered. 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: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Loads precision farming data to Snowflake and notifies via Teams.

naftiko: "0.5"
info:
  label: "Agricultural Precision Farming Data Loader"
  description: "Loads precision farming data to Snowflake and notifies via Teams."
  tags:
    - agriculture
    - data-engineering
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: precision-ops
      port: 8080
      tools:
        - name: precision-farming-data-loader
          description: "Loads precision farming data to Snowflake and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Agricultural Precision Farming Data Loader completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors changes from Snowflake, Jira tracking, and Teams.

naftiko: "0.5"
info:
  label: "Compliance Regulatory Change Monitor"
  description: "Monitors changes from Snowflake, Jira tracking, and Teams."
  tags:
    - compliance
    - regulatory
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: regulatory-change-monitor
          description: "Monitors changes from Snowflake, Jira tracking, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "Compliance Regulatory Change Monitor follow-up"
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Compliance Regulatory Change Monitor completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bayer.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Coordinates submissions via SharePoint, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Regulatory Submission Coordination"
  description: "Coordinates submissions via SharePoint, Snowflake, and Teams."
  tags:
    - regulatory
    - sharepoint
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: regulatory-submission-coordination
          description: "Coordinates submissions via SharePoint, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-documents
              type: call
              call: "sharepoint.list-items"
              with:
                site_id: "$secrets.default_site_id"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Regulatory Submission Coordination completed successfully."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drives
          path: "/sites/{{site_id}}/drives"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: list-items
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Salesforce for open commercial opportunities by division and posts a weekly pipeline digest to the Global Sales Teams channel for Bayer's commercial and pharmaceutical divisions.

naftiko: "0.5"
info:
  label: "Salesforce CRM Opportunity Pipeline Digest"
  description: "Queries Salesforce for open commercial opportunities by division and posts a weekly pipeline digest to the Global Sales Teams channel for Bayer's commercial and pharmaceutical divisions."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - reporting
    - pharma
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-sales-pipeline
          description: "Query Salesforce for open opportunities closing this quarter, grouped by Bayer division, and post a pipeline digest to the Global Sales Teams channel."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter to report, e.g. '2026-Q1'."
            - name: division
              in: body
              type: string
              description: "Bayer division filter: 'Pharmaceuticals', 'Consumer Health', or 'Crop Science'."
          steps:
            - name: query-opportunities
              type: call
              call: "salesforce.query-opportunities"
              with:
                quarter: "{{fiscal_quarter}}"
                division: "{{division}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "global-sales"
                message: "Pipeline digest Q{{fiscal_quarter}} ({{division}}): {{query-opportunities.count}} opportunities | Total: €{{query-opportunities.total_value}} | Weighted: €{{query-opportunities.weighted_value}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bayer.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity-query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Routes approvals from Salesforce, validates in Snowflake, and notifies via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Deal Desk Approval Workflow"
  description: "Routes approvals from Salesforce, validates in Snowflake, and notifies via Teams."
  tags:
    - commercial
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce-ops
      port: 8080
      tools:
        - name: salesforce-deal-desk-approval
          description: "Routes approvals from Salesforce, validates in Snowflake, and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sf-data
              type: call
              call: "salesforce.query"
              with:
                q: "SELECT Id, Name FROM Account LIMIT 10"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Salesforce Deal Desk Approval Workflow completed successfully."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/Account"

          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks KOLs from Salesforce and Snowflake, posting to Teams.

naftiko: "0.5"
info:
  label: "Salesforce Medical Affairs KOL Tracker"
  description: "Tracks KOLs from Salesforce and Snowflake, posting to Teams."
  tags:
    - medical-affairs
    - commercial
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce-ops
      port: 8080
      tools:
        - name: salesforce-kol-tracker
          description: "Tracks KOLs from Salesforce and Snowflake, posting to Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sf-data
              type: call
              call: "salesforce.query"
              with:
                q: "SELECT Id, Name FROM Account LIMIT 10"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Salesforce Medical Affairs KOL Tracker completed successfully."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/Account"

          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Salesforce opportunity details.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Check"
  description: "Retrieves Salesforce opportunity details."
  tags:
    - commercial
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-opp
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up opportunity."
          inputParameters:
            - name: opp_id
              in: body
              type: string
              description: "Opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            id: "{{opp_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Plans territories from Salesforce and Snowflake, notifying via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Territory Planning Orchestrator"
  description: "Plans territories from Salesforce and Snowflake, notifying via Teams."
  tags:
    - commercial
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: salesforce-ops
      port: 8080
      tools:
        - name: salesforce-territory-planning
          description: "Plans territories from Salesforce and Snowflake, notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sf-data
              type: call
              call: "salesforce.query"
              with:
                q: "SELECT Id, Name FROM Account LIMIT 10"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Salesforce Territory Planning Orchestrator completed successfully."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://login.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/Account"

          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Alerts on renewals from Ariba, ServiceNow, and Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Alerter"
  description: "Alerts on renewals from Ariba, ServiceNow, and Teams."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap-ops
      port: 8080
      tools:
        - name: sap-ariba-contract-renewal
          description: "Alerts on renewals from Ariba, ServiceNow, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SAP Ariba Contract Renewal Alerter action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "SAP Ariba Contract Renewal Alerter completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates a purchase requisition in SAP Ariba, routes it through the approval workflow, and notifies the requester and approver via Microsoft Teams when the status changes.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Request Approval"
  description: "Creates a purchase requisition in SAP Ariba, routes it through the approval workflow, and notifies the requester and approver via Microsoft Teams when the status changes."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - approval
    - finance
capability:
  exposes:
    - type: mcp
      namespace: procurement-approvals
      port: 8080
      tools:
        - name: submit-procurement-request
          description: "Given a supplier, line item description, quantity, and estimated cost, create a purchase requisition in SAP Ariba and notify the requester and approver via Teams."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID for the requested vendor."
            - name: item_description
              in: body
              type: string
              description: "Description of the goods or services being requested."
            - name: quantity
              in: body
              type: number
              description: "Quantity of items or units being requested."
            - name: estimated_cost_eur
              in: body
              type: number
              description: "Estimated total cost in EUR."
            - name: cost_center
              in: body
              type: string
              description: "The Bayer cost center code to charge the purchase to."
          steps:
            - name: create-requisition
              type: call
              call: "sap-ariba.create-requisition"
              with:
                supplierId: "{{supplier_id}}"
                description: "{{item_description}}"
                quantity: "{{quantity}}"
                estimatedCost: "{{estimated_cost_eur}}"
                costCenter: "{{cost_center}}"
            - name: notify-requester
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "procurement-requests"
                message: "Procurement request submitted: {{item_description}} | Supplier: {{supplier_id}} | Cost: €{{estimated_cost_eur}} | Ariba ID: {{create-requisition.id}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/purchase-orders/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves supplier from Ariba.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Lookup"
  description: "Retrieves supplier from Ariba."
  tags:
    - procurement
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: procurement-suppliers
      port: 8080
      tools:
        - name: get-supplier
          description: "Look up supplier."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "Supplier ID."
          call: "ariba.get-supplier"
          with:
            id: "{{supplier_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: status
              type: string
              mapping: "$.status"
  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/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET

Queries SAP Concur for expense reports pending manager approval beyond the SLA and sends reminder notifications to the Finance Approvals Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval Reminder"
  description: "Queries SAP Concur for expense reports pending manager approval beyond the SLA and sends reminder notifications to the Finance Approvals Microsoft Teams channel."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approvals
      port: 8080
      tools:
        - name: send-expense-approval-reminders
          description: "Query SAP Concur for expense reports in Pending Manager Approval status older than the specified days threshold and post a reminder to the Finance Approvals Teams channel."
          inputParameters:
            - name: days_pending
              in: body
              type: integer
              description: "Minimum days pending before sending a reminder. Default: 5."
          steps:
            - name: get-pending-reports
              type: call
              call: "concur.list-pending-reports"
              with:
                approvalStatus: "A_PEND"
                daysOld: "{{days_pending}}"
            - name: notify-approvers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "finance-approvals"
                message: "{{get-pending-reports.count}} expense reports pending for more than {{days_pending}} days. Please review 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: expense-reports
          path: "/expense/reports"
          operations:
            - name: list-pending-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks travel request status.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Request Status"
  description: "Checks travel request status."
  tags:
    - travel
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: travel-requests
      port: 8080
      tools:
        - name: check-travel
          description: "Check travel."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "Request ID."
          call: "concur.get-request"
          with:
            id: "{{request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ApprovalStatus"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: requests
          path: "/travelrequest/requests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-request
              method: GET

Checks material stock levels.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Material Stock Check"
  description: "Checks material stock levels."
  tags:
    - supply-chain
    - sap
capability:
  exposes:
    - type: mcp
      namespace: scm-stock
      port: 8080
      tools:
        - name: check-stock
          description: "Check stock."
          inputParameters:
            - name: material
              in: body
              type: string
              description: "Material."
            - name: plant
              in: body
              type: string
              description: "Plant."
          call: "sap.get-stock"
          with:
            material: "{{material}}"
            plant: "{{plant}}"
          outputParameters:
            - name: available_qty
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-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"

          operations:
            - name: get-stock
              method: GET

Orchestrates P2P from SAP, ServiceNow approvals, and Teams notification.

naftiko: "0.5"
info:
  label: "SAP Procurement to Payment Orchestrator"
  description: "Orchestrates P2P from SAP, ServiceNow approvals, and Teams notification."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap-ops
      port: 8080
      tools:
        - name: sap-procurement-to-payment
          description: "Orchestrates P2P from SAP, ServiceNow approvals, and Teams notification."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SAP Procurement to Payment Orchestrator action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "SAP Procurement to Payment Orchestrator completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Optimizes scheduling from SAP, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "SAP Production Scheduling Optimizer"
  description: "Optimizes scheduling from SAP, Snowflake, and Teams."
  tags:
    - manufacturing
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sap-ops
      port: 8080
      tools:
        - name: sap-production-scheduling
          description: "Optimizes scheduling from SAP, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "SAP Production Scheduling Optimizer completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves cost center budget from SAP.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Cost Center Lookup"
  description: "Retrieves cost center budget from SAP."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: finance-cc
      port: 8080
      tools:
        - name: get-cost-center
          description: "Look up cost center."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "Cost center ID."
          call: "sap.get-cost-center"
          with:
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: budget
              type: string
              mapping: "$.d.PlannedAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-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"

          operations:
            - name: get-cost-center
              method: GET

Looks up a purchase order in SAP S/4HANA by PO number and returns header status, supplier name, total value, and currency for procurement and finance reconciliation workflows.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up a purchase order in SAP S/4HANA by PO number and returns header status, supplier name, total value, and currency for procurement and finance reconciliation workflows."
  tags:
    - procurement
    - erp
    - finance
    - sap-s4hana
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header status, supplier, total value, and line item count from SAP S/4HANA. Use for procurement status checks and accounts payable reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up, e.g. '4500012345'."
          call: "sap-s4hana.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: supplier_name
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: number
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-s4hana
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Creates a ServiceNow change request for Bayer IT infrastructure changes, assigns it to the CAB review queue, and notifies stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Advisory Board Submission"
  description: "Creates a ServiceNow change request for Bayer IT infrastructure changes, assigns it to the CAB review queue, and notifies stakeholders via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change title, description, risk level, and planned implementation date, create a ServiceNow change request and notify the Change Advisory Board via Teams."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "Short title of the proposed infrastructure or application change."
            - name: change_description
              in: body
              type: string
              description: "Detailed description including impact, rollback plan, and business justification."
            - name: risk_level
              in: body
              type: string
              description: "Risk classification: 'low', 'medium', or 'high'."
            - name: planned_date
              in: body
              type: string
              description: "Planned implementation date in YYYY-MM-DD format."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{change_title}}"
                description: "{{change_description}}"
                risk: "{{risk_level}}"
                planned_start_date: "{{planned_date}}"
            - name: notify-cab
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "change-advisory-board"
                message: "New CAB request: {{change_title}} | Risk: {{risk_level}} | Planned: {{planned_date}} | SNOW: {{create-change.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves incident details from ServiceNow.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Lookup"
  description: "Retrieves incident details from ServiceNow."
  tags:
    - it-service-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm-incident
      port: 8080
      tools:
        - name: get-incident
          description: "Look up incident."
          inputParameters:
            - name: number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: get-incident
              method: GET

Enriches KB from ServiceNow, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Base Enrichment"
  description: "Enriches KB from ServiceNow, Snowflake, and Teams."
  tags:
    - it-service-management
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: servicenow-ops
      port: 8080
      tools:
        - name: servicenow-kb-enrichment
          description: "Enriches KB from ServiceNow, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "ServiceNow Knowledge Base Enrichment action required"
                category: "automated"
                assigned_group: "Operations"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "ServiceNow Knowledge Base Enrichment completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Lists SharePoint documents.

naftiko: "0.5"
info:
  label: "SharePoint Library Listing"
  description: "Lists SharePoint documents."
  tags:
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: collab-docs
      port: 8080
      tools:
        - name: list-docs
          description: "List documents."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
          call: "sharepoint.list-items"
          with:
            site_id: "{{site_id}}"
          outputParameters:
            - name: items
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drives
          path: "/sites/{{site_id}}/drives"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: list-items
              method: GET

Runs data quality validation against Bayer's Snowflake agricultural and genomics data warehouse, detects anomalies and nulls in crop science datasets, and posts a quality report to the Data Engineering Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Agricultural Data Quality Monitoring"
  description: "Runs data quality validation against Bayer's Snowflake agricultural and genomics data warehouse, detects anomalies and nulls in crop science datasets, and posts a quality report to the Data Engineering Teams channel."
  tags:
    - data
    - analytics
    - snowflake
    - data-quality
    - crop-science
    - agriculture
capability:
  exposes:
    - type: mcp
      namespace: ag-data-ops
      port: 8080
      tools:
        - name: run-ag-data-quality-check
          description: "Given a Snowflake database and table name for a crop science dataset, execute data quality checks for null rates and outlier values, and post results to the Data Engineering Teams channel."
          inputParameters:
            - name: database_name
              in: body
              type: string
              description: "The Snowflake database name, e.g. 'BAYER_CROPSCIENCE_PROD'."
            - name: table_name
              in: body
              type: string
              description: "The fully qualified Snowflake table name to validate."
            - name: check_date
              in: body
              type: string
              description: "The date partition to validate in YYYY-MM-DD format."
          steps:
            - name: run-dq-check
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as total, COUNT_IF(yield IS NULL) as null_yield, COUNT_IF(yield < 0) as negative_yield FROM {{table_name}} WHERE harvest_date = '{{check_date}}'"
            - name: post-dq-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "data-engineering"
                message: "DQ check on {{table_name}} for {{check_date}}: {{run-dq-check.total}} rows, {{run-dq-check.null_yield}} null yields, {{run-dq-check.negative_yield}} negative yields"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries agricultural trial data.

naftiko: "0.5"
info:
  label: "Snowflake Agricultural Data Query"
  description: "Queries agricultural trial data."
  tags:
    - agriculture
    - data-engineering
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: agri-data
      port: 8080
      tools:
        - name: query-agri
          description: "Query agri data."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "Trial ID."
          call: "snowflake.run-query"
          with:
            statement: "SELECT metric_name, value FROM agriculture.trial_results WHERE trial_id='{{trial_id}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST

Queries crop science experiments.

naftiko: "0.5"
info:
  label: "Snowflake Crop Science Experiment Lookup"
  description: "Queries crop science experiments."
  tags:
    - agriculture
    - research
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: agri-research
      port: 8080
      tools:
        - name: get-experiment
          description: "Query experiment."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "Experiment ID."
          call: "snowflake.run-query"
          with:
            statement: "SELECT parameter, measurement FROM crop_science.experiments WHERE experiment_id='{{experiment_id}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST

Checks pipeline last run status.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Status"
  description: "Checks pipeline last run status."
  tags:
    - data-engineering
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline
          description: "Check pipeline."
          inputParameters:
            - name: pipeline
              in: body
              type: string
              description: "Pipeline name."
          call: "snowflake.run-query"
          with:
            statement: "SELECT status FROM pipelines.runs WHERE name='{{pipeline}}' ORDER BY run_date DESC LIMIT 1"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data[0][0]"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST

Looks up the most recent execution status of a named Snowflake pipeline task in Bayer's data warehouse, returning the run state, timestamps, and any error messages.

naftiko: "0.5"
info:
  label: "Snowflake Pipeline Task Status Lookup"
  description: "Looks up the most recent execution status of a named Snowflake pipeline task in Bayer's data warehouse, returning the run state, timestamps, and any error messages."
  tags:
    - data
    - analytics
    - snowflake
    - monitoring
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: pipeline-status
      port: 8080
      tools:
        - name: get-pipeline-task-status
          description: "Given a Snowflake database and task name, return the most recent task run state, scheduled time, completion time, and error message if failed."
          inputParameters:
            - name: database_name
              in: body
              type: string
              description: "The Snowflake database name, e.g. 'BAYER_CROPSCIENCE_PROD'."
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name to query."
          call: "snowflake.get-task-history"
          with:
            database: "{{database_name}}"
            task_name: "{{task_name}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.data[0].STATE"
            - name: scheduled_time
              type: string
              mapping: "$.data[0].SCHEDULED_TIME"
            - name: completed_time
              type: string
              mapping: "$.data[0].COMPLETED_TIME"
            - name: error_message
              type: string
              mapping: "$.data[0].ERROR_MESSAGE"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/information_schema/task_history"
          inputParameters:
            - name: database
              in: path
          operations:
            - name: get-task-history
              method: GET

Audits sharing from Snowflake, ServiceNow, and Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Sharing Governance Check"
  description: "Audits sharing from Snowflake, ServiceNow, and Teams."
  tags:
    - data-governance
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: snowflake-ops
      port: 8080
      tools:
        - name: snowflake-sharing-governance
          description: "Audits sharing from Snowflake, ServiceNow, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Snowflake Data Sharing Governance Check action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Snowflake Data Sharing Governance Check completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Looks up the current status of an employee absence request in SAP SuccessFactors, returning approval state, leave dates, and type.

naftiko: "0.5"
info:
  label: "SuccessFactors Absence Request Status Lookup"
  description: "Looks up the current status of an employee absence request in SAP SuccessFactors, returning approval state, leave dates, and type."
  tags:
    - hr
    - sap-successfactors
    - absence-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: get-absence-request-status
          description: "Given a SuccessFactors absence request ID, return the approval status, start date, end date, and leave type. Use for employee self-service or HR review."
          inputParameters:
            - name: absence_request_id
              in: body
              type: string
              description: "The SAP SuccessFactors absence request ID to look up."
          call: "successfactors.get-absence-request"
          with:
            request_id: "{{absence_request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.approvalStatus"
            - name: start_date
              type: string
              mapping: "$.d.startDate"
            - name: end_date
              type: string
              mapping: "$.d.endDate"
            - name: leave_type
              type: string
              mapping: "$.d.leaveType"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: absence-requests
          path: "/LeaveRequest({{request_id}})"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-absence-request
              method: GET

Retrieves employee details from SuccessFactors.

naftiko: "0.5"
info:
  label: "SuccessFactors Employee Lookup"
  description: "Retrieves employee details from SuccessFactors."
  tags:
    - hr
    - successfactors
capability:
  exposes:
    - type: mcp
      namespace: hr-employee
      port: 8080
      tools:
        - name: get-employee
          description: "Look up employee."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "successfactors.get-employee"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.d.displayName"
            - name: department
              type: string
              mapping: "$.d.department"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api15.sapsf.com/odata/v2"
      authentication:
        type: basic
        username: "$secrets.sf_user"
        password: "$secrets.sf_password"
      resources:
        - name: employees
          path: "/User('{{employee_id}}')"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET

Checks leave balance.

naftiko: "0.5"
info:
  label: "SuccessFactors Leave Balance Check"
  description: "Checks leave balance."
  tags:
    - hr
    - successfactors
capability:
  exposes:
    - type: mcp
      namespace: hr-leave
      port: 8080
      tools:
        - name: check-leave
          description: "Check leave."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "successfactors.get-leave"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: balance
              type: string
              mapping: "$.d.balance"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api15.sapsf.com/odata/v2"
      authentication:
        type: basic
        username: "$secrets.sf_user"
        password: "$secrets.sf_password"
      resources:
        - name: leave
          path: "/EmployeeTime"

          operations:
            - name: get-leave
              method: GET

Calibrates ratings from SuccessFactors and Snowflake, notifying via Teams.

naftiko: "0.5"
info:
  label: "SuccessFactors Performance Calibration"
  description: "Calibrates ratings from SuccessFactors and Snowflake, notifying via Teams."
  tags:
    - hr
    - performance
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: successfactors-ops
      port: 8080
      tools:
        - name: successfactors-performance-calibration
          description: "Calibrates ratings from SuccessFactors and Snowflake, notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "SuccessFactors Performance Calibration completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Initiates a performance review cycle in SAP SuccessFactors for a Bayer division, creates ServiceNow tracking tasks for HR, and notifies managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SuccessFactors Performance Review Cycle Launch"
  description: "Initiates a performance review cycle in SAP SuccessFactors for a Bayer division, creates ServiceNow tracking tasks for HR, and notifies managers via Microsoft Teams."
  tags:
    - hr
    - performance
    - sap-successfactors
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-performance-review-cycle
          description: "Given a SuccessFactors organization unit and review year, initiate the performance review cycle, create ServiceNow HR tasks, and notify managers via Teams."
          inputParameters:
            - name: org_unit_id
              in: body
              type: string
              description: "The SAP SuccessFactors organization unit ID to initiate the review for."
            - name: review_year
              in: body
              type: string
              description: "The performance review year, e.g. '2026'."
          steps:
            - name: initiate-review
              type: call
              call: "successfactors.create-performance-review"
              with:
                orgUnitId: "{{org_unit_id}}"
                reviewYear: "{{review_year}}"
            - name: create-tracking-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Performance review {{review_year}} — org {{org_unit_id}}"
                assignment_group: "HR_Operations"
                due_date: "{{initiate-review.deadline}}"
            - name: notify-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "hr-announcements"
                message: "Performance review {{review_year}} launched for org unit {{org_unit_id}}. Deadline: {{initiate-review.deadline}}."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: performance-reviews
          path: "/PerformanceReview"
          operations:
            - name: create-performance-review
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee role change is processed in SAP SuccessFactors, updates their Okta group memberships and creates a ServiceNow task to confirm access provisioning.

naftiko: "0.5"
info:
  label: "SuccessFactors Role Change Access Provisioning"
  description: "When an employee role change is processed in SAP SuccessFactors, updates their Okta group memberships and creates a ServiceNow task to confirm access provisioning."
  tags:
    - hr
    - identity
    - sap-successfactors
    - okta
    - servicenow
    - role-change
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-access
      port: 8080
      tools:
        - name: sync-role-change-access
          description: "Given a SuccessFactors employee ID, new role, and old role, update Okta group memberships and create a ServiceNow provisioning confirmation task."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The SAP SuccessFactors employee ID for the role change."
            - name: new_role
              in: body
              type: string
              description: "The new job role from the Bayer role catalogue."
            - name: old_role
              in: body
              type: string
              description: "The previous job role for de-provisioning reference."
          steps:
            - name: get-employee
              type: call
              call: "successfactors.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: update-okta-groups
              type: call
              call: "okta.update-user-groups"
              with:
                user_login: "{{get-employee.work_email}}"
                add_group: "{{new_role}}"
                remove_group: "{{old_role}}"
            - name: create-provisioning-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Role change: {{get-employee.full_name}} — {{old_role}} to {{new_role}}"
                assignment_group: "IT_Access_Management"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: employees
          path: "/PerPerson({{employee_id}})"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://bayer.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Collects metrics from Snowflake and posts to Teams.

naftiko: "0.5"
info:
  label: "Environmental Sustainability Metrics Collector"
  description: "Collects metrics from Snowflake and posts to Teams."
  tags:
    - sustainability
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability-ops
      port: 8080
      tools:
        - name: sustainability-metrics-collector
          description: "Collects metrics from Snowflake and posts to Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Environmental Sustainability Metrics Collector completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Prepares reviews from SuccessFactors, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Workday Talent Review Preparation"
  description: "Prepares reviews from SuccessFactors, Snowflake, and Teams."
  tags:
    - hr
    - talent-management
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-ops
      port: 8080
      tools:
        - name: talent-review-preparation
          description: "Prepares reviews from SuccessFactors, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Workday Talent Review Preparation completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Posts Teams notification.

naftiko: "0.5"
info:
  label: "Teams Notification Post"
  description: "Posts Teams notification."
  tags:
    - collaboration
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: collab-notify
      port: 8080
      tools:
        - name: post-notification
          description: "Post notification."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
            - name: message
              in: body
              type: string
              description: "Message."
          call: "msteams.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            body: "{{message}}"
          outputParameters:
            - name: 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: post-channel-message
              method: POST

Tracks changes, updating ServiceNow and notifying via Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Change Tracker"
  description: "Tracks changes, updating ServiceNow and notifying via Teams."
  tags:
    - infrastructure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: terraform-ops
      port: 8080
      tools:
        - name: terraform-change-tracker
          description: "Tracks changes, updating ServiceNow and notifying via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Terraform Infrastructure Change Tracker action required"
                category: "automated"
                assigned_group: "Operations"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Terraform Infrastructure Change Tracker completed successfully."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"

          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers a Terraform Cloud workspace run to provision or update Bayer's cloud infrastructure, and notifies the Platform Engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning Trigger"
  description: "Triggers a Terraform Cloud workspace run to provision or update Bayer's cloud infrastructure, and notifies the Platform Engineering team in Microsoft Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - microsoft-teams
    - devops
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and description, trigger an infrastructure plan-and-apply run and notify the Platform Engineering Teams channel."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID to run against."
            - name: run_message
              in: body
              type: string
              description: "Description of the infrastructure change, e.g. 'Add Kubernetes node pool for genomics pipeline'."
          steps:
            - name: trigger-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                message: "{{run_message}}"
            - name: notify-platform
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "platform-engineering"
                message: "Terraform run triggered: {{run_message}} | Workspace: {{workspace_id}} | Run ID: {{trigger-run.id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Terraform plan status.

naftiko: "0.5"
info:
  label: "Terraform Plan Status Check"
  description: "Checks Terraform plan status."
  tags:
    - infrastructure
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: infra-iac
      port: 8080
      tools:
        - name: check-plan
          description: "Check plan."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Run ID."
          call: "terraform.get-run"
          with:
            run_id: "{{run_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET

Reports cash from SAP, Snowflake, and Teams.

naftiko: "0.5"
info:
  label: "Financial Treasury Cash Position Report"
  description: "Reports cash from SAP, Snowflake, and Teams."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: treasury-ops
      port: 8080
      tools:
        - name: treasury-cash-position
          description: "Reports cash from SAP, Snowflake, and Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Financial Treasury Cash Position Report completed successfully."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Assesses risk from SAP, Snowflake, and ServiceNow.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Workflow"
  description: "Assesses risk from SAP, Snowflake, and ServiceNow."
  tags:
    - procurement
    - risk-management
    - sap
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vendor-ops
      port: 8080
      tools:
        - name: vendor-risk-assessment
          description: "Assesses risk from SAP, Snowflake, and ServiceNow."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: get-sap-data
              type: call
              call: "sap.get-partner"
              with:
                filter: "BusinessPartnerCategory eq 1"
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Vendor Risk Assessment Workflow action required"
                category: "automated"
                assigned_group: "Operations"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bayer-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: partners
          path: "/A_BusinessPartner"

          operations:
            - name: get-partner
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bayer.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

Analyzes weather impact from Snowflake and notifies via Teams.

naftiko: "0.5"
info:
  label: "Agricultural Weather Impact Analysis"
  description: "Analyzes weather impact from Snowflake and notifies via Teams."
  tags:
    - agriculture
    - research
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weather-ops
      port: 8080
      tools:
        - name: weather-impact-analysis
          description: "Analyzes weather impact from Snowflake and notifies via Teams."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The request or entity identifier."
          steps:
            - name: query-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM analytics.summary LIMIT 100"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ops_team_id"
                channel_id: "$secrets.ops_channel_id"
                body: "Agricultural Weather Impact Analysis completed successfully."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bayer.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"

          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST