Thermo Fisher Scientific Capabilities
Naftiko 0.5 capability definitions for Thermo Fisher Scientific - 100 capabilities showing integration workflows and service orchestrations.
Handles ADF failures with Jira tickets and Teams alerts.
naftiko: "0.5"
info:
label: "Azure Data Factory Failure Handler"
description: "Handles ADF failures with Jira tickets and Teams alerts."
tags:
- data-engineering
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: azure-ops
port: 8080
tools:
- name: azure-data-factory-failure-handler
description: "Handles ADF failures with Jira tickets and Teams alerts."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Azure Data Factory Failure Handler follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Azure Data Factory Failure Handler completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks ADF pipeline run status.
naftiko: "0.5"
info:
label: "Azure Data Factory Pipeline Status"
description: "Checks ADF pipeline run status."
tags:
- data-engineering
- azure-data-factory
capability:
exposes:
- type: mcp
namespace: data-pipeline
port: 8080
tools:
- name: check-adf
description: "Check ADF pipeline."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "Pipeline name."
call: "adf.get-pipeline-run"
with:
pipeline: "{{pipeline_name}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: adf
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: pipeline-runs
path: "/subscriptions/$secrets.azure_sub/resourceGroups/$secrets.azure_rg/providers/Microsoft.DataFactory/factories/$secrets.adf_name/pipelineruns"
operations:
- name: get-pipeline-run
method: GET
When an Azure Data Factory pipeline fails, retrieves the error details, creates a Jira bug for the data engineering team, and posts a failure alert to the data operations Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Azure Data Factory Pipeline Failure Handler"
description: "When an Azure Data Factory pipeline fails, retrieves the error details, creates a Jira bug for the data engineering team, and posts a failure alert to the data operations Microsoft Teams channel."
tags:
- data-analytics
- azure-data-factory
- jira
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: adf-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given an Azure Data Factory pipeline run ID and factory name, retrieve the run failure details, open a Jira bug for the data engineering team, and post an alert to the data ops Teams channel. Use when ADF pipeline runs fail in production."
inputParameters:
- name: factory_name
in: body
type: string
description: "The Azure Data Factory instance name."
- name: resource_group
in: body
type: string
description: "The Azure resource group containing the Data Factory."
- name: subscription_id
in: body
type: string
description: "The Azure subscription ID."
- name: run_id
in: body
type: string
description: "The pipeline run ID from Azure Data Factory."
- name: pipeline_name
in: body
type: string
description: "The name of the failed pipeline."
steps:
- name: get-run-details
type: call
call: "adf.get-pipeline-run"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
factory_name: "{{factory_name}}"
run_id: "{{run_id}}"
- name: create-bug
type: call
call: "jira-adf.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "[ADF Failure] {{pipeline_name}} — {{get-run-details.status}}"
description: "Run ID: {{run_id}}\nFactory: {{factory_name}}\nError: {{get-run-details.message}}"
- name: post-alert
type: call
call: "teams-adf.send-message"
with:
channel: "data-ops-alerts"
text: "ADF Pipeline Failure | {{pipeline_name}} | Run: {{run_id}} | Error: {{get-run-details.message}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: adf
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: pipeline-runs
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DataFactory/factories/{{factory_name}}/pipelineRuns/{{run_id}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: factory_name
in: path
- name: run_id
in: path
operations:
- name: get-pipeline-run
method: GET
- type: http
namespace: jira-adf
baseUri: "https://thermofisher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: teams-adf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks releases, updating ServiceNow and notifying via Teams.
naftiko: "0.5"
info:
label: "Azure DevOps Release Pipeline Tracker"
description: "Tracks releases, updating ServiceNow and notifying via Teams."
tags:
- devops
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: azure-ops
port: 8080
tools:
- name: azure-devops-release-tracker
description: "Tracks releases, updating ServiceNow and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Azure DevOps Release Pipeline Tracker action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Azure DevOps Release Pipeline Tracker completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Alerts on variances from SAP, Snowflake, ServiceNow, and Teams.
naftiko: "0.5"
info:
label: "Cross-Functional Budget Variance Alert"
description: "Alerts on variances from SAP, Snowflake, ServiceNow, and Teams."
tags:
- finance
- sap
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: budget-ops
port: 8080
tools:
- name: budget-variance-alert
description: "Alerts on variances from SAP, Snowflake, ServiceNow, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Cross-Functional Budget Variance Alert action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Cross-Functional Budget Variance Alert completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Monitors transfers from Snowflake, creating ServiceNow alerts and notifying via Teams.
naftiko: "0.5"
info:
label: "Clinical Study Data Transfer Monitor"
description: "Monitors transfers from Snowflake, creating ServiceNow alerts and notifying via Teams."
tags:
- clinical
- data-engineering
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-data-transfer-monitor
description: "Monitors transfers from Snowflake, creating ServiceNow alerts and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Clinical Study Data Transfer Monitor action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Study Data Transfer Monitor completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Traces lots by querying SAP, enriching with Snowflake, and posting to Teams.
naftiko: "0.5"
info:
label: "Clinical Reagent Lot Traceability"
description: "Traces lots by querying SAP, enriching with Snowflake, and posting to Teams."
tags:
- quality
- supply-chain
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-reagent-lot-traceability
description: "Traces lots by querying SAP, enriching with Snowflake, and posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Reagent Lot Traceability completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks logistics from Snowflake, updating ServiceNow, and alerting via Teams.
naftiko: "0.5"
info:
label: "Clinical Sample Logistics Tracker"
description: "Tracks logistics from Snowflake, updating ServiceNow, and alerting via Teams."
tags:
- supply-chain
- clinical
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-sample-logistics-tracker
description: "Tracks logistics from Snowflake, updating ServiceNow, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Clinical Sample Logistics Tracker action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Sample Logistics Tracker completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Routes documents from SharePoint for Jira review and Teams notification.
naftiko: "0.5"
info:
label: "Compliance Document Review Workflow"
description: "Routes documents from SharePoint for Jira review and Teams notification."
tags:
- compliance
- quality
- sharepoint
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance-ops
port: 8080
tools:
- name: compliance-document-review
description: "Routes documents from SharePoint for Jira review and Teams notification."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Compliance Document Review Workflow follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Compliance Document Review Workflow completed successfully."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Searches Confluence articles.
naftiko: "0.5"
info:
label: "Confluence Knowledge Base Search"
description: "Searches Confluence articles."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: km-search
port: 8080
tools:
- name: search-kb
description: "Search articles."
inputParameters:
- name: query
in: body
type: string
description: "Search keyword."
call: "confluence.search"
with:
query: "{{query}}"
outputParameters:
- name: results
type: array
mapping: "$.results"
consumes:
- type: http
namespace: confluence
baseUri: "https://thermofisher.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: search
path: "/search"
operations:
- name: search
method: GET
When a ServiceNow incident is resolved, extracts the resolution notes and creates a Confluence knowledge base article in the IT operations space, then posts the article link to the Teams knowledge channel.
naftiko: "0.5"
info:
label: "Confluence Knowledge Article Creation from Incident"
description: "When a ServiceNow incident is resolved, extracts the resolution notes and creates a Confluence knowledge base article in the IT operations space, then posts the article link to the Teams knowledge channel."
tags:
- itsm
- knowledge-management
- servicenow
- confluence
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: knowledge-ops
port: 8080
tools:
- name: create-kb-from-incident
description: "Given a resolved ServiceNow incident number, retrieve the resolution details and create a Confluence knowledge base article capturing the root cause and fix. Post the article link to the Teams knowledge channel. Use post-incident to build institutional knowledge."
inputParameters:
- name: incident_number
in: body
type: string
description: "The resolved ServiceNow incident number, e.g. INC0034567."
- name: confluence_space_key
in: body
type: string
description: "The Confluence space key for the knowledge base, e.g. ITOPS."
steps:
- name: get-incident
type: call
call: "servicenow-kb.get-incident"
with:
number: "{{incident_number}}"
- name: create-article
type: call
call: "confluence.create-page"
with:
space_key: "{{confluence_space_key}}"
title: "KBA: {{get-incident.short_description}}"
body: "Incident: {{incident_number}}\n\nRoot Cause:\n{{get-incident.cause}}\n\nResolution:\n{{get-incident.close_notes}}"
- name: notify-team
type: call
call: "teams-kb.send-message"
with:
channel: "it-knowledge-base"
text: "New KB Article Created from {{incident_number}}: {{create-article.title}} — {{create-article.url}}"
consumes:
- type: http
namespace: servicenow-kb
baseUri: "https://thermofisher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: confluence
baseUri: "https://thermofisher.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: teams-kb
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Routes approvals from Coupa via ServiceNow, Snowflake budget check, and Teams.
naftiko: "0.5"
info:
label: "Coupa Procurement Approval Workflow"
description: "Routes approvals from Coupa via ServiceNow, Snowflake budget check, and Teams."
tags:
- procurement
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: coupa-ops
port: 8080
tools:
- name: coupa-procurement-approval
description: "Routes approvals from Coupa via ServiceNow, Snowflake budget check, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Coupa Procurement Approval Workflow action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Coupa Procurement Approval Workflow completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Submits a procurement requisition in Coupa with line item details and cost allocation, routes it to the approval workflow, and notifies the requester via Microsoft Teams.
naftiko: "0.5"
info:
label: "Coupa Procurement Requisition Submission"
description: "Submits a procurement requisition in Coupa with line item details and cost allocation, routes it to the approval workflow, and notifies the requester via Microsoft Teams."
tags:
- procurement
- coupa
- microsoft-teams
- approval
- finance
capability:
exposes:
- type: mcp
namespace: procurement-coupa
port: 8080
tools:
- name: submit-requisition
description: "Create a new Coupa procurement requisition for a lab supply, reagent, or service purchase. Provide item description, quantity, unit price, and cost center. Notifies the requester via Teams on submission."
inputParameters:
- name: item_description
in: body
type: string
description: "Description of the item or service being requisitioned."
- name: quantity
in: body
type: number
description: "Number of units being requested."
- name: unit_price
in: body
type: number
description: "Unit price in USD."
- name: cost_center
in: body
type: string
description: "Cost center code for budget allocation."
- name: requester_email
in: body
type: string
description: "Corporate email of the employee submitting the request."
steps:
- name: create-req
type: call
call: "coupa.create-requisition"
with:
description: "{{item_description}}"
quantity: "{{quantity}}"
unit_price: "{{unit_price}}"
cost_center: "{{cost_center}}"
- name: notify-requester
type: call
call: "teams-proc.send-message"
with:
channel: "procurement-ops"
text: "Coupa Requisition Submitted | {{item_description}} | Qty: {{quantity}} | Total: ${{unit_price}} | Req ID: {{create-req.requisition_id}} | Status: Pending Approval"
consumes:
- type: http
namespace: coupa
baseUri: "https://thermofisher.coupahost.com/api"
authentication:
type: apikey
key: "X-COUPA-API-KEY"
value: "$secrets.coupa_api_key"
placement: header
resources:
- name: requisitions
path: "/requisition_headers"
operations:
- name: create-requisition
method: POST
- type: http
namespace: teams-proc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks Coupa requisition status.
naftiko: "0.5"
info:
label: "Coupa Purchase Requisition Status"
description: "Checks Coupa requisition status."
tags:
- procurement
- coupa
capability:
exposes:
- type: mcp
namespace: procurement-req
port: 8080
tools:
- name: check-requisition
description: "Check requisition."
inputParameters:
- name: req_id
in: body
type: string
description: "Requisition ID."
call: "coupa.get-requisition"
with:
id: "{{req_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: coupa
baseUri: "https://thermofisher.coupahost.com/api"
authentication:
type: bearer
token: "$secrets.coupa_token"
resources:
- name: requisitions
path: "/requisitions/{{req_id}}"
inputParameters:
- name: req_id
in: path
operations:
- name: get-requisition
method: GET
Resolves complaints via Salesforce, ServiceNow, and Teams.
naftiko: "0.5"
info:
label: "Customer Complaint Resolution Workflow"
description: "Resolves complaints via Salesforce, ServiceNow, and Teams."
tags:
- quality
- commercial
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-ops
port: 8080
tools:
- name: customer-complaint-resolution
description: "Resolves complaints via Salesforce, ServiceNow, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Customer Complaint Resolution Workflow action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Customer Complaint Resolution Workflow completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Onboards customers via Salesforce, ServiceNow, and Teams.
naftiko: "0.5"
info:
label: "Customer Onboarding Orchestrator"
description: "Onboards customers via Salesforce, ServiceNow, and Teams."
tags:
- commercial
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-ops
port: 8080
tools:
- name: customer-onboarding
description: "Onboards customers via Salesforce, ServiceNow, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Customer Onboarding Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Customer Onboarding Orchestrator completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Tracks fulfillment by pulling SAP data, updating Salesforce, and notifying via Teams.
naftiko: "0.5"
info:
label: "Customer Order Fulfillment Tracker"
description: "Tracks fulfillment by pulling SAP data, updating Salesforce, and notifying via Teams."
tags:
- supply-chain
- commercial
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-ops
port: 8080
tools:
- name: customer-order-fulfillment-tracker
description: "Tracks fulfillment by pulling SAP data, updating Salesforce, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Customer Order Fulfillment Tracker completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates surveys from Salesforce, loading to Snowflake, and notifying via Teams.
naftiko: "0.5"
info:
label: "Customer Satisfaction Survey Orchestrator"
description: "Orchestrates surveys from Salesforce, loading to Snowflake, and notifying via Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-ops
port: 8080
tools:
- name: customer-satisfaction-survey
description: "Orchestrates surveys from Salesforce, loading to Snowflake, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Customer Satisfaction Survey Orchestrator completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Databricks cluster status.
naftiko: "0.5"
info:
label: "Databricks Cluster Status Check"
description: "Checks Databricks cluster status."
tags:
- data-engineering
- databricks
capability:
exposes:
- type: mcp
namespace: data-compute
port: 8080
tools:
- name: check-cluster
description: "Check cluster."
inputParameters:
- name: cluster_id
in: body
type: string
description: "Cluster ID."
call: "databricks.get-cluster"
with:
cluster_id: "{{cluster_id}}"
outputParameters:
- name: state
type: string
mapping: "$.state"
consumes:
- type: http
namespace: databricks
baseUri: "https://thermofisher.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: clusters
path: "/clusters/get"
operations:
- name: get-cluster
method: GET
Monitors Azure Databricks job run status and, when a run fails, creates a Jira bug for the data engineering team and posts a failure notification to the data platform Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Databricks Job Run Failure Alert"
description: "Monitors Azure Databricks job run status and, when a run fails, creates a Jira bug for the data engineering team and posts a failure notification to the data platform Microsoft Teams channel."
tags:
- data-analytics
- databricks
- jira
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: databricks-ops
port: 8080
tools:
- name: handle-job-run-failure
description: "Given an Azure Databricks workspace URL and job run ID, retrieve run failure details, create a Jira bug in the DATA project, and post an alert to the data platform Teams channel. Use when Databricks scheduled jobs fail in the production workspace."
inputParameters:
- name: workspace_url
in: body
type: string
description: "The Azure Databricks workspace URL, e.g. https://adb-1234567890.12.azuredatabricks.net."
- name: run_id
in: body
type: string
description: "The Databricks job run ID."
- name: job_name
in: body
type: string
description: "The human-readable Databricks job name."
steps:
- name: get-run
type: call
call: "databricks.get-run"
with:
run_id: "{{run_id}}"
- name: create-bug
type: call
call: "jira-db.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "[Databricks Failure] {{job_name}} — Run {{run_id}}"
description: "Job: {{job_name}}\nRun ID: {{run_id}}\nState: {{get-run.state}}\nError: {{get-run.state_message}}"
- name: post-alert
type: call
call: "teams-dp.send-message"
with:
channel: "data-platform-alerts"
text: "Databricks Job Failed | {{job_name}} | Run: {{run_id}} | Error: {{get-run.state_message}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://adb-thermofisher.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: runs
path: "/jobs/runs/get"
inputParameters:
- name: run_id
in: query
operations:
- name: get-run
method: GET
- type: http
namespace: jira-db
baseUri: "https://thermofisher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: teams-dp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks ML deployments from Databricks, updating Jira, and notifying via Teams.
naftiko: "0.5"
info:
label: "Databricks ML Model Deployment Tracker"
description: "Tracks ML deployments from Databricks, updating Jira, and notifying via Teams."
tags:
- data-science
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: databricks-ops
port: 8080
tools:
- name: databricks-ml-model-deployment
description: "Tracks ML deployments from Databricks, updating Jira, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Databricks ML Model Deployment Tracker follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Databricks ML Model Deployment Tracker completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Datadog monitor fires a critical alert, creates a ServiceNow incident with full alert context and posts a real-time notification to the IT operations Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Datadog Alert to ServiceNow Incident"
description: "When a Datadog monitor fires a critical alert, creates a ServiceNow incident with full alert context and posts a real-time notification to the IT operations Microsoft Teams channel."
tags:
- observability
- datadog
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: observability-ops
port: 8080
tools:
- name: handle-datadog-alert
description: "Given a Datadog monitor ID and alert event, retrieve monitor details, create a ServiceNow incident for tracking, and post a real-time alert to the IT ops Teams channel. Use when Datadog fires critical infrastructure or application alerts."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID that triggered the alert."
- name: alert_message
in: body
type: string
description: "The Datadog alert message body."
- name: host
in: body
type: string
description: "The affected host or service name."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-incident
type: call
call: "servicenow-obs.create-incident"
with:
short_description: "Datadog Alert: {{get-monitor.name}} on {{host}}"
description: "{{alert_message}}\nMonitor: {{monitor_id}}\nHost: {{host}}"
priority: "1"
- name: post-alert
type: call
call: "teams-infra.send-message"
with:
channel: "it-operations-alerts"
text: "CRITICAL Datadog Alert | Monitor: {{get-monitor.name}} | Host: {{host}} | ServiceNow: {{create-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: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow-obs
baseUri: "https://thermofisher.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: teams-infra
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates digests from Datadog and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Digest"
description: "Generates digests from Datadog and Snowflake, posting to Teams."
tags:
- infrastructure
- observability
- datadog
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: datadog-ops
port: 8080
tools:
- name: datadog-infra-health-digest
description: "Generates digests from Datadog and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: check-monitors
type: call
call: "datadog.get-monitors"
with:
tags: "service:{{service_name}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Datadog Infrastructure Health Digest completed successfully."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-monitors
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Datadog service health.
naftiko: "0.5"
info:
label: "Datadog Service Monitor Check"
description: "Checks Datadog service health."
tags:
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: observability-health
port: 8080
tools:
- name: check-service
description: "Check service health."
inputParameters:
- name: service
in: body
type: string
description: "Service name."
call: "datadog.get-monitor-status"
with:
service: "{{service}}"
outputParameters:
- name: status
type: string
mapping: "$.overall_state"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-monitor-status
method: GET
Retrieves SLO compliance status from Datadog for all tracked services, and posts a weekly availability and error budget digest to the engineering leadership Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Datadog SLO Compliance Weekly Digest"
description: "Retrieves SLO compliance status from Datadog for all tracked services, and posts a weekly availability and error budget digest to the engineering leadership Microsoft Teams channel."
tags:
- observability
- datadog
- microsoft-teams
- slo
- reporting
capability:
exposes:
- type: mcp
namespace: slo-reporting
port: 8080
tools:
- name: digest-slo-compliance
description: "Retrieve SLO compliance data from Datadog for the past 7 days across all service-level objectives. Post a weekly compliance digest to the engineering leadership Teams channel. Use for weekly engineering reviews and executive SLO reporting."
inputParameters:
- name: slo_ids
in: body
type: string
description: "Comma-separated list of Datadog SLO IDs to include in the digest."
steps:
- name: get-slo-status
type: call
call: "datadog-slo.get-slos"
with:
ids: "{{slo_ids}}"
- name: post-digest
type: call
call: "teams-eng-lead.send-message"
with:
channel: "engineering-leadership"
text: "Weekly SLO Digest | Services Tracked: {{get-slo-status.total_count}} | Compliant: {{get-slo-status.compliant_count}} | At Risk: {{get-slo-status.at_risk_count}} | Breached: {{get-slo-status.breached_count}}"
consumes:
- type: http
namespace: datadog-slo
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo"
inputParameters:
- name: ids
in: query
operations:
- name: get-slos
method: GET
- type: http
namespace: teams-eng-lead
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Eloqua campaign metrics.
naftiko: "0.5"
info:
label: "Eloqua Campaign Metrics Lookup"
description: "Retrieves Eloqua campaign metrics."
tags:
- marketing
- eloqua
capability:
exposes:
- type: mcp
namespace: marketing-campaigns
port: 8080
tools:
- name: get-campaign-metrics
description: "Look up campaign metrics."
inputParameters:
- name: campaign_id
in: body
type: string
description: "Campaign ID."
call: "eloqua.get-campaign"
with:
campaign_id: "{{campaign_id}}"
outputParameters:
- name: opens
type: string
mapping: "$.opens"
- name: clicks
type: string
mapping: "$.clicks"
consumes:
- type: http
namespace: eloqua
baseUri: "https://secure.p03.eloqua.com/api/REST/2.0"
authentication:
type: basic
username: "$secrets.eloqua_user"
password: "$secrets.eloqua_password"
resources:
- name: campaigns
path: "/assets/campaign/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign
method: GET
Retrieves Eloqua campaign metrics for a given campaign ID, including email open rate, click-through rate, and form submissions, then posts a performance summary to the marketing Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Eloqua Marketing Campaign Performance Digest"
description: "Retrieves Eloqua campaign metrics for a given campaign ID, including email open rate, click-through rate, and form submissions, then posts a performance summary to the marketing Microsoft Teams channel."
tags:
- marketing
- eloqua
- microsoft-teams
- campaign-analytics
- reporting
capability:
exposes:
- type: mcp
namespace: marketing-analytics
port: 8080
tools:
- name: digest-campaign-performance
description: "Given an Eloqua campaign ID, retrieve email send metrics including open rate, click rate, and form submissions, and post a performance digest to the marketing Teams channel. Use for post-campaign analysis and weekly marketing reviews."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The Eloqua campaign ID to retrieve performance data for."
steps:
- name: get-campaign-metrics
type: call
call: "eloqua.get-campaign-stats"
with:
campaign_id: "{{campaign_id}}"
- name: post-digest
type: call
call: "teams-mktg.send-message"
with:
channel: "marketing-performance"
text: "Campaign Digest | Campaign: {{campaign_id}} | Sends: {{get-campaign-metrics.total_sends}} | Open Rate: {{get-campaign-metrics.open_rate}}% | CTR: {{get-campaign-metrics.click_rate}}% | Form Submissions: {{get-campaign-metrics.form_submissions}}"
consumes:
- type: http
namespace: eloqua
baseUri: "https://secure.eloqua.com/API/REST/2.0"
authentication:
type: basic
username: "$secrets.eloqua_username"
password: "$secrets.eloqua_password"
resources:
- name: campaign-stats
path: "/assets/campaign/{{campaign_id}}/emailDeployments"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-stats
method: GET
- type: http
namespace: teams-mktg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Syncs Eloqua results to Salesforce and Snowflake, notifying via Teams.
naftiko: "0.5"
info:
label: "Eloqua to Salesforce Campaign Sync"
description: "Syncs Eloqua results to Salesforce and Snowflake, notifying via Teams."
tags:
- marketing
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: eloqua-ops
port: 8080
tools:
- name: eloqua-to-salesforce-campaign-sync
description: "Syncs Eloqua results to Salesforce and Snowflake, notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Eloqua to Salesforce Campaign Sync completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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 new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Microsoft Teams welcome message with first-day instructions.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Microsoft Teams welcome message with first-day instructions."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
- microsoft-365
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: fetch employee details, open a ServiceNow IT onboarding ticket, provision Microsoft 365, and send a Teams welcome message."
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 new hire's start date in YYYY-MM-DD format."
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"
- name: provision-m365
type: call
call: "msgraph.create-user"
with:
display_name: "{{get-employee.full_name}}"
mail_nickname: "{{get-employee.email_alias}}"
department: "{{get-employee.department}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to Thermo Fisher Scientific, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Start date: {{start_date}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/thermofisher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermofisher.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: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Tracks compliance from Workday, Snowflake requirements, and Teams notification.
naftiko: "0.5"
info:
label: "Employee Training Compliance Tracker"
description: "Tracks compliance from Workday, Snowflake requirements, and Teams notification."
tags:
- hr
- compliance
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-ops
port: 8080
tools:
- name: employee-training-compliance-tracker
description: "Tracks compliance from Workday, Snowflake requirements, and Teams notification."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Employee Training Compliance Tracker completed successfully."
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Indexes content from SharePoint and Snowflake, confirming via Teams.
naftiko: "0.5"
info:
label: "Enterprise Search Content Indexer"
description: "Indexes content from SharePoint and Snowflake, confirming via Teams."
tags:
- knowledge-management
- sharepoint
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: enterprise-ops
port: 8080
tools:
- name: enterprise-search-indexer
description: "Indexes content from SharePoint and Snowflake, confirming via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Enterprise Search Content Indexer completed successfully."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Handles alerts from Snowflake sensors, ServiceNow tickets, and Teams.
naftiko: "0.5"
info:
label: "Environmental Monitoring Alert Handler"
description: "Handles alerts from Snowflake sensors, ServiceNow tickets, and Teams."
tags:
- ehs
- manufacturing
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: environmental-ops
port: 8080
tools:
- name: environmental-monitoring-alert
description: "Handles alerts from Snowflake sensors, ServiceNow tickets, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Environmental Monitoring Alert Handler action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Environmental Monitoring Alert Handler completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Consolidates forecasts from SAP and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Financial Forecast Consolidation"
description: "Consolidates forecasts from SAP and Snowflake, posting to Teams."
tags:
- finance
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: financial-ops
port: 8080
tools:
- name: financial-forecast-consolidation
description: "Consolidates forecasts from SAP and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Financial Forecast Consolidation completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors SLAs from GitHub, creating Jira reminders, and alerting via Teams.
naftiko: "0.5"
info:
label: "GitHub Code Review SLA Monitor"
description: "Monitors SLAs from GitHub, creating Jira reminders, and alerting via Teams."
tags:
- devops
- github
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: github-ops
port: 8080
tools:
- name: github-code-review-sla
description: "Monitors SLAs from GitHub, creating Jira reminders, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-repo-info
type: call
call: "github.get-repo"
with:
repo: "{{repo_name}}"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "GitHub Code Review SLA Monitor follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "GitHub Code Review SLA Monitor completed successfully."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo}}"
inputParameters:
- name: repo
in: path
operations:
- name: get-repo
method: GET
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a GitHub pull request is merged, updates the linked Jira issue status to In Review, adds a comment with the PR URL, and posts a deployment readiness notification to the engineering Teams channel.
naftiko: "0.5"
info:
label: "GitHub Pull Request to Jira Ticket Sync"
description: "When a GitHub pull request is merged, updates the linked Jira issue status to In Review, adds a comment with the PR URL, and posts a deployment readiness notification to the engineering Teams channel."
tags:
- devops
- github
- jira
- microsoft-teams
- ci-cd
capability:
exposes:
- type: mcp
namespace: devops-prs
port: 8080
tools:
- name: sync-pr-to-jira
description: "Given a GitHub PR number and repository, retrieve PR details, update the linked Jira issue status to In Review, add a comment with the PR URL, and post a readiness notification to the engineering Teams channel."
inputParameters:
- name: repo_owner
in: body
type: string
description: "GitHub repository owner or organization name."
- name: repo_name
in: body
type: string
description: "GitHub repository name."
- name: pr_number
in: body
type: integer
description: "The GitHub pull request number."
- name: jira_issue_key
in: body
type: string
description: "The Jira issue key linked to this PR, e.g. TFS-5678."
steps:
- name: get-pr
type: call
call: "github.get-pull-request"
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
pull_number: "{{pr_number}}"
- name: update-jira
type: call
call: "jira-sync.transition-issue"
with:
issue_key: "{{jira_issue_key}}"
transition_id: "31"
- name: add-comment
type: call
call: "jira-sync.add-comment"
with:
issue_key: "{{jira_issue_key}}"
body: "PR merged: {{get-pr.html_url}} | Author: {{get-pr.user_login}} | Branch: {{get-pr.head_ref}}"
- name: notify-team
type: call
call: "teams-devops.send-message"
with:
channel: "engineering-deployments"
text: "PR Merged: {{repo_name}} #{{pr_number}} | Jira: {{jira_issue_key}} | Ready for deployment review."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pull-requests
path: "/repos/{{owner}}/{{repo}}/pulls/{{pull_number}}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: pull_number
in: path
operations:
- name: get-pull-request
method: GET
- type: http
namespace: jira-sync
baseUri: "https://thermofisher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issue-transitions
path: "/issue/{{issue_key}}/transitions"
inputParameters:
- name: issue_key
in: path
operations:
- name: transition-issue
method: POST
- name: issue-comments
path: "/issue/{{issue_key}}/comment"
inputParameters:
- name: issue_key
in: path
operations:
- name: add-comment
method: POST
- type: http
namespace: teams-devops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates deployments from GitHub, updating ServiceNow, and notifying via Teams.
naftiko: "0.5"
info:
label: "GitHub Release Deployment Orchestrator"
description: "Orchestrates deployments from GitHub, updating ServiceNow, and notifying via Teams."
tags:
- devops
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: github-ops
port: 8080
tools:
- name: github-release-deployment-orchestrator
description: "Orchestrates deployments from GitHub, updating ServiceNow, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-repo-info
type: call
call: "github.get-repo"
with:
repo: "{{repo_name}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "GitHub Release Deployment Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "GitHub Release Deployment Orchestrator completed successfully."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo}}"
inputParameters:
- name: repo
in: path
operations:
- name: get-repo
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Retrieves Dependabot alerts.
naftiko: "0.5"
info:
label: "GitHub Repo Security Alerts"
description: "Retrieves Dependabot alerts."
tags:
- security
- github
capability:
exposes:
- type: mcp
namespace: devops-security
port: 8080
tools:
- name: get-alerts
description: "Get security alerts."
inputParameters:
- name: repo
in: body
type: string
description: "Repo (org/repo)."
call: "github.get-alerts"
with:
repo: "{{repo}}"
outputParameters:
- name: alerts
type: array
mapping: "$.data"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: alerts
path: "/repos/{{repo}}/dependabot/alerts"
inputParameters:
- name: repo
in: path
operations:
- name: get-alerts
method: GET
When GitHub Advanced Security detects a code vulnerability, creates a Jira security bug with full finding details and alerts the security engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "GitHub Security Scanning Alert to Jira"
description: "When GitHub Advanced Security detects a code vulnerability, creates a Jira security bug with full finding details and alerts the security engineering Microsoft Teams channel."
tags:
- security
- github
- jira
- microsoft-teams
- devops
capability:
exposes:
- type: mcp
namespace: security-scanning
port: 8080
tools:
- name: handle-security-alert
description: "Given a GitHub security alert ID and repository, retrieve the vulnerability details from GitHub Advanced Security, create a Jira security bug in the SEC project, and alert the security engineering Teams channel. Use when GitHub code scanning or secret scanning fires alerts."
inputParameters:
- name: repo_owner
in: body
type: string
description: "GitHub repository owner or organization."
- name: repo_name
in: body
type: string
description: "GitHub repository name."
- name: alert_number
in: body
type: integer
description: "The GitHub code scanning alert number."
steps:
- name: get-alert
type: call
call: "github-sec.get-code-scanning-alert"
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
alert_number: "{{alert_number}}"
- name: create-bug
type: call
call: "jira-sec.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "[Security] {{get-alert.rule_description}} in {{repo_name}}"
description: "Repository: {{repo_owner}}/{{repo_name}}\nRule: {{get-alert.rule_id}}\nSeverity: {{get-alert.severity}}\nFile: {{get-alert.location_path}}\nGitHub Alert: {{get-alert.html_url}}"
- name: notify-security
type: call
call: "teams-sec.send-message"
with:
channel: "security-engineering"
text: "Security Alert | Repo: {{repo_name}} | Rule: {{get-alert.rule_description}} | Severity: {{get-alert.severity}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: github-sec
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: code-scanning-alerts
path: "/repos/{{owner}}/{{repo}}/code-scanning/alerts/{{alert_number}}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: alert_number
in: path
operations:
- name: get-code-scanning-alert
method: GET
- type: http
namespace: jira-sec
baseUri: "https://thermofisher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: teams-sec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers an Informatica Cloud data quality task for a specified mapping and monitors the job result, posting a quality scorecard to the data governance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Informatica Cloud Data Quality Check"
description: "Triggers an Informatica Cloud data quality task for a specified mapping and monitors the job result, posting a quality scorecard to the data governance Microsoft Teams channel."
tags:
- data-analytics
- informatica
- microsoft-teams
- data-quality
- data-governance
capability:
exposes:
- type: mcp
namespace: data-governance
port: 8080
tools:
- name: run-data-quality-check
description: "Trigger an Informatica Cloud data quality task by task name, retrieve the run result and quality score, and post a scorecard summary to the data governance Teams channel. Use for scheduled or on-demand data quality validation."
inputParameters:
- name: task_name
in: body
type: string
description: "The Informatica Cloud task name to execute for data quality validation."
steps:
- name: run-task
type: call
call: "informatica.run-task"
with:
task_name: "{{task_name}}"
- name: post-scorecard
type: call
call: "teams-dg.send-message"
with:
channel: "data-governance"
text: "Data Quality Check | Task: {{task_name}} | Run ID: {{run-task.run_id}} | Status: {{run-task.status}} | Score: {{run-task.quality_score}}%"
consumes:
- type: http
namespace: informatica
baseUri: "https://dm-us.informaticacloud.com/ma/api/v2"
authentication:
type: apikey
key: "INFA-SESSION-ID"
value: "$secrets.informatica_session_id"
placement: header
resources:
- name: tasks
path: "/task"
operations:
- name: run-task
method: POST
- type: http
namespace: teams-dg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Recovers from failures with Jira tickets and Teams alerts.
naftiko: "0.5"
info:
label: "Informatica ETL Failure Recovery"
description: "Recovers from failures with Jira tickets and Teams alerts."
tags:
- data-engineering
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: informatica-ops
port: 8080
tools:
- name: informatica-etl-failure-recovery
description: "Recovers from failures with Jira tickets and Teams alerts."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Informatica ETL Failure Recovery follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Informatica ETL Failure Recovery completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Informatica ETL job status.
naftiko: "0.5"
info:
label: "Informatica Job Status Check"
description: "Checks Informatica ETL job status."
tags:
- data-engineering
- informatica
capability:
exposes:
- type: mcp
namespace: data-etl
port: 8080
tools:
- name: check-job
description: "Check ETL job."
inputParameters:
- name: job_id
in: body
type: string
description: "Job ID."
call: "informatica.get-job"
with:
job_id: "{{job_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: informatica
baseUri: "https://dm-us.informaticacloud.com/saas/api/v2"
authentication:
type: bearer
token: "$secrets.informatica_token"
resources:
- name: jobs
path: "/job/{{job_id}}"
inputParameters:
- name: job_id
in: path
operations:
- name: get-job
method: GET
Processes procurement via ServiceNow and confirms via Teams.
naftiko: "0.5"
info:
label: "IT Asset Procurement to Deployment"
description: "Processes procurement via ServiceNow and confirms via Teams."
tags:
- it-asset-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-asset-procurement-deployment
description: "Processes procurement via ServiceNow and confirms via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Asset Procurement to Deployment action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "IT Asset Procurement to Deployment completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Orchestrates changes via ServiceNow, Snowflake validation, and Teams notification.
naftiko: "0.5"
info:
label: "IT Change Management Orchestrator"
description: "Orchestrates changes via ServiceNow, Snowflake validation, and Teams notification."
tags:
- it-service-management
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-change-management-orchestrator
description: "Orchestrates changes via ServiceNow, Snowflake validation, and Teams notification."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Change Management Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "IT Change Management Orchestrator completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Reviews access from Entra, cross-referencing Workday, and creating ServiceNow tasks.
naftiko: "0.5"
info:
label: "IT Security Access Review Orchestrator"
description: "Reviews access from Entra, cross-referencing Workday, and creating ServiceNow tasks."
tags:
- security
- identity
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-security-access-review
description: "Reviews access from Entra, cross-referencing Workday, and creating ServiceNow tasks."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Security Access Review Orchestrator action required"
category: "automated"
assigned_group: "Operations"
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
When a critical Jira bug is filed in a production project, automatically creates a linked ServiceNow incident for IT operations tracking and sends a cross-team alert to the engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Jira Bug to ServiceNow Incident Bridge"
description: "When a critical Jira bug is filed in a production project, automatically creates a linked ServiceNow incident for IT operations tracking and sends a cross-team alert to the engineering Microsoft Teams channel."
tags:
- devops
- jira
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: devops-incidents
port: 8080
tools:
- name: bridge-jira-to-servicenow
description: "Given a Jira issue key for a production-critical bug, create a linked ServiceNow incident for IT ops tracking and post a cross-team alert to the engineering Teams channel. Use when production defects require IT operations involvement."
inputParameters:
- name: jira_issue_key
in: body
type: string
description: "The Jira issue key, e.g. PROD-1234."
- name: severity
in: body
type: string
description: "Severity level: P1, P2, or P3."
steps:
- name: get-jira-issue
type: call
call: "jira.get-issue"
with:
issue_key: "{{jira_issue_key}}"
- name: create-incident
type: call
call: "servicenow-dev.create-incident"
with:
short_description: "[{{severity}}] {{get-jira-issue.summary}}"
description: "Jira: {{jira_issue_key}}\nReporter: {{get-jira-issue.reporter}}\nComponent: {{get-jira-issue.components}}"
priority: "{{severity}}"
- name: post-alert
type: call
call: "teams-eng.send-message"
with:
channel: "engineering-incidents"
text: "Production Incident Bridged | Jira: {{jira_issue_key}} | ServiceNow: {{create-incident.number}} | Severity: {{severity}} | {{get-jira-issue.summary}}"
consumes:
- type: http
namespace: jira
baseUri: "https://thermofisher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
- type: http
namespace: servicenow-dev
baseUri: "https://thermofisher.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: teams-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Aggregates portfolio from Jira and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Jira Portfolio Status Aggregator"
description: "Aggregates portfolio from Jira and Snowflake, posting to Teams."
tags:
- project-management
- jira
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: jira-ops
port: 8080
tools:
- name: jira-portfolio-status
description: "Aggregates portfolio from Jira and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Jira Portfolio Status Aggregator follow-up"
issue_type: "Task"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Jira Portfolio Status Aggregator completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks sprint velocity metrics.
naftiko: "0.5"
info:
label: "Jira Project Velocity Check"
description: "Checks sprint velocity metrics."
tags:
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: pm-velocity
port: 8080
tools:
- name: check-velocity
description: "Check velocity."
inputParameters:
- name: board_id
in: body
type: string
description: "Board ID."
call: "jira.get-velocity"
with:
board_id: "{{board_id}}"
outputParameters:
- name: velocity
type: string
mapping: "$.sprints[0].completedPoints"
consumes:
- type: http
namespace: jira
baseUri: "https://thermofisher.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: velocity
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
operations:
- name: get-velocity
method: GET
Retrieves completed story points from the last three Jira sprints for a given board, calculates average velocity, and posts a velocity digest to the product engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "Retrieves completed story points from the last three Jira sprints for a given board, calculates average velocity, and posts a velocity digest to the product engineering Microsoft Teams channel."
tags:
- devops
- jira
- microsoft-teams
- agile
- reporting
capability:
exposes:
- type: mcp
namespace: agile-reporting
port: 8080
tools:
- name: report-sprint-velocity
description: "Given a Jira board ID, retrieve completed story points from the last three sprints, calculate team velocity, and post a sprint velocity digest to the product engineering Teams channel. Use for agile planning and PI planning preparation."
inputParameters:
- name: board_id
in: body
type: string
description: "The Jira Scrum board ID to retrieve sprint data from."
steps:
- name: get-sprints
type: call
call: "jira-agile.get-sprints"
with:
board_id: "{{board_id}}"
- name: post-velocity
type: call
call: "teams-agile.send-message"
with:
channel: "product-engineering"
text: "Sprint Velocity Report | Board: {{board_id}} | Last Sprint Completed: {{get-sprints.last_sprint_points}} pts | 3-Sprint Avg: {{get-sprints.avg_velocity}} pts"
consumes:
- type: http
namespace: jira-agile
baseUri: "https://thermofisher.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
operations:
- name: get-sprints
method: GET
- type: http
namespace: teams-agile
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Integrates lab instrument data by loading to Snowflake, validating quality, and notifying via Teams.
naftiko: "0.5"
info:
label: "Lab Instrument Data Integration"
description: "Integrates lab instrument data by loading to Snowflake, validating quality, and notifying via Teams."
tags:
- laboratory
- data-engineering
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lab-ops
port: 8080
tools:
- name: lab-instrument-data-integration
description: "Integrates lab instrument data by loading to Snowflake, validating quality, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Lab Instrument Data Integration completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Publishes a company update to the Thermo Fisher Scientific LinkedIn organization page and posts a confirmation with the published post URL to the talent acquisition Microsoft Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Post Publisher"
description: "Publishes a company update to the Thermo Fisher Scientific LinkedIn organization page and posts a confirmation with the published post URL to the talent acquisition Microsoft Teams channel."
tags:
- marketing
- talent-acquisition
- linkedin
- microsoft-teams
- employer-brand
capability:
exposes:
- type: mcp
namespace: talent-brand
port: 8080
tools:
- name: publish-linkedin-post
description: "Publish a company update to the Thermo Fisher Scientific LinkedIn organization page. Provide post text and the organization ID. Confirms publication to the talent acquisition Teams channel. Use for employer brand campaigns, job fair announcements, and research milestones."
inputParameters:
- name: post_text
in: body
type: string
description: "The text content of the LinkedIn company update."
- name: organization_id
in: body
type: string
description: "The LinkedIn organization URN ID for Thermo Fisher Scientific."
steps:
- name: publish-post
type: call
call: "linkedin.create-share"
with:
organization_id: "{{organization_id}}"
text: "{{post_text}}"
- name: confirm-publish
type: call
call: "teams-ta.send-message"
with:
channel: "talent-acquisition"
text: "LinkedIn post published | Post ID: {{publish-post.id}} | Content: {{post_text}}"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: shares
path: "/shares"
operations:
- name: create-share
method: POST
- type: http
namespace: teams-ta
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sources candidates from LinkedIn to Workday, notifying via Teams.
naftiko: "0.5"
info:
label: "LinkedIn Talent Sourcing Pipeline"
description: "Sources candidates from LinkedIn to Workday, notifying via Teams."
tags:
- hr
- recruiting
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: linkedin-ops
port: 8080
tools:
- name: linkedin-talent-sourcing
description: "Sources candidates from LinkedIn to Workday, notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "LinkedIn Talent Sourcing Pipeline completed successfully."
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
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
Analyzes yields from SAP and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Manufacturing Production Yield Analysis"
description: "Analyzes yields from SAP and Snowflake, posting to Teams."
tags:
- manufacturing
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: manufacturing-yield-analysis
description: "Analyzes yields from SAP and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Manufacturing Production Yield Analysis completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Entra app registration.
naftiko: "0.5"
info:
label: "Microsoft Entra App Registration Check"
description: "Checks Entra app registration."
tags:
- identity
- microsoft-entra
capability:
exposes:
- type: mcp
namespace: identity-apps
port: 8080
tools:
- name: check-app
description: "Check app."
inputParameters:
- name: app_id
in: body
type: string
description: "App ID."
call: "msgraph.get-application"
with:
app_id: "{{app_id}}"
outputParameters:
- name: display_name
type: string
mapping: "$.displayName"
consumes:
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: applications
path: "/applications/{{app_id}}"
inputParameters:
- name: app_id
in: path
operations:
- name: get-application
method: GET
Submits a laboratory or regulatory document to OpenAI for AI-powered summarization, and saves the generated summary to a SharePoint document library for team review.
naftiko: "0.5"
info:
label: "OpenAI Document Summarization for Lab Reports"
description: "Submits a laboratory or regulatory document to OpenAI for AI-powered summarization, and saves the generated summary to a SharePoint document library for team review."
tags:
- ai-automation
- openai
- sharepoint
- lab-ops
- document-management
capability:
exposes:
- type: mcp
namespace: ai-docs
port: 8080
tools:
- name: summarize-lab-document
description: "Submit a lab report or regulatory document text to OpenAI GPT-4 for summarization, and save the resulting summary to the specified SharePoint library. Use for rapid review of long-form scientific documents and compliance filings."
inputParameters:
- name: document_text
in: body
type: string
description: "The full text content of the laboratory or regulatory document to summarize."
- name: sharepoint_site_id
in: body
type: string
description: "The SharePoint site ID where the summary will be saved."
- name: drive_id
in: body
type: string
description: "The SharePoint document library drive ID."
- name: document_title
in: body
type: string
description: "Title for the summary document to be saved in SharePoint."
steps:
- name: generate-summary
type: call
call: "openai.create-completion"
with:
model: "gpt-4"
prompt: "Summarize the following laboratory document in 3-5 bullet points, highlighting key findings and required actions:\n\n{{document_text}}"
- name: save-summary
type: call
call: "sharepoint.upload-file"
with:
site_id: "{{sharepoint_site_id}}"
drive_id: "{{drive_id}}"
file_name: "{{document_title}}_summary.txt"
content: "{{generate-summary.choices_text}}"
consumes:
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drives/{{drive_id}}/root/children"
inputParameters:
- name: site_id
in: path
- name: drive_id
in: path
operations:
- name: upload-file
method: PUT
Summarizes reports from SharePoint and posts to Teams.
naftiko: "0.5"
info:
label: "OpenAI Lab Report Summarization"
description: "Summarizes reports from SharePoint and posts to Teams."
tags:
- research
- laboratory
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: openai-ops
port: 8080
tools:
- name: openai-lab-report-summarization
description: "Summarizes reports from SharePoint and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "OpenAI Lab Report Summarization completed successfully."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: 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 budget data from Hyperion.
naftiko: "0.5"
info:
label: "Oracle Hyperion Budget Lookup"
description: "Retrieves budget data from Hyperion."
tags:
- finance
- oracle-hyperion
capability:
exposes:
- type: mcp
namespace: finance-budget
port: 8080
tools:
- name: get-budget
description: "Look up budget."
inputParameters:
- name: cost_center
in: body
type: string
description: "Cost center."
call: "hyperion.get-budget"
with:
cost_center: "{{cost_center}}"
outputParameters:
- name: allocated
type: string
mapping: "$.allocated"
consumes:
- type: http
namespace: hyperion
baseUri: "https://thermofisher-hyperion.oraclecloud.com/api/v1"
authentication:
type: basic
username: "$secrets.hyperion_user"
password: "$secrets.hyperion_password"
resources:
- name: budgets
path: "/budgets/{{cost_center}}"
inputParameters:
- name: cost_center
in: path
operations:
- name: get-budget
method: GET
Queries Oracle Hyperion for cost center budget variance data, identifies centers with spend exceeding threshold, and posts a variance alert to the finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Oracle Hyperion Budget Variance Alert"
description: "Queries Oracle Hyperion for cost center budget variance data, identifies centers with spend exceeding threshold, and posts a variance alert to the finance Microsoft Teams channel."
tags:
- finance
- budgeting
- oracle
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: hyperion-finance
port: 8080
tools:
- name: alert-budget-variance
description: "Query Oracle Hyperion for cost center budget vs. actuals and identify centers where spend exceeds the variance threshold percentage. Post a variance alert to the finance Teams channel. Use for monthly budget governance."
inputParameters:
- name: application_name
in: body
type: string
description: "The Hyperion application name, e.g. Plan1."
- name: plan_type
in: body
type: string
description: "The Hyperion plan type, e.g. Working."
- name: variance_threshold_pct
in: body
type: number
description: "Percentage variance threshold that triggers an alert, e.g. 10.0."
steps:
- name: get-variance
type: call
call: "hyperion.get-budget-data"
with:
application: "{{application_name}}"
plan_type: "{{plan_type}}"
- name: post-alert
type: call
call: "teams-hyperion.send-message"
with:
channel: "finance-budget-alerts"
text: "Hyperion Budget Variance Alert | App: {{application_name}} | Overspent Centers: {{get-variance.overspent_count}} | Max Variance: {{get-variance.max_variance_pct}}% | Review required."
consumes:
- type: http
namespace: hyperion
baseUri: "https://thermofisher-epm.oracle.com/HyperionPlanning/rest/v3"
authentication:
type: basic
username: "$secrets.hyperion_user"
password: "$secrets.hyperion_password"
resources:
- name: budget-data
path: "/applications/{{application}}/plantypes/{{plan_type}}/exportdata"
inputParameters:
- name: application
in: path
- name: plan_type
in: path
operations:
- name: get-budget-data
method: GET
- type: http
namespace: teams-hyperion
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates reports from Snowflake, Power BI refresh, and Teams posting.
naftiko: "0.5"
info:
label: "Power BI Executive Reporting Orchestrator"
description: "Orchestrates reports from Snowflake, Power BI refresh, and Teams posting."
tags:
- analytics
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: power-ops
port: 8080
tools:
- name: power-bi-executive-reporting
description: "Orchestrates reports from Snowflake, Power BI refresh, and Teams posting."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Power BI Executive Reporting Orchestrator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers a Power BI dataset refresh for a named report, waits for completion, and posts a distribution notification with the report link to the relevant business stakeholder Teams channel.
naftiko: "0.5"
info:
label: "Power BI Report Refresh and Distribution"
description: "Triggers a Power BI dataset refresh for a named report, waits for completion, and posts a distribution notification with the report link to the relevant business stakeholder Teams channel."
tags:
- data-analytics
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-and-distribute-report
description: "Trigger a Power BI dataset refresh for the specified workspace and dataset, then post a distribution notification with the report URL to the designated Teams channel. Use to push updated reports to business stakeholders after data loads."
inputParameters:
- name: workspace_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 to refresh."
- name: report_url
in: body
type: string
description: "The Power BI report URL to share after refresh."
- name: distribution_channel
in: body
type: string
description: "The Teams channel name for report distribution."
steps:
- name: trigger-refresh
type: call
call: "powerbi.trigger-refresh"
with:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: distribute-report
type: call
call: "teams-bi.send-message"
with:
channel: "{{distribution_channel}}"
text: "Report Ready: {{report_url}} | Dataset refreshed. Updated data is now available for review."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: teams-bi
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Lists Power BI datasets.
naftiko: "0.5"
info:
label: "Power BI Workspace Listing"
description: "Lists Power BI datasets."
tags:
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: analytics-workspace
port: 8080
tools:
- name: list-datasets
description: "List datasets."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Workspace ID."
call: "powerbi.list-datasets"
with:
workspace_id: "{{workspace_id}}"
outputParameters:
- name: datasets
type: array
mapping: "$.value"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{workspace_id}}/datasets"
inputParameters:
- name: workspace_id
in: path
operations:
- name: list-datasets
method: GET
Reviews stage gates from Jira and Snowflake, notifying via Teams.
naftiko: "0.5"
info:
label: "Product Lifecycle Stage Gate Reviewer"
description: "Reviews stage gates from Jira and Snowflake, notifying via Teams."
tags:
- product-management
- jira
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-ops
port: 8080
tools:
- name: product-lifecycle-stage-gate
description: "Reviews stage gates from Jira and Snowflake, notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Product Lifecycle Stage Gate Reviewer follow-up"
issue_type: "Task"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Product Lifecycle Stage Gate Reviewer completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://thermo-fisher-scientific.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Handles deviations by logging in ServiceNow, tracking in Snowflake, and alerting quality via Teams.
naftiko: "0.5"
info:
label: "Product Quality Deviation Handler"
description: "Handles deviations by logging in ServiceNow, tracking in Snowflake, and alerting quality via Teams."
tags:
- quality
- manufacturing
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-ops
port: 8080
tools:
- name: product-quality-deviation-handler
description: "Handles deviations by logging in ServiceNow, tracking in Snowflake, and alerting quality via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Product Quality Deviation Handler action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Product Quality Deviation Handler completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Processes recalls from SAP, notifying via Salesforce and Teams.
naftiko: "0.5"
info:
label: "Product Recall Notification Workflow"
description: "Processes recalls from SAP, notifying via Salesforce and Teams."
tags:
- quality
- supply-chain
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-ops
port: 8080
tools:
- name: product-recall-notification-workflow
description: "Processes recalls from SAP, notifying via Salesforce and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Product Recall Notification Workflow completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks registrations in Snowflake, updating SharePoint and notifying via Teams.
naftiko: "0.5"
info:
label: "Regulatory Product Registration Tracker"
description: "Tracks registrations in Snowflake, updating SharePoint and notifying via Teams."
tags:
- regulatory
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: regulatory-product-registration
description: "Tracks registrations in Snowflake, updating SharePoint and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Regulatory Product Registration Tracker completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors health from Salesforce and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Salesforce Account Health Monitor"
description: "Monitors health from Salesforce and Snowflake, posting to Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-account-health-monitor
description: "Monitors health from Salesforce and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Account Health Monitor completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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 Salesforce opportunity is marked Closed Won, creates a ServiceNow customer onboarding task, updates the account record with onboarding status, and notifies the account team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Account Onboarding Kickoff"
description: "When a Salesforce opportunity is marked Closed Won, creates a ServiceNow customer onboarding task, updates the account record with onboarding status, and notifies the account team via Microsoft Teams."
tags:
- sales
- crm
- salesforce
- servicenow
- microsoft-teams
- customer-onboarding
capability:
exposes:
- type: mcp
namespace: customer-onboarding
port: 8080
tools:
- name: kickoff-account-onboarding
description: "Given a Salesforce opportunity ID that is Closed Won, create a ServiceNow customer onboarding task for the implementation team, update the Salesforce account stage, and notify the account team via Teams. Use at the point of sale to initiate customer onboarding."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce Opportunity ID that was Closed Won."
steps:
- name: get-opportunity
type: call
call: "salesforce-opp.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: create-onboard-task
type: call
call: "servicenow-onboard.create-incident"
with:
short_description: "Customer Onboarding: {{get-opportunity.account_name}}"
category: "customer_onboarding"
assigned_group: "Customer_Success"
- name: update-account
type: call
call: "salesforce-opp.update-account-stage"
with:
account_id: "{{get-opportunity.account_id}}"
onboarding_status: "In Progress"
- name: notify-team
type: call
call: "teams-cs.send-message"
with:
channel: "customer-success-ops"
text: "New Customer Onboarding: {{get-opportunity.account_name}} | Opp: {{opportunity_id}} | ServiceNow Task: {{create-onboard-task.number}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://thermofisher.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
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account-stage
method: PATCH
- type: http
namespace: servicenow-onboard
baseUri: "https://thermofisher.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: teams-cs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Salesforce for contracts expiring within 90 days and automatically creates renewal opportunity records assigned to the account owner, then notifies the sales team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Contract Renewal Opportunity Creator"
description: "Queries Salesforce for contracts expiring within 90 days and automatically creates renewal opportunity records assigned to the account owner, then notifies the sales team via Microsoft Teams."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- contract-management
capability:
exposes:
- type: mcp
namespace: sales-renewals
port: 8080
tools:
- name: create-renewal-opportunities
description: "Query Salesforce for active contracts expiring within the specified number of days, create renewal opportunity records for each, and notify the sales team in Teams. Use to automate renewal pipeline creation and avoid revenue leakage."
inputParameters:
- name: days_to_expiry
in: body
type: integer
description: "Days ahead to look for expiring contracts, typically 90."
steps:
- name: query-expiring
type: call
call: "salesforce-ren.query-expiring-contracts"
with:
days_to_expiry: "{{days_to_expiry}}"
- name: notify-sales
type: call
call: "teams-ren.send-message"
with:
channel: "sales-contract-alerts"
text: "Renewal Pipeline | Contracts expiring in {{days_to_expiry}} days: {{query-expiring.total_size}} | Total ARR at risk: ${{query-expiring.total_value}} | Renewal opportunities created."
consumes:
- type: http
namespace: salesforce-ren
baseUri: "https://thermofisher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-expiring-contracts
method: GET
- type: http
namespace: teams-ren
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves customer account from Salesforce.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Lookup"
description: "Retrieves customer account from Salesforce."
tags:
- commercial
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account
description: "Look up customer account."
inputParameters:
- name: account_id
in: body
type: string
description: "Account ID."
call: "salesforce.get-account"
with:
id: "{{account_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: industry
type: string
mapping: "$.Industry"
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
Queries open Salesforce opportunities by stage, calculates total pipeline value, and publishes a weekly digest to the sales Microsoft Teams channel for forecast review.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Pipeline Digest"
description: "Queries open Salesforce opportunities by stage, calculates total pipeline value, and publishes a weekly digest to the sales Microsoft Teams channel for forecast review."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: sales-pipeline
port: 8080
tools:
- name: digest-opportunity-pipeline
description: "Query open Salesforce opportunities filtered by stage, calculate total pipeline value, and post a digest to the sales Teams channel. Use for weekly pipeline reviews and monthly sales forecasting at Thermo Fisher Scientific."
inputParameters:
- name: stage_name
in: body
type: string
description: "The Salesforce opportunity stage to filter, e.g. 'Proposal/Price Quote' or 'Negotiation'."
steps:
- name: query-opps
type: call
call: "salesforce-sf.query-opportunities"
with:
stage_name: "{{stage_name}}"
- name: post-digest
type: call
call: "teams-sales.send-message"
with:
channel: "sales-pipeline-review"
text: "Pipeline Digest | Stage: {{stage_name}} | Open Opportunities: {{query-opps.total_size}} | Total Value: {{query-opps.total_amount}}"
consumes:
- type: http
namespace: salesforce-sf
baseUri: "https://thermofisher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-opportunities
method: GET
- type: http
namespace: teams-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates forecasts from Salesforce and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Salesforce Renewal Forecast Generator"
description: "Generates forecasts from Salesforce and Snowflake, posting to Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-renewal-forecast
description: "Generates forecasts from Salesforce and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Renewal Forecast Generator completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Concur expense report status.
naftiko: "0.5"
info:
label: "SAP Concur Expense Status Check"
description: "Checks Concur expense report status."
tags:
- finance
- sap-concur
capability:
exposes:
- type: mcp
namespace: finance-expenses
port: 8080
tools:
- name: check-expense
description: "Check expense."
inputParameters:
- name: report_id
in: body
type: string
description: "Report ID."
call: "concur.get-report"
with:
report_id: "{{report_id}}"
outputParameters:
- name: status
type: string
mapping: "$.ApprovalStatusName"
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/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-report
method: GET
Fetches a pending SAP Concur expense report, evaluates the total against the auto-approval policy, approves it programmatically if within threshold, and notifies the submitter via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Auto-Approval"
description: "Fetches a pending SAP Concur expense report, evaluates the total against the auto-approval policy, approves it programmatically if within threshold, and notifies the submitter via Microsoft Teams."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: finance-expense
port: 8080
tools:
- name: auto-approve-expense-report
description: "Given a SAP Concur expense report ID, retrieve it, check total spend against the configured approval threshold, approve if within policy, and notify the submitter via Teams. Use for automated expense processing within finance policy limits."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID to process."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
- name: notify-submitter
type: call
call: "teams-exp.send-message"
with:
channel: "finance-expense-ops"
text: "Expense Report Processed | Report: {{report_id}} | Submitter: {{get-report.owner_name}} | Total: {{get-report.total}} {{get-report.currency_code}} | Status: Under 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: teams-exp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the SAP period-close task completion status for a given company code and fiscal period, and posts a close progress summary to the finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Financial Period Close Status Check"
description: "Retrieves the SAP period-close task completion status for a given company code and fiscal period, and posts a close progress summary to the finance Microsoft Teams channel."
tags:
- finance
- period-close
- sap
- microsoft-teams
- erp
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: check-period-close-status
description: "Given a SAP company code and fiscal period, retrieve task completion status for the period-close checklist and post a summary to the finance Teams channel. Use at month-end to track close progress across Thermo Fisher Scientific entities."
inputParameters:
- name: company_code
in: body
type: string
description: "SAP company code, e.g. 1000 for the US entity."
- name: fiscal_period
in: body
type: string
description: "Fiscal period in YYYYMM format, e.g. 202503."
steps:
- name: get-close-status
type: call
call: "sap-fc.get-period-status"
with:
company_code: "{{company_code}}"
fiscal_period: "{{fiscal_period}}"
- name: post-summary
type: call
call: "teams-fc.send-message"
with:
channel: "finance-period-close"
text: "Period Close Status | Company: {{company_code}} | Period: {{fiscal_period}} | Open Items: {{get-close-status.open_count}} | Complete: {{get-close-status.closed_count}} | % Done: {{get-close-status.completion_pct}}%"
consumes:
- type: http
namespace: sap-fc
baseUri: "https://thermofisher-s4.sap.com/sap/opu/odata/sap/API_FINANCEPERIODCLOSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: close-tasks
path: "/A_ClosingTaskCompletion"
inputParameters:
- name: company_code
in: query
- name: fiscal_period
in: query
operations:
- name: get-period-status
method: GET
outputRawFormat: xml
- type: http
namespace: teams-fc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks close from SAP, Snowflake checklists, and Teams notification.
naftiko: "0.5"
info:
label: "SAP Financial Period Close Tracker"
description: "Tracks close from SAP, Snowflake checklists, and Teams notification."
tags:
- finance
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sap-ops
port: 8080
tools:
- name: sap-financial-period-close
description: "Tracks close from SAP, Snowflake checklists, and Teams notification."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "SAP Financial Period Close Tracker completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Generates aging reports from SAP and Snowflake, notifying via Teams.
naftiko: "0.5"
info:
label: "SAP Inventory Aging Report"
description: "Generates aging reports from SAP and Snowflake, notifying via Teams."
tags:
- supply-chain
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sap-ops
port: 8080
tools:
- name: sap-inventory-aging
description: "Generates aging reports from SAP and Snowflake, notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "SAP Inventory Aging Report completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks SAP material availability.
naftiko: "0.5"
info:
label: "SAP Material Availability Check"
description: "Checks SAP material availability."
tags:
- supply-chain
- sap
capability:
exposes:
- type: mcp
namespace: scm-availability
port: 8080
tools:
- name: check-availability
description: "Check availability."
inputParameters:
- name: material
in: body
type: string
description: "Material number."
- name: plant
in: body
type: string
description: "Plant code."
call: "sap.check-atp"
with:
material: "{{material}}"
plant: "{{plant}}"
outputParameters:
- name: available_qty
type: string
mapping: "$.d.AvailableQuantity"
consumes:
- type: http
namespace: sap
baseUri: "https://thermofisher-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod"
operations:
- name: check-atp
method: GET
Retrieves a SAP S/4HANA purchase order by PO number, returning status, vendor name, total value, and open line items for procurement and accounts payable review.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Retrieves a SAP S/4HANA purchase order by PO number, returning status, vendor name, total value, and open line items for procurement and accounts payable review."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP purchase order by PO number. Returns overall approval status, vendor name, total amount, and transaction currency. Use for procurement approvals, GR/IR reconciliation, and spend reporting."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500001234."
call: "sap-po.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"
consumes:
- type: http
namespace: sap-po
baseUri: "https://thermofisher-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
outputRawFormat: xml
Retrieves vendor master data from SAP S/4HANA by vendor ID, returning payment terms, tax classification, and compliance status for procurement and accounts payable validation.
naftiko: "0.5"
info:
label: "SAP Vendor Master Data Lookup"
description: "Retrieves vendor master data from SAP S/4HANA by vendor ID, returning payment terms, tax classification, and compliance status for procurement and accounts payable validation."
tags:
- finance
- procurement
- sap
- vendor-management
- erp
capability:
exposes:
- type: mcp
namespace: erp-vendors
port: 8080
tools:
- name: get-vendor-master
description: "Look up a SAP vendor master record by vendor ID. Returns full vendor name, payment terms, currency, and tax number. Use for vendor validation during Coupa or SAP Ariba procurement request processing."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The SAP supplier/vendor ID number."
call: "sap-vendor.get-vendor"
with:
vendor_id: "{{vendor_id}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.SupplierFullName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: currency
type: string
mapping: "$.d.Currency"
- name: tax_number
type: string
mapping: "$.d.TaxNumber1"
consumes:
- type: http
namespace: sap-vendor
baseUri: "https://thermofisher-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
outputRawFormat: xml
Generates scorecards from SAP and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "SAP Vendor Performance Scorecard"
description: "Generates scorecards from SAP and Snowflake, posting to Teams."
tags:
- procurement
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sap-ops
port: 8080
tools:
- name: sap-vendor-performance-scorecard
description: "Generates scorecards from SAP and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "SAP Vendor Performance Scorecard completed successfully."
consumes:
- type: http
namespace: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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
Processes service requests via ServiceNow, SAP warranty check, and Teams.
naftiko: "0.5"
info:
label: "Scientific Instrument Service Request"
description: "Processes service requests via ServiceNow, SAP warranty check, and Teams."
tags:
- laboratory
- it-service-management
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: scientific-ops
port: 8080
tools:
- name: scientific-instrument-service-request
description: "Processes service requests via ServiceNow, SAP warranty check, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Scientific Instrument Service Request action required"
category: "automated"
assigned_group: "Operations"
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Scientific Instrument Service Request completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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: sap
baseUri: "https://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Submits a planned infrastructure change to the ServiceNow CAB queue, sends approval notifications to change board members via Microsoft Teams, and logs the approval outcome.
naftiko: "0.5"
info:
label: "ServiceNow Change Request CAB Approval"
description: "Submits a planned infrastructure change to the ServiceNow CAB queue, sends approval notifications to change board members via Microsoft Teams, and logs the approval outcome."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: itsm-cab
port: 8080
tools:
- name: submit-cab-change
description: "Submit a ServiceNow change request to the Change Advisory Board (CAB) approval queue. Provide change title, risk level, and scheduled maintenance window. Notifies CAB members via Teams and awaits approval. Use for all production infrastructure changes."
inputParameters:
- name: change_title
in: body
type: string
description: "Short description of the proposed change."
- name: risk_level
in: body
type: string
description: "Change risk level: low, medium, or high."
- name: planned_start
in: body
type: string
description: "Maintenance window start in ISO 8601 format."
- name: planned_end
in: body
type: string
description: "Maintenance window end in ISO 8601 format."
steps:
- name: create-change
type: call
call: "servicenow-cab.create-change"
with:
short_description: "{{change_title}}"
risk: "{{risk_level}}"
start_date: "{{planned_start}}"
end_date: "{{planned_end}}"
state: "scheduled"
- name: notify-cab
type: call
call: "teams-cab.send-message"
with:
channel: "it-change-advisory-board"
text: "CAB Change Request: {{change_title}} | CR#: {{create-change.number}} | Risk: {{risk_level}} | Window: {{planned_start}} - {{planned_end}} | Approval required."
consumes:
- type: http
namespace: servicenow-cab
baseUri: "https://thermofisher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: teams-cab
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Coordinates incidents via ServiceNow and Teams war rooms.
naftiko: "0.5"
info:
label: "ServiceNow Major Incident Coordinator"
description: "Coordinates incidents via ServiceNow and Teams war rooms."
tags:
- it-service-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: servicenow-ops
port: 8080
tools:
- name: servicenow-major-incident
description: "Coordinates incidents via ServiceNow and Teams war rooms."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "ServiceNow Major Incident Coordinator action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "ServiceNow Major Incident Coordinator completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks ServiceNow ticket status.
naftiko: "0.5"
info:
label: "ServiceNow Ticket Status"
description: "Checks ServiceNow ticket status."
tags:
- it-service-management
- servicenow
capability:
exposes:
- type: mcp
namespace: itsm-ticket
port: 8080
tools:
- name: get-ticket-status
description: "Check ticket status."
inputParameters:
- name: ticket_number
in: body
type: string
description: "Ticket number."
call: "servicenow.get-incident"
with:
number: "{{ticket_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
consumes:
- type: http
namespace: servicenow
baseUri: "https://thermofisher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
Lists SharePoint site documents.
naftiko: "0.5"
info:
label: "SharePoint Site Document Listing"
description: "Lists SharePoint site documents."
tags:
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: collab-docs
port: 8080
tools:
- name: list-site-docs
description: "List documents."
inputParameters:
- name: site_id
in: body
type: string
description: "Site ID."
call: "sharepoint.list-items"
with:
site_id: "{{site_id}}"
outputParameters:
- name: items
type: array
mapping: "$.value"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
Generates cost reports from Snowflake, ServiceNow tickets, and Teams.
naftiko: "0.5"
info:
label: "Snowflake Cost Optimization Report"
description: "Generates cost reports from Snowflake, ServiceNow tickets, and Teams."
tags:
- finops
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: snowflake-ops
port: 8080
tools:
- name: snowflake-cost-optimization
description: "Generates cost reports from Snowflake, ServiceNow tickets, and Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Snowflake Cost Optimization Report action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Snowflake Cost Optimization Report completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Audits Snowflake access, creating ServiceNow findings, and notifying via Teams.
naftiko: "0.5"
info:
label: "Snowflake Data Governance Compliance Check"
description: "Audits Snowflake access, creating ServiceNow findings, and notifying via Teams."
tags:
- data-governance
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: snowflake-ops
port: 8080
tools:
- name: snowflake-data-governance-compliance
description: "Audits Snowflake access, creating ServiceNow findings, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Snowflake Data Governance Compliance Check action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Snowflake Data Governance Compliance Check completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.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
Queries Snowflake task execution history for failed or delayed ETL tasks across key life science data domains, and posts a quality report to the data engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Pipeline Monitor"
description: "Queries Snowflake task execution history for failed or delayed ETL tasks across key life science data domains, and posts a quality report to the data engineering Microsoft Teams channel."
tags:
- data-analytics
- snowflake
- microsoft-teams
- data-quality
- monitoring
capability:
exposes:
- type: mcp
namespace: data-quality-ops
port: 8080
tools:
- name: monitor-data-pipeline
description: "Query Snowflake task history for failed or delayed tasks in the specified database over the past 24 hours, and post a data quality report to the data engineering Teams channel. Use for daily ETL health monitoring."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database to monitor, e.g. LIMS_PROD or OMICS_DW."
steps:
- name: get-task-history
type: call
call: "snowflake.get-task-history"
with:
database: "{{database_name}}"
- name: post-report
type: call
call: "teams-de.send-message"
with:
channel: "data-engineering-ops"
text: "Data Pipeline Health | DB: {{database_name}} | Failed Tasks: {{get-task-history.failed_count}} | Last Run: {{get-task-history.latest_run}} | Action required: {{get-task-history.requires_action}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermofisher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/{{database}}/tasks/history"
inputParameters:
- name: database
in: path
operations:
- name: get-task-history
method: GET
- type: http
namespace: teams-de
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Counts rows in lab data table.
naftiko: "0.5"
info:
label: "Snowflake Lab Data Row Count"
description: "Counts rows in lab data table."
tags:
- data-engineering
- snowflake
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: count-lab-rows
description: "Count lab rows."
inputParameters:
- name: table_name
in: body
type: string
description: "Table name."
call: "snowflake.run-query"
with:
statement: "SELECT COUNT(*) FROM {{table_name}}"
outputParameters:
- name: count
type: integer
mapping: "$.data[0][0]"
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermofisher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Queries Snowflake account usage for storage consumption and time-travel costs, identifies top consumers, and posts an optimization digest to the cloud FinOps Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Storage Cost Optimization Report"
description: "Queries Snowflake account usage for storage consumption and time-travel costs, identifies top consumers, and posts an optimization digest to the cloud FinOps Microsoft Teams channel."
tags:
- data-analytics
- snowflake
- microsoft-teams
- cost-optimization
- cloud
capability:
exposes:
- type: mcp
namespace: snowflake-finops
port: 8080
tools:
- name: report-storage-costs
description: "Query Snowflake account usage views for storage consumption by database, including time-travel and fail-safe storage. Post an optimization report to the cloud FinOps Teams channel. Use monthly to identify storage reduction opportunities."
inputParameters:
- name: min_storage_tb
in: body
type: number
description: "Minimum storage in terabytes to include in the report."
steps:
- name: get-storage-usage
type: call
call: "snowflake-usage.get-storage"
with:
min_storage_tb: "{{min_storage_tb}}"
- name: post-report
type: call
call: "teams-finops.send-message"
with:
channel: "cloud-finops"
text: "Snowflake Storage Report | Total Storage: {{get-storage-usage.total_tb}} TB | Top DB: {{get-storage-usage.top_database}} | Monthly Cost Estimate: ${{get-storage-usage.estimated_cost}} | Review for optimization."
consumes:
- type: http
namespace: snowflake-usage
baseUri: "https://thermofisher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: storage-usage
path: "/databases/snowflake/schemas/account_usage/views/storage_usage"
inputParameters:
- name: min_storage_tb
in: query
operations:
- name: get-storage
method: GET
- type: http
namespace: teams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks Snowflake warehouse utilization.
naftiko: "0.5"
info:
label: "Snowflake Warehouse Utilization Check"
description: "Checks Snowflake warehouse utilization."
tags:
- data-engineering
- snowflake
capability:
exposes:
- type: mcp
namespace: data-infra
port: 8080
tools:
- name: check-warehouse
description: "Check warehouse."
inputParameters:
- name: warehouse_name
in: body
type: string
description: "Warehouse name."
call: "snowflake.run-query"
with:
statement: "SELECT AVG(avg_running) FROM snowflake.account_usage.warehouse_load_history WHERE warehouse_name='{{warehouse_name}}'"
outputParameters:
- name: avg_utilization
type: string
mapping: "$.data[0][0]"
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermofisher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Syncs demand from Snowflake to SAP, notifying via Teams.
naftiko: "0.5"
info:
label: "Supply Chain Demand Planning Sync"
description: "Syncs demand from Snowflake to SAP, notifying via Teams."
tags:
- supply-chain
- snowflake
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-ops
port: 8080
tools:
- name: supply-chain-demand-planning
description: "Syncs demand from Snowflake to SAP, notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-sap-data
type: call
call: "sap.get-partner"
with:
filter: "BusinessPartnerCategory eq 1"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Supply Chain Demand Planning Sync completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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://thermo-fisher-scientific-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: partners
path: "/A_BusinessPartner"
operations:
- name: get-partner
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Posts Teams channel message.
naftiko: "0.5"
info:
label: "Teams Message Post"
description: "Posts Teams channel message."
tags:
- collaboration
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: collab-msg
port: 8080
tools:
- name: post-message
description: "Post message."
inputParameters:
- name: team_id
in: body
type: string
description: "Team ID."
- name: channel_id
in: body
type: string
description: "Channel ID."
- name: message
in: body
type: string
description: "Text."
call: "msteams.post-channel-message"
with:
team_id: "{{team_id}}"
channel_id: "{{channel_id}}"
body: "{{message}}"
outputParameters:
- name: id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates enrollment from Workday and confirms via Teams.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Orchestrator"
description: "Orchestrates enrollment from Workday and confirms via Teams."
tags:
- hr
- benefits
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-benefits-enrollment
description: "Orchestrates enrollment from Workday and confirms via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Benefits Enrollment Orchestrator completed successfully."
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
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
Initiates an annual compensation review cycle in Workday for a management unit, notifies HR business partners via Microsoft Teams, and opens a ServiceNow tracking task.
naftiko: "0.5"
info:
label: "Workday Compensation Review Cycle Initiation"
description: "Initiates an annual compensation review cycle in Workday for a management unit, notifies HR business partners via Microsoft Teams, and opens a ServiceNow tracking task."
tags:
- hr
- compensation
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-comp-cycle
port: 8080
tools:
- name: initiate-comp-review-cycle
description: "Start a Workday compensation review cycle for a management unit and review period. Notify HR business partners via Teams and create a ServiceNow task to track cycle completion. Use at the start of annual merit and bonus planning cycles."
inputParameters:
- name: management_unit_id
in: body
type: string
description: "Workday management unit (organization) ID for the review cycle."
- name: review_period
in: body
type: string
description: "Label for the review period, e.g. 2025 Annual Merit Review."
steps:
- name: create-cycle
type: call
call: "workday-cc.create-comp-cycle"
with:
management_unit_id: "{{management_unit_id}}"
review_period: "{{review_period}}"
- name: notify-hrbp
type: call
call: "teams-hrbp.send-message"
with:
channel: "hr-business-partners"
text: "Compensation Review Cycle Started | Period: {{review_period}} | Unit: {{management_unit_id}} | Cycle ID: {{create-cycle.cycle_id}} | Deadline in 30 days."
- name: open-tracking-task
type: call
call: "servicenow-hrc.create-incident"
with:
short_description: "Track {{review_period}} comp review cycle completion"
category: "hr_compensation"
assignment_group: "HR_Total_Rewards"
consumes:
- type: http
namespace: workday-cc
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: comp-cycles
path: "/thermofisher/compensation/cycles"
operations:
- name: create-comp-cycle
method: POST
- type: http
namespace: teams-hrbp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: servicenow-hrc
baseUri: "https://thermofisher.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
Retrieves employee profile from Workday.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee profile from Workday."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-employee
port: 8080
tools:
- name: get-employee
description: "Look up Workday employee."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: name
type: string
mapping: "$.displayName"
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: "/thermofisher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
Exports active employee headcount grouped by department and cost center from Workday, returning a real-time snapshot for workforce planning and finance budget reconciliation.
naftiko: "0.5"
info:
label: "Workday Headcount by Department and Cost Center"
description: "Exports active employee headcount grouped by department and cost center from Workday, returning a real-time snapshot for workforce planning and finance budget reconciliation."
tags:
- hr
- reporting
- workday
- headcount
- finance
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-snapshot
description: "Return active employee headcount grouped by department and cost center from Workday. Use for quarterly workforce planning, budget reviews, and headcount audits across Thermo Fisher Scientific business units."
call: "workday-rpt.get-headcount"
outputParameters:
- name: employees
type: array
mapping: "$.Report_Entry"
items:
- name: employee_id
type: string
mapping: "$.Employee_ID"
- name: full_name
type: string
mapping: "$.Worker"
- name: cost_center
type: string
mapping: "$.Cost_Center"
- name: department
type: string
mapping: "$.Department"
- name: employment_type
type: string
mapping: "$.Employment_Type"
consumes:
- type: http
namespace: workday-rpt
baseUri: "https://wd2-impl-services1.workday.com/ccx/service/customreport2"
authentication:
type: basic
username: "$secrets.workday_report_user"
password: "$secrets.workday_report_password"
resources:
- name: headcount-report
path: "/thermofisher/headcount_by_cost_center"
operations:
- name: get-headcount
method: GET
outputRawFormat: json
Creates a new job requisition in Workday for an approved headcount, then notifies the recruiting team via Microsoft Teams with the requisition ID and job posting details.
naftiko: "0.5"
info:
label: "Workday Job Requisition and Recruiting Kickoff"
description: "Creates a new job requisition in Workday for an approved headcount, then notifies the recruiting team via Microsoft Teams with the requisition ID and job posting details."
tags:
- hr
- recruiting
- workday
- microsoft-teams
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: hr-recruiting
port: 8080
tools:
- name: create-job-requisition
description: "Create a Workday job requisition for an open position given job title, department, location, and hiring manager. Notifies the TA team in Teams with the requisition ID. Use when headcount has been approved and the role needs to be posted."
inputParameters:
- name: job_title
in: body
type: string
description: "Job title for the open position."
- name: department
in: body
type: string
description: "Workday department ID."
- name: location
in: body
type: string
description: "Work location, e.g. Waltham MA, Remote, San Diego CA."
- name: hiring_manager_id
in: body
type: string
description: "Workday worker ID of the hiring manager."
steps:
- name: create-req
type: call
call: "workday-req.create-requisition"
with:
job_title: "{{job_title}}"
department: "{{department}}"
location: "{{location}}"
hiring_manager_id: "{{hiring_manager_id}}"
- name: notify-ta
type: call
call: "teams-recruit.send-message"
with:
channel: "talent-acquisition"
text: "New Requisition Created | {{job_title}} | Dept: {{department}} | Location: {{location}} | Req ID: {{create-req.requisition_id}} | Hiring Manager: {{hiring_manager_id}}"
consumes:
- type: http
namespace: workday-req
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/thermofisher/jobRequisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: teams-recruit
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When an employee termination is entered in Workday, disables the Microsoft 365 account, clears Okta sessions, opens a ServiceNow offboarding ticket, and notifies the manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Offboarding and Access Revocation"
description: "When an employee termination is entered in Workday, disables the Microsoft 365 account, clears Okta sessions, opens a ServiceNow offboarding ticket, and notifies the manager via Microsoft Teams."
tags:
- hr
- offboarding
- workday
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, disable Microsoft 365 account, revoke Okta sessions, create a ServiceNow offboarding ticket for equipment return, and notify the manager via Teams. Use when employee terminations are confirmed in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "Employee last day in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday-off.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: disable-m365
type: call
call: "msgraph-off.disable-user"
with:
user_id: "{{get-employee.azure_ad_id}}"
- name: revoke-okta
type: call
call: "okta.clear-sessions"
with:
login: "{{get-employee.work_email}}"
- name: open-ticket
type: call
call: "servicenow-off.create-incident"
with:
short_description: "Offboarding: {{get-employee.full_name}} | Last Day: {{termination_date}}"
category: "hr_offboarding"
- name: notify-manager
type: call
call: "teams-off.send-message"
with:
channel: "hr-offboarding-ops"
text: "Offboarding initiated for {{get-employee.full_name}} | Last Day: {{termination_date}} | ServiceNow: {{open-ticket.number}}"
consumes:
- type: http
namespace: workday-off
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/thermofisher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: okta
baseUri: "https://thermofisher.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: user-sessions
path: "/users/{{login}}/sessions"
inputParameters:
- name: login
in: path
operations:
- name: clear-sessions
method: DELETE
- type: http
namespace: servicenow-off
baseUri: "https://thermofisher.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: teams-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Propagates restructures from Workday to ServiceNow and notifies via Teams.
naftiko: "0.5"
info:
label: "Workday Org Restructure Propagation"
description: "Propagates restructures from Workday to ServiceNow and notifies via Teams."
tags:
- hr
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-org-restructure-propagation
description: "Propagates restructures from Workday to ServiceNow and notifies via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Workday Org Restructure Propagation action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Org Restructure Propagation completed successfully."
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://thermo-fisher-scientific.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Generates reports from Workday and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Workday Succession Planning Report"
description: "Generates reports from Workday and Snowflake, posting to Teams."
tags:
- hr
- workforce-planning
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-succession-planning
description: "Generates reports from Workday and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Succession Planning Report completed successfully."
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: "/thermo-fisher-scientific/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://thermo-fisher-scientific.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