Bain & Company Capabilities

Naftiko 0.5 capability definitions for Bain & Company - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Collects access entitlements, routes for review, revokes expired access, and creates audit records.

naftiko: "0.5"
info:
  label: "Access Review Certification Pipeline"
  description: "Collects access entitlements, routes for review, revokes expired access, and creates audit records."
  tags:
    - security
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: access_review_certification_pipeline
          description: "Orchestrate access review certification pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-okta
              type: call
              call: "okta.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-okta.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Access Review Certification Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bain-and-company.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Pulls website metrics from Adobe Analytics, compares with Google Analytics data for cross-validation, and publishes the audit findings to the case Confluence space.

naftiko: "0.5"
info:
  label: "Adobe Analytics Digital Audit Pipeline"
  description: "Pulls website metrics from Adobe Analytics, compares with Google Analytics data for cross-validation, and publishes the audit findings to the case Confluence space."
  tags:
    - digital
    - analytics
    - adobe-analytics
    - google-analytics
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: digital-audit
      port: 8080
      tools:
        - name: run-digital-audit
          description: "Given analytics IDs, run a cross-platform digital audit and publish findings."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID."
            - name: ga_property_id
              in: body
              type: string
              description: "Google Analytics GA4 property ID."
            - name: date_from
              in: body
              type: string
              description: "Start date (YYYY-MM-DD)."
            - name: date_to
              in: body
              type: string
              description: "End date (YYYY-MM-DD)."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-adobe-data
              type: call
              call: "adobe-analytics.get-report"
              with:
                rsid: "{{report_suite_id}}"
                date_from: "{{date_from}}"
                date_to: "{{date_to}}"
            - name: get-ga-data
              type: call
              call: "google-analytics.run-report"
              with:
                property_id: "{{ga_property_id}}"
                start_date: "{{date_from}}"
                end_date: "{{date_to}}"
            - name: publish-audit
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Digital Audit: {{date_from}} to {{date_to}}"
                body: "Adobe sessions: {{get-adobe-data.total_visits}} | GA sessions: {{get-ga-data.total_sessions}} | Adobe bounce rate: {{get-adobe-data.bounce_rate}} | GA bounce rate: {{get-ga-data.bounce_rate}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{report_suite_id}}/reports"
          inputParameters:
            - name: report_suite_id
              in: path
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Pulls case context from Confluence, sends it to OpenAI for hypothesis generation, and publishes the structured analysis back to the case Confluence space for team review.

naftiko: "0.5"
info:
  label: "AI-Powered Case Hypothesis Generator"
  description: "Pulls case context from Confluence, sends it to OpenAI for hypothesis generation, and publishes the structured analysis back to the case Confluence space for team review."
  tags:
    - artificial-intelligence
    - research
    - openai
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: ai-insights
      port: 8080
      tools:
        - name: generate-hypotheses
          description: "Given a case code, pull context from Confluence, generate AI hypotheses, and publish results."
          inputParameters:
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: focus_area
              in: body
              type: string
              description: "Specific area of analysis (e.g., 'growth strategy', 'cost reduction')."
          steps:
            - name: get-case-context
              type: call
              call: "confluence.search"
              with:
                cql: "space=\"{{case_code}}\" AND type=page ORDER BY lastModified DESC"
            - name: generate-insights
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4"
                prompt: "Based on this case context: {{get-case-context.excerpts}}. Generate hypotheses for {{focus_area}}."
            - name: publish-hypotheses
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "AI Hypotheses: {{focus_area}} - {{$now}}"
                body: "{{generate-insights.response}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain.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
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST

Triggers an Alteryx Server workflow by ID, used to run recurring analytics models for client engagements.

naftiko: "0.5"
info:
  label: "Alteryx Workflow Trigger"
  description: "Triggers an Alteryx Server workflow by ID, used to run recurring analytics models for client engagements."
  tags:
    - analytics
    - automation
    - alteryx
capability:
  exposes:
    - type: mcp
      namespace: alteryx-runner
      port: 8080
      tools:
        - name: run-workflow
          description: "Trigger an Alteryx workflow by workflow ID."
          inputParameters:
            - name: workflow_id
              in: body
              type: string
              description: "Alteryx Server workflow ID."
          call: "alteryx.run-workflow"
          with:
            workflow_id: "{{workflow_id}}"
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://bain.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/run"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST

Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress.

naftiko: "0.5"
info:
  label: "API Deprecation Notice Pipeline"
  description: "Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress."
  tags:
    - engineering
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: api_deprecation_notice_pipeline
          description: "Orchestrate api deprecation notice pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "API Deprecation Notice Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers an Azure DevOps build pipeline by definition ID, used by the internal tools team to deploy internal analytics applications.

naftiko: "0.5"
info:
  label: "Azure DevOps Pipeline Trigger"
  description: "Triggers an Azure DevOps build pipeline by definition ID, used by the internal tools team to deploy internal analytics applications."
  tags:
    - development
    - ci-cd
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: devops-pipeline
      port: 8080
      tools:
        - name: trigger-build
          description: "Trigger an Azure DevOps build pipeline."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: definition_id
              in: body
              type: string
              description: "Build definition ID."
          call: "azure-devops.queue-build"
          with:
            project: "{{project}}"
            definition_id: "{{definition_id}}"
  consumes:
    - type: http
      namespace: azure-devops
      baseUri: "https://dev.azure.com/bain"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azure_devops_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?api-version=7.0"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: queue-build
              method: POST

Retrieves current monitoring alert status. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Alert Status Check"
  description: "Retrieves current monitoring alert status. Used by Bain and Company teams."
  tags:
    - consulting
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: tableau
      port: 8080
      tools:
        - name: get-alert_status_check
          description: "Retrieves current monitoring alert status. Used by Bain and Company teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The alert_id to look up." 
          call: "tableau.get-alert_id"
          with:
            alert_id: "{{alert_id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://bain-and-company-tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_alert_status_check
              method: GET

Checks availability of an API endpoint. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company API Endpoint Status"
  description: "Checks availability of an API endpoint. Used by Bain and Company teams."
  tags:
    - consulting
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: datadog
      port: 8080
      tools:
        - name: get-api_endpoint_status
          description: "Checks availability of an API endpoint. Used by Bain and Company teams."
          inputParameters:
            - name: endpoint_url
              in: body
              type: string
              description: "The endpoint_url to look up." 
          call: "datadog.get-endpoint_url"
          with:
            endpoint_url: "{{endpoint_url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_api_endpoint_status
              method: GET

Creates project workspace, provisions tools access, generates kickoff materials, and notifies the case team.

naftiko: "0.5"
info:
  label: "Client Engagement Setup Pipeline"
  description: "Creates project workspace, provisions tools access, generates kickoff materials, and notifies the case team."
  tags:
    - engagement
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engagement
      port: 8080
      tools:
        - name: bain_client_engagement_setup_pipeline
          description: "Orchestrate client engagement setup pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Client Engagement Setup Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves compliance check status. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Compliance Check Status"
  description: "Retrieves compliance check status. Used by Bain and Company teams."
  tags:
    - consulting
    - okta
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: get-compliance_check_status
          description: "Retrieves compliance check status. Used by Bain and Company teams."
          inputParameters:
            - name: check_id
              in: body
              type: string
              description: "The check_id to look up." 
          call: "okta.get-check_id"
          with:
            check_id: "{{check_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bain-and-company.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_compliance_check_status
              method: GET

Tracks consultant allocation, calculates utilization rates, identifies gaps, and notifies staffing.

naftiko: "0.5"
info:
  label: "Consultant Utilization Pipeline"
  description: "Tracks consultant allocation, calculates utilization rates, identifies gaps, and notifies staffing."
  tags:
    - operations
    - workday
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: bain_consultant_utilization_pipeline
          description: "Orchestrate consultant utilization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Consultant Utilization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries cost and spending data. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Cost Report Query"
  description: "Queries cost and spending data. Used by Bain and Company teams."
  tags:
    - consulting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: get-cost_report_query
          description: "Queries cost and spending data. Used by Bain and Company teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The cost_center to look up." 
          call: "workday.get-cost_center"
          with:
            cost_center: "{{cost_center}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_cost_report_query
              method: GET

Executes a read-only analytics query. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Database Query Runner"
  description: "Executes a read-only analytics query. Used by Bain and Company teams."
  tags:
    - consulting
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: get-database_query_runner
          description: "Executes a read-only analytics query. Used by Bain and Company teams."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The sql_query to look up." 
          call: "servicenow.get-sql_query"
          with:
            sql_query: "{{sql_query}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_database_query_runner
              method: GET

Analyzes deal pipeline, runs forecast models, generates revenue projections, and updates leadership.

naftiko: "0.5"
info:
  label: "Deal Pipeline Forecasting Pipeline"
  description: "Analyzes deal pipeline, runs forecast models, generates revenue projections, and updates leadership."
  tags:
    - sales
    - salesforce
    - snowflake
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: bain_deal_pipeline_forecasting_pipeline
          description: "Orchestrate deal pipeline forecasting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-salesforce
              type: call
              call: "salesforce.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-salesforce.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Deal Pipeline Forecasting Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Checks status of a recent deployment. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Deployment Status Check"
  description: "Checks status of a recent deployment. Used by Bain and Company teams."
  tags:
    - consulting
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: elasticsearc
      port: 8080
      tools:
        - name: get-deployment_status_check
          description: "Checks status of a recent deployment. Used by Bain and Company teams."
          inputParameters:
            - name: deployment_id
              in: body
              type: string
              description: "The deployment_id to look up." 
          call: "elasticsearch.get-deployment_id"
          with:
            deployment_id: "{{deployment_id}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-and-company-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_deployment_status_check
              method: GET

Retrieves a document from knowledge management. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Document Retrieval"
  description: "Retrieves a document from knowledge management. Used by Bain and Company teams."
  tags:
    - consulting
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: hubspot
      port: 8080
      tools:
        - name: get-document_retrieval
          description: "Retrieves a document from knowledge management. Used by Bain and Company teams."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The document_id to look up." 
          call: "hubspot.get-document_id"
          with:
            document_id: "{{document_id}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_document_retrieval
              method: GET

Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "Employee Onboarding Automation Pipeline"
  description: "Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers."
  tags:
    - hr
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: bain_employee_onboarding_automation
          description: "Orchestrate employee onboarding automation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Employee Onboarding Automation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Reviews and curates knowledge assets, updates taxonomy, publishes to repository, and notifies teams.

naftiko: "0.5"
info:
  label: "Knowledge Asset Curation Pipeline"
  description: "Reviews and curates knowledge assets, updates taxonomy, publishes to repository, and notifies teams."
  tags:
    - knowledge
    - confluence
    - elasticsearch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: bain_knowledge_asset_curation_pipeline
          description: "Orchestrate knowledge asset curation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-elasticsearch
              type: call
              call: "elasticsearch.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Knowledge Asset Curation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-and-company-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Searches application logs for matching patterns. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Log Search Query"
  description: "Searches application logs for matching patterns. Used by Bain and Company teams."
  tags:
    - consulting
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: get-log_search_query
          description: "Searches application logs for matching patterns. Used by Bain and Company teams."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "snowflake.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_log_search_query
              method: GET

