3M Capabilities

Naftiko 0.5 capability definitions for 3M - 103 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Retrieves a document from SharePoint, sends it to Claude via the Anthropic API for summarization, saves the result back to SharePoint, and notifies the requester in Microsoft Teams.

naftiko: "0.5"
info:
  label: "AI-Assisted Document Summarization"
  description: "Retrieves a document from SharePoint, sends it to Claude via the Anthropic API for summarization, saves the result back to SharePoint, and notifies the requester in Microsoft Teams."
  tags:
    - ai
    - anthropic
    - document-management
    - sharepoint
    - microsoft-teams
    - productivity
capability:
  exposes:
    - type: mcp
      namespace: ai-productivity
      port: 8080
      tools:
        - name: summarize-document
          description: "Given a SharePoint document path and requester UPN, fetch the document, summarize via Claude, save the summary, and notify the requester in Teams."
          inputParameters:
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID containing the document."
            - name: document_path
              in: body
              type: string
              description: "Path to the document within the SharePoint drive."
            - name: requester_upn
              in: body
              type: string
              description: "Microsoft UPN of the person requesting the summary."
          steps:
            - name: get-document
              type: call
              call: "sharepoint-ai.get-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_path: "{{document_path}}"
            - name: summarize
              type: call
              call: "anthropic-ai.create-message"
              with:
                model: "claude-sonnet-4-6"
                max_tokens: "1024"
                system: "You are a concise business document summarizer for 3M executives."
                user_message: "Summarize this document:\n\n{{get-document.content}}"
            - name: save-summary
              type: call
              call: "sharepoint-ai.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_path: "Summaries/{{document_path}}.summary.md"
                content: "{{summarize.content}}"
            - name: notify-requester
              type: call
              call: "msteams-ai.send-message"
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Your document summary is ready: {{save-summary.url}}"
  consumes:
    - type: http
      namespace: sharepoint-ai
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
            - name: create-file
              method: PUT
    - type: http
      namespace: anthropic-ai
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams-ai
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new API is published to Kong Gateway, registers it in Confluence as documentation, creates a Datadog API monitor, and notifies the API governance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "API Lifecycle Management"
  description: "When a new API is published to Kong Gateway, registers it in Confluence as documentation, creates a Datadog API monitor, and notifies the API governance team in Microsoft Teams."
  tags:
    - api-management
    - kong
    - confluence
    - datadog
    - microsoft-teams
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-governance
      port: 8080
      tools:
        - name: register-new-api
          description: "Given a Kong service name and API metadata, create a Confluence doc page, add a Datadog availability monitor, and notify the API governance team in Teams."
          inputParameters:
            - name: kong_service_name
              in: body
              type: string
              description: "The Kong Gateway service name."
            - name: api_title
              in: body
              type: string
              description: "Human-readable API title."
            - name: api_owner_team
              in: body
              type: string
              description: "Team email owning this API."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key to publish docs to."
          steps:
            - name: create-doc-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                title: "API: {{api_title}}"
                body: "Kong service: {{kong_service_name}} | Owner: {{api_owner_team}}"
            - name: create-monitor
              type: call
              call: "datadog.create-monitor"
              with:
                name: "API Availability: {{api_title}}"
                type: "api"
                message: "API {{api_title}} ({{kong_service_name}}) is unavailable. Notify {{api_owner_team}}"
            - name: notify-governance
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "api-governance@3m.com"
                text: "New API Registered: {{api_title}} | Kong: {{kong_service_name}} | Owner: {{api_owner_team}} | Docs: {{create-doc-page.url}} | Monitor: {{create-monitor.id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://3m.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: create-monitor
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an Azure DevOps release pipeline reaches a manual gate, queries Datadog SLO status, checks ServiceNow for open P1 incidents, and posts a go/no-go recommendation to the release management Teams channel.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Gate"
  description: "When an Azure DevOps release pipeline reaches a manual gate, queries Datadog SLO status, checks ServiceNow for open P1 incidents, and posts a go/no-go recommendation to the release management Teams channel."
  tags:
    - devops
    - azure-devops
    - datadog
    - servicenow
    - release-management
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: release-gate
      port: 8080
      tools:
        - name: evaluate-release-gate
          description: "Given a release ID and target environment, check Datadog SLO health and open P1 ServiceNow incidents to produce a go/no-go recommendation."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "The Azure DevOps release ID."
            - name: target_environment
              in: body
              type: string
              description: "Target deployment environment (staging, prod)."
            - name: service_name
              in: body
              type: string
              description: "Datadog service name to check SLO for."
          steps:
            - name: check-slo
              type: call
              call: "datadog.get-slo-status"
              with:
                service: "{{service_name}}"
            - name: check-open-incidents
              type: call
              call: "servicenow.get-incidents"
              with:
                urgency: "1"
                state: "1"
            - name: notify-release-team
              type: call
              call: "msteams-release.send-message"
              with:
                recipient_upn: "release-mgmt@3m.com"
                text: "Release Gate: {{release_id}} → {{target_environment}} | SLO: {{check-slo.status}} | Open P1s: {{check-open-incidents.count}} | Recommendation: review before proceeding."
  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: slo-status
          path: "/slo"
          inputParameters:
            - name: service
              in: query
          operations:
            - name: get-slo-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: urgency
              in: query
            - name: state
              in: query
          operations:
            - name: get-incidents
              method: GET
    - type: http
      namespace: msteams-release
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Verifies nightly Commvault and Veritas NetBackup job results, logs failures to Datadog, and opens a ServiceNow incident for any backup that did not complete successfully.

naftiko: "0.5"
info:
  label: "Backup and Recovery Verification"
  description: "Verifies nightly Commvault and Veritas NetBackup job results, logs failures to Datadog, and opens a ServiceNow incident for any backup that did not complete successfully."
  tags:
    - backup
    - recovery
    - commvault
    - servicenow
    - datadog
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: verify-backup-job
          description: "Given a Commvault job ID, check its completion status, log to Datadog, and open a ServiceNow incident if the backup failed."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "The Commvault backup job ID."
            - name: backup_set_name
              in: body
              type: string
              description: "Name of the backup set or client."
            - name: environment
              in: body
              type: string
              description: "Environment the backup covers (prod, dr, staging)."
          steps:
            - name: get-job-status
              type: call
              call: "commvault.get-job"
              with:
                job_id: "{{job_id}}"
            - name: log-result
              type: call
              call: "datadog.create-event"
              with:
                title: "Backup Job {{job_id}}: {{get-job-status.status}}"
                text: "BackupSet: {{backup_set_name}} | Env: {{environment}} | Size: {{get-job-status.size_gb}}GB | Duration: {{get-job-status.duration_minutes}}min"
                alert_type: "info"
                tags: "backup:{{backup_set_name}},env:{{environment}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Backup failure: {{backup_set_name}} ({{environment}})"
                description: "Commvault job {{job_id}} failed for {{backup_set_name}} in {{environment}}. Status: {{get-job-status.status}}. Datadog: {{log-result.url}}"
                category: "backup_failure"
                urgency: "2"
  consumes:
    - type: http
      namespace: commvault
      baseUri: "https://3m-commvault.internal/commandcenter/api"
      authentication:
        type: bearer
        token: "$secrets.commvault_token"
      resources:
        - name: jobs
          path: "/Job/{{job_id}}"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET
    - 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://3m.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

Initiates a product batch recall by flagging the batch in SAP QM, creating a Jira tracking epic, notifying regulatory affairs via email, and posting to the quality leadership Teams channel.

naftiko: "0.5"
info:
  label: "Batch Recall Initiation"
  description: "Initiates a product batch recall by flagging the batch in SAP QM, creating a Jira tracking epic, notifying regulatory affairs via email, and posting to the quality leadership Teams channel."
  tags:
    - quality
    - recall
    - sap
    - jira
    - microsoft-teams
    - regulatory
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: quality-recall
      port: 8080
      tools:
        - name: initiate-batch-recall
          description: "Given a material number, batch number, and recall reason, flag the batch in SAP, create a Jira epic, notify regulatory, and alert quality leadership."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number of the recalled product."
            - name: batch_number
              in: body
              type: string
              description: "The production batch number to recall."
            - name: recall_reason
              in: body
              type: string
              description: "Reason for the product recall."
            - name: recall_class
              in: body
              type: string
              description: "FDA recall classification: class_i, class_ii, or class_iii."
          steps:
            - name: create-quality-notification
              type: call
              call: "sap.create-qn"
              with:
                material: "{{material_number}}"
                batch: "{{batch_number}}"
                notification_type: "Q2"
                short_text: "RECALL: {{material_number}} Batch {{batch_number}}"
                long_text: "{{recall_reason}} | Classification: {{recall_class}}"
            - name: create-recall-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "RECALL"
                issuetype: "Epic"
                summary: "Recall: {{material_number}} Batch {{batch_number}} ({{recall_class}})"
                description: "{{recall_reason}} | SAP QN: {{create-quality-notification.notification_id}}"
            - name: notify-regulatory
              type: call
              call: "msgraph.send-mail"
              with:
                to: "$secrets.regulatory_affairs_dl"
                subject: "URGENT: Batch Recall Initiated — {{material_number}} / {{batch_number}}"
                body: "A {{recall_class}} recall has been initiated for material {{material_number}}, batch {{batch_number}}. Reason: {{recall_reason}}. SAP QN: {{create-quality-notification.notification_id}}. Jira: {{create-recall-epic.key}}"
            - name: alert-quality-leadership
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.quality_team_id"
                channel_id: "$secrets.quality_alerts_channel_id"
                text: "RECALL INITIATED: {{material_number}} Batch {{batch_number}} | Class: {{recall_class}} | Reason: {{recall_reason}} | SAP QN: {{create-quality-notification.notification_id}} | Jira: {{create-recall-epic.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/QualityNotification"
          operations:
            - name: create-qn
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              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

Extracts actuals from SAP S/4HANA and budget from Oracle Hyperion, computes variance, and publishes the result to the Power BI finance dashboard and posts a summary to the finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Budget vs Actuals Reporting"
  description: "Extracts actuals from SAP S/4HANA and budget from Oracle Hyperion, computes variance, and publishes the result to the Power BI finance dashboard and posts a summary to the finance Microsoft Teams channel."
  tags:
    - finance
    - budgeting
    - sap
    - oracle-hyperion
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: run-budget-vs-actuals
          description: "Pull actuals from SAP and budget from Hyperion for a cost center and period, compute variance, refresh Power BI, and post a summary to Teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "SAP cost center code."
            - name: fiscal_year
              in: body
              type: string
              description: "Four-digit fiscal year."
            - name: fiscal_period
              in: body
              type: string
              description: "Two-digit fiscal period."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-cost-center-actuals"
              with:
                cost_center: "{{cost_center}}"
                fiscal_year: "{{fiscal_year}}"
                fiscal_period: "{{fiscal_period}}"
            - name: get-budget
              type: call
              call: "oracle-hyperion.get-budget"
              with:
                cost_center: "{{cost_center}}"
                period: "{{fiscal_year}}.{{fiscal_period}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_name: "budget-vs-actuals-{{cost_center}}-{{fiscal_year}}-{{fiscal_period}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "finance-reporting@3m.com"
                text: "Budget vs Actuals: Cost Center {{cost_center}} | Period {{fiscal_year}}.{{fiscal_period}} | Actuals: {{get-actuals.total_actual}} | Budget: {{get-budget.total_budget}} | Power BI refreshed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FAC_CO_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActuals"
          inputParameters:
            - name: cost_center
              in: query
            - name: fiscal_year
              in: query
            - name: fiscal_period
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: oracle-hyperion
      baseUri: "https://3m-hyperion.oracle.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: budget-data
          path: "/applications/3M_CONSOL/dataExport"
          inputParameters:
            - name: cost_center
              in: query
            - name: period
              in: query
          operations:
            - name: get-budget
              method: GET
    - 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_name}}/refreshes"
          inputParameters:
            - name: dataset_name
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When Workday creates a new job requisition, schedules interviews via Microsoft Teams, creates a shared Confluence evaluation page, and notifies the hiring panel.

naftiko: "0.5"
info:
  label: "Candidate Interview Pipeline"
  description: "When Workday creates a new job requisition, schedules interviews via Microsoft Teams, creates a shared Confluence evaluation page, and notifies the hiring panel."
  tags:
    - hr
    - recruiting
    - workday
    - microsoft-teams
    - confluence
    - hiring
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: schedule-interview-panel
          description: "Given a Workday requisition ID and candidate name, create Teams meeting invites for the panel and a Confluence evaluation scorecard page."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: candidate_name
              in: body
              type: string
              description: "Full name of the candidate."
            - name: interview_date
              in: body
              type: string
              description: "Interview date in YYYY-MM-DD format."
            - name: panel_upns
              in: body
              type: string
              description: "Comma-separated list of interviewer Microsoft UPNs."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-teams-meeting
              type: call
              call: "msteams.create-meeting"
              with:
                subject: "Interview: {{candidate_name}} — {{get-requisition.job_title}}"
                start_datetime: "{{interview_date}}T09:00:00"
                attendees: "{{panel_upns}}"
            - name: create-scorecard
              type: call
              call: "confluence.create-page"
              with:
                space_key: "HR"
                title: "Interview Scorecard: {{candidate_name}} — {{get-requisition.job_title}}"
                body: "Requisition: {{requisition_id}} | Role: {{get-requisition.job_title}} | Date: {{interview_date}} | Meeting: {{create-teams-meeting.join_url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: meetings
          path: "/me/onlineMeetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://3m.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Routes a capital expenditure request through SAP for financial posting, creates a Jira approval workflow, and notifies the plant controller and finance VP in Teams.

naftiko: "0.5"
info:
  label: "Capital Expenditure Approval"
  description: "Routes a capital expenditure request through SAP for financial posting, creates a Jira approval workflow, and notifies the plant controller and finance VP in Teams."
  tags:
    - finance
    - capital-expenditure
    - sap
    - jira
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: capex
      port: 8080
      tools:
        - name: submit-capex-request
          description: "Given a project description, amount, cost center, and approver, create SAP investment order, Jira approval, and notify finance."
          inputParameters:
            - name: project_description
              in: body
              type: string
              description: "Description of the capital project."
            - name: amount
              in: body
              type: string
              description: "Requested capital amount in USD."
            - name: cost_center
              in: body
              type: string
              description: "SAP cost center for the expenditure."
            - name: approver_upn
              in: body
              type: string
              description: "UPN of the finance approver."
          steps:
            - name: create-investment-order
              type: call
              call: "sap.create-investment-order"
              with:
                description: "{{project_description}}"
                planned_amount: "{{amount}}"
                cost_center: "{{cost_center}}"
                order_type: "I001"
            - name: create-approval-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CAPEX"
                issuetype: "Task"
                summary: "CapEx Approval: {{project_description}} (${{amount}})"
                description: "Cost Center: {{cost_center}} | SAP Order: {{create-investment-order.order_number}} | Amount: ${{amount}}"
            - name: notify-approver
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "CapEx request pending your approval: {{project_description}} | ${{amount}} | SAP: {{create-investment-order.order_number}} | Jira: {{create-approval-ticket.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/IM_INVESTMENT_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: investment-orders
          path: "/InvestmentOrder"
          operations:
            - name: create-investment-order
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

On a protected-branch GitHub Actions pipeline failure, creates a New Relic deployment marker, opens a Jira bug, and alerts the engineering team in Microsoft Teams with full log context.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Triage"
  description: "On a protected-branch GitHub Actions pipeline failure, creates a New Relic deployment marker, opens a Jira bug, and alerts the engineering team in Microsoft Teams with full log context."
  tags:
    - devops
    - ci-cd
    - github
    - github-actions
    - jira
    - new-relic
    - microsoft-teams
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event, create a New Relic deployment marker, open a Jira bug, and alert the engineering channel in Microsoft Teams."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: branch
              in: body
              type: string
              description: "The branch where the pipeline failed."
            - name: failed_job_name
              in: body
              type: string
              description: "Name of the failing job in the pipeline."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the pipeline."
            - name: log_url
              in: body
              type: string
              description: "URL to the failed pipeline run logs."
          steps:
            - name: create-marker
              type: call
              call: "newrelic.create-deployment-marker"
              with:
                entity_name: "{{repository}}"
                version: "{{commit_sha}}"
                description: "Pipeline failure on {{branch}} — job: {{failed_job_name}}"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}} — {{failed_job_name}}"
                description: "Pipeline: {{pipeline_id}}\nRepo: {{repository}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nLog: {{log_url}}\nNew Relic marker: {{create-marker.id}}"
            - name: alert-engineering
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "engineering-alerts@3m.com"
                text: "Pipeline Failure: {{repository}} | Branch: {{branch}} | Job: {{failed_job_name}} | Jira: {{create-bug.key}} | Log: {{log_url}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: deployments
          path: "/applications/{{entity_name}}/deployments.json"
          inputParameters:
            - name: entity_name
              in: path
          operations:
            - name: create-deployment-marker
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When AWS or Azure cost anomaly detection fires, annotates in Datadog, opens a ServiceNow cost-management ticket, and posts a summary to the FinOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Response"
  description: "When AWS or Azure cost anomaly detection fires, annotates in Datadog, opens a ServiceNow cost-management ticket, and posts a summary to the FinOps Microsoft Teams channel."
  tags:
    - finops
    - cloud-cost
    - aws
    - azure
    - datadog
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given a cloud cost anomaly event (AWS or Azure), create a Datadog annotation, open a ServiceNow cost-management ticket, and alert the FinOps team in Microsoft Teams."
          inputParameters:
            - name: cloud_provider
              in: body
              type: string
              description: "Cloud provider where the anomaly was detected (aws or azure)."
            - name: anomaly_id
              in: body
              type: string
              description: "The anomaly identifier from the cloud provider."
            - name: service_name
              in: body
              type: string
              description: "The cloud service or resource group with the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated cost overage in USD."
            - name: business_unit
              in: body
              type: string
              description: "The 3M business unit responsible for the spend."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "{{cloud_provider}} Cost Anomaly: {{service_name}}"
                text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}} — BU: {{business_unit}}"
                alert_type: "warning"
                tags: "cloud_provider:{{cloud_provider}},business_unit:{{business_unit}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Cloud Cost Anomaly: {{cloud_provider}} {{service_name}} — ${{estimated_overage_usd}} overage"
                description: "Anomaly {{anomaly_id}} on {{service_name}} ({{cloud_provider}}). BU: {{business_unit}}. Datadog event: {{annotate-datadog.id}}"
                category: "cloud_cost"
                assigned_group: "FinOps"
            - name: notify-finops
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "finops-alerts@3m.com"
                text: "Cost Anomaly: {{cloud_provider}} | Service: {{service_name}} | Overage: ${{estimated_overage_usd}} | BU: {{business_unit}} | Ticket: {{open-ticket.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://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Performs competitive pricing analysis by pulling 3M product prices from SAP, querying market intelligence from Snowflake, and publishing insights to the Salesforce opportunity and marketing Teams channel.

naftiko: "0.5"
info:
  label: "Competitive Pricing Analysis"
  description: "Performs competitive pricing analysis by pulling 3M product prices from SAP, querying market intelligence from Snowflake, and publishing insights to the Salesforce opportunity and marketing Teams channel."
  tags:
    - sales
    - pricing
    - sap
    - snowflake
    - salesforce
    - microsoft-teams
    - market-intelligence
capability:
  exposes:
    - type: mcp
      namespace: competitive-analysis
      port: 8080
      tools:
        - name: analyze-competitive-pricing
          description: "Given a product line and competitor, pull 3M prices, market data, and publish analysis."
          inputParameters:
            - name: product_line
              in: body
              type: string
              description: "3M product line identifier."
            - name: competitor_name
              in: body
              type: string
              description: "Competitor name for comparison."
            - name: salesforce_opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity to attach analysis."
          steps:
            - name: get-3m-pricing
              type: call
              call: "sap.get-product-pricing"
              with:
                product_line: "{{product_line}}"
            - name: get-market-intel
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM MARKET_INTEL.COMPETITOR_PRICING WHERE competitor = '{{competitor_name}}' AND product_line = '{{product_line}}'"
                warehouse: "ANALYTICS_WH"
            - name: update-opportunity
              type: call
              call: "salesforce.add-note"
              with:
                opportunity_id: "{{salesforce_opportunity_id}}"
                title: "Competitive Pricing: {{product_line}} vs {{competitor_name}}"
                body: "3M avg price: {{get-3m-pricing.avg_price}} | Competitor avg: {{get-market-intel.competitor_avg_price}} | Delta: {{get-market-intel.price_delta_pct}}%"
            - name: notify-marketing
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.marketing_team_id"
                channel_id: "$secrets.pricing_channel_id"
                text: "Pricing Analysis: {{product_line}} vs {{competitor_name}} | 3M: {{get-3m-pricing.avg_price}} | Competitor: {{get-market-intel.competitor_avg_price}} | Opp: {{salesforce_opportunity_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: product-pricing
          path: "/ProductLinePricing(ProductLine='{{product_line}}')"
          inputParameters:
            - name: product_line
              in: path
          operations:
            - name: get-product-pricing
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: notes
          path: "/sobjects/ContentNote"
          inputParameters:
            - name: opportunity_id
              in: query
          operations:
            - name: add-note
              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 Confluence page by ID, returning title, content body, last modified date, and author for knowledge management and documentation teams.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence page by ID, returning title, content body, last modified date, and author for knowledge management and documentation teams."
  tags:
    - knowledge-management
    - confluence
    - documentation
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-confluence-page
          description: "Look up a Confluence page by page ID. Returns title, body content, last modifier, and version."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
            - name: last_modified
              type: string
              mapping: "$.version.when"
            - name: author
              type: string
              mapping: "$.version.by.displayName"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://3m.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Onboards contractors for plant access by verifying training records in ServiceNow, creating a Workday contingent worker record, and issuing a badge request through Microsoft Power Automate.

