3M Capabilities
Naftiko 0.5 capability definitions for 3M - 103 capabilities showing integration workflows and service orchestrations.
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