Aggregates market data, runs analytical models, generates insights, and distributes to consultants.

naftiko: "0.5"
info:
  label: "Market Analysis Data Pipeline"
  description: "Aggregates market data, runs analytical models, generates insights, and distributes to consultants."
  tags:
    - research
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: research
      port: 8080
      tools:
        - name: bain_market_analysis_data_pipeline
          description: "Orchestrate market analysis data pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Market Analysis Data Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries metric values from a monitoring dashboard. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Metric Dashboard Query"
  description: "Queries metric values from a monitoring dashboard. Used by Bain and Company teams."
  tags:
    - consulting
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: powerbi
      port: 8080
      tools:
        - name: get-metric_dashboard_query
          description: "Queries metric values from a monitoring dashboard. Used by Bain and Company teams."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The metric_name to look up." 
          call: "powerbi.get-metric_name"
          with:
            metric_name: "{{metric_name}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_metric_dashboard_query
              method: GET

Queries metric values from a monitoring dashboard. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Metric Dashboard Query"
  description: "Queries metric values from a monitoring dashboard. Used by Bain and Company teams."
  tags:
    - consulting
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: powerbi
      port: 8080
      tools:
        - name: get-metric_dashboard_query
          description: "Queries metric values from a monitoring dashboard. Used by Bain and Company teams."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The metric_name to look up." 
          call: "powerbi.get-metric_name"
          with:
            metric_name: "{{metric_name}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_powerbi_metric_dashboard_
              method: GET

Checks the current status of a project. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Project Status Check"
  description: "Checks the current status of a project. Used by Bain and Company teams."
  tags:
    - consulting
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: get-project_status_check
          description: "Checks the current status of a project. Used by Bain and Company teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The project_key to look up." 
          call: "jira.get-project_key"
          with:
            project_key: "{{project_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_project_status_check
              method: GET

Retrieves code repository information. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Repository Info Lookup"
  description: "Retrieves code repository information. Used by Bain and Company teams."
  tags:
    - consulting
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: get-repository_info_lookup
          description: "Retrieves code repository information. Used by Bain and Company teams."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The repo_name to look up." 
          call: "grafana.get-repo_name"
          with:
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://bain-and-company-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_repository_info_lookup
              method: GET

Checks the health status of a monitored service. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Service Health Check"
  description: "Checks the health status of a monitored service. Used by Bain and Company teams."
  tags:
    - consulting
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-service_health_check
          description: "Checks the health status of a monitored service. Used by Bain and Company teams."
          inputParameters:
            - name: health_target
              in: body
              type: string
              description: "The health_target to look up." 
          call: "salesforce.get-health_target"
          with:
            health_target: "{{health_target}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_salesforce_service_health
              method: GET

Detects security incidents, enriches with context, creates response tickets, and notifies the SOC.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "Detects security incidents, enriches with context, creates response tickets, and notifies the SOC."
  tags:
    - security
    - splunk
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: bain_security_incident_response_pipeline
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-salesforce
              type: call
              call: "salesforce.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-salesforce.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Security Incident Response Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Retrieves vulnerability scan results. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Security Scan Results"
  description: "Retrieves vulnerability scan results. Used by Bain and Company teams."
  tags:
    - consulting
    - github
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: get-security_scan_results
          description: "Retrieves vulnerability scan results. Used by Bain and Company teams."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The scan_id to look up." 
          call: "github.get-scan_id"
          with:
            scan_id: "{{scan_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_security_scan_results
              method: GET

Checks the health status of a monitored service. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Service Health Check"
  description: "Checks the health status of a monitored service. Used by Bain and Company teams."
  tags:
    - consulting
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-service_health_check
          description: "Checks the health status of a monitored service. Used by Bain and Company teams."
          inputParameters:
            - name: health_target
              in: body
              type: string
              description: "The health_target to look up." 
          call: "salesforce.get-health_target"
          with:
            health_target: "{{health_target}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_service_health_check
              method: GET

Searches application logs for matching patterns. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Log Search Query"
  description: "Searches application logs for matching patterns. Used by Bain and Company teams."
  tags:
    - consulting
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: get-log_search_query
          description: "Searches application logs for matching patterns. Used by Bain and Company teams."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "snowflake.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_snowflake_log_search_quer
              method: GET

Retrieves the details of a support ticket. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company Ticket Details Lookup"
  description: "Retrieves the details of a support ticket. Used by Bain and Company teams."
  tags:
    - consulting
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack
      port: 8080
      tools:
        - name: get-ticket_details_lookup
          description: "Retrieves the details of a support ticket. Used by Bain and Company teams."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The ticket_id to look up." 
          call: "slack.get-ticket_id"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_ticket_details_lookup
              method: GET

Retrieves user account details from the directory. Used by Bain and Company teams.

naftiko: "0.5"
info:
  label: "Bain and Company User Account Lookup"
  description: "Retrieves user account details from the directory. Used by Bain and Company teams."
  tags:
    - consulting
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: confluence
      port: 8080
      tools:
        - name: get-user_account_lookup
          description: "Retrieves user account details from the directory. Used by Bain and Company teams."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The user_id to look up." 
          call: "confluence.get-user_id"
          with:
            user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bain_user_account_lookup
              method: GET

Fetches Bloomberg Intelligence research for a sector, cross-references with Factiva news coverage, and publishes a consolidated briefing to the case team Confluence space.

naftiko: "0.5"
info:
  label: "Bloomberg Intelligence Briefing Pipeline"
  description: "Fetches Bloomberg Intelligence research for a sector, cross-references with Factiva news coverage, and publishes a consolidated briefing to the case team Confluence space."
  tags:
    - research
    - market-intelligence
    - bloomberg-intelligence
    - factiva
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: market-research
      port: 8080
      tools:
        - name: build-sector-briefing
          description: "Given a sector and case code, build a consolidated BI briefing from Bloomberg and Factiva into Confluence."
          inputParameters:
            - name: sector
              in: body
              type: string
              description: "The BI sector code (e.g., TECH, HLTH)."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-bi-research
              type: call
              call: "bloomberg-intel.get-research"
              with:
                sector: "{{sector}}"
                date_from: "{{date_from}}"
            - name: get-news-coverage
              type: call
              call: "factiva.search-articles"
              with:
                query: "{{sector}}"
                date_range: "{{date_from}}"
            - name: publish-briefing
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Sector Briefing: {{sector}} - {{date_from}}"
                body: "BI research notes: {{get-bi-research.note_count}} | Key themes: {{get-bi-research.themes}} | News articles: {{get-news-coverage.article_count}}"
  consumes:
    - type: http
      namespace: bloomberg-intel
      baseUri: "https://api.bloomberg.com/eap/intelligence"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: research-notes
          path: "/research?sector={{sector}}&from={{date_from}}"
          inputParameters:
            - name: sector
              in: query
            - name: date_from
              in: query
          operations:
            - name: get-research
              method: GET
    - type: http
      namespace: factiva
      baseUri: "https://api.dowjones.com/content"
      authentication:
        type: bearer
        token: "$secrets.factiva_token"
      resources:
        - name: articles
          path: "/articles"
          operations:
            - name: search-articles
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Analyzes resource utilization trends, forecasts capacity needs, creates procurement requests, and reports.

naftiko: "0.5"
info:
  label: "Capacity Planning Forecast Pipeline"
  description: "Analyzes resource utilization trends, forecasts capacity needs, creates procurement requests, and reports."
  tags:
    - infrastructure
    - grafana
    - snowflake
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: capacity_planning_forecast_pipeline
          description: "Orchestrate capacity planning forecast pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-grafana
              type: call
              call: "grafana.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-grafana.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Capacity Planning Forecast Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://bain-and-company-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

On case completion, archives the SharePoint case folder, closes the Salesforce opportunity, publishes final deliverables to Confluence, and sends a closeout summary to the case team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Case Closeout Orchestrator"
  description: "On case completion, archives the SharePoint case folder, closes the Salesforce opportunity, publishes final deliverables to Confluence, and sends a closeout summary to the case team via Microsoft Teams."
  tags:
    - consulting
    - case-management
    - sharepoint
    - salesforce
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: case-closeout
      port: 8080
      tools:
        - name: close-case
          description: "Given a case code, archive documents, close CRM records, publish deliverables, and notify the team."
          inputParameters:
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: team_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the case team."
          steps:
            - name: archive-folder
              type: call
              call: "sharepoint.move-folder"
              with:
                site_id: "case_management_site"
                source_path: "Cases/{{case_code}}"
                destination_path: "Archive/{{case_code}}"
            - name: close-opportunity
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                stage: "Closed Won"
            - name: publish-deliverables
              type: call
              call: "confluence.create-page"
              with:
                space_key: "DELIVERABLES"
                title: "Final Deliverables: {{case_code}}"
                body: "Case {{case_code}} completed. Archive: {{archive-folder.url}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "{{team_channel_id}}"
                text: "Case {{case_code}} has been closed out. Deliverables: {{publish-deliverables.url}} | Archive: {{archive-folder.url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{source_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: source_path
              in: path
          operations:
            - name: move-folder
              method: PATCH
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              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: send-channel-message
              method: POST

Queries Workday for available consultants by skill and seniority, checks their Google Calendar availability, and posts a staffing proposal to the case lead in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Case Team Staffing Orchestrator"
  description: "Queries Workday for available consultants by skill and seniority, checks their Google Calendar availability, and posts a staffing proposal to the case lead in Microsoft Teams."
  tags:
    - talent
    - staffing
    - workday
    - microsoft-teams
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: case-staffing
      port: 8080
      tools:
        - name: propose-staffing
          description: "Given a skill requirement and case code, find available consultants and propose staffing to the case lead."
          inputParameters:
            - name: skill_required
              in: body
              type: string
              description: "Primary skill needed (e.g., 'private-equity', 'digital-transformation')."
            - name: seniority_level
              in: body
              type: string
              description: "Consultant level (e.g., 'AC', 'Senior AC', 'Consultant', 'Manager')."
            - name: case_lead_email
              in: body
              type: string
              description: "Email of the case lead to receive the proposal."
          steps:
            - name: search-workers
              type: call
              call: "workday.search-workers"
              with:
                skill: "{{skill_required}}"
                job_level: "{{seniority_level}}"
            - name: check-availability
              type: call
              call: "google-calendar.freebusy"
              with:
                emails: "{{search-workers.email_list}}"
                time_min: "{{$now}}"
                time_max: "{{$now_plus_14d}}"
            - name: send-proposal
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{case_lead_email}}"
                text: "Staffing candidates for {{skill_required}} ({{seniority_level}}): {{check-availability.available_names}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: search-workers
              method: GET
    - type: http
      namespace: google-calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: freebusy
          path: "/freeBusy"
          operations:
            - name: freebusy
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Validates change requests, routes for approval, schedules implementation, and notifies stakeholders.