naftiko: "0.5"
info:
  label: "Contractor Safety Onboarding"
  description: "Onboards contractors for plant access by verifying training records in ServiceNow, creating a Workday contingent worker record, and issuing a badge request through Microsoft Power Automate."
  tags:
    - safety
    - contractor
    - servicenow
    - workday
    - microsoft-power-automate
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: contractor-safety
      port: 8080
      tools:
        - name: onboard-contractor
          description: "Given contractor details, verify safety training, create worker record, and issue badge request."
          inputParameters:
            - name: contractor_name
              in: body
              type: string
              description: "Full name of the contractor."
            - name: company_name
              in: body
              type: string
              description: "Contractor's employer company."
            - name: plant_code
              in: body
              type: string
              description: "3M plant code for access."
            - name: start_date
              in: body
              type: string
              description: "Contract start date."
            - name: training_cert_id
              in: body
              type: string
              description: "Safety training certification ID."
          steps:
            - name: verify-training
              type: call
              call: "servicenow.verify-training-cert"
              with:
                cert_id: "{{training_cert_id}}"
                contractor_name: "{{contractor_name}}"
            - name: create-worker-record
              type: call
              call: "workday.create-contingent-worker"
              with:
                name: "{{contractor_name}}"
                company: "{{company_name}}"
                location: "{{plant_code}}"
                start_date: "{{start_date}}"
            - name: request-badge
              type: call
              call: "power-automate.trigger-flow"
              with:
                flow_id: "$secrets.badge_request_flow_id"
                contractor_name: "{{contractor_name}}"
                plant: "{{plant_code}}"
                worker_id: "{{create-worker-record.worker_id}}"
                training_status: "{{verify-training.status}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: training-certs
          path: "/table/sn_ehs_training_cert"
          inputParameters:
            - name: cert_id
              in: query
            - name: contractor_name
              in: query
          operations:
            - name: verify-training-cert
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/3m"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: contingent-workers
          path: "/contingentWorkers"
          operations:
            - name: create-contingent-worker
              method: POST
    - type: http
      namespace: power-automate
      baseUri: "https://prod-00.westus.logic.azure.com/workflows"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/{{flow_id}}/triggers/manual/paths/invoke"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST

Processes a customer complaint from Salesforce by creating a SAP quality notification, opening a Jira investigation ticket, and sending an acknowledgment email to the customer through Microsoft Graph.

naftiko: "0.5"
info:
  label: "Customer Complaint Processing"
  description: "Processes a customer complaint from Salesforce by creating a SAP quality notification, opening a Jira investigation ticket, and sending an acknowledgment email to the customer through Microsoft Graph."
  tags:
    - quality
    - customer-service
    - salesforce
    - sap
    - jira
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: customer-quality
      port: 8080
      tools:
        - name: process-complaint
          description: "Given a Salesforce case ID, create a SAP quality notification, open a Jira ticket, and send a customer acknowledgment email."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID for the complaint."
            - name: product_number
              in: body
              type: string
              description: "The product material number."
            - name: complaint_description
              in: body
              type: string
              description: "Description of the customer complaint."
            - name: customer_email
              in: body
              type: string
              description: "Customer email for acknowledgment."
          steps:
            - name: create-sap-qn
              type: call
              call: "sap.create-quality-notification"
              with:
                material: "{{product_number}}"
                notification_type: "Q3"
                short_text: "Customer Complaint: {{product_number}}"
                long_text: "{{complaint_description}} | Salesforce Case: {{case_id}}"
            - name: create-jira-investigation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "QA"
                issuetype: "Task"
                summary: "Investigate complaint: {{product_number}} — Case {{case_id}}"
                description: "{{complaint_description}} | SAP QN: {{create-sap-qn.notification_id}}"
            - name: send-acknowledgment
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{customer_email}}"
                subject: "3M — Your complaint has been received (Case {{case_id}})"
                body: "Thank you for contacting 3M. Your complaint regarding product {{product_number}} has been logged and assigned for investigation. Reference: {{create-sap-qn.notification_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              method: POST

Reviews a customer credit limit by pulling AR aging from SAP, checking Salesforce account health, and routing the approval decision to the credit manager in Teams.

naftiko: "0.5"
info:
  label: "Customer Credit Limit Review"
  description: "Reviews a customer credit limit by pulling AR aging from SAP, checking Salesforce account health, and routing the approval decision to the credit manager in Teams."
  tags:
    - finance
    - credit-management
    - sap
    - salesforce
    - microsoft-teams
    - accounts-receivable
capability:
  exposes:
    - type: mcp
      namespace: credit-management
      port: 8080
      tools:
        - name: review-credit-limit
          description: "Given a customer number and requested limit, pull AR data, check CRM health, and route for approval."
          inputParameters:
            - name: customer_number
              in: body
              type: string
              description: "The SAP customer account number."
            - name: requested_limit
              in: body
              type: string
              description: "Requested credit limit in USD."
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: credit_manager_upn
              in: body
              type: string
              description: "UPN of the credit manager."
          steps:
            - name: get-ar-aging
              type: call
              call: "sap.get-ar-aging"
              with:
                customer: "{{customer_number}}"
            - name: get-account-health
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: route-approval
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{credit_manager_upn}}"
                text: "Credit Limit Review: Customer {{customer_number}} | Requested: ${{requested_limit}} | Current AR: ${{get-ar-aging.total_outstanding}} | Overdue: ${{get-ar-aging.overdue_amount}} | CRM Revenue: ${{get-account-health.annual_revenue}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FI_AR_AGING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ar-aging
          path: "/CustomerAging(Customer='{{customer}}')"
          inputParameters:
            - name: customer
              in: path
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

Processes incoming NPS survey responses from Salesforce, segments detractors for immediate follow-up via HubSpot, and updates the Power BI customer satisfaction dashboard.

naftiko: "0.5"
info:
  label: "Customer NPS Survey Processing"
  description: "Processes incoming NPS survey responses from Salesforce, segments detractors for immediate follow-up via HubSpot, and updates the Power BI customer satisfaction dashboard."
  tags:
    - customer-experience
    - nps
    - salesforce
    - hubspot
    - power-bi
    - customer-success
capability:
  exposes:
    - type: mcp
      namespace: customer-experience
      port: 8080
      tools:
        - name: process-nps-response
          description: "Given an NPS survey response and Salesforce contact ID, route detractors for follow-up in HubSpot and refresh the Power BI CX dashboard."
          inputParameters:
            - name: salesforce_contact_id
              in: body
              type: string
              description: "The Salesforce contact ID of the survey respondent."
            - name: nps_score
              in: body
              type: integer
              description: "NPS score 0–10."
            - name: survey_comment
              in: body
              type: string
              description: "Optional open-text comment from the respondent."
          steps:
            - name: get-contact
              type: call
              call: "salesforce.get-contact"
              with:
                contact_id: "{{salesforce_contact_id}}"
            - name: update-salesforce-nps
              type: call
              call: "salesforce.update-contact"
              with:
                contact_id: "{{salesforce_contact_id}}"
                nps_score: "{{nps_score}}"
                nps_comment: "{{survey_comment}}"
            - name: create-hubspot-task
              type: call
              call: "hubspot.create-task"
              with:
                contact_email: "{{get-contact.email}}"
                subject: "NPS Detractor Follow-up: {{get-contact.name}} (score {{nps_score}})"
                body: "Comment: {{survey_comment}}"
                due_date_days: "2"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
            - name: update-contact
              method: PATCH
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: tasks
          path: "/objects/tasks"
          operations:
            - name: create-task
              method: POST

When a Salesforce opportunity closes as won, enrolls the customer in a HubSpot onboarding workflow, provisions a SharePoint customer portal, and notifies the customer success team in Teams.

naftiko: "0.5"
info:
  label: "Customer Onboarding Provisioning"
  description: "When a Salesforce opportunity closes as won, enrolls the customer in a HubSpot onboarding workflow, provisions a SharePoint customer portal, and notifies the customer success team in Teams."
  tags:
    - sales
    - customer-success
    - salesforce
    - hubspot
    - sharepoint
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: customer-onboarding
      port: 8080
      tools:
        - name: provision-customer-onboarding
          description: "Given a closed-won Salesforce opportunity ID, enroll in HubSpot onboarding, provision a SharePoint portal, and notify the CSM in Teams."
          inputParameters:
            - name: salesforce_opportunity_id
              in: body
              type: string
              description: "The closed-won Salesforce opportunity ID."
            - name: csm_upn
              in: body
              type: string
              description: "Microsoft UPN of the assigned customer success manager."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-cx.get-opportunity"
              with:
                opportunity_id: "{{salesforce_opportunity_id}}"
            - name: enroll-hubspot
              type: call
              call: "hubspot-cx.enroll-workflow"
              with:
                contact_email: "{{get-opportunity.primary_contact_email}}"
                workflow_name: "enterprise-onboarding"
            - name: create-portal
              type: call
              call: "sharepoint-cx.create-folder"
              with:
                site_id: "customer_portals_site"
                folder_path: "Customers/{{get-opportunity.account_name}}"
            - name: notify-csm
              type: call
              call: "msteams-cx.send-message"
              with:
                recipient_upn: "{{csm_upn}}"
                text: "New Customer: {{get-opportunity.account_name}} | Value: {{get-opportunity.amount}} | Portal: {{create-portal.url}} | HubSpot enrolled."
  consumes:
    - type: http
      namespace: salesforce-cx
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: hubspot-cx
      baseUri: "https://api.hubapi.com/automation/v4"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: workflow-enrollments
          path: "/flows/enrollments"
          operations:
            - name: enroll-workflow
              method: POST
    - type: http
      namespace: sharepoint-cx
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams-cx
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a Salesforce case breaches SLA, escalates to a ServiceNow priority incident, notifies the customer success manager in Microsoft Teams, and logs the escalation in Confluence.

naftiko: "0.5"
info:
  label: "Customer Support Ticket Escalation"
  description: "When a Salesforce case breaches SLA, escalates to a ServiceNow priority incident, notifies the customer success manager in Microsoft Teams, and logs the escalation in Confluence."
  tags:
    - customer-support
    - crm
    - salesforce
    - servicenow
    - confluence
    - microsoft-teams
    - sla
capability:
  exposes:
    - type: mcp
      namespace: customer-support
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a Salesforce case ID that has breached SLA, open a ServiceNow priority incident, notify the CSM in Teams, and document in Confluence."
          inputParameters:
            - name: salesforce_case_id
              in: body
              type: string
              description: "The Salesforce case record ID."
            - name: csm_upn
              in: body
              type: string
              description: "Microsoft UPN of the customer success manager."
            - name: escalation_reason
              in: body
              type: string
              description: "Description of why SLA was breached."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{salesforce_case_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SLA Breach Escalation: {{get-case.subject}}"
                description: "Salesforce Case {{salesforce_case_id}} breached SLA. Customer: {{get-case.account_name}}. Reason: {{escalation_reason}}"
                urgency: "2"
                impact: "2"
                category: "customer_escalation"
            - name: notify-csm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{csm_upn}}"
                text: "SLA Breach: Case {{salesforce_case_id}} — {{get-case.subject}} | Customer: {{get-case.account_name}} | ServiceNow: {{create-incident.number}} | Reason: {{escalation_reason}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Files customs declarations for international shipments by pulling export data from SAP GTS, creating a compliance record in ServiceNow, and notifying the trade compliance team in Teams.

naftiko: "0.5"
info:
  label: "Customs Declaration Filing"
  description: "Files customs declarations for international shipments by pulling export data from SAP GTS, creating a compliance record in ServiceNow, and notifying the trade compliance team in Teams."
  tags:
    - logistics
    - trade-compliance
    - sap
    - servicenow
    - microsoft-teams
    - customs
capability:
  exposes:
    - type: mcp
      namespace: trade-compliance
      port: 8080
      tools:
        - name: file-customs-declaration
          description: "Given a shipment reference and destination country, pull SAP GTS data, create compliance record, and notify trade team."
          inputParameters:
            - name: shipment_reference
              in: body
              type: string
              description: "SAP shipment document number."
            - name: destination_country
              in: body
              type: string
              description: "ISO country code of destination."
            - name: incoterms
              in: body
              type: string
              description: "Incoterms code (e.g., FOB, CIF, DDP)."
          steps:
            - name: get-export-data
              type: call
              call: "sap.get-gts-declaration"
              with:
                shipment: "{{shipment_reference}}"
                country: "{{destination_country}}"
            - name: create-compliance-record
              type: call
              call: "servicenow.create-compliance-record"
              with:
                short_description: "Customs Declaration: {{shipment_reference}} to {{destination_country}}"
                classification: "{{get-export-data.tariff_code}}"
                value: "{{get-export-data.declared_value}}"
                incoterms: "{{incoterms}}"
            - name: notify-trade-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.trade_team_id"
                channel_id: "$secrets.trade_channel_id"
                text: "Customs Declaration Filed: {{shipment_reference}} to {{destination_country}} | Tariff: {{get-export-data.tariff_code}} | Value: {{get-export-data.declared_value}} | ServiceNow: {{create-compliance-record.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/GTS_DECLARATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: declarations
          path: "/CustomsDeclaration(Shipment='{{shipment}}',Country='{{country}}')"
          inputParameters:
            - name: shipment
              in: path
            - name: country
              in: path
          operations:
            - name: get-gts-declaration
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance
          path: "/table/sn_compliance_record"
          operations:
            - name: create-compliance-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors Apache Airflow DAG run status, logs failures to Datadog, updates the Snowflake data pipeline audit table, and opens a Jira incident when a critical DAG fails.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitoring"
  description: "Monitors Apache Airflow DAG run status, logs failures to Datadog, updates the Snowflake data pipeline audit table, and opens a Jira incident when a critical DAG fails."
  tags:
    - data-engineering
    - apache-airflow
    - datadog
    - snowflake
    - jira
    - observability
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-dag-failure
          description: "Given a failed Airflow DAG run ID, log the failure to Datadog, write an audit record to Snowflake, and open a Jira incident for the data engineering team."
          inputParameters:
            - name: dag_id
              in: body
              type: string
              description: "The Airflow DAG identifier."
            - name: run_id
              in: body
              type: string
              description: "The Airflow DAG run ID."
            - name: failure_reason
              in: body
              type: string
              description: "Error message or reason for failure."
            - name: data_domain
              in: body
              type: string
              description: "Business data domain (e.g., finance, supply_chain, hr)."
          steps:
            - name: log-to-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Airflow DAG Failed: {{dag_id}}"
                text: "Run {{run_id}} failed. Reason: {{failure_reason}}"
                alert_type: "error"
                tags: "dag:{{dag_id}},domain:{{data_domain}}"
            - name: open-jira-incident
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Incident"
                summary: "DAG Failure: {{dag_id}} — {{run_id}}"
                description: "DAG {{dag_id}} run {{run_id}} failed.\nDomain: {{data_domain}}\nReason: {{failure_reason}}\nDatadog: {{log-to-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: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries Datadog for the current health status of a monitored service, returning monitor state, last triggered time, and alert details.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a monitored service, returning monitor state, last triggered time, and alert details."
  tags:
    - monitoring
    - datadog
    - observability
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Check the status of a Datadog monitor by monitor ID. Returns overall state, last triggered timestamp, and message."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: overall_state
              type: string
              mapping: "$.overall_state"
            - name: name
              type: string
              mapping: "$.name"
            - name: last_triggered
              type: string
              mapping: "$.overall_state_modified"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Triggers a demand forecast model run in Snowflake, pushes forecast data back to SAP APO, and publishes updated forecast charts to the supply planning Teams channel.

naftiko: "0.5"
info:
  label: "Demand Forecast Refresh"
  description: "Triggers a demand forecast model run in Snowflake, pushes forecast data back to SAP APO, and publishes updated forecast charts to the supply planning Teams channel."
  tags:
    - supply-chain
    - forecasting
    - snowflake
    - sap
    - microsoft-teams
    - planning
