Thermo Fisher Scientific Capabilities

Naftiko 0.5 capability definitions for Thermo Fisher Scientific - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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