naftiko: "0.5"
info:
  label: "Change Management Approval Pipeline"
  description: "Validates change requests, routes for approval, schedules implementation, and notifies stakeholders."
  tags:
    - itsm
    - servicenow
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: change_management_approval_pipeline
          description: "Orchestrate change management approval pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Change Management Approval Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

After a client meeting, logs the activity in Salesforce, uploads meeting notes to SharePoint, and updates the engagement timeline in Microsoft Project.

naftiko: "0.5"
info:
  label: "Client CRM Activity Logger"
  description: "After a client meeting, logs the activity in Salesforce, uploads meeting notes to SharePoint, and updates the engagement timeline in Microsoft Project."
  tags:
    - client-engagement
    - crm
    - salesforce
    - sharepoint
    - microsoft-project
capability:
  exposes:
    - type: mcp
      namespace: crm-activity-log
      port: 8080
      tools:
        - name: log-client-activity
          description: "Log a client meeting activity across Salesforce, SharePoint, and Microsoft Project."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: meeting_subject
              in: body
              type: string
              description: "Subject of the client meeting."
            - name: meeting_notes
              in: body
              type: string
              description: "Summary notes from the meeting."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: create-activity
              type: call
              call: "salesforce.create-task"
              with:
                what_id: "{{opportunity_id}}"
                subject: "{{meeting_subject}}"
                description: "{{meeting_notes}}"
                status: "Completed"
            - name: upload-notes
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "case_management_site"
                folder_path: "Cases/{{case_code}}/MeetingNotes"
                file_name: "{{meeting_subject}}_{{$now}}.md"
                content: "{{meeting_notes}}"
            - name: update-timeline
              type: call
              call: "msproject.update-task"
              with:
                project_id: "{{case_code}}"
                task_name: "{{meeting_subject}}"
                percent_complete: "100"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msproject
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: update-task
              method: PATCH

Runs a digital maturity assessment by pulling tech stack data from G2, website performance from Google Analytics, IT service catalog from ServiceNow, and compiles an assessment report in Confluence.

naftiko: "0.5"
info:
  label: "Client Digital Transformation Assessment"
  description: "Runs a digital maturity assessment by pulling tech stack data from G2, website performance from Google Analytics, IT service catalog from ServiceNow, and compiles an assessment report in Confluence."
  tags:
    - digital-transformation
    - assessment
    - g2
    - google-analytics
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: digital-assessment
      port: 8080
      tools:
        - name: run-digital-assessment
          description: "Given a client company, assess their digital maturity across tech stack, web performance, and IT operations."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "Client company name."
            - name: company_domain
              in: body
              type: string
              description: "Client company domain for web analytics."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-tech-stack
              type: call
              call: "g2.get-company-stack"
              with:
                company_name: "{{company_name}}"
            - name: get-web-performance
              type: call
              call: "google-analytics.run-report"
              with:
                property_id: "{{company_domain}}"
                start_date: "{{$now_minus_90d}}"
                end_date: "{{$now}}"
            - name: get-it-catalog
              type: call
              call: "servicenow.get-service-catalog"
              with:
                company: "{{company_name}}"
            - name: publish-assessment
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Digital Maturity Assessment: {{company_name}}"
                body: "Tech stack size: {{get-tech-stack.product_count}} | Web sessions: {{get-web-performance.total_sessions}} | IT services: {{get-it-catalog.service_count}}"
  consumes:
    - type: http
      namespace: g2
      baseUri: "https://data.g2.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.g2_token"
      resources:
        - name: company-stack
          path: "/companies/tech-stack"
          operations:
            - name: get-company-stack
              method: GET
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: service-catalog
          path: "/table/sc_cat_item"
          operations:
            - name: get-service-catalog
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a new client engagement is created in Salesforce, provisions a SharePoint case folder, creates a Confluence knowledge space, schedules a kickoff meeting in Microsoft Teams, and notifies the case team via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Engagement Kickoff Orchestrator"
  description: "When a new client engagement is created in Salesforce, provisions a SharePoint case folder, creates a Confluence knowledge space, schedules a kickoff meeting in Microsoft Teams, and notifies the case team via Microsoft Outlook."
  tags:
    - consulting
    - client-engagement
    - salesforce
    - sharepoint
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engagement-kickoff
      port: 8080
      tools:
        - name: trigger-engagement-kickoff
          description: "Given a Salesforce opportunity ID, orchestrate full engagement kickoff across SharePoint, Confluence, Microsoft Teams, and Outlook."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID for the new engagement."
            - name: case_code
              in: body
              type: string
              description: "The Bain internal case code."
            - name: partner_email
              in: body
              type: string
              description: "Email of the lead partner on the case."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-case-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "case_management_site"
                folder_path: "Cases/{{case_code}}_{{get-opportunity.account_name}}"
            - name: create-knowledge-space
              type: call
              call: "confluence.create-space"
              with:
                space_key: "{{case_code}}"
                name: "{{case_code}} - {{get-opportunity.account_name}}"
                description: "Knowledge space for {{get-opportunity.name}}"
            - name: schedule-kickoff
              type: call
              call: "msteams.create-meeting"
              with:
                subject: "Kickoff: {{get-opportunity.account_name}} - {{case_code}}"
                attendees: "{{partner_email}}"
            - name: notify-team
              type: call
              call: "outlook.send-email"
              with:
                to: "{{partner_email}}"
                subject: "Engagement {{case_code}} provisioned"
                body: "Case folder: {{create-case-folder.url}} | Wiki: {{create-knowledge-space.url}} | Kickoff: {{schedule-kickoff.join_url}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: spaces
          path: "/space"
          operations:
            - name: create-space
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: online-meetings
          path: "/me/onlineMeetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Creates project workspace, provisions tools access, generates kickoff materials, and notifies the case team.

naftiko: "0.5"
info:
  label: "Client Engagement Setup Pipeline"
  description: "Creates project workspace, provisions tools access, generates kickoff materials, and notifies the case team."
  tags:
    - engagement
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engagement
      port: 8080
      tools:
        - name: client_engagement_setup_pipeline
          description: "Orchestrate client engagement setup pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Client Engagement Setup Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Generates a PowerPoint deck by pulling case data from Snowflake, charts from Tableau, and client branding from SharePoint, then uploads the assembled deck to Google Drive for review.

naftiko: "0.5"
info:
  label: "Client Presentation Builder"
  description: "Generates a PowerPoint deck by pulling case data from Snowflake, charts from Tableau, and client branding from SharePoint, then uploads the assembled deck to Google Drive for review."
  tags:
    - consulting
    - presentations
    - snowflake
    - tableau
    - sharepoint
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: deck-builder
      port: 8080
      tools:
        - name: build-presentation
          description: "Given a case code and template, assemble a client presentation from analytics and branding assets."
          inputParameters:
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: template_id
              in: body
              type: string
              description: "PowerPoint template identifier from SharePoint."
            - name: tableau_workbook
              in: body
              type: string
              description: "Tableau workbook name for chart exports."
          steps:
            - name: get-case-data
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "ANALYTICS"
                statement: "SELECT * FROM CASE_SUMMARY WHERE case_code='{{case_code}}'"
            - name: export-charts
              type: call
              call: "tableau.export-views"
              with:
                workbook_name: "{{tableau_workbook}}"
                format: "png"
            - name: get-template
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "brand_assets"
                file_path: "Templates/{{template_id}}.pptx"
            - name: upload-deck
              type: call
              call: "google-drive.upload-file"
              with:
                folder_id: "case_{{case_code}}_decks"
                file_name: "{{case_code}}_presentation_{{$now}}.pptx"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://bain.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: views
          path: "/sites/{{site_id}}/views/{{view_id}}/image"
          inputParameters:
            - name: site_id
              in: path
            - name: view_id
              in: path
          operations:
            - name: export-views
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/upload/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: upload-file
              method: POST

After case closeout, sends a client satisfaction survey via Google Forms, monitors responses, logs results to Salesforce, and alerts the partner if NPS drops below threshold via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Satisfaction Survey Pipeline"
  description: "After case closeout, sends a client satisfaction survey via Google Forms, monitors responses, logs results to Salesforce, and alerts the partner if NPS drops below threshold via Microsoft Teams."
  tags:
    - client-engagement
    - feedback
    - google-forms
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-satisfaction
      port: 8080
      tools:
        - name: trigger-satisfaction-survey
          description: "Given an opportunity ID and client contact, send a satisfaction survey and set up tracking."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: client_email
              in: body
              type: string
              description: "Client contact email."
            - name: partner_email
              in: body
              type: string
              description: "Partner email for NPS alerts."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: send-survey
              type: call
              call: "gmail.send-email"
              with:
                to: "{{client_email}}"
                subject: "How was your experience with Bain? - {{get-opportunity.account_name}}"
                body: "Please complete our brief satisfaction survey: https://forms.gle/bain-csat-{{case_code}}"
            - name: log-survey-sent
              type: call
              call: "salesforce.create-task"
              with:
                what_id: "{{opportunity_id}}"
                subject: "CSAT survey sent to {{client_email}}"
                status: "In Progress"
            - name: alert-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{partner_email}}"
                text: "CSAT survey sent for {{case_code}} ({{get-opportunity.account_name}}) to {{client_email}}. Tracking in Salesforce task {{log-survey-sent.id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain.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: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: gmail
      baseUri: "https://gmail.googleapis.com/gmail/v1"
      authentication:
        type: bearer
        token: "$secrets.gmail_token"
      resources:
        - name: messages
          path: "/users/me/messages/send"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Prepares a client workshop by creating a Microsoft Teams meeting, provisioning a shared Google Drive folder, generating an agenda in Confluence, and sending pre-read materials via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Workshop Orchestrator"
  description: "Prepares a client workshop by creating a Microsoft Teams meeting, provisioning a shared Google Drive folder, generating an agenda in Confluence, and sending pre-read materials via Microsoft Outlook."
  tags:
    - consulting
    - workshops
    - microsoft-teams
    - google-drive
    - confluence
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: workshop-prep
      port: 8080
      tools:
        - name: prepare-workshop
          description: "Given workshop details, set up all logistics including meeting, shared folder, agenda, and pre-reads."
          inputParameters:
            - name: workshop_title
              in: body
              type: string
              description: "Title of the workshop."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: attendee_emails
              in: body
              type: string
              description: "Comma-separated attendee emails."
            - name: date
              in: body
              type: string
              description: "Workshop date (YYYY-MM-DD)."
          steps:
            - name: create-meeting
              type: call
              call: "msteams.create-meeting"
              with:
                subject: "{{workshop_title}} - {{case_code}}"
                attendees: "{{attendee_emails}}"
                start_date: "{{date}}"
            - name: create-shared-folder
              type: call
              call: "google-drive.create-folder"
              with:
                name: "{{workshop_title}}_{{date}}"
                parent_folder: "case_{{case_code}}_workshops"
            - name: create-agenda
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Workshop Agenda: {{workshop_title}} - {{date}}"
                body: "Meeting link: {{create-meeting.join_url}} | Shared folder: {{create-shared-folder.url}}"
            - name: send-prereads
              type: call
              call: "outlook.send-email"
              with:
                to: "{{attendee_emails}}"
                subject: "Pre-read Materials: {{workshop_title}} - {{date}}"
                body: "Workshop agenda: {{create-agenda.url}} | Shared folder: {{create-shared-folder.url}} | Teams link: {{create-meeting.join_url}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: online-meetings
          path: "/me/onlineMeetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Gathers competitor data from Bloomberg Enterprise Data, recent news from Reuters, social sentiment from LinkedIn, and compiles a competitive brief in a Confluence page.