capability:
  exposes:
    - type: mcp
      namespace: demand-planning
      port: 8080
      tools:
        - name: refresh-demand-forecast
          description: "Given a product family and horizon, run forecast model, update SAP APO, and notify supply planning."
          inputParameters:
            - name: product_family
              in: body
              type: string
              description: "The product family code for forecasting."
            - name: forecast_horizon_months
              in: body
              type: string
              description: "Number of months to forecast ahead."
          steps:
            - name: run-forecast-model
              type: call
              call: "snowflake.run-query"
              with:
                statement: "CALL SUPPLY_CHAIN.RUN_DEMAND_FORECAST('{{product_family}}', {{forecast_horizon_months}})"
                warehouse: "PLANNING_WH"
            - name: push-to-sap
              type: call
              call: "sap.update-forecast"
              with:
                product_family: "{{product_family}}"
                forecast_data: "{{run-forecast-model.result}}"
            - name: notify-planning
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.supply_planning_team_id"
                channel_id: "$secrets.planning_channel_id"
                text: "Demand forecast refreshed for {{product_family}} ({{forecast_horizon_months}}M horizon). SAP APO updated."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/APO_FORECAST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: forecasts
          path: "/ForecastData"
          operations:
            - name: update-forecast
              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 new engineer is added to GitHub org, provisions Jira and Confluence access, opens a ServiceNow onboarding ticket, and sends a welcome message with resource links via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Developer Onboarding"
  description: "When a new engineer is added to GitHub org, provisions Jira and Confluence access, opens a ServiceNow onboarding ticket, and sends a welcome message with resource links via Microsoft Teams."
  tags:
    - developer-experience
    - onboarding
    - github
    - jira
    - confluence
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dev-onboarding
      port: 8080
      tools:
        - name: onboard-developer
          description: "Given a GitHub username and Workday employee ID, provision Jira/Confluence, create a ServiceNow onboarding task, and send Teams welcome message."
          inputParameters:
            - name: github_username
              in: body
              type: string
              description: "The new developer's GitHub username."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: team_name
              in: body
              type: string
              description: "The engineering team the developer is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: add-to-jira
              type: call
              call: "jira.add-user-to-project"
              with:
                username: "{{get-employee.work_email}}"
                project_key: "{{team_name}}"
                role: "Developer"
            - name: open-onboarding-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Developer onboarding: {{get-employee.full_name}} — {{team_name}}"
                category: "dev_onboarding"
                assigned_group: "DevOps_Platform"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to 3M Engineering, {{get-employee.first_name}}! GitHub: {{github_username}} | Team: {{team_name}} | Jira access provisioned | Onboarding ticket: {{open-onboarding-task.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: project-roles
          path: "/project/{{project_key}}/role"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: add-user-to-project
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Updates distributor pricing by pulling new price conditions from SAP, generating a price list in Snowflake, and distributing it via email to the channel sales team and distributor contacts.

naftiko: "0.5"
info:
  label: "Distributor Price List Update"
  description: "Updates distributor pricing by pulling new price conditions from SAP, generating a price list in Snowflake, and distributing it via email to the channel sales team and distributor contacts."
  tags:
    - sales
    - pricing
    - sap
    - snowflake
    - microsoft-outlook
    - distribution
capability:
  exposes:
    - type: mcp
      namespace: pricing
      port: 8080
      tools:
        - name: update-price-list
          description: "Given a distributor ID and effective date, pull SAP pricing, generate price list, and distribute via email."
          inputParameters:
            - name: distributor_id
              in: body
              type: string
              description: "SAP customer number of the distributor."
            - name: effective_date
              in: body
              type: string
              description: "Effective date for new pricing."
            - name: distributor_email
              in: body
              type: string
              description: "Distributor contact email."
          steps:
            - name: get-price-conditions
              type: call
              call: "sap.get-pricing"
              with:
                customer: "{{distributor_id}}"
                valid_from: "{{effective_date}}"
            - name: generate-price-list
              type: call
              call: "snowflake.run-query"
              with:
                statement: "CALL SALES.GENERATE_PRICE_LIST('{{distributor_id}}', '{{effective_date}}')"
                warehouse: "SALES_WH"
            - name: send-price-list
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{distributor_email}}"
                subject: "3M Updated Price List — Effective {{effective_date}}"
                body: "Please find the updated price list effective {{effective_date}}. Total items: {{generate-price-list.item_count}}. Contact your 3M representative for questions."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pricing
          path: "/PriceCondition"
          inputParameters:
            - name: customer
              in: query
            - name: valid_from
              in: query
          operations:
            - name: get-pricing
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              method: POST

When an environmental health and safety incident is reported, creates a ServiceNow EHS case, logs the event in SAP Plant Maintenance, and notifies the site safety officer and EHS leadership in Microsoft Teams.

naftiko: "0.5"
info:
  label: "EHS Safety Incident Reporting"
  description: "When an environmental health and safety incident is reported, creates a ServiceNow EHS case, logs the event in SAP Plant Maintenance, and notifies the site safety officer and EHS leadership in Microsoft Teams."
  tags:
    - ehs
    - safety
    - servicenow
    - sap
    - microsoft-teams
    - compliance
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: ehs
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Given an EHS incident description and plant code, open a ServiceNow EHS case, log in SAP PM, and notify the site safety officer in Teams."
          inputParameters:
            - name: incident_description
              in: body
              type: string
              description: "Description of the safety or environmental incident."
            - name: plant_code
              in: body
              type: string
              description: "3M plant or facility code where the incident occurred."
            - name: severity
              in: body
              type: string
              description: "Incident severity: near_miss, first_aid, recordable, or lost_time."
            - name: safety_officer_upn
              in: body
              type: string
              description: "Microsoft UPN of the site safety officer."
          steps:
            - name: create-ehs-case
              type: call
              call: "servicenow.create-ehs-case"
              with:
                short_description: "EHS Incident ({{severity}}): {{plant_code}}"
                description: "{{incident_description}}"
                category: "safety_incident"
                severity: "{{severity}}"
                location: "{{plant_code}}"
            - name: log-sap-notification
              type: call
              call: "sap.create-pm-notification"
              with:
                plant: "{{plant_code}}"
                notification_type: "S2"
                short_text: "EHS: {{severity}} at {{plant_code}}"
                long_text: "{{incident_description}} | ServiceNow: {{create-ehs-case.number}}"
            - name: notify-safety-officer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{safety_officer_upn}}"
                text: "EHS Incident Reported: {{severity}} at {{plant_code}} | ServiceNow: {{create-ehs-case.number}} | SAP Notification: {{log-sap-notification.notification_id}} | Details: {{incident_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: ehs-cases
          path: "/table/sn_ehs_case"
          operations:
            - name: create-ehs-case
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/MaintenanceNotification"
          operations:
            - name: create-pm-notification
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When Workday records a termination, disables the Microsoft 365 account, raises a ServiceNow access revocation task, and notifies HR and IT in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding"
  description: "When Workday records a termination, disables the Microsoft 365 account, raises a ServiceNow access revocation task, and notifies HR and IT in Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - servicenow
    - microsoft-teams
    - iam
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: offboard-employee
          description: "Given a Workday employee ID and termination date, disable their Microsoft 365 account, open a ServiceNow revocation task, and notify HR and IT in Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: termination_date
              in: body
              type: string
              description: "Effective termination date in YYYY-MM-DD format."
            - name: termination_type
              in: body
              type: string
              description: "Type of termination (voluntary, involuntary, retirement)."
          steps:
            - name: get-employee
              type: call
              call: "workday-offboard.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: disable-m365
              type: call
              call: "msgraph-offboard.disable-user"
              with:
                upn: "{{get-employee.work_email}}"
            - name: create-revocation-task
              type: call
              call: "servicenow-offboard.create-task"
              with:
                short_description: "Offboarding access revocation: {{get-employee.full_name}}"
                description: "Employee {{employee_id}} terminated {{termination_date}} ({{termination_type}}). Revoke all system access."
                category: "offboarding"
                assigned_group: "IT_Security"
            - name: notify-hr-it
              type: call
              call: "msteams-offboard.send-message"
              with:
                recipient_upn: "hr-it-ops@3m.com"
                text: "Offboarding: {{get-employee.full_name}} | Date: {{termination_date}} | Type: {{termination_type}} | M365 disabled | Task: {{create-revocation-task.number}}"
  consumes:
    - type: http
      namespace: workday-offboard
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message to the new employee.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message to the new employee."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department or business unit the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to 3M, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents are ready at {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Manages environmental permit renewals by pulling permit data from ServiceNow, creating renewal tasks in Jira, and notifying the EHS director and regulatory team in Teams.

naftiko: "0.5"
info:
  label: "Environmental Permit Renewal"
  description: "Manages environmental permit renewals by pulling permit data from ServiceNow, creating renewal tasks in Jira, and notifying the EHS director and regulatory team in Teams."
  tags:
    - ehs
    - compliance
    - regulatory
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ehs-permits
      port: 8080
      tools:
        - name: initiate-permit-renewal
          description: "Given a permit ID and plant code, pull permit data, create renewal tasks, and notify stakeholders."
          inputParameters:
            - name: permit_id
              in: body
              type: string
              description: "The ServiceNow environmental permit record ID."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: permit_type
              in: body
              type: string
              description: "Type of permit (e.g., air_emissions, water_discharge, waste_handling)."
            - name: expiry_date
              in: body
              type: string
              description: "Current permit expiry date."
          steps:
            - name: get-permit-details
              type: call
              call: "servicenow.get-permit"
              with:
                permit_id: "{{permit_id}}"
            - name: create-renewal-tasks
              type: call
              call: "jira.create-issue"
              with:
                project_key: "EHS"
                issuetype: "Epic"
                summary: "Permit Renewal: {{permit_type}} — {{plant_code}} (expires {{expiry_date}})"
                description: "Permit: {{permit_id}} | Type: {{permit_type}} | Plant: {{plant_code}} | Current expiry: {{expiry_date}} | Authority: {{get-permit-details.issuing_authority}}"
            - name: notify-ehs-leadership
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ehs_team_id"
                channel_id: "$secrets.ehs_permits_channel_id"
                text: "Permit Renewal Required: {{permit_type}} at {{plant_code}} | Expires: {{expiry_date}} | Jira: {{create-renewal-tasks.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: permits
          path: "/table/sn_ehs_permit/{{permit_id}}"
          inputParameters:
            - name: permit_id
              in: path
          operations:
            - name: get-permit
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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 manufacturing asset health monitor signals degradation, creates a ServiceNow maintenance work order, cross-references the SAP Plant Maintenance module for asset details, and notifies the facility team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Equipment Maintenance Request"
  description: "When a manufacturing asset health monitor signals degradation, creates a ServiceNow maintenance work order, cross-references the SAP Plant Maintenance module for asset details, and notifies the facility team in Microsoft Teams."
  tags:
    - manufacturing
    - maintenance
    - servicenow
    - sap
    - microsoft-teams
    - asset-management
    - industrial
capability:
  exposes:
    - type: mcp
      namespace: plant-operations
      port: 8080
      tools:
        - name: create-maintenance-request
          description: "Given an equipment ID and failure signal, fetch asset details from SAP Plant Maintenance, open a ServiceNow work order, and notify the facility team in Microsoft Teams."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP Plant Maintenance equipment number."
            - name: failure_signal
              in: body
              type: string
              description: "Description of the observed equipment fault or degradation signal."
            - name: plant_code
              in: body
              type: string
              description: "The 3M manufacturing plant code where the equipment is located."
            - name: priority
              in: body
              type: string
              description: "Maintenance priority (1=Emergency, 2=Urgent, 3=Normal, 4=Low)."
          steps:
            - name: get-asset-details
              type: call
              call: "sap.get-equipment"
              with:
                equipment_id: "{{equipment_id}}"
                plant: "{{plant_code}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-work-order"
              with:
                short_description: "Maintenance Request: {{get-asset-details.equipment_description}} — {{failure_signal}}"
                category: "plant_maintenance"
                asset_tag: "{{equipment_id}}"
                location: "{{plant_code}}"
                priority: "{{priority}}"
                description: "Equipment: {{get-asset-details.equipment_description}}\nPlant: {{plant_code}}\nFault: {{failure_signal}}\nLast PM: {{get-asset-details.last_pm_date}}"
            - name: notify-facility
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "plant-{{plant_code}}-ops@3m.com"
                text: "Maintenance Request: {{get-asset-details.equipment_description}} ({{equipment_id}}) | Plant: {{plant_code}} | Priority: {{priority}} | Signal: {{failure_signal}} | Work Order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-equipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Assembles a weekly executive briefing by pulling sales pipeline from Salesforce, financial KPIs from Power BI, and operational metrics from Snowflake, then publishes the digest to a SharePoint executive portal and Teams channel.

naftiko: "0.5"
info:
  label: "Executive Briefing Digest"
  description: "Assembles a weekly executive briefing by pulling sales pipeline from Salesforce, financial KPIs from Power BI, and operational metrics from Snowflake, then publishes the digest to a SharePoint executive portal and Teams channel."
  tags:
    - executive
    - reporting
    - salesforce
    - power-bi
    - snowflake
    - sharepoint
    - microsoft-teams
    - digest
capability:
  exposes:
    - type: mcp
      namespace: executive-reporting
      port: 8080
      tools:
        - name: publish-executive-briefing
          description: "Pull pipeline from Salesforce, KPIs from Power BI, and ops metrics from Snowflake, then publish the digest to SharePoint and notify leadership in Teams."
          inputParameters:
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD format."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint executive portal site ID."
            - name: leadership_channel_upn
              in: body
              type: string
              description: "Microsoft Teams channel or distribution UPN for leadership."
          steps:
            - name: get-pipeline
              type: call
              call: "salesforce.get-pipeline-summary"
              with:
                week_ending: "{{week_ending}}"
            - name: get-financial-kpis
              type: call
              call: "powerbi.get-dataset-rows"
              with:
                dataset_name: "executive-kpis"
                filter: "week_ending eq '{{week_ending}}'"
            - name: publish-to-sharepoint
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_path: "ExecutiveBriefings/briefing-{{week_ending}}.md"
                content: "# 3M Executive Briefing — {{week_ending}}\n\n## Pipeline\n{{get-pipeline.summary}}\n\n## Financial KPIs\n{{get-financial-kpis.summary}}"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{leadership_channel_upn}}"
                text: "Executive Briefing Published (week of {{week_ending}}): Pipeline: {{get-pipeline.total_value}} | SharePoint: {{publish-to-sharepoint.url}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pipeline
          path: "/query"
          inputParameters:
            - name: week_ending
              in: query
          operations:
            - name: get-pipeline-summary
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-rows
          path: "/datasets/{{dataset_name}}/tables/KPIs/rows"
          inputParameters:
            - name: dataset_name
              in: path
            - name: filter
              in: query
          operations:
            - name: get-dataset-rows
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected.

naftiko: "0.5"
info:
  label: "Expense Report Processing"
  description: "Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected."
  tags:
    - finance
    - expense
    - concur
    - sap-concur
    - workday
    - servicenow
    - policy-compliance
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: review-expense-report
          description: "Given a Concur expense report ID and employee ID, fetch the report details, validate the cost center against Workday, and flag any policy violations to ServiceNow."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the expense submitter."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense policy review: {{get-expense-report.report_name}} — {{get-employee.full_name}}"
                description: "Report {{expense_report_id}} total: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Cost center: {{get-employee.cost_center}}. Submitted: {{get-expense-report.submit_date}}."
                assigned_group: "Finance_Audit"
                category: "expense_review"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Triggers SAP S/4HANA period-close tasks, pulls consolidated financials into Oracle Hyperion for intercompany elimination, and refreshes the Power BI executive financial dashboard.

naftiko: "0.5"
info:
  label: "Financial Consolidation and Close"
  description: "Triggers SAP S/4HANA period-close tasks, pulls consolidated financials into Oracle Hyperion for intercompany elimination, and refreshes the Power BI executive financial dashboard."
  tags:
    - finance
    - financial-close
    - sap
    - oracle-hyperion
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-period-close
          description: "Trigger SAP period-close postings for a company code and fiscal period, sync results to Oracle Hyperion, and refresh the Power BI financial dashboard."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code (e.g., 1000 for 3M US)."
            - name: fiscal_year
              in: body
              type: string
              description: "Four-digit fiscal year (e.g., 2025)."
            - name: fiscal_period
              in: body
              type: string
              description: "Two-digit fiscal period (e.g., 03 for March)."
          steps:
            - name: trigger-close
              type: call
              call: "sap.run-period-close"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                fiscal_period: "{{fiscal_period}}"
            - name: sync-hyperion
              type: call
              call: "oracle-hyperion.load-data"
              with:
                application: "3M_CONSOL"
                period: "{{fiscal_year}}.{{fiscal_period}}"
                scenario: "Actuals"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_name: "executive-financial-{{fiscal_year}}-{{fiscal_period}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FAC_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close
          path: "/PeriodClose"
          operations:
            - name: run-period-close
              method: POST
    - type: http
      namespace: oracle-hyperion
      baseUri: "https://3m-hyperion.oracle.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: data-loads
          path: "/applications/{{application}}/dataLoads"
          inputParameters:
            - name: application
              in: path
          operations:
            - name: load-data
              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_name}}/refreshes"
          inputParameters:
            - name: dataset_name
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Creates a hazardous waste shipping manifest by pulling waste profile data from SAP EHS, generating the manifest in ServiceNow, and notifying the plant EHS coordinator in Teams.

naftiko: "0.5"
info:
  label: "Hazardous Waste Manifest Creation"
  description: "Creates a hazardous waste shipping manifest by pulling waste profile data from SAP EHS, generating the manifest in ServiceNow, and notifying the plant EHS coordinator in Teams."
  tags:
    - ehs
    - safety
    - sap
    - servicenow
    - microsoft-teams
    - waste-management
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: waste-management
      port: 8080
      tools:
        - name: create-waste-manifest
          description: "Given waste stream details, pull SAP EHS data, create ServiceNow manifest, and notify EHS coordinator."
          inputParameters:
            - name: waste_stream_id
              in: body
              type: string
              description: "SAP EHS waste stream identifier."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: quantity_kg
              in: body
              type: string
              description: "Quantity of waste in kilograms."
            - name: disposal_facility
              in: body
              type: string
              description: "Name of the disposal facility."
          steps:
            - name: get-waste-profile
              type: call
              call: "sap.get-waste-profile"
              with:
                waste_stream: "{{waste_stream_id}}"
                plant: "{{plant_code}}"
            - name: create-manifest
              type: call
              call: "servicenow.create-manifest"
              with:
                short_description: "Hazwaste Manifest: {{waste_stream_id}} from {{plant_code}}"
                waste_class: "{{get-waste-profile.waste_class}}"
                un_number: "{{get-waste-profile.un_number}}"
                quantity: "{{quantity_kg}}"
                facility: "{{disposal_facility}}"
            - name: notify-ehs
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ehs_team_id"
                channel_id: "$secrets.ehs_waste_channel_id"
                text: "Hazwaste Manifest Created: {{waste_stream_id}} | {{quantity_kg}} kg | Class: {{get-waste-profile.waste_class}} | Facility: {{disposal_facility}} | Manifest: {{create-manifest.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/EHS_WASTE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: waste-profiles
          path: "/WasteProfile(WasteStream='{{waste_stream}}',Plant='{{plant}}')"
          inputParameters:
            - name: waste_stream
              in: path
            - name: plant
              in: path
          operations:
            - name: get-waste-profile
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: manifests
          path: "/table/sn_ehs_manifest"
          operations:
            - name: create-manifest
              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

Returns current headcount by department and cost center from Workday and ADP, cross-referenced against SAP cost center hierarchy, for use in headcount planning and budget reporting.

naftiko: "0.5"
info:
  label: "Headcount and Payroll Snapshot"
  description: "Returns current headcount by department and cost center from Workday and ADP, cross-referenced against SAP cost center hierarchy, for use in headcount planning and budget reporting."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - adp
    - sap
    - headcount
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns employee headcount grouped by department and cost center from Workday, enriched with ADP payroll classification data."
          call: "workday.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.workerId"
                - name: full_name
                  type: string
                  mapping: "$.name.formattedName"
                - name: department
                  type: string
                  mapping: "$.organizationInfo.department"
                - name: cost_center
                  type: string
                  mapping: "$.organizationInfo.costCenter"
                - name: employment_type
                  type: string
                  mapping: "$.workerType"
        - name: get-payroll-by-cost-center
          description: "Returns ADP payroll totals grouped by SAP cost center code for a given pay period. Use for budget vs. actuals reconciliation."
          inputParameters:
            - name: pay_period_start
              in: body
              type: string
              description: "Start date of the pay period in YYYY-MM-DD format."
            - name: pay_period_end
              in: body
              type: string
              description: "End date of the pay period in YYYY-MM-DD format."
          call: "adp.payroll-summary"
          with:
            start_date: "{{pay_period_start}}"
            end_date: "{{pay_period_end}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: headcount-export
              method: GET
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll/v1/payroll-output"
          inputParameters:
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: payroll-summary
              method: GET

When Workday detects a role change, syncs the updated job profile to Microsoft Identity Manager, updates ServiceNow group memberships, and notifies the employee in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Identity and Access Provisioning"
  description: "When Workday detects a role change, syncs the updated job profile to Microsoft Identity Manager, updates ServiceNow group memberships, and notifies the employee in Microsoft Teams."
  tags:
    - iam
    - identity
    - workday
    - microsoft-identity-manager
    - servicenow
    - microsoft-teams
    - security
capability:
  exposes:
    - type: mcp
      namespace: iam-provisioning
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID and new role, update Microsoft Identity Manager, adjust ServiceNow group access, and notify the employee in Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: new_role
              in: body
              type: string
              description: "The new job role or title as defined in Workday."
            - name: effective_date
              in: body
              type: string
              description: "Effective date of the role change in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-mim
              type: call
              call: "mim.update-person"
              with:
                upn: "{{get-employee.work_email}}"
                job_title: "{{new_role}}"
                department: "{{get-employee.department}}"
                effective_date: "{{effective_date}}"
            - name: update-snow-group
              type: call
              call: "servicenow.update-group-membership"
              with:
                user_email: "{{get-employee.work_email}}"
                role: "{{new_role}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Your system access has been updated for your new role: {{new_role}} (effective {{effective_date}}). Contact IT if you need additional access."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: mim
      baseUri: "https://3m-mim.internal/identitymanagement/api/v1"
      authentication:
        type: bearer
        token: "$secrets.mim_token"
      resources:
        - name: persons
          path: "/persons/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: update-person
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: group-members
          path: "/table/sys_user_grmember"
          operations:
            - name: update-group-membership
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Informatica IICS job completions and logs failures to Datadog, opens a Jira data incident, and notifies the ETL team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Informatica Data Integration Failure"
  description: "Monitors Informatica IICS job completions and logs failures to Datadog, opens a Jira data incident, and notifies the ETL team in Microsoft Teams."
  tags:
    - data-integration
    - informatica
    - datadog
    - jira
    - microsoft-teams
    - etl
capability:
  exposes:
    - type: mcp
      namespace: etl-ops
      port: 8080
      tools:
        - name: handle-informatica-failure
          description: "Given an Informatica job name, source, and target, log the failure to Datadog, open a Jira incident, and notify the ETL team in Teams."
          inputParameters:
            - name: job_name
              in: body
              type: string
              description: "The Informatica mapping or workflow job name."
            - name: source_system
              in: body
              type: string
              description: "Source system (e.g., SAP, Oracle, Salesforce)."
            - name: target_system
              in: body
              type: string
              description: "Target system (e.g., Snowflake, Oracle DW)."
            - name: error_message
              in: body
              type: string
              description: "Error message from the failed job."
          steps:
            - name: log-datadog
              type: call
              call: "datadog-etl.create-event"
              with:
                title: "Informatica Failure: {{job_name}}"
                text: "Source: {{source_system}} → Target: {{target_system}} | Error: {{error_message}}"
                alert_type: "error"
                tags: "etl:informatica,source:{{source_system}},target:{{target_system}}"
            - name: open-jira
              type: call
              call: "jira-etl.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Incident"
                summary: "Informatica failure: {{job_name}} ({{source_system}} → {{target_system}})"
                description: "Job: {{job_name}}\nSource: {{source_system}}\nTarget: {{target_system}}\nError: {{error_message}}\nDatadog: {{log-datadog.url}}"
            - name: notify-team
              type: call
              call: "msteams-etl.send-message"
              with:
                recipient_upn: "etl-team@3m.com"
                text: "Informatica Failure: {{job_name}} | {{source_system}} → {{target_system}} | Jira: {{open-jira.key}}"
  consumes:
    - type: http
      namespace: datadog-etl
      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: jira-etl
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-etl
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Runs Terraform to provision AWS or Azure infrastructure, registers the new resources in Datadog for monitoring, and posts a provisioning summary to the DevOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Infrastructure Provisioning Pipeline"
  description: "Runs Terraform to provision AWS or Azure infrastructure, registers the new resources in Datadog for monitoring, and posts a provisioning summary to the DevOps Microsoft Teams channel."
  tags:
    - devops
    - infrastructure
    - terraform
    - aws
    - azure
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-infrastructure
          description: "Trigger a Terraform infrastructure provisioning run for AWS or Azure, register resulting resources in Datadog, and notify the DevOps team in Teams."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "The Terraform Cloud workspace name to trigger."
            - name: cloud_provider
              in: body
              type: string
              description: "Target cloud provider: aws or azure."
            - name: environment
              in: body
              type: string
              description: "Target environment: dev, staging, or prod."
          steps:
            - name: trigger-terraform
              type: call
              call: "terraform.create-run"
              with:
                workspace: "{{workspace_name}}"
                message: "Provisioning {{environment}} on {{cloud_provider}}"
            - name: register-monitor
              type: call
              call: "datadog.create-monitor"
              with:
                name: "{{workspace_name}} — {{environment}} health"
                type: "service check"
                message: "Infrastructure {{workspace_name}} on {{cloud_provider}} in {{environment}} is unhealthy."
            - name: notify-devops
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "devops-team@3m.com"
                text: "Infrastructure Provisioned: {{workspace_name}} | Cloud: {{cloud_provider}} | Env: {{environment}} | Terraform Run: {{trigger-terraform.run_id}} | Datadog Monitor: {{register-monitor.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: create-monitor
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Processes intercompany invoices by matching SAP FI documents between company codes, logging discrepancies in Jira, and notifying the shared services team in Teams.

