Bain & Company Capabilities
Naftiko 0.5 capability definitions for Bain & Company - 100 capabilities showing integration workflows and service orchestrations.
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