naftiko: "0.5"
info:
  label: "Competitive Intelligence Aggregator"
  description: "Gathers competitor data from Bloomberg Enterprise Data, recent news from Reuters, social sentiment from LinkedIn, and compiles a competitive brief in a Confluence page."
  tags:
    - due-diligence
    - competitive-intelligence
    - bloomberg-enterprise-data
    - reuters
    - linkedin
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: competitive-intel
      port: 8080
      tools:
        - name: build-competitive-brief
          description: "Given a competitor name and case code, assemble a competitive intelligence brief from multiple sources into Confluence."
          inputParameters:
            - name: competitor_name
              in: body
              type: string
              description: "Name of the competitor company."
            - name: bloomberg_ticker
              in: body
              type: string
              description: "Bloomberg ticker for the competitor."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-financials
              type: call
              call: "bloomberg.get-company"
              with:
                ticker: "{{bloomberg_ticker}}"
            - name: get-news
              type: call
              call: "reuters.search-news"
              with:
                query: "{{competitor_name}}"
                limit: "20"
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-company"
              with:
                company_name: "{{competitor_name}}"
            - name: publish-brief
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Competitive Brief: {{competitor_name}}"
                body: "Revenue: {{get-financials.revenue}} | Market Cap: {{get-financials.market_cap}} | Employee Count: {{get-linkedin-profile.employee_count}} | Recent Headlines: {{get-news.headline_summary}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: companies
          path: "/companies/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: reuters
      baseUri: "https://api.reuters.com/v2"
      authentication:
        type: bearer
        token: "$secrets.reuters_token"
      resources:
        - name: news
          path: "/news/search"
          operations:
            - name: search-news
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: companies
          path: "/organizations"
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Collects audit events, validates against policies, generates compliance reports, and notifies auditors.

naftiko: "0.5"
info:
  label: "Compliance Audit Trail Pipeline"
  description: "Collects audit events, validates against policies, generates compliance reports, and notifies auditors."
  tags:
    - compliance
    - elasticsearch
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: compliance_audit_trail_pipeline
          description: "Orchestrate compliance audit trail pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-elasticsearch
              type: call
              call: "elasticsearch.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-elasticsearch.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Compliance Audit Trail Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-and-company-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Searches the Bain Confluence knowledge base by keyword and returns matching page titles, URLs, and excerpts for rapid case team research.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Page Lookup"
  description: "Searches the Bain Confluence knowledge base by keyword and returns matching page titles, URLs, and excerpts for rapid case team research."
  tags:
    - knowledge-management
    - research
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-search
      port: 8080
      tools:
        - name: search-knowledge-base
          description: "Search Confluence for knowledge articles by keyword."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keywords or CQL query."
            - name: space_key
              in: body
              type: string
              description: "Optional Confluence space key to narrow results."
          call: "confluence.search"
          with:
            cql: "text~\"{{query}}\" AND space=\"{{space_key}}\""
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain.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

Assigns a Pluralsight learning path to a consultant based on their Workday skill profile, tracks completion progress, and updates their development plan in Confluence.

naftiko: "0.5"
info:
  label: "Consultant Learning Path Orchestrator"
  description: "Assigns a Pluralsight learning path to a consultant based on their Workday skill profile, tracks completion progress, and updates their development plan in Confluence."
  tags:
    - talent
    - learning
    - pluralsight
    - workday
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: learning-path
      port: 8080
      tools:
        - name: assign-learning-path
          description: "Given a consultant and skill gap, assign a Pluralsight learning path and track in Confluence."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: skill_gap
              in: body
              type: string
              description: "Skill area to develop (e.g., 'data-science', 'cloud-architecture')."
          steps:
            - name: get-worker-skills
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: find-learning-path
              type: call
              call: "pluralsight.search-paths"
              with:
                query: "{{skill_gap}}"
            - name: assign-path
              type: call
              call: "pluralsight.assign-path"
              with:
                user_email: "{{get-worker-skills.work_email}}"
                path_id: "{{find-learning-path.top_path_id}}"
            - name: update-dev-plan
              type: call
              call: "confluence.create-page"
              with:
                space_key: "TALENT"
                title: "Development Plan: {{get-worker-skills.full_name}} - {{skill_gap}}"
                body: "Assigned Pluralsight path: {{find-learning-path.top_path_title}} ({{assign-path.estimated_hours}} hours)"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api-v0.9"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: paths
          path: "/paths/search"
          operations:
            - name: search-paths
              method: GET
        - name: assignments
          path: "/assignments"
          operations:
            - name: assign-path
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Tracks consultant allocation, calculates utilization rates, identifies gaps, and notifies staffing.

naftiko: "0.5"
info:
  label: "Consultant Utilization Pipeline"
  description: "Tracks consultant allocation, calculates utilization rates, identifies gaps, and notifies staffing."
  tags:
    - operations
    - workday
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: consultant_utilization_pipeline
          description: "Orchestrate consultant utilization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Consultant Utilization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Pulls consultant performance data from Workday, gathers 360 feedback from Google Forms, compiles review notes in Confluence, and notifies the reviewer in Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Consulting Performance Review Pipeline"
  description: "Pulls consultant performance data from Workday, gathers 360 feedback from Google Forms, compiles review notes in Confluence, and notifies the reviewer in Microsoft Outlook."
  tags:
    - talent
    - performance-management
    - workday
    - google-forms
    - confluence
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: perf-review
      port: 8080
      tools:
        - name: compile-performance-review
          description: "Given a consultant worker ID, compile performance data and 360 feedback into a Confluence review page."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID for the consultant."
            - name: review_period
              in: body
              type: string
              description: "Review period (e.g., 'H1-2026')."
            - name: reviewer_email
              in: body
              type: string
              description: "Email of the reviewing partner/manager."
          steps:
            - name: get-performance-data
              type: call
              call: "workday.get-worker-performance"
              with:
                worker_id: "{{worker_id}}"
                period: "{{review_period}}"
            - name: get-feedback
              type: call
              call: "google-forms.get-responses"
              with:
                form_id: "360_feedback_{{review_period}}"
                filter: "subject_id={{worker_id}}"
            - name: create-review-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "TALENT"
                title: "Performance Review: {{get-performance-data.full_name}} - {{review_period}}"
                body: "Cases completed: {{get-performance-data.case_count}} | Avg rating: {{get-feedback.avg_score}} | Feedback count: {{get-feedback.response_count}}"
            - name: notify-reviewer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{reviewer_email}}"
                subject: "Performance review ready: {{get-performance-data.full_name}}"
                body: "Review page: {{create-review-page.url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker-performance
          path: "/workers/{{worker_id}}/performance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker-performance
              method: GET
    - type: http
      namespace: google-forms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_forms_token"
      resources:
        - name: responses
          path: "/forms/{{form_id}}/responses"
          inputParameters:
            - name: form_id
              in: path
          operations:
            - name: get-responses
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders.

naftiko: "0.5"
info:
  label: "Cost Center Budget Tracking Pipeline"
  description: "Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders."
  tags:
    - finance
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: cost_center_budget_tracking
          description: "Orchestrate cost center budget tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Cost Center Budget Tracking Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

For performance improvement engagements, pulls spend data from SAP Concur, headcount from Workday, vendor contracts from Oracle E-Business Suite, runs an optimization model in Alteryx, and publishes findings to Confluence.

naftiko: "0.5"
info:
  label: "Cost Optimization Analysis Pipeline"
  description: "For performance improvement engagements, pulls spend data from SAP Concur, headcount from Workday, vendor contracts from Oracle E-Business Suite, runs an optimization model in Alteryx, and publishes findings to Confluence."
  tags:
    - consulting
    - cost-optimization
    - sap-concur
    - workday
    - oracle-e-business-suite
    - alteryx
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: cost-optimization
      port: 8080
      tools:
        - name: run-cost-analysis
          description: "Given a client cost center and case code, run a full cost optimization analysis."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "Client cost center ID."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: period
              in: body
              type: string
              description: "Analysis period (e.g., 'FY2025')."
          steps:
            - name: get-spend-data
              type: call
              call: "concur.get-expense-reports"
              with:
                cost_center: "{{cost_center}}"
                period: "{{period}}"
            - name: get-headcount
              type: call
              call: "workday.get-headcount"
              with:
                cost_center: "{{cost_center}}"
            - name: get-vendor-contracts
              type: call
              call: "oracle-ebs.get-contracts"
              with:
                cost_center: "{{cost_center}}"
            - name: run-optimization
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "cost_optimization_v3"
                inputs: "{{get-spend-data.dataset_id}},{{get-headcount.dataset_id}},{{get-vendor-contracts.dataset_id}}"
            - name: publish-findings
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Cost Optimization Analysis: {{cost_center}} - {{period}}"
                body: "Total spend: {{get-spend-data.total}} | Headcount: {{get-headcount.count}} | Vendor contracts: {{get-vendor-contracts.count}} | Savings opportunity: {{run-optimization.savings_estimate}}"
  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"
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/staffing/headcount"
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bain-ebs.oracle.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: contracts
          path: "/procurement/contracts"
          operations:
            - name: get-contracts
              method: GET
    - type: http
      namespace: alteryx
      baseUri: "https://bain.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/run"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM.

naftiko: "0.5"
info:
  label: "Customer 360 Data Sync Pipeline"
  description: "Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM."
  tags:
    - data
    - snowflake
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: customer_360_data_sync_pipeline
          description: "Orchestrate customer 360 data sync pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Customer 360 Data Sync Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards.

naftiko: "0.5"
info:
  label: "Data Quality Monitoring Pipeline"
  description: "Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards."
  tags:
    - data-quality
    - snowflake
    - jira
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: data_quality_monitoring_pipeline
          description: "Orchestrate data quality monitoring pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Data Quality Monitoring Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://bain-and-company-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST

Queries Datadog for the current health status of a monitored service, returning uptime percentage, error rate, and active alerts.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a monitored service, returning uptime percentage, error rate, and active alerts."
  tags:
    - it-operations
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: service-health
      port: 8080
      tools:
        - name: get-service-health
          description: "Check Datadog health metrics for a service."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Name of the monitored service."
          call: "datadog.query-metrics"
          with:
            query: "avg:system.cpu.user{service:{{service_name}}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET

Retrieves target financials from Bloomberg, pulls comparable transactions from Snowflake, generates a valuation model in Alteryx, and uploads the output to Google Drive for partner review.