naftiko: "0.5"
info:
  label: "Intercompany Invoice Processing"
  description: "Processes intercompany invoices by matching SAP FI documents between company codes, logging discrepancies in Jira, and notifying the shared services team in Teams."
  tags:
    - finance
    - intercompany
    - sap
    - sap-s4hana
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: intercompany-finance
      port: 8080
      tools:
        - name: process-intercompany-invoice
          description: "Given sending and receiving company codes and invoice number, match documents, log issues, and notify shared services."
          inputParameters:
            - name: sending_company
              in: body
              type: string
              description: "SAP company code of the sending entity."
            - name: receiving_company
              in: body
              type: string
              description: "SAP company code of the receiving entity."
            - name: invoice_number
              in: body
              type: string
              description: "The intercompany invoice number."
          steps:
            - name: get-sending-doc
              type: call
              call: "sap.get-fi-document"
              with:
                company_code: "{{sending_company}}"
                invoice: "{{invoice_number}}"
            - name: get-receiving-doc
              type: call
              call: "sap.get-fi-document"
              with:
                company_code: "{{receiving_company}}"
                invoice: "{{invoice_number}}"
            - name: log-discrepancy
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                issuetype: "Task"
                summary: "IC Match: Invoice {{invoice_number}} ({{sending_company}} → {{receiving_company}})"
                description: "Sending amount: {{get-sending-doc.amount}} | Receiving amount: {{get-receiving-doc.amount}} | Currency: {{get-sending-doc.currency}}"
            - name: notify-shared-services
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.shared_services_team_id"
                channel_id: "$secrets.ic_channel_id"
                text: "IC Invoice {{invoice_number}}: {{sending_company}} → {{receiving_company}} | Sending: {{get-sending-doc.amount}} | Receiving: {{get-receiving-doc.amount}} | Jira: {{log-discrepancy.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FI_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fi-documents
          path: "/FIDocument(CompanyCode='{{company_code}}',Invoice='{{invoice}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: invoice
              in: path
          operations:
            - name: get-fi-document
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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 inventory cycle count discrepancies by comparing SAP book quantities against physical counts, logging adjustments, and alerting the warehouse manager in Teams.

naftiko: "0.5"
info:
  label: "Inventory Cycle Count Reconciliation"
  description: "Reconciles inventory cycle count discrepancies by comparing SAP book quantities against physical counts, logging adjustments, and alerting the warehouse manager in Teams."
  tags:
    - inventory
    - warehouse
    - sap
    - sap-s4hana
    - microsoft-teams
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: inventory-management
      port: 8080
      tools:
        - name: reconcile-cycle-count
          description: "Given a plant, storage location, and count results, compare against SAP, post adjustments, and notify warehouse manager."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: storage_location
              in: body
              type: string
              description: "SAP storage location."
            - name: material_number
              in: body
              type: string
              description: "Material number counted."
            - name: physical_count
              in: body
              type: string
              description: "Physical count quantity."
          steps:
            - name: get-book-quantity
              type: call
              call: "sap.get-stock"
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
                storage_location: "{{storage_location}}"
            - name: post-adjustment
              type: call
              call: "sap.post-inventory-adjustment"
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
                storage_location: "{{storage_location}}"
                book_qty: "{{get-book-quantity.available_qty}}"
                physical_qty: "{{physical_count}}"
            - name: notify-warehouse
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.warehouse_team_id"
                channel_id: "$secrets.warehouse_channel_id"
                text: "Cycle Count: {{material_number}} at {{plant_code}}/{{storage_location}} | Book: {{get-book-quantity.available_qty}} | Physical: {{physical_count}} | Adjustment: {{post-adjustment.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MaterialStock(Material='{{material}}',Plant='{{plant}}',StorageLocation='{{storage_location}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
            - name: storage_location
              in: path
          operations:
            - name: get-stock
              method: GET
        - name: adjustments
          path: "/InventoryAdjustment"
          operations:
            - name: post-inventory-adjustment
              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

Receives an invoice from SAP Ariba, validates vendor data against SAP S/4HANA master records, posts the accounting document, and notifies the AP team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Invoice Processing and AP Automation"
  description: "Receives an invoice from SAP Ariba, validates vendor data against SAP S/4HANA master records, posts the accounting document, and notifies the AP team in Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - sap-ariba
    - sap
    - invoice-processing
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: accounts-payable
      port: 8080
      tools:
        - name: process-invoice
          description: "Given an Ariba invoice ID, validate the vendor in SAP, post the AP document, and notify the AP team in Teams."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice identifier."
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor master ID."
          steps:
            - name: get-invoice
              type: call
              call: "ariba.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: validate-vendor
              type: call
              call: "sap.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: post-ap-document
              type: call
              call: "sap.post-invoice"
              with:
                vendor_id: "{{vendor_id}}"
                amount: "{{get-invoice.total_amount}}"
                currency: "{{get-invoice.currency}}"
                invoice_date: "{{get-invoice.invoice_date}}"
                reference: "{{invoice_id}}"
            - name: notify-ap-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "ap-team@3m.com"
                text: "Invoice Posted: {{invoice_id}} | Vendor: {{validate-vendor.name}} | Amount: {{get-invoice.total_amount}} {{get-invoice.currency}} | SAP Doc: {{post-ap-document.document_number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/API_VENDOR_0001"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
        - name: invoice-documents
          path: "/A_SupplierInvoice"
          operations:
            - name: post-invoice
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Updates controlled documents for ISO compliance by versioning in SharePoint, creating a Jira review task, and notifying the document control team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ISO Document Control Update"
  description: "Updates controlled documents for ISO compliance by versioning in SharePoint, creating a Jira review task, and notifying the document control team in Microsoft Teams."
  tags:
    - compliance
    - iso
    - sharepoint
    - jira
    - microsoft-teams
    - quality
    - document-control
capability:
  exposes:
    - type: mcp
      namespace: document-control
      port: 8080
      tools:
        - name: update-controlled-document
          description: "Given a document ID, new version, and change summary, version in SharePoint, create review task, and notify."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "SharePoint document ID."
            - name: document_title
              in: body
              type: string
              description: "Title of the controlled document."
            - name: new_version
              in: body
              type: string
              description: "New document version number."
            - name: change_summary
              in: body
              type: string
              description: "Summary of changes in this version."
          steps:
            - name: upload-new-version
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.qms_site_id"
                folder_path: "/ControlledDocs"
                file_name: "{{document_id}}-v{{new_version}}.pdf"
                content: "{{change_summary}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "QMS"
                issuetype: "Task"
                summary: "Doc Review: {{document_title}} v{{new_version}}"
                description: "Document: {{document_id}} | Version: {{new_version}} | Changes: {{change_summary}}"
            - name: notify-doc-control
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.quality_team_id"
                channel_id: "$secrets.doc_control_channel_id"
                text: "Document Updated: {{document_title}} v{{new_version}} | Changes: {{change_summary}} | Review: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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 Jira change ticket is approved, creates a ServiceNow change request, updates the linked Confluence runbook, and notifies the change advisory board in Microsoft Teams.

naftiko: "0.5"
info:
  label: "IT Change Management Workflow"
  description: "When a Jira change ticket is approved, creates a ServiceNow change request, updates the linked Confluence runbook, and notifies the change advisory board in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-change
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given an approved Jira change ticket, open a ServiceNow change request, link the Confluence runbook, and notify the CAB channel in Teams."
          inputParameters:
            - name: jira_issue_key
              in: body
              type: string
              description: "The approved Jira change ticket key (e.g., CHG-1234)."
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence runbook page ID to attach."
            - name: scheduled_start
              in: body
              type: string
              description: "Planned change start time in ISO 8601 format."
          steps:
            - name: get-jira-issue
              type: call
              call: "jira.get-issue"
              with:
                issue_key: "{{jira_issue_key}}"
            - name: get-runbook
              type: call
              call: "confluence.get-page"
              with:
                page_id: "{{confluence_page_id}}"
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "{{get-jira-issue.summary}}"
                description: "{{get-jira-issue.description}}\nRunbook: {{get-runbook.url}}"
                start_date: "{{scheduled_start}}"
                category: "infrastructure"
            - name: notify-cab
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "cab-board@3m.com"
                text: "Change Submitted: {{get-jira-issue.summary}} | Jira: {{jira_issue_key}} | ServiceNow: {{create-change.number}} | Start: {{scheduled_start}} | Runbook: {{get-runbook.url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://3m.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When Datadog fires a critical alert, creates a ServiceNow P1 incident, posts an alert to the Microsoft Teams on-call channel, and attaches the Datadog dashboard link for rapid triage.

naftiko: "0.5"
info:
  label: "IT Incident Response"
  description: "When Datadog fires a critical alert, creates a ServiceNow P1 incident, posts an alert to the Microsoft Teams on-call channel, and attaches the Datadog dashboard link for rapid triage."
  tags:
    - itsm
    - observability
    - datadog
    - servicenow
    - microsoft-teams
    - incident-response
    - operations
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog monitor alert, open a ServiceNow P1 incident and notify the on-call channel in Microsoft Teams with full context."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired."
            - name: monitor_name
              in: body
              type: string
              description: "Human-readable name of the firing monitor."
            - name: host
              in: body
              type: string
              description: "The affected host or service."
            - name: alert_url
              in: body
              type: string
              description: "URL to the Datadog monitor event."
            - name: oncall_channel
              in: body
              type: string
              description: "Microsoft Teams channel ID for on-call notifications."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "P1 Alert: {{monitor_name}} on {{host}}"
                urgency: "1"
                impact: "1"
                category: "infrastructure"
                description: "Datadog monitor {{monitor_id}} fired for {{host}}. Dashboard: {{alert_url}}"
            - name: notify-oncall
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{oncall_channel}}"
                text: "P1 Incident Opened: {{monitor_name}} | Host: {{host}} | ServiceNow: {{create-incident.number}} | Datadog: {{alert_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, and priority for engineering and project management teams.

naftiko: "0.5"
info:
  label: "Jira Ticket Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority for engineering and project management teams."
  tags:
    - engineering
    - jira
    - project-management
    - development
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, priority, and sprint."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., PROJ-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Triggers a Kubernetes rolling deployment from a GitHub Actions release, monitors rollout health via Datadog, and posts the deployment result to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Kubernetes Deployment Rollout"
  description: "Triggers a Kubernetes rolling deployment from a GitHub Actions release, monitors rollout health via Datadog, and posts the deployment result to the engineering Microsoft Teams channel."
  tags:
    - devops
    - kubernetes
    - github-actions
    - datadog
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: k8s-deploy
      port: 8080
      tools:
        - name: rollout-deployment
          description: "Given a GitHub release tag and Kubernetes namespace, trigger a rolling deployment and monitor health via Datadog. Post the result to Teams."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: release_tag
              in: body
              type: string
              description: "The Git tag to deploy (e.g., v2.4.1)."
            - name: k8s_namespace
              in: body
              type: string
              description: "Kubernetes namespace to deploy into."
            - name: service_name
              in: body
              type: string
              description: "Datadog service name for health monitoring."
          steps:
            - name: trigger-workflow
              type: call
              call: "github.create-workflow-dispatch"
              with:
                repository: "{{repository}}"
                workflow_id: "deploy.yml"
                ref: "{{release_tag}}"
                namespace: "{{k8s_namespace}}"
            - name: create-deployment-marker
              type: call
              call: "datadog.create-event"
              with:
                title: "Deployment: {{repository}} {{release_tag}} → {{k8s_namespace}}"
                text: "Rolling deployment triggered. Workflow: {{trigger-workflow.run_id}}"
                alert_type: "info"
                tags: "service:{{service_name}},env:{{k8s_namespace}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "engineering-deploys@3m.com"
                text: "Deployment: {{repository}} {{release_tag}} → {{k8s_namespace}} | Run: {{trigger-workflow.run_id}} | Datadog: {{create-deployment-marker.url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatches
          path: "/repos/{{repository}}/actions/workflows/{{workflow_id}}/dispatches"
          inputParameters:
            - name: repository
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: create-workflow-dispatch
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When R&D lab test results are available, records them in SAP QM, updates the Jira R&D tracker, and notifies the project scientist in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Lab Test Result Processing"
  description: "When R&D lab test results are available, records them in SAP QM, updates the Jira R&D tracker, and notifies the project scientist in Microsoft Teams."
  tags:
    - research
    - quality
    - sap
    - jira
    - microsoft-teams
    - lab-testing
capability:
  exposes:
    - type: mcp
      namespace: rd-lab
      port: 8080
      tools:
        - name: process-lab-results
          description: "Given test results, material, and project info, log results in SAP QM, update Jira, and notify the project lead."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "Material number tested."
            - name: test_plan_id
              in: body
              type: string
              description: "SAP QM test plan identifier."
            - name: result_status
              in: body
              type: string
              description: "Overall result: pass, fail, or conditional."
            - name: jira_key
              in: body
              type: string
              description: "The Jira R&D project issue key."
            - name: scientist_upn
              in: body
              type: string
              description: "UPN of the lead scientist."
          steps:
            - name: record-results
              type: call
              call: "sap.record-inspection-results"
              with:
                inspection_plan: "{{test_plan_id}}"
                material: "{{material_number}}"
                result_status: "{{result_status}}"
            - name: update-jira
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{jira_key}}"
                body: "Lab test results recorded. Material: {{material_number}} | Status: {{result_status}} | SAP Inspection: {{record-results.inspection_lot}}"
            - name: notify-scientist
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{scientist_upn}}"
                text: "Lab results for {{material_number}} are in: {{result_status}} | SAP: {{record-results.inspection_lot}} | Jira: {{jira_key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_RESULT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-results
          path: "/InspectionResult"
          operations:
            - name: record-inspection-results
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

Deploys a trained ML model by registering it in Azure Machine Learning, creating a Jira deployment ticket, updating the model registry in Snowflake, and notifying the data science team in Teams.

naftiko: "0.5"
info:
  label: "Machine Learning Model Deployment"
  description: "Deploys a trained ML model by registering it in Azure Machine Learning, creating a Jira deployment ticket, updating the model registry in Snowflake, and notifying the data science team in Teams."
  tags:
    - data-science
    - machine-learning
    - azure-machine-learning
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: deploy-model
          description: "Given a model name, version, and endpoint, register in Azure ML, create Jira ticket, update registry, and notify data science."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Name of the ML model."
            - name: model_version
              in: body
              type: string
              description: "Model version to deploy."
            - name: endpoint_name
              in: body
              type: string
              description: "Azure ML endpoint name."
            - name: use_case
              in: body
              type: string
              description: "Business use case (e.g., demand_forecast, defect_detection, predictive_maintenance)."
          steps:
            - name: register-model
              type: call
              call: "azureml.register-model"
              with:
                model_name: "{{model_name}}"
                model_version: "{{model_version}}"
                endpoint: "{{endpoint_name}}"
            - name: create-deployment-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "MLOPS"
                issuetype: "Task"
                summary: "Model Deployment: {{model_name}} v{{model_version}} to {{endpoint_name}}"
                description: "Use case: {{use_case}} | Azure ML endpoint: {{endpoint_name}} | Registration: {{register-model.model_id}}"
            - name: update-registry
              type: call
              call: "snowflake.run-query"
              with:
                statement: "INSERT INTO MLOPS.MODEL_REGISTRY VALUES ('{{model_name}}', '{{model_version}}', '{{endpoint_name}}', '{{use_case}}', CURRENT_TIMESTAMP())"
                warehouse: "MLOPS_WH"
            - name: notify-data-science
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.datascience_team_id"
                channel_id: "$secrets.datascience_channel_id"
                text: "Model Deployed: {{model_name}} v{{model_version}} to {{endpoint_name}} | Use case: {{use_case}} | Jira: {{create-deployment-ticket.key}}"
  consumes:
    - type: http
      namespace: azureml
      baseUri: "https://3m-ml.api.azureml.ms"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: models
          path: "/models/{{model_name}}/versions/{{model_version}}/deploy"
          inputParameters:
            - name: model_name
              in: path
            - name: model_version
              in: path
          operations:
            - name: register-model
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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 manufacturing line goes down, creates a SAP Plant Maintenance work order, opens a ServiceNow incident, and alerts the plant operations team in Microsoft Teams with downtime details.

naftiko: "0.5"
info:
  label: "Manufacturing Line Downtime Alert"
  description: "When a manufacturing line goes down, creates a SAP Plant Maintenance work order, opens a ServiceNow incident, and alerts the plant operations team in Microsoft Teams with downtime details."
  tags:
    - manufacturing
    - downtime
    - sap
    - servicenow
    - microsoft-teams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: plant-operations
      port: 8080
      tools:
        - name: report-line-downtime
          description: "Given a production line ID and downtime reason, create a SAP PM work order, open a ServiceNow incident, and notify the plant operations team in Teams."
          inputParameters:
            - name: line_id
              in: body
              type: string
              description: "The manufacturing line identifier."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: downtime_reason
              in: body
              type: string
              description: "Reason for the production line downtime."
            - name: estimated_duration_hours
              in: body
              type: string
              description: "Estimated downtime duration in hours."
          steps:
            - name: create-pm-order
              type: call
              call: "sap.create-maintenance-order"
              with:
                plant: "{{plant_code}}"
                equipment: "{{line_id}}"
                order_type: "PM02"
                short_text: "Line Down: {{line_id}} — {{downtime_reason}}"
                priority: "1"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Production Line Down: {{line_id}} at {{plant_code}}"
                description: "{{downtime_reason}} | Est. Duration: {{estimated_duration_hours}}h | SAP Order: {{create-pm-order.order_number}}"
                urgency: "1"
                category: "manufacturing"
            - name: notify-operations
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.plant_ops_team_id"
                channel_id: "$secrets.plant_ops_channel_id"
                text: "ALERT: Line {{line_id}} DOWN at {{plant_code}} | Reason: {{downtime_reason}} | Est: {{estimated_duration_hours}}h | SAP: {{create-pm-order.order_number}} | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.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