naftiko: "0.5"
info:
  label: "Deal Financial Model Builder"
  description: "Retrieves target financials from Bloomberg, pulls comparable transactions from Snowflake, generates a valuation model in Alteryx, and uploads the output to Google Drive for partner review."
  tags:
    - due-diligence
    - financial-modeling
    - bloomberg-enterprise-data
    - snowflake
    - alteryx
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: deal-modeling
      port: 8080
      tools:
        - name: build-financial-model
          description: "Given a target company ticker and case code, build a financial model from Bloomberg data, comps from Snowflake, and Alteryx modeling."
          inputParameters:
            - name: bloomberg_ticker
              in: body
              type: string
              description: "Bloomberg ticker for the target."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: partner_email
              in: body
              type: string
              description: "Partner email for review notification."
          steps:
            - name: get-target-financials
              type: call
              call: "bloomberg.get-company"
              with:
                ticker: "{{bloomberg_ticker}}"
            - name: get-comps
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "DEALS"
                statement: "SELECT * FROM COMPS WHERE sector='{{get-target-financials.sector}}' ORDER BY close_date DESC LIMIT 10"
            - name: run-valuation
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "dcf_model_v2"
                inputs: "{{get-target-financials.dataset_id}},{{get-comps.result_id}}"
            - name: upload-model
              type: call
              call: "google-drive.upload-file"
              with:
                folder_id: "case_{{case_code}}_models"
                file_name: "Valuation_{{bloomberg_ticker}}_{{$now}}.xlsx"
                content: "{{run-valuation.output_file}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: companies
          path: "/companies/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: alteryx
      baseUri: "https://bain.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/run"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/upload/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: upload-file
              method: POST

Analyzes deal pipeline, runs forecast models, generates revenue projections, and updates leadership.

naftiko: "0.5"
info:
  label: "Deal Pipeline Forecasting Pipeline"
  description: "Analyzes deal pipeline, runs forecast models, generates revenue projections, and updates leadership."
  tags:
    - sales
    - salesforce
    - snowflake
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: deal_pipeline_forecasting_pipeline
          description: "Orchestrate deal pipeline forecasting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-salesforce
              type: call
              call: "salesforce.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-salesforce.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Deal Pipeline Forecasting Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Tests DR procedures, validates backup integrity, generates readiness reports, and notifies leadership.

naftiko: "0.5"
info:
  label: "Disaster Recovery Readiness Pipeline"
  description: "Tests DR procedures, validates backup integrity, generates readiness reports, and notifies leadership."
  tags:
    - disaster-recovery
    - servicenow
    - confluence
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: disaster-recovery
      port: 8080
      tools:
        - name: disaster_recovery_readiness_pipeline
          description: "Orchestrate disaster recovery readiness pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Disaster Recovery Readiness Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Pulls a target company profile from Bloomberg Enterprise Data, enriches with ZoomInfo firmographics, retrieves recent Factiva news, and assembles a summary in a Confluence page for the deal team.

naftiko: "0.5"
info:
  label: "Due Diligence Company Profiler"
  description: "Pulls a target company profile from Bloomberg Enterprise Data, enriches with ZoomInfo firmographics, retrieves recent Factiva news, and assembles a summary in a Confluence page for the deal team."
  tags:
    - due-diligence
    - m-and-a
    - bloomberg-enterprise-data
    - zoominfo
    - factiva
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: dd-company-profile
      port: 8080
      tools:
        - name: build-company-profile
          description: "Given a target company name and Bloomberg ticker, assemble a due diligence company profile from Bloomberg, ZoomInfo, and Factiva into Confluence."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "The target company name."
            - name: bloomberg_ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol for the target."
            - name: case_code
              in: body
              type: string
              description: "Bain case code for the engagement."
          steps:
            - name: get-bloomberg-profile
              type: call
              call: "bloomberg.get-company"
              with:
                ticker: "{{bloomberg_ticker}}"
            - name: get-zoominfo-profile
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{company_name}}"
            - name: get-factiva-news
              type: call
              call: "factiva.search-articles"
              with:
                query: "{{company_name}}"
                date_range: "last_90_days"
            - name: create-profile-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Company Profile: {{company_name}}"
                body: "Revenue: {{get-bloomberg-profile.revenue}} | Employees: {{get-zoominfo-profile.employee_count}} | Industry: {{get-zoominfo-profile.industry}} | Recent news items: {{get-factiva-news.article_count}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: companies
          path: "/companies/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-search
          path: "/search/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: factiva
      baseUri: "https://api.dowjones.com/content"
      authentication:
        type: bearer
        token: "$secrets.factiva_token"
      resources:
        - name: articles
          path: "/articles"
          operations:
            - name: search-articles
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Searches the Bain Elasticsearch index for case studies and prior work by keyword, returning matching case summaries with relevance scores.

naftiko: "0.5"
info:
  label: "Elasticsearch Case Search"
  description: "Searches the Bain Elasticsearch index for case studies and prior work by keyword, returning matching case summaries with relevance scores."
  tags:
    - knowledge-management
    - search
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: case-search
      port: 8080
      tools:
        - name: search-cases
          description: "Search the case knowledge index by keyword."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keywords."
            - name: industry_filter
              in: body
              type: string
              description: "Optional industry filter."
          call: "elasticsearch.search"
          with:
            index: "case_knowledge"
            query: "{{query}}"
            filter_industry: "{{industry_filter}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-search.es.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/case_knowledge/_search"
          operations:
            - name: search
              method: POST

Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "Employee Onboarding Automation Pipeline"
  description: "Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers."
  tags:
    - hr
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: employee_onboarding_automation
          description: "Orchestrate employee onboarding automation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Employee Onboarding Automation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Finds expert contacts in ZoomInfo, sends interview requests via Microsoft Outlook, creates calendar holds, and tracks responses in a Salesforce activity log for knowledge gathering during case work.

naftiko: "0.5"
info:
  label: "Expert Interview Scheduling Pipeline"
  description: "Finds expert contacts in ZoomInfo, sends interview requests via Microsoft Outlook, creates calendar holds, and tracks responses in a Salesforce activity log for knowledge gathering during case work."
  tags:
    - research
    - expert-interviews
    - zoominfo
    - microsoft-outlook
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: expert-scheduling
      port: 8080
      tools:
        - name: schedule-expert-interview
          description: "Given expert criteria, find contacts, send requests, and track in Salesforce."
          inputParameters:
            - name: industry
              in: body
              type: string
              description: "Industry vertical for expert search."
            - name: title_keywords
              in: body
              type: string
              description: "Job title keywords (e.g., 'VP Supply Chain')."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: analyst_email
              in: body
              type: string
              description: "Email of the requesting analyst."
          steps:
            - name: find-experts
              type: call
              call: "zoominfo.search-contact"
              with:
                job_title: "{{title_keywords}}"
                industry: "{{industry}}"
                seniority: "VP,Director,C-Level"
            - name: send-request
              type: call
              call: "outlook.send-email"
              with:
                to: "{{find-experts.top_contact_email}}"
                subject: "Expert Interview Request - {{industry}} Insights"
                body: "We are conducting research on {{industry}} trends and would value your perspective. Would you be available for a 30-minute call?"
            - name: create-calendar-hold
              type: call
              call: "outlook.create-event"
              with:
                subject: "Expert Interview: {{find-experts.top_contact_name}}"
                attendees: "{{analyst_email}}"
                duration: "30"
            - name: log-activity
              type: call
              call: "salesforce.create-task"
              with:
                subject: "Expert interview request: {{find-experts.top_contact_name}}"
                description: "Sent to {{find-experts.top_contact_email}} for {{case_code}}"
                status: "In Progress"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contact-search
          path: "/search/contact"
          operations:
            - name: search-contact
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
        - name: events
          path: "/me/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

Searches Factiva for recent news articles by company or topic, returning headlines, sources, and publication dates for case research.

naftiko: "0.5"
info:
  label: "Factiva News Alert Search"
  description: "Searches Factiva for recent news articles by company or topic, returning headlines, sources, and publication dates for case research."
  tags:
    - research
    - news
    - factiva
capability:
  exposes:
    - type: mcp
      namespace: news-search
      port: 8080
      tools:
        - name: search-news
          description: "Search Factiva for news articles by query."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query (company name or topic)."
            - name: date_range
              in: body
              type: string
              description: "Date range filter (e.g., 'last_30_days')."
          call: "factiva.search-articles"
          with:
            query: "{{query}}"
            date_range: "{{date_range}}"
  consumes:
    - type: http
      namespace: factiva
      baseUri: "https://api.dowjones.com/content"
      authentication:
        type: bearer
        token: "$secrets.factiva_token"
      resources:
        - name: articles
          path: "/articles"
          operations:
            - name: search-articles
              method: POST

Pulls website analytics from Google Analytics, compares against industry benchmarks in Snowflake, and uploads a performance report to SharePoint for the case team.

naftiko: "0.5"
info:
  label: "Google Analytics Client Benchmark Report"
  description: "Pulls website analytics from Google Analytics, compares against industry benchmarks in Snowflake, and uploads a performance report to SharePoint for the case team."
  tags:
    - analytics
    - digital
    - google-analytics
    - snowflake
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: build-analytics-benchmark
          description: "Given a GA property and industry, build a benchmarked analytics report."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "GA4 property ID."
            - name: start_date
              in: body
              type: string
              description: "Report start date (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date (YYYY-MM-DD)."
            - name: industry
              in: body
              type: string
              description: "Industry for benchmark comparison."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-analytics
              type: call
              call: "google-analytics.run-report"
              with:
                property_id: "{{property_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: get-benchmarks
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "ANALYTICS"
                statement: "SELECT * FROM DIGITAL_BENCHMARKS WHERE industry='{{industry}}'"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "case_management_site"
                folder_path: "Cases/{{case_code}}/Analytics"
                file_name: "GA_Benchmark_{{start_date}}_{{end_date}}.xlsx"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Retrieves a HubSpot contact, enriches with ZoomInfo firmographic data, and logs the enriched profile as a Salesforce activity for BD pipeline tracking.

naftiko: "0.5"
info:
  label: "HubSpot Lead Enrichment Pipeline"
  description: "Retrieves a HubSpot contact, enriches with ZoomInfo firmographic data, and logs the enriched profile as a Salesforce activity for BD pipeline tracking."
  tags:
    - business-development
    - crm
    - hubspot
    - zoominfo
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: bd-contact-lookup
      port: 8080
      tools:
        - name: enrich-lead
          description: "Look up a HubSpot contact, enrich with ZoomInfo, and log to Salesforce."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Contact email address."
            - name: opportunity_id
              in: body
              type: string
              description: "Related Salesforce opportunity ID."
          steps:
            - name: get-hubspot-contact
              type: call
              call: "hubspot.get-contact"
              with:
                email: "{{email}}"
            - name: enrich-firmographics
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{get-hubspot-contact.company}}"
            - name: log-enrichment
              type: call
              call: "salesforce.create-task"
              with:
                what_id: "{{opportunity_id}}"
                subject: "Lead enriched: {{get-hubspot-contact.full_name}} at {{get-hubspot-contact.company}}"
                description: "Industry: {{enrich-firmographics.industry}} | Revenue: {{enrich-firmographics.revenue}} | Employees: {{enrich-firmographics.employee_count}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{email}}?idProperty=email"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-search
          path: "/search/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

Pulls industry benchmark data from Circana, financial comps from Bloomberg, and historical client data from Snowflake, then publishes a benchmarking analysis to Confluence.

naftiko: "0.5"
info:
  label: "Industry Benchmarking Pipeline"
  description: "Pulls industry benchmark data from Circana, financial comps from Bloomberg, and historical client data from Snowflake, then publishes a benchmarking analysis to Confluence."
  tags:
    - analytics
    - benchmarking
    - circana
    - bloomberg-enterprise-data
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: benchmarking
      port: 8080
      tools:
        - name: run-benchmarking
          description: "Given an industry and metrics, run a benchmarking analysis across multiple data sources."
          inputParameters:
            - name: industry_code
              in: body
              type: string
              description: "Circana industry code."
            - name: metrics
              in: body
              type: string
              description: "Comma-separated metrics to benchmark (e.g., 'revenue_growth,margin,roic')."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-industry-benchmarks
              type: call
              call: "circana.get-benchmarks"
              with:
                industry_code: "{{industry_code}}"
                metrics: "{{metrics}}"
            - name: get-financial-comps
              type: call
              call: "bloomberg.screen-companies"
              with:
                sector: "{{industry_code}}"
                fields: "{{metrics}}"
            - name: get-historical-data
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "ANALYTICS"
                statement: "SELECT * FROM BENCHMARKS WHERE industry='{{industry_code}}' ORDER BY year DESC"
            - name: publish-analysis
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Industry Benchmarking: {{industry_code}}"
                body: "Industry median: {{get-industry-benchmarks.median_values}} | Peer set: {{get-financial-comps.peer_count}} companies | Historical trend: {{get-historical-data.row_count}} years"
  consumes:
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: benchmarks
          path: "/industry/benchmarks"
          operations:
            - name: get-benchmarks
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: screening
          path: "/screening"
          operations:
            - name: screen-companies
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops.

naftiko: "0.5"
info:
  label: "Infrastructure Drift Detection Pipeline"
  description: "Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops."
  tags:
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: infrastructure_drift_detection
          description: "Orchestrate infrastructure drift detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-github
              type: call
              call: "github.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-github.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Infrastructure Drift Detection Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks asset lifecycle stages, schedules replacements, manages disposal, and updates CMDB.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Pipeline"
  description: "Tracks asset lifecycle stages, schedules replacements, manages disposal, and updates CMDB."
  tags:
    - operations
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: it_asset_lifecycle_pipeline
          description: "Orchestrate it asset lifecycle pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "IT Asset Lifecycle Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Reviews and curates knowledge assets, updates taxonomy, publishes to repository, and notifies teams.

naftiko: "0.5"
info:
  label: "Knowledge Asset Curation Pipeline"
  description: "Reviews and curates knowledge assets, updates taxonomy, publishes to repository, and notifies teams."
  tags:
    - knowledge
    - confluence
    - elasticsearch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: knowledge_asset_curation_pipeline
          description: "Orchestrate knowledge asset curation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-elasticsearch
              type: call
              call: "elasticsearch.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Knowledge Asset Curation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-and-company-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Identifies stale articles, assigns review tasks, tracks updates, and publishes freshness reports.

naftiko: "0.5"
info:
  label: "Knowledge Base Freshness Pipeline"
  description: "Identifies stale articles, assigns review tasks, tracks updates, and publishes freshness reports."
  tags:
    - knowledge
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: knowledge_base_freshness_pipeline
          description: "Orchestrate knowledge base freshness pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Knowledge Base Freshness Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bain-and-company.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a consultant transitions off a case, extracts their Confluence contributions, archives key documents to SharePoint, creates a handover summary, and notifies the incoming consultant via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Knowledge Transfer Orchestrator"
  description: "When a consultant transitions off a case, extracts their Confluence contributions, archives key documents to SharePoint, creates a handover summary, and notifies the incoming consultant via Microsoft Outlook."
  tags:
    - knowledge-management
    - case-management
    - confluence
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: knowledge-transfer
      port: 8080
      tools:
        - name: execute-knowledge-transfer
          description: "Given the departing and incoming consultant details, orchestrate the knowledge transfer process."
          inputParameters:
            - name: departing_email
              in: body
              type: string
              description: "Email of the departing consultant."
            - name: incoming_email
              in: body
              type: string
              description: "Email of the incoming consultant."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-contributions
              type: call
              call: "confluence.search"
              with:
                cql: "contributor=\"{{departing_email}}\" AND space=\"{{case_code}}\""
            - name: create-handover
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Handover Notes: {{departing_email}} to {{incoming_email}}"
                body: "Key contributions: {{get-contributions.page_count}} pages. Review: {{get-contributions.page_titles}}"
            - name: archive-docs
              type: call
              call: "sharepoint.copy-files"
              with:
                site_id: "case_management_site"
                source_path: "Cases/{{case_code}}/WorkingDocs/{{departing_email}}"
                destination_path: "Cases/{{case_code}}/Archive/{{departing_email}}"
            - name: notify-incoming
              type: call
              call: "outlook.send-email"
              with:
                to: "{{incoming_email}}"
                subject: "Knowledge transfer for case {{case_code}}"
                body: "Handover notes: {{create-handover.url}} | Archived docs: {{archive-docs.url}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain.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
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{source_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: source_path
              in: path
          operations:
            - name: copy-files
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Publishes a thought leadership article to the Bain LinkedIn company page, pulling content from a Confluence page and notifying the marketing team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Thought Leadership Publisher"
  description: "Publishes a thought leadership article to the Bain LinkedIn company page, pulling content from a Confluence page and notifying the marketing team in Microsoft Teams."
  tags:
    - marketing
    - thought-leadership
    - linkedin
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: linkedin-publishing
      port: 8080
      tools:
        - name: publish-article
          description: "Given a Confluence page ID, publish the content as a LinkedIn article and notify marketing."
          inputParameters:
            - name: confluence_page_id
              in: body
              type: string
              description: "Confluence page ID containing the article."
            - name: marketing_channel_id
              in: body
              type: string
              description: "Microsoft Teams marketing channel ID."
          steps:
            - name: get-content
              type: call
              call: "confluence.get-page"
              with:
                page_id: "{{confluence_page_id}}"
            - name: publish-to-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                organization_id: "bain-and-company"
                text: "{{get-content.title}}: {{get-content.excerpt}}"
                article_url: "{{get-content.url}}"
            - name: notify-marketing
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "{{marketing_channel_id}}"
                text: "Published to LinkedIn: {{get-content.title}} - {{publish-to-linkedin.post_url}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/{{page_id}}?expand=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - 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-post
              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: send-channel-message
              method: POST

Screens potential acquisition targets by pulling financials from Bloomberg, ownership data from ZoomInfo, patent counts from Google, and compiles a screening matrix in Snowflake for Tableau visualization.

naftiko: "0.5"
info:
  label: "M&A Target Screening Pipeline"
  description: "Screens potential acquisition targets by pulling financials from Bloomberg, ownership data from ZoomInfo, patent counts from Google, and compiles a screening matrix in Snowflake for Tableau visualization."
  tags:
    - m-and-a
    - due-diligence
    - bloomberg-enterprise-data
    - zoominfo
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: ma-screening
      port: 8080
      tools:
        - name: screen-targets
          description: "Given sector criteria and deal parameters, screen M&A targets across multiple data sources."
          inputParameters:
            - name: sector
              in: body
              type: string
              description: "Industry sector for screening."
            - name: min_revenue
              in: body
              type: string
              description: "Minimum revenue threshold in millions."
            - name: geography
              in: body
              type: string
              description: "Target geography."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-sector-companies
              type: call
              call: "bloomberg.screen-companies"
              with:
                sector: "{{sector}}"
                min_revenue: "{{min_revenue}}"
                geography: "{{geography}}"
            - name: enrich-ownership
              type: call
              call: "zoominfo.search-company"
              with:
                company_list: "{{get-sector-companies.company_ids}}"
            - name: store-screening
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "DEALS"
                statement: "INSERT INTO MA_SCREENING (case_code, sector, results) VALUES ('{{case_code}}', '{{sector}}', '{{enrich-ownership.dataset_id}}')"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "ma_screening_{{case_code}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: screening
          path: "/screening"
          operations:
            - name: screen-companies
              method: POST
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-search
          path: "/search/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://bain.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/{{site_id}}/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: site_id
              in: path
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Retrieves the status and performance metrics of a MailChimp email campaign, including open rate, click rate, and send count for marketing effectiveness tracking.

naftiko: "0.5"
info:
  label: "MailChimp Campaign Status"
  description: "Retrieves the status and performance metrics of a MailChimp email campaign, including open rate, click rate, and send count for marketing effectiveness tracking."
  tags:
    - marketing
    - email
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: get-campaign-status
          description: "Retrieve a MailChimp campaign report by campaign ID."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "MailChimp campaign ID."
          call: "mailchimp.get-campaign-report"
          with:
            campaign_id: "{{campaign_id}}"
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: reports
          path: "/reports/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-report
              method: GET

Aggregates market data, runs analytical models, generates insights, and distributes to consultants.

naftiko: "0.5"
info:
  label: "Market Analysis Data Pipeline"
  description: "Aggregates market data, runs analytical models, generates insights, and distributes to consultants."
  tags:
    - research
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: research
      port: 8080
      tools:
        - name: market_analysis_data_pipeline
          description: "Orchestrate market analysis data pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Market Analysis Data Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Pulls industry revenue data from Circana, enriches with Bloomberg Economics macro indicators, runs an Alteryx sizing model, and stores results in Snowflake for Tableau visualization.

naftiko: "0.5"
info:
  label: "Market Sizing Data Pipeline"
  description: "Pulls industry revenue data from Circana, enriches with Bloomberg Economics macro indicators, runs an Alteryx sizing model, and stores results in Snowflake for Tableau visualization."
  tags:
    - analytics
    - market-sizing
    - circana
    - bloomberg-economics
    - alteryx
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: market-sizing
      port: 8080
      tools:
        - name: run-market-sizing
          description: "Given an industry code and geography, execute the market sizing pipeline from data ingestion through Snowflake storage."
          inputParameters:
            - name: industry_code
              in: body
              type: string
              description: "Circana industry classification code."
            - name: geography
              in: body
              type: string
              description: "Target geography (e.g., 'US', 'EU', 'APAC')."
            - name: case_code
              in: body
              type: string
              description: "Bain case code for output tagging."
          steps:
            - name: get-industry-data
              type: call
              call: "circana.get-industry-revenue"
              with:
                industry_code: "{{industry_code}}"
                geography: "{{geography}}"
            - name: get-macro-indicators
              type: call
              call: "bloomberg-econ.get-indicators"
              with:
                geography: "{{geography}}"
                indicators: "GDP,CPI,UNEMPLOYMENT"
            - name: run-sizing-model
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "market_sizing_v3"
                inputs: "{{get-industry-data.dataset_id}},{{get-macro-indicators.dataset_id}}"
            - name: store-results
              type: call
              call: "snowflake.insert-dataset"
              with:
                database: "ANALYTICS"
                schema: "MARKET_SIZING"
                table: "RESULTS_{{case_code}}"
                data_source: "{{run-sizing-model.output_id}}"
  consumes:
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: industry-revenue
          path: "/industry/revenue"
          operations:
            - name: get-industry-revenue
              method: GET
    - type: http
      namespace: bloomberg-econ
      baseUri: "https://api.bloomberg.com/eap/economics"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: indicators
          path: "/indicators"
          operations:
            - name: get-indicators
              method: GET
    - type: http
      namespace: alteryx
      baseUri: "https://bain.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/run"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: datasets
          path: "/statements"
          operations:
            - name: insert-dataset
              method: POST

Sends a message to a Microsoft Teams channel, used for case team announcements and automated notifications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message"
  description: "Sends a message to a Microsoft Teams channel, used for case team announcements and automated notifications."
  tags:
    - collaboration
    - communications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: teams-messaging
      port: 8080
      tools:
        - name: send-channel-message
          description: "Send a message to a Microsoft Teams channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID."
            - name: message
              in: body
              type: string
              description: "Message text to send."
          call: "msteams.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            content: "{{message}}"
  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

On new hire creation in Workday, provisions a Microsoft 365 account, creates a ServiceNow onboarding ticket, adds to the appropriate Microsoft Teams channels, and sends a welcome email via Outlook.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "On new hire creation in Workday, provisions a Microsoft 365 account, creates a ServiceNow onboarding ticket, adds to the appropriate Microsoft Teams channels, and sends a welcome email via Outlook."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - microsoft-outlook
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."
          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: "Employee start date (YYYY-MM-DD)."
            - name: office_location
              in: body
              type: string
              description: "Office location (e.g., 'Boston', 'London', 'Mumbai')."
          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_{{office_location}}"
            - name: add-to-teams
              type: call
              call: "msteams.add-member"
              with:
                team_id: "consulting_{{office_location}}"
                user_upn: "{{get-employee.work_email}}"
            - name: send-welcome
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-employee.work_email}}"
                subject: "Welcome to Bain & Company"
                body: "Welcome {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}. You have been added to the {{office_location}} consulting team channel."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bain.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: team-members
          path: "/teams/{{team_id}}/members"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: add-member
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Initiates review cycles, collects feedback, aggregates scores, and distributes to managers.