Aggregates campaign performance data from Adobe Analytics and HubSpot, updates Salesforce campaign records with current metrics, and posts a digest to the marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Aggregates campaign performance data from Adobe Analytics and HubSpot, updates Salesforce campaign records with current metrics, and posts a digest to the marketing Microsoft Teams channel."
  tags:
    - marketing
    - analytics
    - adobe-analytics
    - hubspot
    - salesforce
    - microsoft-teams
    - campaign-management
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a campaign ID, fetch Adobe Analytics web metrics and HubSpot email metrics, update the Salesforce campaign record, and post a summary to Teams."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The campaign identifier (shared across Adobe Analytics, HubSpot, and Salesforce)."
            - name: date_range
              in: body
              type: string
              description: "Date range for the report in YYYY-MM-DD/YYYY-MM-DD format."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "The Salesforce campaign record ID."
          steps:
            - name: get-web-metrics
              type: call
              call: "adobe-analytics.get-campaign-metrics"
              with:
                campaign_id: "{{campaign_id}}"
                date_range: "{{date_range}}"
            - name: get-email-metrics
              type: call
              call: "hubspot.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
            - name: update-salesforce-campaign
              type: call
              call: "salesforce.update-campaign"
              with:
                campaign_id: "{{salesforce_campaign_id}}"
                impressions: "{{get-web-metrics.impressions}}"
                clicks: "{{get-web-metrics.clicks}}"
                email_opens: "{{get-email-metrics.opens}}"
                email_clicks: "{{get-email-metrics.clicks}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "marketing-team@3m.com"
                text: "Campaign {{campaign_id}} digest ({{date_range}}): Impressions: {{get-web-metrics.impressions}} | Web Clicks: {{get-web-metrics.clicks}} | Email Opens: {{get-email-metrics.opens}} | Email Clicks: {{get-email-metrics.clicks}} | Salesforce updated."
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/{{company_id}}/reports"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: campaign-reports
          path: "/campaigns/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
            - name: date_range
              in: query
          operations:
            - name: get-campaign-metrics
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign_id}}/stats"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Detects material cost variances in SAP cost accounting, logs an investigation task in Jira, and alerts the plant controller and finance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Material Cost Variance Alert"
  description: "Detects material cost variances in SAP cost accounting, logs an investigation task in Jira, and alerts the plant controller and finance team in Microsoft Teams."
  tags:
    - finance
    - cost-accounting
    - sap
    - jira
    - microsoft-teams
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: cost-management
      port: 8080
      tools:
        - name: alert-cost-variance
          description: "Given a material, plant, and variance details, retrieve SAP cost data, create Jira investigation, and alert finance."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: variance_amount
              in: body
              type: string
              description: "Cost variance amount in USD."
            - name: variance_type
              in: body
              type: string
              description: "Type of variance (e.g., purchase_price, production_quantity, usage)."
          steps:
            - name: get-cost-data
              type: call
              call: "sap.get-material-cost"
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: create-investigation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                issuetype: "Task"
                summary: "Cost Variance: {{material_number}} at {{plant_code}} (${{variance_amount}})"
                description: "Variance type: {{variance_type}} | Amount: ${{variance_amount}} | Standard cost: {{get-cost-data.standard_cost}} | Actual cost: {{get-cost-data.actual_cost}}"
            - name: notify-finance
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.finance_team_id"
                channel_id: "$secrets.cost_alerts_channel_id"
                text: "Cost Variance Alert: {{material_number}} at {{plant_code}} | Type: {{variance_type}} | Amount: ${{variance_amount}} | Jira: {{create-investigation.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/CO_MATERIAL_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-costs
          path: "/MaterialCostEstimate(Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-cost
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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 an Azure Databricks ML training job, tracks the experiment in the model registry, logs metrics to Datadog, and posts training results to the data science Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ML Model Training Pipeline"
  description: "Triggers an Azure Databricks ML training job, tracks the experiment in the model registry, logs metrics to Datadog, and posts training results to the data science Microsoft Teams channel."
  tags:
    - machine-learning
    - azure-databricks
    - datadog
    - microsoft-teams
    - data-science
    - mlops
capability:
  exposes:
    - type: mcp
      namespace: mlops
      port: 8080
      tools:
        - name: run-training-job
          description: "Given a Databricks job ID and model name, trigger training, log metrics to Datadog, and post results to Teams."
          inputParameters:
            - name: databricks_job_id
              in: body
              type: string
              description: "The Azure Databricks job ID for the training pipeline."
            - name: model_name
              in: body
              type: string
              description: "The registered model name in Databricks MLflow."
            - name: experiment_name
              in: body
              type: string
              description: "The MLflow experiment name."
          steps:
            - name: trigger-job
              type: call
              call: "databricks.run-job"
              with:
                job_id: "{{databricks_job_id}}"
            - name: log-metrics
              type: call
              call: "datadog.create-event"
              with:
                title: "ML Training Started: {{model_name}}"
                text: "Job {{databricks_job_id}} | Experiment: {{experiment_name}} | Run: {{trigger-job.run_id}}"
                alert_type: "info"
                tags: "ml_model:{{model_name}},experiment:{{experiment_name}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "data-science@3m.com"
                text: "ML Training Job Started: {{model_name}} | Experiment: {{experiment_name}} | Databricks Run: {{trigger-job.run_id}} | Datadog: {{log-metrics.url}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-3m.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: job-runs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors MuleSoft API Manager for failed flows, correlates with Datadog APM traces, opens a ServiceNow integration incident, and notifies the integration team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "MuleSoft Integration Health Monitor"
  description: "Monitors MuleSoft API Manager for failed flows, correlates with Datadog APM traces, opens a ServiceNow integration incident, and notifies the integration team in Microsoft Teams."
  tags:
    - integration
    - mulesoft
    - datadog
    - servicenow
    - microsoft-teams
    - api-management
capability:
  exposes:
    - type: mcp
      namespace: integration-ops
      port: 8080
      tools:
        - name: handle-integration-failure
          description: "Given a MuleSoft flow failure event, correlate with Datadog traces, open a ServiceNow incident, and alert the integration team in Teams."
          inputParameters:
            - name: flow_name
              in: body
              type: string
              description: "The name of the failed MuleSoft flow."
            - name: environment
              in: body
              type: string
              description: "MuleSoft environment (dev, staging, prod)."
            - name: error_message
              in: body
              type: string
              description: "Error message from the failed flow."
            - name: correlation_id
              in: body
              type: string
              description: "MuleSoft correlation ID for trace lookup."
          steps:
            - name: log-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "MuleSoft Flow Failure: {{flow_name}} ({{environment}})"
                text: "Error: {{error_message}} | Correlation: {{correlation_id}}"
                alert_type: "error"
                tags: "integration:mulesoft,flow:{{flow_name}},env:{{environment}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Integration Failure: {{flow_name}} in {{environment}}"
                description: "MuleSoft flow {{flow_name}} failed in {{environment}}.\nError: {{error_message}}\nCorrelation ID: {{correlation_id}}\nDatadog: {{log-datadog.url}}"
                category: "integration"
                urgency: "2"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "integration-ops@3m.com"
                text: "MuleSoft Failure: {{flow_name}} ({{environment}}) | Error: {{error_message}} | ServiceNow: {{create-incident.number}} | Datadog: {{log-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://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When Palo Alto Networks fires a threat alert, correlates with Datadog network metrics, opens a ServiceNow security incident, and notifies the security operations center in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Network Security Event Triage"
  description: "When Palo Alto Networks fires a threat alert, correlates with Datadog network metrics, opens a ServiceNow security incident, and notifies the security operations center in Microsoft Teams."
  tags:
    - security
    - network
    - palo-alto-networks
    - datadog
    - servicenow
    - microsoft-teams
    - soc
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: triage-network-threat
          description: "Given a Palo Alto threat alert ID and source IP, correlate with Datadog, open a ServiceNow security incident, and alert the SOC in Teams."
          inputParameters:
            - name: threat_id
              in: body
              type: string
              description: "The Palo Alto Networks threat alert ID."
            - name: source_ip
              in: body
              type: string
              description: "Source IP address of the threat."
            - name: threat_severity
              in: body
              type: string
              description: "Threat severity level (critical, high, medium, low)."
            - name: affected_host
              in: body
              type: string
              description: "Hostname or resource affected by the threat."
          steps:
            - name: log-datadog-event
              type: call
              call: "datadog.create-event"
              with:
                title: "Network Threat: {{threat_id}} from {{source_ip}}"
                text: "Severity: {{threat_severity}} | Host: {{affected_host}}"
                alert_type: "error"
                tags: "security:network,severity:{{threat_severity}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Network Threat ({{threat_severity}}): {{threat_id}} — {{source_ip}}"
                description: "Palo Alto alert {{threat_id}} | Source: {{source_ip}} | Host: {{affected_host}} | Datadog: {{log-datadog-event.url}}"
                category: "security"
                urgency: "1"
                impact: "1"
            - name: alert-soc
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "soc-team@3m.com"
                text: "Network Threat: {{threat_id}} | Severity: {{threat_severity}} | Source IP: {{source_ip}} | Host: {{affected_host}} | ServiceNow: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Provisions IT equipment for a new hire by creating a ServiceNow request, linking the Workday employee record, and notifying the hiring manager and IT support in Teams.

naftiko: "0.5"
info:
  label: "New Hire Equipment Provisioning"
  description: "Provisions IT equipment for a new hire by creating a ServiceNow request, linking the Workday employee record, and notifying the hiring manager and IT support in Teams."
  tags:
    - hr
    - it-service
    - servicenow
    - workday
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-it-provisioning
      port: 8080
      tools:
        - name: provision-new-hire-equipment
          description: "Given an employee ID, role, and start date, create equipment request in ServiceNow, verify Workday record, and notify stakeholders."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: role
              in: body
              type: string
              description: "The new hire's role/job title."
            - name: start_date
              in: body
              type: string
              description: "Employee start date."
            - name: manager_upn
              in: body
              type: string
              description: "UPN of the hiring manager."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                employee_id: "{{employee_id}}"
            - name: create-equipment-request
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Equipment provisioning: {{get-employee.full_name}} ({{role}})"
                description: "New hire starting {{start_date}}. Role: {{role}}. Manager: {{manager_upn}}"
                category: "hardware"
                requested_for: "{{employee_id}}"
            - name: notify-manager
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Equipment request created for {{get-employee.full_name}} ({{role}}), starting {{start_date}}. ServiceNow: {{create-equipment-request.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/3m"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

Orchestrates a new product regulatory submission by gathering product specs from SAP, creating a Jira submission tracker, uploading documents to SharePoint, and notifying the regulatory affairs team.

naftiko: "0.5"
info:
  label: "New Product Regulatory Submission"
  description: "Orchestrates a new product regulatory submission by gathering product specs from SAP, creating a Jira submission tracker, uploading documents to SharePoint, and notifying the regulatory affairs team."
  tags:
    - regulatory
    - compliance
    - sap
    - jira
    - sharepoint
    - product-development
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submissions
      port: 8080
      tools:
        - name: submit-regulatory-package
          description: "Given a product material number, submission type, and target market, gather specs, create a tracker, upload docs, and notify the regulatory team."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the new product."
            - name: submission_type
              in: body
              type: string
              description: "Type of regulatory submission (e.g., 510k, CE_mark, REACH)."
            - name: target_market
              in: body
              type: string
              description: "Target market for the submission (e.g., US, EU, APAC)."
          steps:
            - name: get-product-specs
              type: call
              call: "sap.get-material-master"
              with:
                material_number: "{{material_number}}"
            - name: create-submission-tracker
              type: call
              call: "jira.create-issue"
              with:
                project_key: "REG"
                issuetype: "Task"
                summary: "Regulatory Submission: {{submission_type}} — {{material_number}} ({{target_market}})"
                description: "Product: {{get-product-specs.material_description}} | Type: {{submission_type}} | Market: {{target_market}}"
            - name: create-sharepoint-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "$secrets.regulatory_site_id"
                parent_path: "/Submissions/{{submission_type}}"
                folder_name: "{{material_number}}-{{target_market}}"
            - name: notify-regulatory-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.regulatory_team_id"
                channel_id: "$secrets.regulatory_channel_id"
                text: "New Regulatory Submission: {{submission_type}} for {{material_number}} ({{target_market}}) | Jira: {{create-submission-tracker.key}} | SharePoint folder created"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-master
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:{{parent_path}}/{{folder_name}}"
          inputParameters:
            - name: site_id
              in: path
            - name: parent_path
              in: path
            - name: folder_name
              in: path
          operations:
            - name: create-folder
              method: PUT
    - 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 Datadog detects Oracle Database query latency or tablespace saturation anomalies, opens a ServiceNow DBA task and opens a Jira ticket for the database engineering team.

naftiko: "0.5"
info:
  label: "Oracle Database Performance Alert"
  description: "When Datadog detects Oracle Database query latency or tablespace saturation anomalies, opens a ServiceNow DBA task and opens a Jira ticket for the database engineering team."
  tags:
    - database
    - oracle
    - datadog
    - servicenow
    - jira
    - performance
    - dba
capability:
  exposes:
    - type: mcp
      namespace: dba-ops
      port: 8080
      tools:
        - name: handle-db-performance-alert
          description: "Given an Oracle DB performance alert from Datadog, open a ServiceNow DBA task and a Jira ticket for investigation."
          inputParameters:
            - name: db_instance
              in: body
              type: string
              description: "Oracle database instance name."
            - name: alert_type
              in: body
              type: string
              description: "Alert type (query_latency, tablespace_full, connection_pool, lock_wait)."
            - name: metric_value
              in: body
              type: string
              description: "The metric value that triggered the alert."
            - name: datadog_alert_url
              in: body
              type: string
              description: "URL to the Datadog monitor event."
          steps:
            - name: create-snow-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Oracle DB Alert: {{alert_type}} on {{db_instance}}"
                description: "Metric: {{metric_value}} | Alert: {{datadog_alert_url}}"
                category: "database_performance"
                assigned_group: "DBA_Team"
            - name: create-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DBA"
                issuetype: "Task"
                summary: "Oracle DB: {{alert_type}} on {{db_instance}} ({{metric_value}})"
                description: "ServiceNow: {{create-snow-task.number}}\nDatadog: {{datadog_alert_url}}\nInstance: {{db_instance}}\nAlert: {{alert_type}}\nValue: {{metric_value}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries Oracle E-Business Suite general ledger for account balances by period, returning beginning balance, net activity, and ending balance for finance teams.

naftiko: "0.5"
info:
  label: "Oracle GL Balance Lookup"
  description: "Queries Oracle E-Business Suite general ledger for account balances by period, returning beginning balance, net activity, and ending balance for finance teams."
  tags:
    - finance
    - oracle
    - general-ledger
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up Oracle general ledger balance by account and period. Returns beginning balance, debits, credits, and ending balance."
          inputParameters:
            - name: account_code
              in: body
              type: string
              description: "The GL account code combination."
            - name: period_name
              in: body
              type: string
              description: "The accounting period (e.g., JAN-26)."
          call: "oracle-ebs.get-gl-balance"
          with:
            account_code: "{{account_code}}"
            period_name: "{{period_name}}"
          outputParameters:
            - name: beginning_balance
              type: string
              mapping: "$.BeginningBalance"
            - name: net_activity
              type: string
              mapping: "$.NetActivity"
            - name: ending_balance
              type: string
              mapping: "$.EndingBalance"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://3m-ebs.oracle.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: gl-balances
          path: "/glBalances"
          inputParameters:
            - name: account_code
              in: query
            - name: period_name
              in: query
          operations:
            - name: get-gl-balance
              method: GET

Prepares for an OSHA compliance audit by pulling safety incident records from ServiceNow, gathering training completion data from Workday, and compiling an audit readiness report in SharePoint.

naftiko: "0.5"
info:
  label: "OSHA Compliance Audit Preparation"
  description: "Prepares for an OSHA compliance audit by pulling safety incident records from ServiceNow, gathering training completion data from Workday, and compiling an audit readiness report in SharePoint."
  tags:
    - safety
    - compliance
    - osha
    - servicenow
    - workday
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: compliance-audit
      port: 8080
      tools:
        - name: prepare-osha-audit
          description: "Given a plant code and audit date, pull incident records, training data, and compile an audit report."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code being audited."
            - name: audit_date
              in: body
              type: string
              description: "Scheduled audit date."
            - name: audit_scope
              in: body
              type: string
              description: "Scope of the OSHA audit (e.g., general_safety, chemical_handling, lockout_tagout)."
          steps:
            - name: get-incident-records
              type: call
              call: "servicenow.get-ehs-cases"
              with:
                location: "{{plant_code}}"
                date_range: "last_12_months"
                category: "{{audit_scope}}"
            - name: get-training-compliance
              type: call
              call: "workday.get-training-completions"
              with:
                location: "{{plant_code}}"
                training_category: "{{audit_scope}}"
            - name: upload-audit-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.ehs_site_id"
                folder_path: "/Audits/OSHA/{{plant_code}}"
                file_name: "OSHA-Audit-Prep-{{plant_code}}-{{audit_date}}.json"
                content: "Incidents: {{get-incident-records.total_count}} | Training Compliance: {{get-training-compliance.completion_rate}}%"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: ehs-cases
          path: "/table/sn_ehs_case"
          inputParameters:
            - name: location
              in: query
            - name: date_range
              in: query
            - name: category
              in: query
          operations:
            - name: get-ehs-cases
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/3m"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/trainingCompletions"
          inputParameters:
            - name: location
              in: query
            - name: training_category
              in: query
          operations:
            - name: get-training-completions
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Creates a patent filing tracking entry in Jira, uploads invention disclosure documents to SharePoint, and notifies the IP legal team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Patent Filing Tracker"
  description: "Creates a patent filing tracking entry in Jira, uploads invention disclosure documents to SharePoint, and notifies the IP legal team in Microsoft Teams."
  tags:
    - intellectual-property
    - legal
    - jira
    - sharepoint
    - microsoft-teams
    - research
capability:
  exposes:
    - type: mcp
      namespace: ip-management
      port: 8080
      tools:
        - name: track-patent-filing
          description: "Given invention details, create a Jira tracker, upload documents to SharePoint, and notify IP legal."
          inputParameters:
            - name: invention_title
              in: body
              type: string
              description: "Title of the invention."
            - name: inventor_names
              in: body
              type: string
              description: "Comma-separated list of inventor names."
            - name: technology_area
              in: body
              type: string
              description: "Technology domain (e.g., adhesives, abrasives, healthcare)."
          steps:
            - name: create-patent-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "IP"
                issuetype: "Epic"
                summary: "Patent Filing: {{invention_title}}"
                description: "Inventors: {{inventor_names}} | Technology: {{technology_area}}"
            - name: create-document-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "$secrets.ip_site_id"
                parent_path: "/Patents/{{technology_area}}"
                folder_name: "{{create-patent-ticket.key}}-{{invention_title}}"
            - name: notify-ip-legal
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ip_legal_team_id"
                channel_id: "$secrets.ip_legal_channel_id"
                text: "New patent filing initiated: {{invention_title}} | Inventors: {{inventor_names}} | Tech: {{technology_area}} | Jira: {{create-patent-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:{{parent_path}}/{{folder_name}}"
          inputParameters:
            - name: site_id
              in: path
            - name: parent_path
              in: path
            - name: folder_name
              in: path
          operations:
            - name: create-folder
              method: PUT
    - 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 resolution of internal audit findings by creating corrective actions in ServiceNow, assigning owners in Jira, and reporting status to the audit committee in Teams.

naftiko: "0.5"
info:
  label: "Plant Audit Finding Resolution"
  description: "Tracks resolution of internal audit findings by creating corrective actions in ServiceNow, assigning owners in Jira, and reporting status to the audit committee in Teams."
  tags:
    - audit
    - compliance
    - servicenow
    - jira
    - microsoft-teams
    - quality
capability:
  exposes:
    - type: mcp
      namespace: audit-management
      port: 8080
      tools:
        - name: resolve-audit-finding
          description: "Given an audit finding, create corrective action in ServiceNow, assign in Jira, and notify audit committee."
          inputParameters:
            - name: finding_id
              in: body
              type: string
              description: "The audit finding reference number."
            - name: finding_description
              in: body
              type: string
              description: "Description of the audit finding."
            - name: severity
              in: body
              type: string
              description: "Finding severity: minor, major, critical."
            - name: owner_upn
              in: body
              type: string
              description: "UPN of the corrective action owner."
            - name: due_date
              in: body
              type: string
              description: "Due date for resolution."
          steps:
            - name: create-capa
              type: call
              call: "servicenow.create-capa"
              with:
                short_description: "Audit Finding {{finding_id}}: {{finding_description}}"
                severity: "{{severity}}"
                assigned_to: "{{owner_upn}}"
                due_date: "{{due_date}}"
            - name: create-jira-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "AUDIT"
                issuetype: "Task"
                summary: "CAPA: {{finding_id}} — {{finding_description}}"
                description: "Severity: {{severity}} | Due: {{due_date}} | ServiceNow CAPA: {{create-capa.number}}"
                assignee: "{{owner_upn}}"
            - name: notify-audit-committee
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.audit_team_id"
                channel_id: "$secrets.audit_channel_id"
                text: "Audit Finding {{finding_id}} ({{severity}}): {{finding_description}} | Owner: {{owner_upn}} | Due: {{due_date}} | CAPA: {{create-capa.number}} | Jira: {{create-jira-task.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: capa
          path: "/table/sn_quality_capa"
          operations:
            - name: create-capa
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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

Collects energy consumption data from SAP Plant Maintenance, calculates KPIs in Snowflake, and publishes a summary report to a Power BI dataset and the sustainability Teams channel.

naftiko: "0.5"
info:
  label: "Plant Energy Consumption Report"
  description: "Collects energy consumption data from SAP Plant Maintenance, calculates KPIs in Snowflake, and publishes a summary report to a Power BI dataset and the sustainability Teams channel."
  tags:
    - sustainability
    - energy
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a plant code and reporting period, collect energy data, compute KPIs, refresh Power BI, and notify sustainability team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-energy-data
              type: call
              call: "sap.get-energy-readings"
              with:
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: compute-kpis
              type: call
              call: "snowflake.run-query"
              with:
                statement: "CALL SUSTAINABILITY.COMPUTE_ENERGY_KPIS('{{plant_code}}', '{{period}}')"
                warehouse: "SUSTAINABILITY_WH"
            - name: refresh-powerbi
              type: call
              call: "powerbi.trigger-refresh"
              with:
                group_id: "$secrets.sustainability_pbi_group"
                dataset_id: "$secrets.energy_dataset_id"
            - name: notify-sustainability
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.sustainability_team_id"
                channel_id: "$secrets.sustainability_channel_id"
                text: "Energy report for {{plant_code}} ({{period}}) published. Power BI dashboard refreshed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_DOC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy-readings
          path: "/MeasurementDocument"
          inputParameters:
            - name: plant
              in: query
            - name: period
              in: query
          operations:
            - name: get-energy-readings
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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: dataset-refresh
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_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

Checks the last refresh status and timing of a Power BI dataset to verify data freshness for reporting and analytics teams.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status and timing of a Power BI dataset to verify data freshness for reporting and analytics teams."
  tags:
    - analytics
    - power-bi
    - reporting
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Check the last refresh status of a Power BI dataset. Returns status, start and end times, and error message if failed."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh-history"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refresh-history
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Creates a preventive maintenance work order in SAP Plant Maintenance, assigns a technician in ServiceNow, and sends a calendar invite via Microsoft Graph for scheduled maintenance windows.

naftiko: "0.5"
info:
  label: "Preventive Maintenance Scheduling"
  description: "Creates a preventive maintenance work order in SAP Plant Maintenance, assigns a technician in ServiceNow, and sends a calendar invite via Microsoft Graph for scheduled maintenance windows."
  tags:
    - maintenance
    - sap
    - servicenow
    - microsoft-outlook
    - manufacturing
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: maintenance-scheduling
      port: 8080
      tools:
        - name: schedule-preventive-maintenance
          description: "Given equipment ID, maintenance type, and scheduled date, create SAP PM order, assign in ServiceNow, and send calendar invite."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment ID."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance (e.g., calibration, inspection, overhaul)."
            - name: scheduled_date
              in: body
              type: string
              description: "Scheduled date for maintenance."
            - name: technician_upn
              in: body
              type: string
              description: "UPN of the assigned maintenance technician."
          steps:
            - name: create-pm-order
              type: call
              call: "sap.create-pm-order"
              with:
                equipment: "{{equipment_id}}"
                plant: "{{plant_code}}"
                order_type: "PM01"
                short_text: "PM: {{maintenance_type}} — {{equipment_id}}"
                scheduled_start: "{{scheduled_date}}"
            - name: create-snow-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "PM: {{maintenance_type}} for {{equipment_id}}"
                assigned_to: "{{technician_upn}}"
                scheduled_date: "{{scheduled_date}}"
                reference: "{{create-pm-order.order_number}}"
            - name: send-calendar-invite
              type: call
              call: "msgraph.create-event"
              with:
                attendee: "{{technician_upn}}"
                subject: "Preventive Maintenance: {{maintenance_type}} — {{equipment_id}}"
                start: "{{scheduled_date}}T08:00:00"
                end: "{{scheduled_date}}T12:00:00"
                body: "SAP Order: {{create-pm-order.order_number}} | Plant: {{plant_code}} | Equipment: {{equipment_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pm-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-pm-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.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: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/users/{{attendee}}/events"
          inputParameters:
            - name: attendee
              in: path
          operations:
            - name: create-event
              method: POST

When a SAP Ariba requisition exceeds a spend threshold, routes for manager approval via Workday and notifies the requestor in Microsoft Teams with approval status.

naftiko: "0.5"
info:
  label: "Procurement Approval Pipeline"
  description: "When a SAP Ariba requisition exceeds a spend threshold, routes for manager approval via Workday and notifies the requestor in Microsoft Teams with approval status."
  tags:
    - procurement
    - ariba
    - sap-ariba
    - workday
    - microsoft-teams
    - approval
    - spend-management
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: route-requisition-approval
          description: "Given an Ariba requisition ID and requestor employee ID, check the requisition amount, resolve the approver from Workday, and notify both parties in Microsoft Teams."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba requisition identifier."
            - name: requestor_employee_id
              in: body
              type: string
              description: "The Workday employee ID of the requestor."
            - name: spend_amount
              in: body
              type: number
              description: "The total spend amount on the requisition."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: get-requestor
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{requestor_employee_id}}"
            - name: get-manager
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-requestor.manager_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-manager.work_email}}"
                text: "Approval Required: Ariba requisition {{requisition_id}} from {{get-requestor.full_name}} for ${{spend_amount}}. Vendor: {{get-requisition.vendor_name}}. Please review: {{get-requisition.approval_url}}"
            - name: notify-requestor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-requestor.work_email}}"
                text: "Your requisition {{requisition_id}} (${{spend_amount}}) has been routed to {{get-manager.full_name}} for approval."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a product defect is reported from Salesforce field service, creates a Jira defect ticket, logs a SAP quality notification, and opens a ServiceNow change request for the engineering team.