naftiko: "0.5"
info:
  label: "Performance Review Cycle Pipeline"
  description: "Initiates review cycles, collects feedback, aggregates scores, and distributes to managers."
  tags:
    - hr
    - workday
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: performance_review_cycle_pipeline
          description: "Orchestrate performance review cycle pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Performance Review Cycle Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers a Power BI dataset refresh, waits for completion, and sends a notification with the dashboard link to the case team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh and Notify"
  description: "Triggers a Power BI dataset refresh, waits for completion, and sends a notification with the dashboard link to the case team in Microsoft Teams."
  tags:
    - analytics
    - dashboards
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: refresh-and-notify
          description: "Trigger a Power BI dataset refresh and notify the case team when complete."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace GUID."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset GUID."
            - name: team_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for notification."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.trigger-refresh"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: get-refresh-status
              type: call
              call: "powerbi.get-refresh-status"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "{{team_channel_id}}"
                text: "Power BI dashboard refreshed. Status: {{get-refresh-status.status}}. View at: https://app.powerbi.com/groups/{{workspace_id}}/dashboards"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refresh
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
            - name: get-refresh-status
              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: send-channel-message
              method: POST

Assembles a client proposal by pulling prior case examples from Elasticsearch, team bios from Workday, pricing from Salesforce, and generates a draft proposal document uploaded to SharePoint.

naftiko: "0.5"
info:
  label: "Proposal Development Orchestrator"
  description: "Assembles a client proposal by pulling prior case examples from Elasticsearch, team bios from Workday, pricing from Salesforce, and generates a draft proposal document uploaded to SharePoint."
  tags:
    - business-development
    - proposals
    - elasticsearch
    - workday
    - salesforce
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: proposal-builder
      port: 8080
      tools:
        - name: build-proposal
          description: "Given a prospect and engagement scope, assemble a proposal from case examples, team bios, and pricing."
          inputParameters:
            - name: prospect_name
              in: body
              type: string
              description: "Prospective client name."
            - name: industry
              in: body
              type: string
              description: "Industry vertical."
            - name: engagement_type
              in: body
              type: string
              description: "Type of engagement (e.g., 'Strategy', 'Due Diligence', 'Performance Improvement')."
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: find-case-examples
              type: call
              call: "elasticsearch.search"
              with:
                index: "case_knowledge"
                query: "{{industry}} {{engagement_type}}"
            - name: get-team-bios
              type: call
              call: "workday.search-workers"
              with:
                skill: "{{industry}}"
                job_level: "Manager,Partner"
            - name: get-pricing
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: upload-proposal
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "proposals_site"
                folder_path: "Proposals/{{prospect_name}}"
                file_name: "Proposal_{{prospect_name}}_{{engagement_type}}_{{$now}}.docx"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://bain-search.es.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/case_knowledge/_search"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: search-workers
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Triggers a data reload for a Qlik Sense application, used to refresh analytics apps before client steering committee meetings.

naftiko: "0.5"
info:
  label: "Qlik Sense App Reload"
  description: "Triggers a data reload for a Qlik Sense application, used to refresh analytics apps before client steering committee meetings."
  tags:
    - analytics
    - visualization
    - qlik-sense
capability:
  exposes:
    - type: mcp
      namespace: qlik-reload
      port: 8080
      tools:
        - name: reload-app
          description: "Trigger a Qlik Sense app reload by app ID."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Qlik Sense application ID."
          call: "qlik.reload-app"
          with:
            app_id: "{{app_id}}"
  consumes:
    - type: http
      namespace: qlik
      baseUri: "https://bain.us.qlikcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: reloads
          path: "/reloads"
          operations:
            - name: reload-app
              method: POST

For M&A engagements, pulls revenue data for acquirer and target from Bloomberg, customer overlap from Snowflake, and market opportunity from Circana, then compiles a synergy estimate in Confluence.

naftiko: "0.5"
info:
  label: "Revenue Synergy Analysis Pipeline"
  description: "For M&A engagements, pulls revenue data for acquirer and target from Bloomberg, customer overlap from Snowflake, and market opportunity from Circana, then compiles a synergy estimate in Confluence."
  tags:
    - m-and-a
    - due-diligence
    - revenue-synergies
    - bloomberg-enterprise-data
    - snowflake
    - circana
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: revenue-synergy
      port: 8080
      tools:
        - name: analyze-revenue-synergies
          description: "Given acquirer and target tickers, analyze revenue synergy potential across data sources."
          inputParameters:
            - name: acquirer_ticker
              in: body
              type: string
              description: "Bloomberg ticker for the acquirer."
            - name: target_ticker
              in: body
              type: string
              description: "Bloomberg ticker for the target."
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
          steps:
            - name: get-acquirer-revenue
              type: call
              call: "bloomberg.get-company"
              with:
                ticker: "{{acquirer_ticker}}"
            - name: get-target-revenue
              type: call
              call: "bloomberg.get-company"
              with:
                ticker: "{{target_ticker}}"
            - name: get-customer-overlap
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "DEALS"
                statement: "SELECT overlap_pct FROM CUSTOMER_OVERLAP WHERE acquirer='{{acquirer_ticker}}' AND target='{{target_ticker}}'"
            - name: get-market-opportunity
              type: call
              call: "circana.get-industry-revenue"
              with:
                industry_code: "{{get-target-revenue.sector}}"
                geography: "GLOBAL"
            - name: publish-synergy-analysis
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{case_code}}"
                title: "Revenue Synergy Analysis: {{acquirer_ticker}} + {{target_ticker}}"
                body: "Acquirer revenue: {{get-acquirer-revenue.revenue}} | Target revenue: {{get-target-revenue.revenue}} | Customer overlap: {{get-customer-overlap.overlap_pct}}% | Market size: {{get-market-opportunity.total_revenue}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_enterprise_token"
      resources:
        - name: companies
          path: "/companies/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: industry-revenue
          path: "/industry/revenue"
          operations:
            - name: get-industry-revenue
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bain.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves a Salesforce opportunity by ID, enriches it with the account contact from HubSpot, and posts a deal summary to the partner in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Enrichment"
  description: "Retrieves a Salesforce opportunity by ID, enriches it with the account contact from HubSpot, and posts a deal summary to the partner in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - hubspot
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-lookup
      port: 8080
      tools:
        - name: enrich-opportunity
          description: "Look up a Salesforce opportunity, enrich with HubSpot contact data, and notify the partner."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
            - name: partner_email
              in: body
              type: string
              description: "Partner email for notification."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: enrich-contact
              type: call
              call: "hubspot.get-contact"
              with:
                email: "{{get-opportunity.contact_email}}"
            - name: notify-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{partner_email}}"
                text: "Deal update: {{get-opportunity.account_name}} ({{get-opportunity.stage}}) - Amount: {{get-opportunity.amount}} | Contact: {{enrich-contact.full_name}}, {{enrich-contact.title}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{email}}?idProperty=email"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Detects security incidents, enriches with context, creates response tickets, and notifies the SOC.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "Detects security incidents, enriches with context, creates response tickets, and notifies the SOC."
  tags:
    - security
    - splunk
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: security_incident_response_pipeline
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-salesforce
              type: call
              call: "salesforce.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-salesforce.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Security Incident Response Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bain-and-company.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and resolution notes."
  tags:
    - it-operations
    - support
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm-lookup
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Searches the Bain SharePoint document library by keyword and returns matching documents with titles, paths, and last modified dates.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches the Bain SharePoint document library by keyword and returns matching documents with titles, paths, and last modified dates."
  tags:
    - knowledge-management
    - documents
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-search
      port: 8080
      tools:
        - name: search-documents
          description: "Search SharePoint for documents by keyword."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keywords."
            - name: site_id
              in: body
              type: string
              description: "SharePoint site ID to search within."
          call: "sharepoint.search"
          with:
            query: "{{query}}"
            site_id: "{{site_id}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/sites/{{site_id}}/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: site_id
              in: path
            - name: query
              in: path
          operations:
            - name: search
              method: GET

Monitors service levels, detects SLA breaches, creates escalation tickets, and reports to management.