naftiko: "0.5"
info:
  label: "Product Defect Tracking"
  description: "When a product defect is reported from Salesforce field service, creates a Jira defect ticket, logs a SAP quality notification, and opens a ServiceNow change request for the engineering team."
  tags:
    - quality
    - product
    - salesforce
    - jira
    - sap
    - servicenow
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: quality-management
      port: 8080
      tools:
        - name: report-product-defect
          description: "Given a Salesforce field service case ID and product number, open a Jira defect, log a SAP quality notification, and create a ServiceNow change for engineering review."
          inputParameters:
            - name: salesforce_case_id
              in: body
              type: string
              description: "The Salesforce field service case ID."
            - name: product_number
              in: body
              type: string
              description: "The SAP material/product number with the defect."
            - name: defect_description
              in: body
              type: string
              description: "Description of the product defect."
            - name: batch_number
              in: body
              type: string
              description: "The production batch number if known."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{salesforce_case_id}}"
            - name: create-jira-defect
              type: call
              call: "jira.create-issue"
              with:
                project_key: "QA"
                issuetype: "Bug"
                summary: "Product Defect: {{product_number}} — {{defect_description}}"
                description: "Customer: {{get-case.account_name}} | Batch: {{batch_number}} | Case: {{salesforce_case_id}} | Defect: {{defect_description}}"
            - name: log-sap-qn
              type: call
              call: "sap.create-quality-notification"
              with:
                material: "{{product_number}}"
                batch: "{{batch_number}}"
                short_text: "Defect: {{defect_description}}"
                notification_type: "Q1"
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Engineering review: product defect {{product_number}}"
                description: "Defect in {{product_number}} (batch {{batch_number}}). Jira: {{create-jira-defect.key}} | SAP QN: {{log-sap-qn.notification_id}}"
                category: "product_quality"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST

Coordinates a 3M product launch by publishing brand assets from Adobe Creative Cloud to SharePoint, scheduling the HubSpot email campaign, and posting launch readiness to the marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Product Launch Content Pipeline"
  description: "Coordinates a 3M product launch by publishing brand assets from Adobe Creative Cloud to SharePoint, scheduling the HubSpot email campaign, and posting launch readiness to the marketing Microsoft Teams channel."
  tags:
    - marketing
    - product-launch
    - adobe-creative-cloud
    - sharepoint
    - hubspot
    - microsoft-teams
    - content
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: execute-launch-content-pipeline
          description: "Given a product name and HubSpot campaign ID, publish approved brand assets to SharePoint, activate the HubSpot email campaign, and notify the marketing team in Teams."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The product name being launched."
            - name: hubspot_campaign_id
              in: body
              type: string
              description: "The HubSpot email campaign ID to activate."
            - name: sharepoint_library_id
              in: body
              type: string
              description: "SharePoint document library ID for brand assets."
            - name: launch_date
              in: body
              type: string
              description: "Planned launch date in YYYY-MM-DD format."
          steps:
            - name: publish-assets
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "marketing_assets_site"
                folder_path: "ProductLaunches/{{product_name}}_{{launch_date}}"
            - name: activate-campaign
              type: call
              call: "hubspot.activate-campaign"
              with:
                campaign_id: "{{hubspot_campaign_id}}"
            - name: notify-marketing
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "marketing-team@3m.com"
                text: "Launch Pipeline Complete: {{product_name}} | Launch Date: {{launch_date}} | Assets: {{publish-assets.url}} | HubSpot Campaign: {{hubspot_campaign_id}} activated."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign_id}}/activate"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: activate-campaign
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Initiates a product specification change by creating a SAP engineering change order, opening a Jira review task, and notifying the product engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Specification Change Request"
  description: "Initiates a product specification change by creating a SAP engineering change order, opening a Jira review task, and notifying the product engineering team in Microsoft Teams."
  tags:
    - engineering
    - product-development
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-engineering
      port: 8080
      tools:
        - name: request-spec-change
          description: "Given a material, change description, and justification, create SAP ECO, Jira task, and notify engineering."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number being changed."
            - name: change_description
              in: body
              type: string
              description: "Description of the specification change."
            - name: justification
              in: body
              type: string
              description: "Business justification for the change."
            - name: priority
              in: body
              type: string
              description: "Change priority: low, medium, high, critical."
          steps:
            - name: create-eco
              type: call
              call: "sap.create-change-order"
              with:
                material: "{{material_number}}"
                description: "{{change_description}}"
                reason: "{{justification}}"
                priority: "{{priority}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Task"
                summary: "Spec Change Review: {{material_number}} — {{change_description}}"
                description: "SAP ECO: {{create-eco.change_number}} | Justification: {{justification}} | Priority: {{priority}}"
                priority: "{{priority}}"
            - name: notify-engineering
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.engineering_team_id"
                channel_id: "$secrets.engineering_channel_id"
                text: "Spec Change Request: {{material_number}} | {{change_description}} | Priority: {{priority}} | SAP ECO: {{create-eco.change_number}} | Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PLM_CHANGE_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: change-orders
          path: "/EngineeringChangeOrder"
          operations:
            - name: create-change-order
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      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 the current status, quantities, and scheduling details of a SAP production order for manufacturing floor visibility.

naftiko: "0.5"
info:
  label: "Production Order Status Lookup"
  description: "Retrieves the current status, quantities, and scheduling details of a SAP production order for manufacturing floor visibility."
  tags:
    - manufacturing
    - production
    - sap
    - sap-s4hana
    - erp
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: production
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order by number. Returns status, planned and actual quantities, start and finish dates."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap.get-prod-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: planned_qty
              type: string
              mapping: "$.d.TotalPlannedQty"
            - name: actual_qty
              type: string
              mapping: "$.d.ActualQuantityDelivered"
            - name: start_date
              type: string
              mapping: "$.d.BasicStartDate"
            - name: finish_date
              type: string
              mapping: "$.d.BasicEndDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-prod-order
              method: GET
              outputRawFormat: json

Automates production shift handover by collecting output data from SAP, summarizing open issues from ServiceNow, and posting a shift report to the plant operations Teams channel.

naftiko: "0.5"
info:
  label: "Production Shift Handover"
  description: "Automates production shift handover by collecting output data from SAP, summarizing open issues from ServiceNow, and posting a shift report to the plant operations Teams channel."
  tags:
    - manufacturing
    - production
    - sap
    - servicenow
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: shift-management
      port: 8080
      tools:
        - name: generate-shift-handover
          description: "Given a plant, line, and shift period, collect production data, open issues, and post handover report."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: production_line
              in: body
              type: string
              description: "Production line identifier."
            - name: shift
              in: body
              type: string
              description: "Shift identifier (e.g., day, swing, night)."
          steps:
            - name: get-production-output
              type: call
              call: "sap.get-shift-output"
              with:
                plant: "{{plant_code}}"
                line: "{{production_line}}"
                shift: "{{shift}}"
            - name: get-open-issues
              type: call
              call: "servicenow.get-open-incidents"
              with:
                location: "{{plant_code}}"
                equipment: "{{production_line}}"
            - name: post-handover
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.plant_ops_team_id"
                channel_id: "$secrets.plant_ops_channel_id"
                text: "Shift Handover: {{production_line}} at {{plant_code}} ({{shift}}) | Output: {{get-production-output.total_qty}} units | Scrap: {{get-production-output.scrap_qty}} | Open Issues: {{get-open-issues.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PP_SHIFT_REPORT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: shift-output
          path: "/ShiftReport"
          inputParameters:
            - name: plant
              in: query
            - name: line
              in: query
            - name: shift
              in: query
          operations:
            - name: get-shift-output
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: location
              in: query
            - name: equipment
              in: query
          operations:
            - name: get-open-incidents
              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

Generates a Certificate of Analysis by pulling test results from SAP QM, formatting the document, uploading to SharePoint, and emailing it to the customer.

naftiko: "0.5"
info:
  label: "Quality Certificate Generation"
  description: "Generates a Certificate of Analysis by pulling test results from SAP QM, formatting the document, uploading to SharePoint, and emailing it to the customer."
  tags:
    - quality
    - sap
    - sharepoint
    - microsoft-outlook
    - manufacturing
    - certification
capability:
  exposes:
    - type: mcp
      namespace: quality-certs
      port: 8080
      tools:
        - name: generate-coa
          description: "Given a batch number and customer email, pull SAP QM results, upload COA to SharePoint, and email to customer."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The production batch number."
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: customer_email
              in: body
              type: string
              description: "Customer email address for the COA."
          steps:
            - name: get-test-results
              type: call
              call: "sap.get-batch-results"
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
            - name: upload-coa
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.quality_site_id"
                folder_path: "/COA/{{material_number}}"
                file_name: "COA-{{batch_number}}.pdf"
                content: "{{get-test-results.certificate_content}}"
            - name: email-customer
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{customer_email}}"
                subject: "3M Certificate of Analysis — {{material_number}} Batch {{batch_number}}"
                body: "Please find attached the Certificate of Analysis for material {{material_number}}, batch {{batch_number}}. All test parameters within specification."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_BATCH_RESULTS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batch-results
          path: "/BatchInspectionResult(Batch='{{batch}}',Material='{{material}}')"
          inputParameters:
            - name: batch
              in: path
            - name: material
              in: path
          operations:
            - name: get-batch-results
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              method: POST

Queries SAP S/4HANA for current raw material inventory levels by plant and storage location, returning available stock, reserved quantities, and reorder point status.

naftiko: "0.5"
info:
  label: "Raw Material Inventory Lookup"
  description: "Queries SAP S/4HANA for current raw material inventory levels by plant and storage location, returning available stock, reserved quantities, and reorder point status."
  tags:
    - inventory
    - manufacturing
    - sap
    - sap-s4hana
    - supply-chain
    - materials
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-raw-material-stock
          description: "Look up raw material inventory in SAP S/4HANA by material number and plant. Returns available stock, reserved quantity, and reorder point."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the raw material."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
          call: "sap.get-material-stock"
          with:
            material_number: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: available_qty
              type: string
              mapping: "$.d.AvailableQuantity"
            - name: reserved_qty
              type: string
              mapping: "$.d.ReservedQuantity"
            - name: reorder_point
              type: string
              mapping: "$.d.ReorderPoint"
            - name: unit_of_measure
              type: string
              mapping: "$.d.BaseUnitOfMeasure"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MaterialStock(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET
              outputRawFormat: json

Captures R&D experiment results by logging data in Snowflake, updating the Jira research ticket, and archiving the experiment report in SharePoint for knowledge retention.

naftiko: "0.5"
info:
  label: "R&D Experiment Log Capture"
  description: "Captures R&D experiment results by logging data in Snowflake, updating the Jira research ticket, and archiving the experiment report in SharePoint for knowledge retention."
  tags:
    - research
    - innovation
    - snowflake
    - jira
    - sharepoint
    - data-science
capability:
  exposes:
    - type: mcp
      namespace: rd-experiments
      port: 8080
      tools:
        - name: log-experiment
          description: "Given experiment details, log results in Snowflake, update Jira, and archive report in SharePoint."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "Unique experiment identifier."
            - name: jira_key
              in: body
              type: string
              description: "The Jira R&D issue key."
            - name: result_summary
              in: body
              type: string
              description: "Summary of experiment results."
            - name: technology_area
              in: body
              type: string
              description: "Technology area (e.g., adhesives, abrasives, films)."
          steps:
            - name: log-to-snowflake
              type: call
              call: "snowflake.run-query"
              with:
                statement: "INSERT INTO RD.EXPERIMENT_LOG VALUES ('{{experiment_id}}', '{{jira_key}}', '{{result_summary}}', '{{technology_area}}', CURRENT_TIMESTAMP())"
                warehouse: "RD_WH"
            - name: update-jira
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{jira_key}}"
                body: "Experiment {{experiment_id}} completed. Results: {{result_summary}}"
            - name: archive-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.rd_site_id"
                folder_path: "/Experiments/{{technology_area}}"
                file_name: "{{experiment_id}}-report.json"
                content: "{{result_summary}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Extracts financial and operational data from SAP S/4HANA into Snowflake, runs compliance aggregations via Azure Data Factory, and publishes the result to a Power BI dataset for regulatory reporting.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Reporting Pipeline"
  description: "Extracts financial and operational data from SAP S/4HANA into Snowflake, runs compliance aggregations via Azure Data Factory, and publishes the result to a Power BI dataset for regulatory reporting."
  tags:
    - compliance
    - finance
    - reporting
    - sap
    - snowflake
    - azure-data-factory
    - power-bi
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: run-compliance-report
          description: "Trigger a regulatory compliance data pipeline: extract from SAP, load to Snowflake, refresh via Azure Data Factory, and push results to Power BI."
          inputParameters:
            - name: report_period
              in: body
              type: string
              description: "The reporting period in YYYY-MM format (e.g., 2025-03)."
            - name: report_type
              in: body
              type: string
              description: "The regulatory report type (e.g., sox_controls, ehs_emissions, product_safety)."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code for the reporting entity."
          steps:
            - name: extract-sap-data
              type: call
              call: "sap.get-financial-posting"
              with:
                company_code: "{{company_code}}"
                period: "{{report_period}}"
            - name: trigger-adf-pipeline
              type: call
              call: "azure-data-factory.run-pipeline"
              with:
                pipeline_name: "compliance-{{report_type}}"
                parameters: "period={{report_period}},company={{company_code}}"
            - name: refresh-powerbi-dataset
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_name: "compliance-{{report_type}}-{{report_period}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FAC_GL_ITEMS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: financial-postings
          path: "/A_JournalEntry"
          inputParameters:
            - name: company_code
              in: query
            - name: period
              in: query
          operations:
            - name: get-financial-posting
              method: GET
    - type: http
      namespace: azure-data-factory
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DataFactory/factories/{{factory_name}}"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: pipeline-runs
          path: "/pipelines/{{pipeline_name}}/createRun"
          inputParameters:
            - name: pipeline_name
              in: path
          operations:
            - name: run-pipeline
              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_name}}/refreshes"
          inputParameters:
            - name: dataset_name
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Assigns mandatory safety training in Workday Learning, creates a tracking record in ServiceNow, and sends a completion deadline reminder to the employee and their manager in Teams.

naftiko: "0.5"
info:
  label: "Safety Training Assignment"
  description: "Assigns mandatory safety training in Workday Learning, creates a tracking record in ServiceNow, and sends a completion deadline reminder to the employee and their manager in Teams."
  tags:
    - safety
    - training
    - workday
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-training
      port: 8080
      tools:
        - name: assign-safety-training
          description: "Given an employee ID, training course, and deadline, assign in Workday, track in ServiceNow, and notify via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: course_id
              in: body
              type: string
              description: "The Workday Learning course ID."
            - name: deadline
              in: body
              type: string
              description: "Completion deadline date."
            - name: employee_upn
              in: body
              type: string
              description: "Microsoft UPN of the employee."
          steps:
            - name: assign-course
              type: call
              call: "workday.assign-learning"
              with:
                employee_id: "{{employee_id}}"
                course_id: "{{course_id}}"
                due_date: "{{deadline}}"
            - name: create-tracking-record
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Safety training due: {{course_id}} for {{employee_id}}"
                assigned_to: "{{employee_upn}}"
                due_date: "{{deadline}}"
                category: "safety_training"
            - name: notify-employee
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{employee_upn}}"
                text: "You have been assigned mandatory safety training: {{course_id}}. Please complete by {{deadline}}. ServiceNow: {{create-tracking-record.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/3m"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/learningAssignments"
          operations:
            - name: assign-learning
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.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: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

Pulls the current Salesforce sales forecast by region, writes the data into SAP Business Warehouse for planning, and refreshes the Power BI sales leadership dashboard.

naftiko: "0.5"
info:
  label: "Sales Forecast Sync"
  description: "Pulls the current Salesforce sales forecast by region, writes the data into SAP Business Warehouse for planning, and refreshes the Power BI sales leadership dashboard."
  tags:
    - sales
    - forecasting
    - salesforce
    - sap
    - sap-bw
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-planning
      port: 8080
      tools:
        - name: sync-sales-forecast
          description: "Pull Salesforce opportunity forecast for a region and period, load into SAP BW, and refresh the Power BI sales dashboard."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Sales region (e.g., APAC, EMEA, Americas)."
            - name: forecast_period
              in: body
              type: string
              description: "Forecast period in YYYY-MM format."
          steps:
            - name: get-forecast
              type: call
              call: "salesforce.get-forecast"
              with:
                region: "{{region}}"
                period: "{{forecast_period}}"
            - name: load-bw
              type: call
              call: "sap-bw.load-forecast-data"
              with:
                region: "{{region}}"
                period: "{{forecast_period}}"
                amount: "{{get-forecast.forecast_amount}}"
                currency: "{{get-forecast.currency}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_name: "sales-forecast-{{region}}-{{forecast_period}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: forecasts
          path: "/query"
          inputParameters:
            - name: region
              in: query
            - name: period
              in: query
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: sap-bw
      baseUri: "https://3m-bw.sap.com/sap/opu/odata/sap/ZBWFORECAST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: forecast-data
          path: "/ForecastSet"
          operations:
            - name: load-forecast-data
              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_name}}/refreshes"
          inputParameters:
            - name: dataset_name
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When a qualifying LinkedIn signal occurs, enriches the Salesforce contact record with current profile data, syncs to HubSpot, and alerts the owning sales rep in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sales Lead Enrichment"
  description: "When a qualifying LinkedIn signal occurs, enriches the Salesforce contact record with current profile data, syncs to HubSpot, and alerts the owning sales rep in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - hubspot
    - linkedin
    - microsoft-teams
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-lead-from-linkedin
          description: "Given a LinkedIn member URN and Salesforce contact ID, enrich the Salesforce record, sync to HubSpot, and notify the owning rep in Microsoft Teams."
          inputParameters:
            - name: linkedin_member_urn
              in: body
              type: string
              description: "The LinkedIn member URN for the contact."
            - name: salesforce_contact_id
              in: body
              type: string
              description: "The Salesforce contact record ID to enrich."
            - name: signal_type
              in: body
              type: string
              description: "The LinkedIn signal type (e.g., job_change, content_share, profile_view)."
            - name: rep_upn
              in: body
              type: string
              description: "The Microsoft UPN of the owning sales rep."
          steps:
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-profile"
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: update-salesforce
              type: call
              call: "salesforce.update-contact"
              with:
                contact_id: "{{salesforce_contact_id}}"
                title: "{{get-linkedin-profile.headline}}"
                company: "{{get-linkedin-profile.current_company}}"
                linkedin_url: "{{get-linkedin-profile.profile_url}}"
            - name: sync-hubspot
              type: call
              call: "hubspot.update-contact"
              with:
                email: "{{update-salesforce.email}}"
                jobtitle: "{{get-linkedin-profile.headline}}"
                company: "{{get-linkedin-profile.current_company}}"
                hs_lead_status: "OPEN_DEAL"
            - name: alert-rep
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{rep_upn}}"
                text: "Warm Lead Signal: {{get-linkedin-profile.first_name}} {{get-linkedin-profile.last_name}} | Signal: {{signal_type}} | Title: {{get-linkedin-profile.headline}} | Company: {{get-linkedin-profile.current_company}} | Salesforce updated."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: update-contact
              method: PATCH
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: update-contact
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce account record by ID, returning account name, industry, annual revenue, and account owner for sales and customer operations.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves a Salesforce account record by ID, returning account name, industry, annual revenue, and account owner for sales and customer operations."
  tags:
    - sales
    - salesforce
    - crm
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up a Salesforce account by account ID. Returns name, industry, revenue, owner, and billing country."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: annual_revenue
              type: string
              mapping: "$.AnnualRevenue"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves a procurement contract from SAP Ariba by contract ID, returning status, expiry date, supplier, and contract value for strategic sourcing.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Lookup"
  description: "Retrieves a procurement contract from SAP Ariba by contract ID, returning status, expiry date, supplier, and contract value for strategic sourcing."
  tags:
    - procurement
    - sap-ariba
    - contract-management
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: sourcing
      port: 8080
      tools:
        - name: get-contract
          description: "Look up an SAP Ariba contract by contract ID. Returns status, supplier, value, and expiry date."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP Ariba contract ID."
          call: "ariba.get-contract"
          with:
            contract_id: "{{contract_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: supplier
              type: string
              mapping: "$.Supplier.Name"
            - name: contract_value
              type: string
              mapping: "$.Amount.Amount"
            - name: expiry_date
              type: string
              mapping: "$.ExpirationDate"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-compliance/v1/prod"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      inputParameters:
        - name: apiKey
          in: header
          value: "$secrets.ariba_api_key"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET

Retrieves the bill of materials for a finished good from SAP S/4HANA, returning component list, quantities, and assembly details for manufacturing engineering.

naftiko: "0.5"
info:
  label: "SAP Bill of Materials Lookup"
  description: "Retrieves the bill of materials for a finished good from SAP S/4HANA, returning component list, quantities, and assembly details for manufacturing engineering."
  tags:
    - manufacturing
    - bom
    - sap
    - sap-s4hana
    - engineering
    - materials
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-engineering
      port: 8080
      tools:
        - name: get-bom
          description: "Look up a SAP bill of materials by material number and plant. Returns component list with quantities and units."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP finished good material number."
            - name: plant_code
              in: body
              type: string
              description: "The 3M manufacturing plant code."
          call: "sap.get-bom"
          with:
            material_number: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: bom_number
              type: string
              mapping: "$.d.BillOfMaterial"
            - name: components
              type: string
              mapping: "$.d.to_BillOfMaterialItem.results"
            - name: base_quantity
              type: string
              mapping: "$.d.BOMHeaderBaseQuantity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bom
          path: "/MaterialBOM(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-bom
              method: GET
              outputRawFormat: json

Posts a goods receipt in SAP against a purchase order, triggers a three-way match check, and notifies accounts payable in Microsoft Teams if discrepancies are found.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Processing"
  description: "Posts a goods receipt in SAP against a purchase order, triggers a three-way match check, and notifies accounts payable in Microsoft Teams if discrepancies are found."
  tags:
    - supply-chain
    - procurement
    - sap
    - sap-s4hana
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: goods-receipt
      port: 8080
      tools:
        - name: process-goods-receipt
          description: "Given a PO number, material, and received quantity, post goods receipt in SAP and notify AP of any discrepancies."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: material_number
              in: body
              type: string
              description: "The material number received."
            - name: received_quantity
              in: body
              type: string
              description: "Quantity actually received."
            - name: storage_location
              in: body
              type: string
              description: "Storage location for the received goods."
          steps:
            - name: post-goods-receipt
              type: call
              call: "sap.post-gr"
              with:
                po_number: "{{po_number}}"
                material: "{{material_number}}"
                quantity: "{{received_quantity}}"
                storage_location: "{{storage_location}}"
            - name: check-three-way-match
              type: call
              call: "sap.check-invoice-match"
              with:
                po_number: "{{po_number}}"
                gr_document: "{{post-goods-receipt.document_number}}"
            - name: notify-ap
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.ap_team_id"
                channel_id: "$secrets.ap_channel_id"
                text: "Goods Receipt posted: PO {{po_number}} | Material: {{material_number}} | Qty: {{received_quantity}} | GR Doc: {{post-goods-receipt.document_number}} | Match Status: {{check-three-way-match.match_status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_GOODS_RECEIPT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-receipts
          path: "/GoodsReceipt"
          operations:
            - name: post-gr
              method: POST
        - name: invoice-match
          path: "/ThreeWayMatch(PO='{{po_number}}',GR='{{gr_document}}')"
          inputParameters:
            - name: po_number
              in: path
            - name: gr_document
              in: path
          operations:
            - name: check-invoice-match
              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

When a SAP master data record is created or changed, routes the record for approval via ServiceNow, and notifies the responsible data steward in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Master Data Governance Alert"
  description: "When a SAP master data record is created or changed, routes the record for approval via ServiceNow, and notifies the responsible data steward in Microsoft Teams."
  tags:
    - master-data
    - sap
    - data-governance
    - servicenow
    - microsoft-teams
    - erp
capability:
  exposes:
    - type: mcp
      namespace: mdg
      port: 8080
      tools:
        - name: route-master-data-approval
          description: "Given a SAP master data record type, ID, and change type, create a ServiceNow approval task and notify the data steward in Teams."
          inputParameters:
            - name: record_type
              in: body
              type: string
              description: "Master data type (material, vendor, customer)."
            - name: record_id
              in: body
              type: string
              description: "The SAP master data record ID."
            - name: change_type
              in: body
              type: string
              description: "Change type (create, update, block, delete)."
            - name: data_steward_upn
              in: body
              type: string
              description: "Microsoft UPN of the responsible data steward."
          steps:
            - name: create-approval-task
              type: call
              call: "servicenow-mdg.create-task"
              with:
                short_description: "MDG approval: {{change_type}} {{record_type}} {{record_id}}"
                description: "Record: {{record_id}} ({{record_type}}) | Change: {{change_type}}"
                category: "master_data_governance"
                assigned_to: "{{data_steward_upn}}"
            - name: notify-steward
              type: call
              call: "msteams-mdg.send-message"
              with:
                recipient_upn: "{{data_steward_upn}}"
                text: "MDG Review Required: {{change_type}} on {{record_type}} {{record_id}} | ServiceNow: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: servicenow-mdg
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-mdg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items. Used by procurement and finance teams to check PO health without logging into SAP.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items. Used by procurement and finance teams to check PO health without logging into SAP."
  tags:
    - procurement
    - erp
    - sap
    - sap-s4hana
    - purchase-order
    - finance
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (10-digit)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Retrieves a quality inspection lot from SAP QM by lot number, returning inspection results, usage decision, and defect counts for quality assurance teams.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves a quality inspection lot from SAP QM by lot number, returning inspection results, usage decision, and defect counts for quality assurance teams."
  tags:
    - quality
    - sap
    - sap-s4hana
    - inspection
    - manufacturing
    - quality-control
capability:
  exposes:
    - type: mcp
      namespace: quality-inspection
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Look up a SAP quality inspection lot by number. Returns usage decision, inspection result, and defect count."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: "sap.get-inspection-lot"
          with:
            lot_number: "{{lot_number}}"
          outputParameters:
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
            - name: inspection_result
              type: string
              mapping: "$.d.InspectionResult"
            - name: defect_count
              type: string
              mapping: "$.d.NumberOfDefects"
            - name: material
              type: string
              mapping: "$.d.Material"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_LOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/InspectionLot('{{lot_number}}')"
          inputParameters:
            - name: lot_number
              in: path
          operations:
            - name: get-inspection-lot
              method: GET
              outputRawFormat: json

Promotes a SAP transport request through the landscape by triggering the release in SAP, logging the change in ServiceNow, and notifying the SAP Basis team in Teams.

naftiko: "0.5"
info:
  label: "SAP Transport Request Promotion"
  description: "Promotes a SAP transport request through the landscape by triggering the release in SAP, logging the change in ServiceNow, and notifying the SAP Basis team in Teams."
  tags:
    - sap
    - sap-s4hana
    - servicenow
    - microsoft-teams
    - change-management
    - development
capability:
  exposes:
    - type: mcp
      namespace: sap-transport
      port: 8080
      tools:
        - name: promote-transport
          description: "Given a transport number and target system, release the transport, log in ServiceNow, and notify SAP Basis."
          inputParameters:
            - name: transport_number
              in: body
              type: string
              description: "The SAP transport request number."
            - name: target_system
              in: body
              type: string
              description: "Target system (e.g., QAS, PRD)."
            - name: change_ticket
              in: body
              type: string
              description: "ServiceNow change ticket number."
          steps:
            - name: release-transport
              type: call
              call: "sap.release-transport"
              with:
                transport: "{{transport_number}}"
                target: "{{target_system}}"
            - name: update-change-ticket
              type: call
              call: "servicenow.update-change"
              with:
                change_number: "{{change_ticket}}"
                work_notes: "Transport {{transport_number}} released to {{target_system}}. Status: {{release-transport.status}}"
            - name: notify-basis
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.sap_basis_team_id"
                channel_id: "$secrets.sap_basis_channel_id"
                text: "Transport {{transport_number}} released to {{target_system}} | Change: {{change_ticket}} | Status: {{release-transport.status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/CTS_TRANSPORT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transports
          path: "/Transport('{{transport}}')/Release"
          inputParameters:
            - name: transport
              in: path
          operations:
            - name: release-transport
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: update-change
              method: PATCH
    - 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 vendor master data from SAP S/4HANA by vendor number, returning company name, payment terms, currency, and purchasing organization details.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number, returning company name, payment terms, currency, and purchasing organization details."
  tags:
    - procurement
    - vendor
    - sap
    - sap-s4hana
    - master-data
capability:
  exposes:
    - type: mcp
      namespace: vendor-management
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up SAP vendor master data by vendor number. Returns company name, payment terms, and purchasing organization."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor account number."
          call: "sap.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET
              outputRawFormat: json

Monitors scrap rates by querying SAP production data, analyzing trends in Snowflake, and alerting the plant manager in Teams when thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Scrap Rate Monitoring"
  description: "Monitors scrap rates by querying SAP production data, analyzing trends in Snowflake, and alerting the plant manager in Teams when thresholds are exceeded."
  tags:
    - manufacturing
    - quality
    - sap
    - snowflake
    - microsoft-teams
    - production
capability:
  exposes:
    - type: mcp
      namespace: production-monitoring
      port: 8080
      tools:
        - name: check-scrap-rate
          description: "Given a production line and period, check scrap rate against threshold and alert if exceeded."
          inputParameters:
            - name: production_line
              in: body
              type: string
              description: "The production line identifier."
            - name: plant_code
              in: body
              type: string
              description: "The 3M plant code."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-03)."
            - name: threshold_pct
              in: body
              type: string
              description: "Scrap rate threshold percentage."
          steps:
            - name: get-scrap-data
              type: call
              call: "sap.get-production-scrap"
              with:
                line: "{{production_line}}"
                plant: "{{plant_code}}"
                period: "{{period}}"
            - name: analyze-trend
              type: call
              call: "snowflake.run-query"
              with:
                statement: "CALL MANUFACTURING.ANALYZE_SCRAP_TREND('{{production_line}}', '{{plant_code}}', '{{period}}')"
                warehouse: "MANUFACTURING_WH"
            - name: alert-plant-manager
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.plant_ops_team_id"
                channel_id: "$secrets.plant_ops_channel_id"
                text: "Scrap Rate Report: Line {{production_line}} at {{plant_code}} ({{period}}) | Current: {{get-scrap-data.scrap_rate}}% | Threshold: {{threshold_pct}}% | Trend: {{analyze-trend.trend_direction}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/PP_SCRAP_ANALYSIS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: scrap-data
          path: "/ProductionScrap"
          inputParameters:
            - name: line
              in: query
            - name: plant
              in: query
            - name: period
              in: query
          operations:
            - name: get-production-scrap
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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 Safety Data Sheet from SAP EHS, uploads it to SharePoint, and distributes a notification to affected plant safety coordinators via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SDS Document Distribution"
  description: "Retrieves a Safety Data Sheet from SAP EHS, uploads it to SharePoint, and distributes a notification to affected plant safety coordinators via Microsoft Teams."
  tags:
    - safety
    - ehs
    - sap
    - sharepoint
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: ehs-documents
      port: 8080
      tools:
        - name: distribute-sds
          description: "Given a material number, retrieve the SDS from SAP, upload to SharePoint, and notify plant safety coordinators."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: revision_reason
              in: body
              type: string
              description: "Reason for the SDS revision."
          steps:
            - name: get-sds
              type: call
              call: "sap.get-sds-document"
              with:
                material: "{{material_number}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.ehs_site_id"
                folder_path: "/SDS/{{material_number}}"
                file_name: "SDS-{{material_number}}-latest.pdf"
                content: "{{get-sds.document_content}}"
            - name: notify-safety-coordinators
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.safety_team_id"
                channel_id: "$secrets.safety_sds_channel_id"
                text: "Updated SDS for {{material_number}} now available on SharePoint. Reason: {{revision_reason}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/EHS_SDS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sds-documents
          path: "/SafetyDataSheet(Material='{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-sds-document
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - 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 Dependabot or SonarQube alert fires, enriches the finding with Datadog service context, opens a Jira security ticket, and routes a ServiceNow change request for high-severity vulnerabilities.

naftiko: "0.5"
info:
  label: "Security Vulnerability Triage"
  description: "When a GitHub Dependabot or SonarQube alert fires, enriches the finding with Datadog service context, opens a Jira security ticket, and routes a ServiceNow change request for high-severity vulnerabilities."
  tags:
    - security
    - devsecops
    - github
    - datadog
    - jira
    - servicenow
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-vulnerability
          description: "Given a GitHub vulnerability alert (Dependabot or SonarQube), fetch Datadog service metadata, open a Jira security ticket, and for CVSS >= 7.0 also open a ServiceNow change request."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: alert_number
              in: body
              type: string
              description: "The GitHub Dependabot or code scanning alert number."
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier (e.g., CVE-2024-12345)."
            - name: cvss_score
              in: body
              type: number
              description: "The CVSS score of the vulnerability (0.0–10.0)."
            - name: affected_package
              in: body
              type: string
              description: "The name of the affected library or package."
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name associated with this repository."
          steps:
            - name: get-service-context
              type: call
              call: "datadog.get-service"
              with:
                service_name: "{{service_name}}"
            - name: create-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Security Vulnerability"
                summary: "[{{cve_id}}] {{affected_package}} in {{repository}} — CVSS {{cvss_score}}"
                description: "CVE: {{cve_id}}\nRepo: {{repository}}\nAlert: {{alert_number}}\nPackage: {{affected_package}}\nCVSS: {{cvss_score}}\nService owner: {{get-service-context.team}}"
                priority: "High"
            - name: open-change-request
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Security patch: {{cve_id}} in {{affected_package}} ({{repository}})"
                description: "High-severity vulnerability {{cve_id}} (CVSS {{cvss_score}}) found in {{affected_package}}. Jira: {{create-jira-ticket.key}}. Service: {{service_name}} owned by {{get-service-context.team}}."
                category: "security_patch"
                risk: "moderate"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/services/definitions/{{service_name}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST

Retrieves a ServiceNow incident record by number, returning priority, state, assigned group, and resolution notes for IT support teams.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident record by number, returning priority, state, assigned group, and resolution notes for IT support teams."
  tags:
    - it-service
    - servicenow
    - incident
    - support
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns priority, state, assignment group, and short description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: incident_number
              in: query
              value: "number={{incident_number}}"
          operations:
            - name: get-incident
              method: GET

Generates shipping labels by retrieving order details from SAP, creating a shipment in Oracle TMS, and posting the tracking information to the Salesforce opportunity record.

naftiko: "0.5"
info:
  label: "Shipping Label Generation"
  description: "Generates shipping labels by retrieving order details from SAP, creating a shipment in Oracle TMS, and posting the tracking information to the Salesforce opportunity record."
  tags:
    - logistics
    - shipping
    - sap
    - oracle
    - salesforce
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: shipping
      port: 8080
      tools:
        - name: generate-shipping-label
          description: "Given an order number, create shipment, generate label, and update Salesforce with tracking."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP sales order number."
            - name: salesforce_opportunity_id
              in: body
              type: string
              description: "Linked Salesforce opportunity ID."
          steps:
            - name: get-order-details
              type: call
              call: "sap.get-delivery"
              with:
                order_number: "{{order_number}}"
            - name: create-shipment
              type: call
              call: "oracle-tms.create-shipment"
              with:
                origin: "{{get-order-details.shipping_plant}}"
                destination: "{{get-order-details.ship_to_address}}"
                weight: "{{get-order-details.total_weight}}"
                reference: "{{order_number}}"
            - name: update-salesforce
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{salesforce_opportunity_id}}"
                tracking_number: "{{create-shipment.tracking_number}}"
                ship_date: "{{create-shipment.ship_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/SD_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutboundDelivery('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: oracle-tms
      baseUri: "https://3m-ebs.oracle.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: shipments
          path: "/shipments"
          operations:
            - name: create-shipment
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