naftiko: "0.5"
info:
  label: "SLA Compliance Monitoring Pipeline"
  description: "Monitors service levels, detects SLA breaches, creates escalation tickets, and reports to management."
  tags:
    - operations
    - datadog
    - servicenow
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: sla_compliance_monitoring_pipeline
          description: "Orchestrate sla compliance monitoring pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "SLA Compliance Monitoring Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Executes a SQL query against Snowflake, exports results to Google Drive, and sends the download link to the requesting analyst via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Snowflake Query and Visualize"
  description: "Executes a SQL query against Snowflake, exports results to Google Drive, and sends the download link to the requesting analyst via Microsoft Outlook."
  tags:
    - analytics
    - data
    - snowflake
    - google-drive
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: data-query
      port: 8080
      tools:
        - name: query-and-share
          description: "Execute a Snowflake query, export to Google Drive, and email the analyst."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database name."
            - name: sql_statement
              in: body
              type: string
              description: "SQL query to execute."
            - name: analyst_email
              in: body
              type: string
              description: "Analyst email for delivery."
          steps:
            - name: run-query
              type: call
              call: "snowflake.execute-statement"
              with:
                database: "{{database}}"
                statement: "{{sql_statement}}"
            - name: export-results
              type: call
              call: "google-drive.upload-file"
              with:
                folder_id: "analytics_exports"
                file_name: "query_results_{{$now}}.csv"
                content: "{{run-query.result_set}}"
            - name: notify-analyst
              type: call
              call: "outlook.send-email"
              with:
                to: "{{analyst_email}}"
                subject: "Snowflake query results ready"
                body: "Your query results are available at: {{export-results.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bain.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/upload/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: upload-file
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT.

naftiko: "0.5"
info:
  label: "Software License Optimization Pipeline"
  description: "Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT."
  tags:
    - operations
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: software_license_optimization
          description: "Orchestrate software license optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Software License Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bain-and-company.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs a Splunk search for security anomalies, creates a ServiceNow incident if threats are found, and notifies the security operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Splunk Security Incident Pipeline"
  description: "Runs a Splunk search for security anomalies, creates a ServiceNow incident if threats are found, and notifies the security operations team in Microsoft Teams."
  tags:
    - it-operations
    - security
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: log-analysis
      port: 8080
      tools:
        - name: investigate-security-event
          description: "Search Splunk for security anomalies, create a ServiceNow incident, and alert the SOC team."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk SPL search query."
            - name: earliest
              in: body
              type: string
              description: "Earliest time bound (e.g., '-24h')."
            - name: soc_channel_id
              in: body
              type: string
              description: "Microsoft Teams SOC channel ID."
          steps:
            - name: search-logs
              type: call
              call: "splunk.create-search"
              with:
                search: "{{search_query}}"
                earliest_time: "{{earliest}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security anomaly detected: {{search-logs.event_count}} events"
                category: "security"
                priority: "2"
                description: "Splunk search: {{search_query}} | Results: {{search-logs.event_count}} events found"
            - name: alert-soc
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "{{soc_channel_id}}"
                text: "Security alert: {{search-logs.event_count}} anomalies detected. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://bain-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain.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: send-channel-message
              method: POST

Retrieves metadata for a Tableau workbook by name, including last refresh time, owner, and embedded data source details.

naftiko: "0.5"
info:
  label: "Tableau Workbook Lookup"
  description: "Retrieves metadata for a Tableau workbook by name, including last refresh time, owner, and embedded data source details."
  tags:
    - analytics
    - visualization
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: tableau-lookup
      port: 8080
      tools:
        - name: get-workbook
          description: "Look up a Tableau workbook by name and return metadata."
          inputParameters:
            - name: workbook_name
              in: body
              type: string
              description: "Name of the Tableau workbook."
          call: "tableau.get-workbook"
          with:
            workbook_name: "{{workbook_name}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://bain.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-workbook
              method: GET

When a new consulting role is opened in Workday, creates a LinkedIn Recruiter project, posts to the careers page, and sends a Slack notification to the recruiting team lead.

naftiko: "0.5"
info:
  label: "Talent Requisition Pipeline"
  description: "When a new consulting role is opened in Workday, creates a LinkedIn Recruiter project, posts to the careers page, and sends a Slack notification to the recruiting team lead."
  tags:
    - talent
    - recruiting
    - workday
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-pipeline
      port: 8080
      tools:
        - name: open-requisition-pipeline
          description: "Given a Workday job requisition ID, orchestrate creation of LinkedIn project, career page posting, and team notification."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday job requisition ID."
            - name: recruiter_email
              in: body
              type: string
              description: "Email of the assigned recruiter."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-linkedin-project
              type: call
              call: "linkedin.create-project"
              with:
                title: "{{get-requisition.job_title}} - {{get-requisition.location}}"
                description: "{{get-requisition.job_description}}"
            - name: notify-recruiter
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{recruiter_email}}"
                text: "New requisition {{requisition_id}}: {{get-requisition.job_title}}. LinkedIn project: {{create-linkedin-project.url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/job-requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_recruiter_token"
      resources:
        - name: hiring-projects
          path: "/hiringProjects"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors integration endpoints, detects failures, creates support tickets, and notifies integration team.

naftiko: "0.5"
info:
  label: "Third-Party Integration Health Pipeline"
  description: "Monitors integration endpoints, detects failures, creates support tickets, and notifies integration team."
  tags:
    - integrations
    - datadog
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: integrations
      port: 8080
      tools:
        - name: third_party_integration_health_pipeline
          description: "Orchestrate third-party integration health pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Third-Party Integration Health Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks mandatory training completion, sends reminders, escalates non-compliance, and reports status.

naftiko: "0.5"
info:
  label: "Training Compliance Tracker Pipeline"
  description: "Tracks mandatory training completion, sends reminders, escalates non-compliance, and reports status."
  tags:
    - compliance
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: training_compliance_tracker_pipeline
          description: "Orchestrate training compliance tracker pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Training Compliance Tracker Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bain-and-company"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Pulls expense reports from SAP Concur for a case code, matches against the Workday cost center budget, flags overages, and posts a summary to the case lead in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Travel Expense Reconciliation Pipeline"
  description: "Pulls expense reports from SAP Concur for a case code, matches against the Workday cost center budget, flags overages, and posts a summary to the case lead in Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-reconciliation
      port: 8080
      tools:
        - name: reconcile-expenses
          description: "Given a case code, reconcile SAP Concur expenses against Workday budget and notify the case lead."
          inputParameters:
            - name: case_code
              in: body
              type: string
              description: "Bain case code."
            - name: cost_center
              in: body
              type: string
              description: "Workday cost center ID."
            - name: case_lead_email
              in: body
              type: string
              description: "Case lead email for notifications."
          steps:
            - name: get-expenses
              type: call
              call: "concur.get-expense-reports"
              with:
                case_code: "{{case_code}}"
            - name: get-budget
              type: call
              call: "workday.get-budget"
              with:
                cost_center: "{{cost_center}}"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{case_lead_email}}"
                text: "Expense reconciliation for {{case_code}}: Total spend {{get-expenses.total_amount}} vs budget {{get-budget.remaining_budget}}."
  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"
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/financial-management/budgets/{{cost_center}}"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Pipeline"
  description: "Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement."
  tags:
    - procurement
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: vendor_risk_assessment_pipeline
          description: "Orchestrate vendor risk assessment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Vendor Risk Assessment Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bain-and-company.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bain-and-company.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries Workday for consultant utilization rates, pulls billing data from Oracle E-Business Suite, computes metrics in Alteryx, and distributes the report via Microsoft Outlook and uploads to SharePoint.

naftiko: "0.5"
info:
  label: "Weekly Utilization Report Generator"
  description: "Queries Workday for consultant utilization rates, pulls billing data from Oracle E-Business Suite, computes metrics in Alteryx, and distributes the report via Microsoft Outlook and uploads to SharePoint."
  tags:
    - operations
    - utilization
    - workday
    - oracle-e-business-suite
    - alteryx
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: utilization-report
      port: 8080
      tools:
        - name: generate-utilization-report
          description: "Generate the weekly utilization report across Workday time data and Oracle billing."
          inputParameters:
            - name: week_ending
              in: body
              type: string
              description: "Week ending date (YYYY-MM-DD)."
            - name: office
              in: body
              type: string
              description: "Office location filter."
            - name: ops_lead_email
              in: body
              type: string
              description: "Operations lead email for distribution."
          steps:
            - name: get-time-data
              type: call
              call: "workday.get-time-entries"
              with:
                week_ending: "{{week_ending}}"
                office: "{{office}}"
            - name: get-billing-data
              type: call
              call: "oracle-ebs.get-billing"
              with:
                period: "{{week_ending}}"
                office: "{{office}}"
            - name: compute-metrics
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "weekly_utilization_v2"
                inputs: "{{get-time-data.dataset_id}},{{get-billing-data.dataset_id}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "operations_site"
                folder_path: "Utilization/{{week_ending}}"
                file_name: "Utilization_{{office}}_{{week_ending}}.xlsx"
                content: "{{compute-metrics.output_file}}"
            - name: distribute-report
              type: call
              call: "outlook.send-email"
              with:
                to: "{{ops_lead_email}}"
                subject: "Weekly Utilization Report - {{office}} - {{week_ending}}"
                body: "Report uploaded: {{upload-report.url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-entries
          path: "/time-tracking/entries"
          operations:
            - name: get-time-entries
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bain-ebs.oracle.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: billing
          path: "/billing/summary"
          operations:
            - name: get-billing
              method: GET
    - type: http
      namespace: alteryx
      baseUri: "https://bain.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/run"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Retrieves a Workday worker profile by employee ID, returning name, title, department, office location, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Retrieves a Workday worker profile by employee ID, returning name, title, department, office location, and manager."
  tags:
    - hr
    - talent
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an employee in Workday by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Retrieves a Zendesk support ticket by ID, returning status, priority, assignee, and latest comment for internal IT support tracking.

naftiko: "0.5"
info:
  label: "Zendesk Ticket Status"
  description: "Retrieves a Zendesk support ticket by ID, returning status, priority, assignee, and latest comment for internal IT support tracking."
  tags:
    - it-operations
    - support
    - zendesk
capability:
  exposes:
    - type: mcp
      namespace: support-ticket
      port: 8080
      tools:
        - name: get-ticket
          description: "Look up a Zendesk ticket by ID."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://bain.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET

Searches ZoomInfo for a contact by name and company, returning direct phone, email, title, and seniority level for client outreach.

naftiko: "0.5"
info:
  label: "ZoomInfo Contact Enrichment"
  description: "Searches ZoomInfo for a contact by name and company, returning direct phone, email, title, and seniority level for client outreach."
  tags:
    - research
    - contact-enrichment
    - zoominfo
capability:
  exposes:
    - type: mcp
      namespace: contact-enrichment
      port: 8080
      tools:
        - name: enrich-contact
          description: "Search ZoomInfo for a contact and return enriched profile data."
          inputParameters:
            - name: first_name
              in: body
              type: string
              description: "Contact first name."
            - name: last_name
              in: body
              type: string
              description: "Contact last name."
            - name: company_name
              in: body
              type: string
              description: "Company name to narrow the search."
          call: "zoominfo.search-contact"
          with:
            first_name: "{{first_name}}"
            last_name: "{{last_name}}"
            company_name: "{{company_name}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contact-search
          path: "/search/contact"
          operations:
            - name: search-contact
              method: POST