When a Snowflake data quality check fails (row count anomaly, null threshold breach, or schema drift), logs the failure to Datadog, opens a Jira data quality ticket, and notifies the data engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert"
  description: "When a Snowflake data quality check fails (row count anomaly, null threshold breach, or schema drift), logs the failure to Datadog, opens a Jira data quality ticket, and notifies the data engineering team in Microsoft Teams."
  tags:
    - data-quality
    - snowflake
    - datadog
    - jira
    - microsoft-teams
    - data-engineering
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: handle-data-quality-failure
          description: "Given a Snowflake table and data quality check failure type, log to Datadog, open a Jira ticket, and notify the data team in Teams."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully-qualified Snowflake table name (database.schema.table)."
            - name: check_type
              in: body
              type: string
              description: "Type of check that failed (row_count, null_threshold, schema_drift, duplicate_key)."
            - name: expected_value
              in: body
              type: string
              description: "Expected value or threshold."
            - name: actual_value
              in: body
              type: string
              description: "Actual observed value."
            - name: data_domain
              in: body
              type: string
              description: "Business data domain (finance, hr, supply_chain, etc.)."
          steps:
            - name: log-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Data Quality Failure: {{check_type}} on {{table_name}}"
                text: "Expected: {{expected_value}} | Actual: {{actual_value}} | Domain: {{data_domain}}"
                alert_type: "error"
                tags: "data_quality:{{check_type}},domain:{{data_domain}}"
            - name: open-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Data Quality: {{check_type}} failure on {{table_name}}"
                description: "Table: {{table_name}}\nCheck: {{check_type}}\nExpected: {{expected_value}}\nActual: {{actual_value}}\nDomain: {{data_domain}}\nDatadog: {{log-datadog.url}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "data-engineering@3m.com"
                text: "Data Quality Failure: {{check_type}} on {{table_name}} | Expected: {{expected_value}} | Actual: {{actual_value}} | Jira: {{open-jira-ticket.key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Submits a SQL query to 3M's Snowflake data warehouse and returns the result set for ad-hoc analytics and data exploration.

naftiko: "0.5"
info:
  label: "Snowflake Query Execution"
  description: "Submits a SQL query to 3M's Snowflake data warehouse and returns the result set for ad-hoc analytics and data exploration."
  tags:
    - analytics
    - snowflake
    - data-warehouse
    - sql
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: run-query
          description: "Execute a SQL query against the 3M Snowflake data warehouse. Returns the result set as JSON rows."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL query to execute."
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse to use (e.g., ANALYTICS_WH)."
          call: "snowflake.submit-query"
          with:
            statement: "{{sql_statement}}"
            warehouse: "{{warehouse}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://3m.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: submit-query
              method: POST

Aggregates 3M content performance from LinkedIn and Meta, pushes the combined metrics to HubSpot campaign records, and posts a weekly digest to the social media Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Social Media Performance Digest"
  description: "Aggregates 3M content performance from LinkedIn and Meta, pushes the combined metrics to HubSpot campaign records, and posts a weekly digest to the social media Microsoft Teams channel."
  tags:
    - marketing
    - social-media
    - linkedin
    - meta
    - hubspot
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-media
      port: 8080
      tools:
        - name: digest-social-performance
          description: "Pull post engagement from LinkedIn and Meta for a given campaign ID, update HubSpot, and post a digest to Teams."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Campaign identifier shared across LinkedIn, Meta, and HubSpot."
            - name: date_range
              in: body
              type: string
              description: "Reporting date range in YYYY-MM-DD/YYYY-MM-DD format."
          steps:
            - name: get-linkedin-stats
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                campaign_id: "{{campaign_id}}"
                date_range: "{{date_range}}"
            - name: get-meta-stats
              type: call
              call: "meta.get-campaign-insights"
              with:
                campaign_id: "{{campaign_id}}"
                date_preset: "{{date_range}}"
            - name: update-hubspot-campaign
              type: call
              call: "hubspot.update-campaign"
              with:
                campaign_id: "{{campaign_id}}"
                linkedin_impressions: "{{get-linkedin-stats.impressions}}"
                linkedin_clicks: "{{get-linkedin-stats.clicks}}"
                meta_reach: "{{get-meta-stats.reach}}"
                meta_engagement: "{{get-meta-stats.engagement}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "social-media@3m.com"
                text: "Social Digest ({{date_range}}): LinkedIn — {{get-linkedin-stats.impressions}} impressions, {{get-linkedin-stats.clicks}} clicks | Meta — {{get-meta-stats.reach}} reach, {{get-meta-stats.engagement}} engagements | HubSpot updated."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalytics"
          inputParameters:
            - name: campaign_id
              in: query
            - name: date_range
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_access_token"
      resources:
        - name: campaign-insights
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
            - name: date_preset
              in: query
          operations:
            - name: get-campaign-insights
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a SonarQube quality gate fails on a pull request, posts a quality report comment to the GitHub PR, opens a Jira engineering task, and notifies the team in Teams.

naftiko: "0.5"
info:
  label: "SonarQube Code Quality Gate Failure"
  description: "When a SonarQube quality gate fails on a pull request, posts a quality report comment to the GitHub PR, opens a Jira engineering task, and notifies the team in Teams."
  tags:
    - code-quality
    - sonarqube
    - github
    - jira
    - microsoft-teams
    - devsecops
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: handle-quality-gate-failure
          description: "Given a SonarQube project and GitHub PR number, post the quality report as a PR comment, open a Jira task, and alert the team in Teams."
          inputParameters:
            - name: sonarqube_project_key
              in: body
              type: string
              description: "The SonarQube project key."
            - name: github_repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: string
              description: "The GitHub pull request number."
            - name: failed_conditions
              in: body
              type: string
              description: "Description of the failed gate conditions."
          steps:
            - name: get-sonar-report
              type: call
              call: "sonarqube-cq.get-project-status"
              with:
                project_key: "{{sonarqube_project_key}}"
            - name: post-pr-comment
              type: call
              call: "github-cq.create-pr-comment"
              with:
                repository: "{{github_repo}}"
                pr_number: "{{pr_number}}"
                body: "SonarQube Quality Gate FAILED\n\nConditions: {{failed_conditions}}\nBugs: {{get-sonar-report.bugs}} | Vulnerabilities: {{get-sonar-report.vulnerabilities}} | Coverage: {{get-sonar-report.coverage}}%"
            - name: open-jira
              type: call
              call: "jira-cq.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Task"
                summary: "Quality gate failure: {{sonarqube_project_key}} PR #{{pr_number}}"
                description: "Failed: {{failed_conditions}}\nBugs: {{get-sonar-report.bugs}}\nVulnerabilities: {{get-sonar-report.vulnerabilities}}\nCoverage: {{get-sonar-report.coverage}}%"
  consumes:
    - type: http
      namespace: sonarqube-cq
      baseUri: "https://3m-sonar.internal/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: project-status
          path: "/qualitygates/project_status"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-project-status
              method: GET
    - type: http
      namespace: github-cq
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-comments
          path: "/repos/{{repository}}/issues/{{pr_number}}/comments"
          inputParameters:
            - name: repository
              in: path
            - name: pr_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST
    - type: http
      namespace: jira-cq
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a supplier delivery is delayed, updates the SAP purchase order schedule, creates a ServiceNow case for procurement follow-up, and notifies the category manager in Teams.

naftiko: "0.5"
info:
  label: "Supplier Delivery Delay Escalation"
  description: "When a supplier delivery is delayed, updates the SAP purchase order schedule, creates a ServiceNow case for procurement follow-up, and notifies the category manager in Teams."
  tags:
    - supply-chain
    - procurement
    - sap
    - servicenow
    - microsoft-teams
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-escalation
      port: 8080
      tools:
        - name: escalate-delivery-delay
          description: "Given a PO number, new estimated delivery date, and delay reason, update SAP schedule, create a ServiceNow case, and notify the category manager."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: new_delivery_date
              in: body
              type: string
              description: "The revised estimated delivery date."
            - name: delay_reason
              in: body
              type: string
              description: "Reason provided by the supplier for the delay."
            - name: category_manager_upn
              in: body
              type: string
              description: "Microsoft UPN of the procurement category manager."
          steps:
            - name: update-po-schedule
              type: call
              call: "sap.update-po-delivery"
              with:
                po_number: "{{po_number}}"
                delivery_date: "{{new_delivery_date}}"
                note: "Supplier delay: {{delay_reason}}"
            - name: create-procurement-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Supplier Delivery Delay: PO {{po_number}}"
                description: "PO {{po_number}} delayed to {{new_delivery_date}}. Reason: {{delay_reason}}"
                category: "procurement"
                priority: "2"
            - name: notify-category-manager
              type: call
              call: "msteams.send-chat"
              with:
                recipient_upn: "{{category_manager_upn}}"
                text: "Supplier Delay on PO {{po_number}} | New ETA: {{new_delivery_date}} | Reason: {{delay_reason}} | ServiceNow: {{create-procurement-case.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-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: update-po-delivery
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-chat
              method: POST

Pulls a supplier profile from SAP Ariba, enriches it with ZoomInfo firmographic data, scores risk, and creates a ServiceNow vendor risk review task for the procurement team.

naftiko: "0.5"
info:
  label: "Supplier Risk Assessment"
  description: "Pulls a supplier profile from SAP Ariba, enriches it with ZoomInfo firmographic data, scores risk, and creates a ServiceNow vendor risk review task for the procurement team."
  tags:
    - procurement
    - vendor-risk
    - sap-ariba
    - zoominfo
    - servicenow
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-supplier-risk
          description: "Given an Ariba supplier ID and company name, enrich with ZoomInfo data, compute a risk tier, and open a ServiceNow vendor risk task."
          inputParameters:
            - name: ariba_supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: company_name
              in: body
              type: string
              description: "Legal company name for ZoomInfo enrichment."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{ariba_supplier_id}}"
            - name: enrich-firmographics
              type: call
              call: "zoominfo.get-company"
              with:
                company_name: "{{company_name}}"
            - name: create-risk-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Vendor risk review: {{company_name}}"
                description: "Supplier: {{ariba_supplier_id}} | Revenue: {{enrich-firmographics.revenue}} | Employees: {{enrich-firmographics.employee_count}} | Country: {{get-supplier.country}} | Status: {{get-supplier.qualification_status}}"
                category: "vendor_risk"
                assigned_group: "Procurement_Risk"
  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
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          inputParameters:
            - name: company_name
              in: query
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Looks up a supply chain order across SAP S/4HANA and Oracle E-Business Suite, reconciles inventory and delivery status, and surfaces consolidated status to Salesforce customer-facing records.

naftiko: "0.5"
info:
  label: "Supply Chain Order Status"
  description: "Looks up a supply chain order across SAP S/4HANA and Oracle E-Business Suite, reconciles inventory and delivery status, and surfaces consolidated status to Salesforce customer-facing records."
  tags:
    - supply-chain
    - erp
    - sap
    - oracle
    - salesforce
    - order-management
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-order-status
          description: "Look up a customer order across SAP and Oracle EBS, return consolidated fulfillment status, inventory availability, and estimated delivery date."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The customer order number, present in both SAP and Oracle EBS."
            - name: salesforce_opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID linked to this order."
          steps:
            - name: get-sap-order
              type: call
              call: "sap.get-sales-order"
              with:
                order_number: "{{order_number}}"
            - name: get-oracle-inventory
              type: call
              call: "oracle-ebs.get-inventory-status"
              with:
                item_number: "{{get-sap-order.material_number}}"
                warehouse: "{{get-sap-order.shipping_plant}}"
            - name: update-salesforce-opportunity
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{salesforce_opportunity_id}}"
                delivery_date: "{{get-sap-order.requested_delivery_date}}"
                fulfillment_status: "{{get-sap-order.overall_status}}"
                available_stock: "{{get-oracle-inventory.available_qty}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
              outputRawFormat: json
    - type: http
      namespace: oracle-ebs
      baseUri: "https://3m-ebs.oracle.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: inventory
          path: "/inventoryOnhandQuantities"
          inputParameters:
            - name: item_number
              in: query
            - name: warehouse
              in: query
          operations:
            - name: get-inventory-status
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://3m.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

When a Tableau workbook extract refresh fails, logs the failure to Datadog, opens a Jira ticket for the BI team, and notifies the dashboard owner in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh Failure"
  description: "When a Tableau workbook extract refresh fails, logs the failure to Datadog, opens a Jira ticket for the BI team, and notifies the dashboard owner in Microsoft Teams."
  tags:
    - analytics
    - tableau
    - datadog
    - jira
    - microsoft-teams
    - business-intelligence
capability:
  exposes:
    - type: mcp
      namespace: bi-ops
      port: 8080
      tools:
        - name: handle-tableau-refresh-failure
          description: "Given a failed Tableau workbook name and owner, log to Datadog, open a Jira BI ticket, and notify the owner in Teams."
          inputParameters:
            - name: workbook_name
              in: body
              type: string
              description: "The Tableau workbook name."
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
            - name: owner_upn
              in: body
              type: string
              description: "Microsoft UPN of the workbook owner."
            - name: error_message
              in: body
              type: string
              description: "Extract refresh error message."
          steps:
            - name: log-datadog
              type: call
              call: "datadog-bi.create-event"
              with:
                title: "Tableau Refresh Failed: {{workbook_name}}"
                text: "Workbook: {{workbook_id}} | Error: {{error_message}} | Owner: {{owner_upn}}"
                alert_type: "error"
                tags: "bi:tableau,workbook:{{workbook_name}}"
            - name: open-jira
              type: call
              call: "jira-bi.create-issue"
              with:
                project_key: "BI"
                issuetype: "Bug"
                summary: "Tableau refresh failure: {{workbook_name}}"
                description: "Workbook: {{workbook_name}} ({{workbook_id}})\nOwner: {{owner_upn}}\nError: {{error_message}}\nDatadog: {{log-datadog.url}}"
            - name: notify-owner
              type: call
              call: "msteams-bi.send-message"
              with:
                recipient_upn: "{{owner_upn}}"
                text: "Tableau Refresh Failed: {{workbook_name}} | Error: {{error_message}} | Jira: {{open-jira.key}}"
  consumes:
    - type: http
      namespace: datadog-bi
      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: jira-bi
      baseUri: "https://3m.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-bi
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles travel expenses by pulling reports from SAP Concur, matching against SAP FI postings, and creating a ServiceNow ticket for any discrepancies found.

naftiko: "0.5"
info:
  label: "Travel Expense Reconciliation"
  description: "Reconciles travel expenses by pulling reports from SAP Concur, matching against SAP FI postings, and creating a ServiceNow ticket for any discrepancies found."
  tags:
    - finance
    - travel
    - sap-concur
    - sap
    - servicenow
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: travel-finance
      port: 8080
      tools:
        - name: reconcile-travel-expenses
          description: "Given an employee ID and period, pull Concur reports, match against SAP postings, and flag discrepancies."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee ID in Concur."
            - name: period
              in: body
              type: string
              description: "The reconciliation period (e.g., 2026-03)."
          steps:
            - name: get-concur-reports
              type: call
              call: "concur.get-expense-reports"
              with:
                employee_id: "{{employee_id}}"
                period: "{{period}}"
            - name: get-sap-postings
              type: call
              call: "sap.get-travel-postings"
              with:
                employee_id: "{{employee_id}}"
                period: "{{period}}"
            - name: create-discrepancy-ticket
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Travel expense discrepancy: {{employee_id}} ({{period}})"
                description: "Concur total: {{get-concur-reports.total_amount}} | SAP total: {{get-sap-postings.total_amount}} | Reports: {{get-concur-reports.report_count}}"
                category: "finance"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: employee_id
              in: query
            - name: period
              in: query
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/FI_TRAVEL_EXPENSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: travel-postings
          path: "/TravelExpensePosting"
          inputParameters:
            - name: employee_id
              in: query
            - name: period
              in: query
          operations:
            - name: get-travel-postings
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Generates a vendor performance scorecard by pulling delivery and quality metrics from SAP, computing scores in Snowflake, and publishing results to a Power BI dashboard and the procurement Teams channel.

naftiko: "0.5"
info:
  label: "Vendor Scorecard Generation"
  description: "Generates a vendor performance scorecard by pulling delivery and quality metrics from SAP, computing scores in Snowflake, and publishing results to a Power BI dashboard and the procurement Teams channel."
  tags:
    - procurement
    - vendor-management
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-performance
      port: 8080
      tools:
        - name: generate-vendor-scorecard
          description: "Given a vendor number and period, pull SAP metrics, compute scores, refresh Power BI, and notify procurement."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
            - name: period
              in: body
              type: string
              description: "Evaluation period (e.g., 2026-Q1)."
          steps:
            - name: get-vendor-metrics
              type: call
              call: "sap.get-vendor-evaluation"
              with:
                vendor: "{{vendor_number}}"
                period: "{{period}}"
            - name: compute-scorecard
              type: call
              call: "snowflake.run-query"
              with:
                statement: "CALL PROCUREMENT.COMPUTE_VENDOR_SCORECARD('{{vendor_number}}', '{{period}}')"
                warehouse: "PROCUREMENT_WH"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                group_id: "$secrets.procurement_pbi_group"
                dataset_id: "$secrets.vendor_scorecard_dataset"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.procurement_team_id"
                channel_id: "$secrets.procurement_channel_id"
                text: "Vendor scorecard for {{vendor_number}} ({{period}}) published. Dashboard refreshed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_EVAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendor-evaluations
          path: "/VendorEvaluation(Vendor='{{vendor}}',Period='{{period}}')"
          inputParameters:
            - name: vendor
              in: path
            - name: period
              in: path
          operations:
            - name: get-vendor-evaluation
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://3m.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: dataset-refresh
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_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

Creates an inter-plant stock transfer in SAP, logs the shipment in Oracle TMS, and notifies the receiving plant warehouse team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Warehouse Transfer Order Creation"
  description: "Creates an inter-plant stock transfer in SAP, logs the shipment in Oracle TMS, and notifies the receiving plant warehouse team in Microsoft Teams."
  tags:
    - supply-chain
    - logistics
    - sap
    - oracle
    - microsoft-teams
    - warehouse
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: create-transfer-order
          description: "Given source and destination plants, material, and quantity, create a SAP stock transfer, log the shipment, and notify receiving warehouse."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number to transfer."
            - name: source_plant
              in: body
              type: string
              description: "The originating 3M plant code."
            - name: destination_plant
              in: body
              type: string
              description: "The receiving 3M plant code."
            - name: quantity
              in: body
              type: string
              description: "Quantity to transfer."
          steps:
            - name: create-sto
              type: call
              call: "sap.create-stock-transfer"
              with:
                material: "{{material_number}}"
                supplying_plant: "{{source_plant}}"
                receiving_plant: "{{destination_plant}}"
                quantity: "{{quantity}}"
            - name: log-shipment
              type: call
              call: "oracle-tms.create-shipment"
              with:
                origin: "{{source_plant}}"
                destination: "{{destination_plant}}"
                reference: "{{create-sto.transfer_order_number}}"
                weight: "{{quantity}}"
            - name: notify-receiving
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "$secrets.warehouse_team_id"
                channel_id: "$secrets.warehouse_channel_id"
                text: "Inbound Transfer: {{material_number}} x{{quantity}} from {{source_plant}} | SAP STO: {{create-sto.transfer_order_number}} | Shipment: {{log-shipment.shipment_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://3m-s4.sap.com/sap/opu/odata/sap/MM_STOCK_TRANSFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock-transfers
          path: "/StockTransferOrder"
          operations:
            - name: create-stock-transfer
              method: POST
    - type: http
      namespace: oracle-tms
      baseUri: "https://3m-ebs.oracle.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: shipments
          path: "/shipments"
          operations:
            - name: create-shipment
              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 Workday to retrieve employee profile details including department, manager, location, and job title for HR and people operations.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Queries Workday to retrieve employee profile details including department, manager, location, and job title for HR and people operations."
  tags:
    - hr
    - workday
    - employee
    - people-operations
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Workday employee by employee ID. Returns name, department, manager, job title, and work location."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Name"
            - name: department
              type: string
              mapping: "$.Worker.Organization"
            - name: manager
              type: string
              mapping: "$.Worker.Manager.Name"
            - name: job_title
              type: string
              mapping: "$.Worker.JobTitle"
            - name: location
              type: string
              mapping: "$.Worker.Location"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/3m"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

When Workday creates a new employee, provisions their Microsoft 365 account, creates a personal SharePoint site, and raises a ServiceNow hardware provisioning task.

naftiko: "0.5"
info:
  label: "Workspace Provisioning"
  description: "When Workday creates a new employee, provisions their Microsoft 365 account, creates a personal SharePoint site, and raises a ServiceNow hardware provisioning task."
  tags:
    - hr
    - it
    - microsoft-365
    - sharepoint
    - servicenow
    - workday
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: workspace-provisioning
      port: 8080
      tools:
        - name: provision-workspace
          description: "Given a new Workday employee ID, create their Microsoft 365 account, SharePoint personal site, and a ServiceNow hardware request."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: hardware_type
              in: body
              type: string
              description: "Required hardware type (e.g., laptop_windows, laptop_mac, mobile)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-m365-account
              type: call
              call: "msgraph.create-user"
              with:
                display_name: "{{get-employee.full_name}}"
                upn: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
                job_title: "{{get-employee.job_title}}"
            - name: create-sharepoint-site
              type: call
              call: "sharepoint.create-site"
              with:
                owner_upn: "{{get-employee.work_email}}"
                site_name: "{{get-employee.full_name}}"
            - name: request-hardware
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Hardware request: {{hardware_type}} for {{get-employee.full_name}}"
                category: "hardware"
                requested_for: "{{get-employee.work_email}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
        - name: sites
          path: "/sites"
          operations:
            - name: create-site
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sites
          path: "/"
          operations:
            - name: create-site
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://3m.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST