BP Capabilities

Naftiko 0.5 capability definitions for BP - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Pulls a summary report from Adobe Analytics for a given report suite and date range.

naftiko: "0.5"
info:
  label: "Adobe Analytics Report Pull"
  description: "Pulls a summary report from Adobe Analytics for a given report suite and date range."
  tags:
    - analytics
    - adobe-analytics
    - marketing
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-report
          description: "Given an Adobe Analytics report suite ID and date range, retrieve a summary report with page views, visits, and unique visitors. Use for marketing performance reviews."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "The Adobe Analytics report suite ID."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "adobe-analytics.get-report"
          with:
            rsid: "{{report_suite_id}}"
            date_from: "{{date_from}}"
            date_to: "{{date_to}}"
          outputParameters:
            - name: page_views
              type: integer
              mapping: "$.rows[0].data[0]"
            - name: visits
              type: integer
              mapping: "$.rows[0].data[1]"
  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

Compares Workday headcount data against ADP payroll records, identifies discrepancies, logs them in Snowflake, and alerts the payroll team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Discrepancy Detector"
  description: "Compares Workday headcount data against ADP payroll records, identifies discrepancies, logs them in Snowflake, and alerts the payroll team via Microsoft Teams."
  tags:
    - hr
    - payroll
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: detect-payroll-discrepancies
          description: "Given a pay period, compare Workday headcount against ADP payroll records and flag mismatches. Use before payroll finalization each pay cycle."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "The pay period in YYYY-MM-DD format."
          steps:
            - name: get-workday-headcount
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM HR.WORKDAY_ACTIVE_EMPLOYEES WHERE as_of_date = '{{pay_period}}'"
            - name: get-adp-payroll
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM HR.ADP_PAYROLL_RECORDS WHERE pay_period = '{{pay_period}}'"
            - name: log-discrepancies
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO HR.PAYROLL_DISCREPANCIES SELECT w.employee_id, '{{pay_period}}' FROM HR.WORKDAY_ACTIVE_EMPLOYEES w LEFT JOIN HR.ADP_PAYROLL_RECORDS a ON w.employee_id = a.employee_id WHERE a.employee_id IS NULL AND w.as_of_date = '{{pay_period}}'"
            - name: notify-payroll
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_payroll_channel"
                text: "Payroll discrepancy check for {{pay_period}} complete. Workday count: {{get-workday-headcount.row_count}}, ADP count: {{get-adp-payroll.row_count}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Given a resolved ServiceNow incident, uses Anthropic Claude to generate a structured post-mortem summary and publishes it to the knowledge base in Confluence.

naftiko: "0.5"
info:
  label: "AI-Assisted Incident Post-Mortem Summarizer"
  description: "Given a resolved ServiceNow incident, uses Anthropic Claude to generate a structured post-mortem summary and publishes it to the knowledge base in Confluence."
  tags:
    - ai
    - automation
    - anthropic
    - servicenow
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: ai-ops
      port: 8080
      tools:
        - name: generate-postmortem
          description: "Given a resolved ServiceNow incident number, retrieve the full incident timeline, generate a structured post-mortem using Anthropic Claude, and publish to Confluence. Use for all P1 and P2 incidents after resolution."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The resolved ServiceNow incident number, e.g. 'INC0011111'."
            - name: confluence_space_key
              in: body
              type: string
              description: "The Confluence space key for the post-mortem page, e.g. 'INFRA'."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: generate-summary
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-opus-4-5"
                max_tokens: 2048
                system: "You are an incident management specialist. Generate a structured post-mortem with sections: Summary, Timeline, Root Cause, Impact, Remediation, Action Items."
                content: "Generate a post-mortem for this incident: {{get-incident.short_description}}. Resolution: {{get-incident.close_notes}}. Duration: {{get-incident.resolved_at}}."
            - name: publish-postmortem
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                title: "Post-mortem: {{incident_number}} — {{get-incident.short_description}}"
                body: "{{generate-summary.content}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bp.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Scans Amazon S3 buckets for objects exceeding retention policies, logs non-compliant objects in Snowflake, and alerts the cloud governance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Amazon S3 Data Lifecycle Enforcer"
  description: "Scans Amazon S3 buckets for objects exceeding retention policies, logs non-compliant objects in Snowflake, and alerts the cloud governance team via Microsoft Teams."
  tags:
    - cloud
    - amazon-web-services
    - snowflake
    - microsoft-teams
    - data-governance
capability:
  exposes:
    - type: mcp
      namespace: cloud-governance
      port: 8080
      tools:
        - name: enforce-s3-lifecycle
          description: "Given an S3 bucket name and retention policy in days, identify objects exceeding retention, log findings, and alert the team. Use for cloud data governance enforcement."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The Amazon S3 bucket name."
            - name: retention_days
              in: body
              type: integer
              description: "Maximum retention period in days."
          steps:
            - name: scan-bucket
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as expired_count, SUM(size_bytes) as total_size FROM CLOUD.S3_INVENTORY WHERE bucket = '{{bucket_name}}' AND DATEDIFF(day, last_modified, CURRENT_DATE) > {{retention_days}}"
            - name: log-findings
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO GOVERNANCE.S3_LIFECYCLE_AUDIT VALUES ('{{bucket_name}}', {{retention_days}}, {{scan-bucket.expired_count}}, {{scan-bucket.total_size}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_cloud_governance_channel"
                text: "S3 lifecycle audit for {{bucket_name}}: {{scan-bucket.expired_count}} objects exceed {{retention_days}}-day retention ({{scan-bucket.total_size}} bytes)."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Azure Cost Management detects a spend anomaly for a BP subscription, creates a Jira ticket for the cloud platform team and posts an alert to the FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Responder"
  description: "When Azure Cost Management detects a spend anomaly for a BP subscription, creates a Jira ticket for the cloud platform team and posts an alert to the FinOps Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - jira
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID, anomaly amount, and owning team name, fetch cost breakdown from Azure, open a Jira FinOps ticket, and alert the FinOps channel in Teams. Use when cloud spend exceeds expected baseline."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the anomaly was detected."
            - name: anomaly_amount
              in: body
              type: number
              description: "The dollar amount exceeding the expected spend baseline."
            - name: team_name
              in: body
              type: string
              description: "The team name owning the subscription for Jira routing."
          steps:
            - name: get-cost-detail
              type: call
              call: "azure.get-subscription-costs"
              with:
                subscription_id: "{{subscription_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FINOPS"
                issuetype: "Task"
                summary: "Azure cost anomaly: {{subscription_id}} — ${{anomaly_amount}} overage"
                description: "Subscription: {{subscription_id}}\nOverage: ${{anomaly_amount}}\nTeam: {{team_name}}"
            - name: notify-finops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.finops_channel_id"
                text: "Cloud cost anomaly on {{subscription_id}}: ${{anomaly_amount}} over baseline. Team: {{team_name}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: subscription-costs
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-subscription-costs
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers an Azure Databricks notebook run, monitors completion status, logs results in Snowflake, and notifies the data engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure Databricks Notebook Scheduler"
  description: "Triggers an Azure Databricks notebook run, monitors completion status, logs results in Snowflake, and notifies the data engineering team via Microsoft Teams."
  tags:
    - data-engineering
    - azure-databricks
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: notebook-ops
      port: 8080
      tools:
        - name: run-notebook
          description: "Given a Databricks workspace path and parameters, trigger the notebook run, log results, and notify the team. Use for scheduled data processing jobs."
          inputParameters:
            - name: notebook_path
              in: body
              type: string
              description: "The Databricks notebook path."
            - name: parameters
              in: body
              type: string
              description: "JSON string of notebook parameters."
          steps:
            - name: submit-run
              type: call
              call: "databricks.submit-run"
              with:
                notebook_path: "{{notebook_path}}"
                parameters: "{{parameters}}"
            - name: log-execution
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO DATA_ENG.NOTEBOOK_RUNS VALUES ('{{notebook_path}}', '{{submit-run.run_id}}', CURRENT_TIMESTAMP)"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_data_engineering_channel"
                text: "Databricks notebook {{notebook_path}} submitted. Run ID: {{submit-run.run_id}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://bp-databricks.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/submit"
          operations:
            - name: submit-run
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an Azure DevOps release pipeline requires approval, fetches release details, validates change management in ServiceNow, and notifies the approver via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Approval Chain"
  description: "When an Azure DevOps release pipeline requires approval, fetches release details, validates change management in ServiceNow, and notifies the approver via Microsoft Teams."
  tags:
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: process-release-approval
          description: "Given an Azure DevOps release ID and project, fetch release details, validate the associated ServiceNow change request, and notify the approver. Use for release governance."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "The Azure DevOps release ID."
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
          steps:
            - name: get-release
              type: call
              call: "azdo.get-release"
              with:
                project: "{{project}}"
                release_id: "{{release_id}}"
            - name: validate-change
              type: call
              call: "servicenow.get-change-request"
              with:
                change_number: "{{get-release.change_request_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-release.approver_email}}"
                text: "Release {{release_id}} in {{project}} requires your approval. Change request {{validate-change.number}} status: {{validate-change.state}}."
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://vsrm.dev.azure.com/bp"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: releases
          path: "/{{project}}/_apis/release/releases/{{release_id}}"
          inputParameters:
            - name: project
              in: path
            - name: release_id
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request?sysparm_query=number={{change_number}}"
          inputParameters:
            - name: change_number
              in: query
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks the health status of a specified Azure resource, returning availability state and summary.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Checks the health status of a specified Azure resource, returning availability state and summary."
  tags:
    - cloud
    - microsoft-azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-resource-health
          description: "Given an Azure resource ID, retrieve its current availability status and health summary. Use for infrastructure monitoring and incident triage."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "The full Azure resource ID path."
          call: "azure.get-resource-health"
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
            - name: summary
              type: string
              mapping: "$.properties.summary"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resource-health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current?api-version=2023-07-01"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-resource-health
              method: GET

Ingests Bloomberg market data feeds into Snowflake, validates data completeness, and notifies the trading analytics team via Microsoft Teams with quality metrics.

naftiko: "0.5"
info:
  label: "Bloomberg Market Data Ingestion Pipeline"
  description: "Ingests Bloomberg market data feeds into Snowflake, validates data completeness, and notifies the trading analytics team via Microsoft Teams with quality metrics."
  tags:
    - trading
    - bloomberg
    - snowflake
    - microsoft-teams
    - market-data
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: ingest-market-data
          description: "Given a Bloomberg data feed and trade date, ingest market data into Snowflake and validate completeness. Use for daily market data loading."
          inputParameters:
            - name: feed_name
              in: body
              type: string
              description: "The Bloomberg data feed name."
            - name: trade_date
              in: body
              type: string
              description: "The trade date in YYYY-MM-DD format."
          steps:
            - name: load-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL TRADING.LOAD_BLOOMBERG_FEED('{{feed_name}}', '{{trade_date}}')"
            - name: validate-completeness
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as record_count, COUNT(DISTINCT symbol) as symbol_count FROM TRADING.BLOOMBERG_{{feed_name}} WHERE trade_date = '{{trade_date}}'"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_trading_analytics_channel"
                text: "Bloomberg {{feed_name}} loaded for {{trade_date}}: {{validate-completeness.record_count}} records, {{validate-completeness.symbol_count}} symbols."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a file stored in Box including name, size, owner, and shared link status.

naftiko: "0.5"
info:
  label: "Box File Metadata Lookup"
  description: "Retrieves metadata for a file stored in Box including name, size, owner, and shared link status."
  tags:
    - storage
    - box
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: storage
      port: 8080
      tools:
        - name: get-file-info
          description: "Given a Box file ID, retrieve the file name, size, owner, modification date, and sharing status. Use for document governance and compliance audits."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
          call: "box.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: integer
              mapping: "$.size"
            - name: owner
              type: string
              mapping: "$.owned_by.login"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Pulls carbon emissions data from SAP EHS, aggregates it in Snowflake, generates a Power BI dashboard refresh, and sends the report link to the sustainability team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Carbon Emissions Quarterly Report Generator"
  description: "Pulls carbon emissions data from SAP EHS, aggregates it in Snowflake, generates a Power BI dashboard refresh, and sends the report link to the sustainability team via Microsoft Teams."
  tags:
    - sustainability
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability-reporting
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a fiscal quarter and business unit, pull emissions data from SAP EHS, aggregate in Snowflake, trigger a Power BI refresh, and notify the sustainability team. Use for quarterly ESG reporting."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter in YYYY-QN format."
            - name: business_unit
              in: body
              type: string
              description: "BP business unit code."
          steps:
            - name: pull-emissions
              type: call
              call: "sap-ehs.get-emissions-data"
              with:
                quarter: "{{fiscal_quarter}}"
                business_unit: "{{business_unit}}"
            - name: aggregate-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO SUSTAINABILITY.EMISSIONS_QUARTERLY SELECT * FROM staging WHERE quarter='{{fiscal_quarter}}'"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_emissions_dataset_id"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sustainability_channel"
                text: "Q{{fiscal_quarter}} emissions report ready for {{business_unit}}. Dashboard refreshed: {{refresh-dashboard.status}}."
  consumes:
    - type: http
      namespace: sap-ehs
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_EHS_EMISSIONS"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: emissions
          path: "/EmissionsData"
          operations:
            - name: get-emissions-data
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a change request for a critical infrastructure or OT system is submitted in ServiceNow, retrieves risk details and routes to the Change Advisory Board via Teams for review.

naftiko: "0.5"
info:
  label: "Change Management Approval Gate for Critical Infrastructure"
  description: "When a change request for a critical infrastructure or OT system is submitted in ServiceNow, retrieves risk details and routes to the Change Advisory Board via Teams for review."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - operations
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: route-change-request
          description: "Given a ServiceNow change request number, retrieve the change details and risk assessment, notify the CAB in Teams, and update the change record to under review. Use for all changes to critical energy infrastructure and OT systems."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number, e.g. 'CHG0003456'."
          steps:
            - name: get-change
              type: call
              call: "servicenow.get-change"
              with:
                number: "{{change_number}}"
            - name: notify-cab
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.cab_channel_id"
                text: "CAB Review: {{change_number}} — {{get-change.short_description}} | Risk: {{get-change.risk}} | System: {{get-change.cmdb_ci}} | Planned: {{get-change.start_date}}"
            - name: update-change
              type: call
              call: "servicenow-update.patch-change"
              with:
                sys_id: "{{get-change.sys_id}}"
                state: "2"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: get-change
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: servicenow-update
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-patch
          path: "/table/change_request/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: patch-change
              method: PATCH

When an Azure DevOps pipeline fails on a protected branch, creates a Jira bug, posts an alert to Microsoft Teams, and triggers a PagerDuty incident for the on-call engineering team.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Handler"
  description: "When an Azure DevOps pipeline fails on a protected branch, creates a Jira bug, posts an alert to Microsoft Teams, and triggers a PagerDuty incident for the on-call engineering team."
  tags:
    - devops
    - cicd
    - azure-devops
    - jira
    - microsoft-teams
    - pagerduty
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given an Azure DevOps pipeline failure with project, pipeline name, branch, and run ID, create a Jira bug, alert the engineering Teams channel, and trigger PagerDuty for on-call response. Use for critical pipeline failures in production branches."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_name
              in: body
              type: string
              description: "The Azure DevOps pipeline name that failed."
            - name: branch
              in: body
              type: string
              description: "The Git branch where the failure occurred."
            - name: run_id
              in: body
              type: string
              description: "The Azure DevOps pipeline run ID."
          steps:
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{project}} / {{pipeline_name}} on {{branch}}"
                description: "Project: {{project}}\nPipeline: {{pipeline_name}}\nBranch: {{branch}}\nRun ID: {{run_id}}"
            - name: alert-teams
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.engineering_alerts_channel_id"
                text: "Pipeline failure: {{pipeline_name}} on {{branch}} in {{project}}. Jira: {{create-bug.key}}. Run: {{run_id}}."
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "CI Failure: {{project}} {{pipeline_name}} {{branch}}"
                service_id: "$secrets.pagerduty_engineering_service_id"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When a Cisco firewall rule change is detected, validates it against the approved ServiceNow change request, logs the audit trail in Splunk, and alerts the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cisco Firewall Rule Change Auditor"
  description: "When a Cisco firewall rule change is detected, validates it against the approved ServiceNow change request, logs the audit trail in Splunk, and alerts the security team via Microsoft Teams."
  tags:
    - security
    - cisco
    - servicenow
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: firewall-audit
      port: 8080
      tools:
        - name: audit-firewall-change
          description: "Given a Cisco device ID and change timestamp, validate the change against approved change requests and log the audit. Use for firewall compliance monitoring."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The Cisco firewall device identifier."
            - name: change_timestamp
              in: body
              type: string
              description: "The timestamp of the detected change."
          steps:
            - name: get-change-request
              type: call
              call: "servicenow.get-change-requests"
              with:
                ci_id: "{{device_id}}"
                timestamp: "{{change_timestamp}}"
            - name: log-audit
              type: call
              call: "splunk.index-event"
              with:
                index: "firewall_audit"
                event: "Firewall rule change on {{device_id}} at {{change_timestamp}}. Approved CR: {{get-change-request.number}}"
            - name: alert-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_security_channel"
                text: "Firewall rule change detected on {{device_id}} at {{change_timestamp}}. Associated CR: {{get-change-request.number}}, Status: {{get-change-request.state}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: get-change-requests
              method: GET
    - type: http
      namespace: splunk
      baseUri: "https://bp-splunk.example.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/receivers/simple"
          operations:
            - name: index-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the current state of an AWS CloudWatch alarm, returning state value and reason.

naftiko: "0.5"
info:
  label: "CloudWatch Alarm Status Check"
  description: "Checks the current state of an AWS CloudWatch alarm, returning state value and reason."
  tags:
    - monitoring
    - amazon-web-services
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: aws-monitoring
      port: 8080
      tools:
        - name: get-alarm-status
          description: "Given an AWS CloudWatch alarm name, retrieve its current state and state reason. Use for operational monitoring dashboards."
          inputParameters:
            - name: alarm_name
              in: body
              type: string
              description: "The CloudWatch alarm name."
          call: "cloudwatch.describe-alarm"
          with:
            alarm_name: "{{alarm_name}}"
          outputParameters:
            - name: state_value
              type: string
              mapping: "$.MetricAlarms[0].StateValue"
            - name: state_reason
              type: string
              mapping: "$.MetricAlarms[0].StateReason"
  consumes:
    - type: http
      namespace: cloudwatch
      baseUri: "https://monitoring.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "X-Amz-Security-Token"
        value: "$secrets.aws_session_token"
        placement: header
      resources:
        - name: alarms
          path: "/?Action=DescribeAlarms&AlarmNames.member.1={{alarm_name}}"
          inputParameters:
            - name: alarm_name
              in: query
          operations:
            - name: describe-alarm
              method: GET

Identifies SAP Concur expense reports pending approval beyond the policy threshold and sends reminder messages to approving managers via Teams.

naftiko: "0.5"
info:
  label: "Concur Expense Report Approval Escalation"
  description: "Identifies SAP Concur expense reports pending approval beyond the policy threshold and sends reminder messages to approving managers via Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: escalate-pending-expenses
          description: "Retrieve expense reports pending approval for more than the specified number of days from SAP Concur and send Teams reminders to the responsible approvers. Use for weekly expense compliance monitoring."
          inputParameters:
            - name: pending_days
              in: body
              type: integer
              description: "Minimum pending days before escalating. BP policy threshold is typically 5 days."
          steps:
            - name: get-pending-reports
              type: call
              call: "concur.list-pending-reports"
              with:
                approvalStatusCode: "A_PEND"
                limit: "100"
            - name: notify-approvers
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-pending-reports.approver_email}}"
                text: "Reminder: You have expense reports pending approval in SAP Concur. Please review within {{pending_days}} days per BP expense policy."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: list-pending-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When SAP Concur flags a travel booking that violates policy, logs the violation in Snowflake, creates a ServiceNow request for review, and notifies the traveler's manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Concur Travel Policy Violation Handler"
  description: "When SAP Concur flags a travel booking that violates policy, logs the violation in Snowflake, creates a ServiceNow request for review, and notifies the traveler's manager via Microsoft Teams."
  tags:
    - travel
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-compliance
      port: 8080
      tools:
        - name: handle-policy-violation
          description: "Given a Concur report ID and violation type, log the violation, create a review request, and notify the manager. Use when travel policy violations are detected."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: violation_type
              in: body
              type: string
              description: "Type of policy violation."
            - name: employee_email
              in: body
              type: string
              description: "The employee's email address."
          steps:
            - name: log-violation
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO FINANCE.TRAVEL_VIOLATIONS VALUES ('{{report_id}}', '{{violation_type}}', '{{employee_email}}', CURRENT_TIMESTAMP)"
            - name: create-review
              type: call
              call: "servicenow.create-request"
              with:
                category: "travel_compliance"
                short_description: "Travel policy violation: {{violation_type}} on report {{report_id}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_travel_compliance_channel"
                text: "Travel policy violation on report {{report_id}} ({{violation_type}}) by {{employee_email}}. Review request: {{create-review.number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes ServiceNow incident trends, identifies knowledge gaps in Confluence, creates Jira tasks for documentation, and notifies the knowledge management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Gap Analyzer"
  description: "Analyzes ServiceNow incident trends, identifies knowledge gaps in Confluence, creates Jira tasks for documentation, and notifies the knowledge management team via Microsoft Teams."
  tags:
    - knowledge-management
    - servicenow
    - confluence
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: knowledge-ops
      port: 8080
      tools:
        - name: analyze-knowledge-gaps
          description: "Given a ServiceNow category and time range, identify frequently recurring incidents without knowledge articles, create documentation tasks, and notify the team. Use for continuous improvement."
          inputParameters:
            - name: category
              in: body
              type: string
              description: "The ServiceNow incident category to analyze."
            - name: lookback_days
              in: body
              type: integer
              description: "Number of days to look back for incident patterns."
          steps:
            - name: get-incident-trends
              type: call
              call: "servicenow.get-incidents"
              with:
                category: "{{category}}"
                days: "{{lookback_days}}"
            - name: search-knowledge
              type: call
              call: "confluence.search"
              with:
                query: "{{category}} troubleshooting"
            - name: create-doc-task
              type: call
              call: "jira.create-issue"
              with:
                project: "KBASE"
                issue_type: "Task"
                summary: "Knowledge gap: {{category}} - {{get-incident-trends.top_issue}} ({{get-incident-trends.count}} incidents)"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_knowledge_channel"
                text: "Knowledge gap found: {{get-incident-trends.top_issue}} in {{category}} with {{get-incident-trends.count}} incidents. Only {{search-knowledge.result_count}} articles found. Task: {{create-doc-task.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incidents
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bp.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql={{query}}"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Confluence wiki page by ID, returning the title, space, last modifier, and version number.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID, returning the title, space, last modifier, and version number."
  tags:
    - documentation
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given a Confluence page ID, retrieve the page title, space key, body content excerpt, and last modified date. Use for documentation reviews and audit trails."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID, e.g. '12345678'."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: space_key
              type: string
              mapping: "$.space.key"
            - name: version
              type: integer
              mapping: "$.version.number"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bp.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=version,space"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Promotes a validated ML model from Databricks staging to production, updates the model registry, and notifies the data science team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Pipeline"
  description: "Promotes a validated ML model from Databricks staging to production, updates the model registry, and notifies the data science team via Microsoft Teams."
  tags:
    - data-science
    - databricks
    - microsoft-teams
    - mlops
capability:
  exposes:
    - type: mcp
      namespace: mlops
      port: 8080
      tools:
        - name: deploy-ml-model
          description: "Given a Databricks model name and version, promote it to production, update the registry, and notify the team. Use after model validation passes."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The registered model name in Databricks."
            - name: model_version
              in: body
              type: string
              description: "The model version to promote."
          steps:
            - name: promote-model
              type: call
              call: "databricks.transition-model-stage"
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
                stage: "Production"
            - name: log-deployment
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO MLOPS.DEPLOYMENTS VALUES ('{{model_name}}', '{{model_version}}', CURRENT_TIMESTAMP, 'Production')"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_data_science_channel"
                text: "Model {{model_name}} v{{model_version}} promoted to Production. Status: {{promote-model.status}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://bp-databricks.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-versions
          path: "/mlflow/model-versions/transition-stage"
          operations:
            - name: transition-model-stage
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for the current health status of a specified service, returning uptime percentage and active alert count.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a specified service, returning uptime percentage and active alert count."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Datadog service name, retrieve its current health status, uptime metric, and active monitor alert count. Use for operational readiness checks."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name, e.g. 'bp-trading-api'."
          call: "datadog.get-service-health"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
            - name: uptime_pct
              type: string
              mapping: "$.data.attributes.uptime"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/service_level_objectives?query={{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-health
              method: GET

When Dynatrace detects application performance degradation, captures the problem details, creates a ServiceNow incident, and alerts the SRE team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Dynatrace APM Degradation Handler"
  description: "When Dynatrace detects application performance degradation, captures the problem details, creates a ServiceNow incident, and alerts the SRE team via Microsoft Teams."
  tags:
    - monitoring
    - dynatrace
    - servicenow
    - microsoft-teams
    - sre
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: handle-degradation
          description: "Given a Dynatrace problem ID, retrieve details, create a ServiceNow incident, and notify the SRE team. Use when Dynatrace detects performance anomalies."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "The Dynatrace problem ID."
          steps:
            - name: get-problem
              type: call
              call: "dynatrace.get-problem"
              with:
                problem_id: "{{problem_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "application_performance"
                priority: "2"
                short_description: "Dynatrace: {{get-problem.title}} affecting {{get-problem.impactedEntities}}"
            - name: notify-sre
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_sre_channel"
                text: "APM Degradation: {{get-problem.title}}. Impact: {{get-problem.impactLevel}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://bp.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Api-Token $secrets.dynatrace_api_token"
        placement: header
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an emergency is declared at a facility, creates a ServiceNow major incident, notifies the emergency response team via Microsoft Teams, and opens a Jira war room tracker.

naftiko: "0.5"
info:
  label: "Emergency Response Coordination Chain"
  description: "When an emergency is declared at a facility, creates a ServiceNow major incident, notifies the emergency response team via Microsoft Teams, and opens a Jira war room tracker."
  tags:
    - safety
    - emergency-response
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: emergency-response
      port: 8080
      tools:
        - name: coordinate-emergency-response
          description: "Given a facility, emergency type, and severity level, activate emergency response procedures across all relevant systems. Use for declared facility emergencies."
          inputParameters:
            - name: facility
              in: body
              type: string
              description: "The facility name or code."
            - name: emergency_type
              in: body
              type: string
              description: "Type of emergency: fire, chemical_release, explosion, medical."
            - name: severity
              in: body
              type: string
              description: "Severity: TIER1, TIER2, TIER3."
          steps:
            - name: create-major-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "emergency"
                priority: "1"
                short_description: "EMERGENCY at {{facility}}: {{emergency_type}} ({{severity}})"
            - name: create-war-room
              type: call
              call: "jira.create-issue"
              with:
                project: "EMERG"
                issue_type: "Epic"
                summary: "War Room: {{facility}} {{emergency_type}} - {{severity}}"
            - name: notify-ert
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_emergency_channel"
                text: "EMERGENCY DECLARED at {{facility}}: {{emergency_type}} ({{severity}}). Major incident: {{create-major-incident.number}}. War room: {{create-war-room.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, revokes Okta access and notifies the IT offboarding team via Teams to complete systems deprovisioning.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is processed in Workday, revokes Okta access and notifies the IT offboarding team via Teams to complete systems deprovisioning."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, retrieve employee details, deactivate their Okta account, and notify the IT offboarding team in Teams. Invoke when an employee departure is confirmed."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working day in ISO 8601 format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_login: "{{get-employee.work_email}}"
            - name: notify-it
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.it_offboarding_channel_id"
                text: "Offboarding: {{get-employee.full_name}} ({{get-employee.work_email}}). Okta deactivated. Last day: {{termination_date}}. Please complete system deprovisioning."
  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: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://bp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-deactivate
          path: "/users/{{user_login}}/lifecycle/deactivate"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: deactivate-user
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions an Okta identity account, and sends a Microsoft Teams welcome message to the employee and their manager.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions an Okta identity account, and sends a Microsoft Teams welcome message to the employee and their manager."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Okta, and Microsoft Teams. Invoke when a new hire record is confirmed in Workday for any BP business."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in ISO 8601 format, e.g. '2026-05-01'."
          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:
                category: "hr_onboarding"
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                assigned_group: "IT_Onboarding"
            - name: provision-okta
              type: call
              call: "okta.create-user"
              with:
                first_name: "{{get-employee.first_name}}"
                last_name: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to BP, {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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: okta
      baseUri: "https://bp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles energy trading positions between the ETRM system and Snowflake, flags discrepancies in a Jira ticket, and notifies the trading risk team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Energy Trading Position Reconciliation"
  description: "Reconciles energy trading positions between the ETRM system and Snowflake, flags discrepancies in a Jira ticket, and notifies the trading risk team via Microsoft Teams."
  tags:
    - trading
    - snowflake
    - jira
    - microsoft-teams
    - risk
capability:
  exposes:
    - type: mcp
      namespace: trading-ops
      port: 8080
      tools:
        - name: reconcile-positions
          description: "Given a trade date and commodity code, pull positions from ETRM and Snowflake, compare them, and flag mismatches. Use at end-of-day for position reconciliation."
          inputParameters:
            - name: trade_date
              in: body
              type: string
              description: "Trade date in YYYY-MM-DD format."
            - name: commodity_code
              in: body
              type: string
              description: "Commodity code, e.g. 'CRUDE_WTI'."
          steps:
            - name: get-etrm-positions
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM TRADING.ETRM_POSITIONS WHERE trade_date='{{trade_date}}' AND commodity='{{commodity_code}}'"
            - name: get-warehouse-positions
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM TRADING.WAREHOUSE_POSITIONS WHERE trade_date='{{trade_date}}' AND commodity='{{commodity_code}}'"
            - name: flag-discrepancies
              type: call
              call: "jira.create-issue"
              with:
                project: "TRDRISK"
                issue_type: "Bug"
                summary: "Position discrepancy: {{commodity_code}} on {{trade_date}}"
            - name: notify-risk
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_trading_risk_channel"
                text: "Position reconciliation complete for {{commodity_code}} on {{trade_date}}. Discrepancy ticket: {{flag-discrepancies.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Scans F5 load balancers for SSL certificates nearing expiration, creates ServiceNow change requests for renewal, and alerts the infrastructure security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "F5 Load Balancer Certificate Expiry Checker"
  description: "Scans F5 load balancers for SSL certificates nearing expiration, creates ServiceNow change requests for renewal, and alerts the infrastructure security team via Microsoft Teams."
  tags:
    - security
    - f5-networks
    - servicenow
    - microsoft-teams
    - certificates
capability:
  exposes:
    - type: mcp
      namespace: cert-mgmt
      port: 8080
      tools:
        - name: check-certificate-expiry
          description: "Given an F5 partition and expiry threshold in days, scan for certificates nearing expiration, create renewal change requests, and notify the team. Use for proactive certificate lifecycle management."
          inputParameters:
            - name: partition
              in: body
              type: string
              description: "The F5 partition to scan."
            - name: days_threshold
              in: body
              type: integer
              description: "Number of days before expiry to flag."
          steps:
            - name: scan-certificates
              type: call
              call: "f5.get-certificates"
              with:
                partition: "{{partition}}"
                expiring_within_days: "{{days_threshold}}"
            - name: create-change-request
              type: call
              call: "servicenow.create-change-request"
              with:
                category: "certificate_renewal"
                short_description: "{{scan-certificates.count}} SSL certificates expiring within {{days_threshold}} days on F5 partition {{partition}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_infra_security_channel"
                text: "{{scan-certificates.count}} SSL certificates on F5 partition {{partition}} expire within {{days_threshold}} days. Change request: {{create-change-request.number}}."
  consumes:
    - type: http
      namespace: f5
      baseUri: "https://bp-f5.example.com/mgmt/tm"
      authentication:
        type: basic
        username: "$secrets.f5_user"
        password: "$secrets.f5_password"
      resources:
        - name: certificates
          path: "/sys/crypto/cert?$filter=partition eq '{{partition}}'"
          inputParameters:
            - name: partition
              in: query
          operations:
            - name: get-certificates
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a GitHub Actions workflow fails, retrieves the failure details, creates a Jira bug ticket, and notifies the engineering team via Microsoft Teams with remediation context.

naftiko: "0.5"
info:
  label: "GitHub Actions CI/CD Quality Gate"
  description: "When a GitHub Actions workflow fails, retrieves the failure details, creates a Jira bug ticket, and notifies the engineering team via Microsoft Teams with remediation context."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
    - cicd
capability:
  exposes:
    - type: mcp
      namespace: cicd-quality
      port: 8080
      tools:
        - name: handle-workflow-failure
          description: "Given a GitHub repository and workflow run ID, retrieve failure logs, create a Jira ticket, and notify the team. Use when a CI/CD pipeline fails."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in org/repo format."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
          steps:
            - name: get-run-details
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project: "BPENG"
                issue_type: "Bug"
                summary: "CI/CD failure in {{repo}}: {{get-run-details.display_title}}"
                description: "Workflow run {{run_id}} failed. Conclusion: {{get-run-details.conclusion}}. Branch: {{get-run-details.head_branch}}."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_engineering_channel"
                text: "CI/CD failure in {{repo}} ({{get-run-details.head_branch}}): {{get-run-details.display_title}}. Jira: {{create-bug.key}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves metadata for a GitHub repository including description, default branch, open issues count, and last push date.

naftiko: "0.5"
info:
  label: "GitHub Repository Info Lookup"
  description: "Retrieves metadata for a GitHub repository including description, default branch, open issues count, and last push date."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given a GitHub org and repository name, retrieve the repository metadata including visibility, default branch, and open issue count. Use for developer experience audits and onboarding."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "The GitHub organization, e.g. 'bp-digital'."
            - name: repo
              in: body
              type: string
              description: "The repository name, e.g. 'trading-platform'."
          call: "github.get-repo"
          with:
            org: "{{org}}"
            repo: "{{repo}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.full_name"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues
              type: integer
              mapping: "$.open_issues_count"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{org}}/{{repo}}"
          inputParameters:
            - name: org
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

When GitHub Advanced Security flags a critical vulnerability in a repository, creates a Jira security ticket and triggers a PagerDuty alert for the security team.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub Advanced Security flags a critical vulnerability in a repository, creates a Jira security ticket and triggers a PagerDuty alert for the security team."
  tags:
    - devops
    - security
    - github
    - jira
    - pagerduty
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-security-vulnerability
          description: "Given a GitHub repository, CVE ID, and severity level, create a Jira security ticket and page the BP security team via PagerDuty. Use for critical and high-severity CVE findings in BP code repositories."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. 'bp/trading-platform'."
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier, e.g. 'CVE-2025-5678'."
            - name: severity
              in: body
              type: string
              description: "Severity level: 'critical', 'high', 'medium', 'low'."
          steps:
            - name: create-sec-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "[{{severity}}] {{cve_id}} in {{repo}}"
                description: "Repository: {{repo}}\nCVE: {{cve_id}}\nSeverity: {{severity}}"
            - name: page-security
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Security vulnerability {{cve_id}} in {{repo}} — {{severity}}"
                service_id: "$secrets.pagerduty_security_service_id"
                body: "Jira: {{create-sec-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Pulls Google Analytics campaign metrics, joins with Salesforce pipeline data in Snowflake, and sends an ROI summary to the marketing leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Campaign ROI Reporter"
  description: "Pulls Google Analytics campaign metrics, joins with Salesforce pipeline data in Snowflake, and sends an ROI summary to the marketing leadership via Microsoft Teams."
  tags:
    - marketing
    - google-analytics
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing-roi
      port: 8080
      tools:
        - name: generate-campaign-roi
          description: "Given a campaign ID and date range, pull GA metrics, join with Salesforce pipeline, and send ROI summary. Use for monthly marketing performance reviews."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Google Analytics campaign ID."
            - name: date_range
              in: body
              type: string
              description: "Date range in YYYY-MM-DD/YYYY-MM-DD format."
          steps:
            - name: get-ga-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT sessions, conversions, revenue FROM MARKETING.GA_CAMPAIGNS WHERE campaign_id = '{{campaign_id}}'"
            - name: get-pipeline-impact
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT SUM(amount) as pipeline_value FROM SALES.SFDC_OPPORTUNITIES WHERE campaign_id = '{{campaign_id}}'"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_marketing_leadership_channel"
                text: "Campaign {{campaign_id}} ROI: Sessions={{get-ga-metrics.sessions}}, Conversions={{get-ga-metrics.conversions}}, Pipeline impact={{get-pipeline-impact.pipeline_value}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Google Cloud Dataflow streaming jobs, logs performance metrics in Snowflake, and alerts the data platform team via Microsoft Teams when jobs fall behind.

naftiko: "0.5"
info:
  label: "Google Cloud Dataflow Job Health Monitor"
  description: "Monitors Google Cloud Dataflow streaming jobs, logs performance metrics in Snowflake, and alerts the data platform team via Microsoft Teams when jobs fall behind."
  tags:
    - data-engineering
    - google-cloud-platform
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dataflow-monitoring
      port: 8080
      tools:
        - name: monitor-dataflow-job
          description: "Given a GCP project and Dataflow job ID, check job health metrics, log in Snowflake, and alert if lagging. Use for streaming pipeline health monitoring."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
            - name: job_id
              in: body
              type: string
              description: "The Dataflow job ID."
          steps:
            - name: get-job-metrics
              type: call
              call: "gcp-dataflow.get-job"
              with:
                project_id: "{{project_id}}"
                job_id: "{{job_id}}"
            - name: log-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO DATA_PLATFORM.DATAFLOW_METRICS VALUES ('{{job_id}}', '{{get-job-metrics.currentState}}', {{get-job-metrics.backlog_seconds}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_data_platform_channel"
                text: "Dataflow job {{job_id}}: State={{get-job-metrics.currentState}}, Backlog={{get-job-metrics.backlog_seconds}}s."
  consumes:
    - type: http
      namespace: gcp-dataflow
      baseUri: "https://dataflow.googleapis.com/v1b3"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: jobs
          path: "/projects/{{project_id}}/jobs/{{job_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Scans Google Drive shared folders for sensitive data patterns, logs findings in Snowflake, and alerts the data protection team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Drive Sensitive Data Scanner"
  description: "Scans Google Drive shared folders for sensitive data patterns, logs findings in Snowflake, and alerts the data protection team via Microsoft Teams."
  tags:
    - security
    - google-drive
    - snowflake
    - microsoft-teams
    - data-protection
capability:
  exposes:
    - type: mcp
      namespace: data-protection
      port: 8080
      tools:
        - name: scan-sensitive-data
          description: "Given a Google Drive folder ID, scan for files containing sensitive data patterns, log findings, and alert the team. Use for data loss prevention audits."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The Google Drive folder ID to scan."
          steps:
            - name: list-files
              type: call
              call: "gdrive.list-files"
              with:
                folder_id: "{{folder_id}}"
            - name: log-findings
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO SECURITY.DLP_SCAN_RESULTS VALUES ('{{folder_id}}', {{list-files.sensitive_count}}, {{list-files.total_files}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_data_protection_channel"
                text: "DLP scan of Google Drive folder {{folder_id}}: {{list-files.sensitive_count}} files with sensitive data out of {{list-files.total_files}} scanned."
  consumes:
    - type: http
      namespace: gdrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files?q='{{folder_id}}' in parents"
          inputParameters:
            - name: folder_id
              in: query
          operations:
            - name: list-files
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a snapshot of a Grafana dashboard and returns the shareable URL.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Snapshot"
  description: "Creates a snapshot of a Grafana dashboard and returns the shareable URL."
  tags:
    - monitoring
    - grafana
    - observability
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: create-dashboard-snapshot
          description: "Given a Grafana dashboard UID, create a point-in-time snapshot and return the shareable link. Use for incident reports and executive briefings."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
          call: "grafana.create-snapshot"
          with:
            dashboard_uid: "{{dashboard_uid}}"
          outputParameters:
            - name: snapshot_url
              type: string
              mapping: "$.url"
            - name: delete_url
              type: string
              mapping: "$.deleteUrl"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://bp-grafana.example.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: snapshots
          path: "/snapshots"
          operations:
            - name: create-snapshot
              method: POST

When a Harness deployment fails health checks, triggers an automatic rollback, creates a Jira incident ticket, and notifies the DevOps team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Harness Deployment Rollback Automation"
  description: "When a Harness deployment fails health checks, triggers an automatic rollback, creates a Jira incident ticket, and notifies the DevOps team via Microsoft Teams."
  tags:
    - devops
    - harness
    - jira
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: deployment-ops
      port: 8080
      tools:
        - name: rollback-deployment
          description: "Given a Harness pipeline execution ID, trigger a rollback, create a Jira incident, and notify DevOps. Use when deployment health checks fail."
          inputParameters:
            - name: execution_id
              in: body
              type: string
              description: "The Harness pipeline execution ID."
            - name: service_name
              in: body
              type: string
              description: "The service that was being deployed."
          steps:
            - name: trigger-rollback
              type: call
              call: "harness.rollback-execution"
              with:
                execution_id: "{{execution_id}}"
            - name: create-incident
              type: call
              call: "jira.create-issue"
              with:
                project: "BPENG"
                issue_type: "Bug"
                summary: "Deployment rollback: {{service_name}} (execution {{execution_id}})"
                description: "Automatic rollback triggered due to failed health checks. Rollback status: {{trigger-rollback.status}}."
            - name: notify-devops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_devops_channel"
                text: "Deployment ROLLBACK for {{service_name}}: Execution {{execution_id}} rolled back ({{trigger-rollback.status}}). Jira: {{create-incident.key}}."
  consumes:
    - type: http
      namespace: harness
      baseUri: "https://app.harness.io/gateway/pipeline/api"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.harness_api_key"
        placement: header
      resources:
        - name: executions
          path: "/pipeline/execute/rollback/{{execution_id}}"
          inputParameters:
            - name: execution_id
              in: path
          operations:
            - name: rollback-execution
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Syncs new marketing qualified leads from HubSpot to Salesforce, enriches them with ZoomInfo data, and notifies the BDR team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Lead Sync"
  description: "Syncs new marketing qualified leads from HubSpot to Salesforce, enriches them with ZoomInfo data, and notifies the BDR team via Microsoft Teams."
  tags:
    - marketing
    - hubspot
    - salesforce
    - zoominfo
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-sync
      port: 8080
      tools:
        - name: sync-marketing-leads
          description: "Given a HubSpot list ID, sync MQLs to Salesforce, enrich with ZoomInfo, and notify the BDR team. Use for marketing-to-sales handoff automation."
          inputParameters:
            - name: list_id
              in: body
              type: string
              description: "The HubSpot contact list ID."
          steps:
            - name: get-leads
              type: call
              call: "hubspot.get-contacts"
              with:
                list_id: "{{list_id}}"
            - name: enrich-leads
              type: call
              call: "zoominfo.enrich-contacts"
              with:
                emails: "{{get-leads.emails}}"
            - name: push-to-salesforce
              type: call
              call: "salesforce.create-leads"
              with:
                leads: "{{enrich-leads.enriched_contacts}}"
            - name: notify-bdr
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_bdr_channel"
                text: "{{get-leads.count}} new MQLs synced from HubSpot to Salesforce. Enriched with ZoomInfo data."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/contacts/v1/lists/{{list_id}}/contacts/all"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: get-contacts
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/enrich/contact"
          operations:
            - name: enrich-contacts
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://bp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/composite/sobjects/Lead"
          operations:
            - name: create-leads
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls Indeed job posting performance metrics, compares against Workday requisition targets, logs results in Snowflake, and notifies the recruiting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Indeed Job Posting Performance Tracker"
  description: "Pulls Indeed job posting performance metrics, compares against Workday requisition targets, logs results in Snowflake, and notifies the recruiting team via Microsoft Teams."
  tags:
    - hr
    - recruiting
    - indeed
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: recruiting-analytics
      port: 8080
      tools:
        - name: track-posting-performance
          description: "Given an Indeed campaign ID, pull application metrics, compare to targets, and notify recruiting. Use for weekly job posting performance reviews."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Indeed sponsored job campaign ID."
          steps:
            - name: get-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT views, applications, cost_per_application FROM HR.INDEED_METRICS WHERE campaign_id = '{{campaign_id}}'"
            - name: get-target
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT target_applications FROM HR.REQUISITION_TARGETS WHERE indeed_campaign_id = '{{campaign_id}}'"
            - name: log-performance
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO HR.POSTING_PERFORMANCE VALUES ('{{campaign_id}}', {{get-metrics.views}}, {{get-metrics.applications}}, {{get-target.target_applications}}, CURRENT_TIMESTAMP)"
            - name: notify-recruiting
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_recruiting_channel"
                text: "Indeed campaign {{campaign_id}}: {{get-metrics.applications}}/{{get-target.target_applications}} applications ({{get-metrics.views}} views, ${{get-metrics.cost_per_application}} CPA)."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority."
  tags:
    - project-management
    - jira
    - issue-tracking
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, retrieve the issue summary, status, assignee, priority, and sprint. Use for status updates and triage workflows."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key, e.g. 'BPENG-1234'."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Generates a sprint planning digest from Jira for a given engineering project and posts the summary to the team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Digest"
  description: "Generates a sprint planning digest from Jira for a given engineering project and posts the summary to the team's Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - sprint-planning
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: digest-sprint-board
          description: "Given a Jira project key and sprint ID, fetch all open issues, count by priority, and post a structured sprint digest to the engineering Teams channel. Use at the start of sprint planning and weekly stand-ups."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. 'BPDT'."
            - name: sprint_id
              in: body
              type: integer
              description: "The Jira sprint ID for the current sprint."
          steps:
            - name: get-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "project={{project_key}} AND sprint={{sprint_id}} AND status != Done"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.engineering_channel_id"
                text: "Sprint {{sprint_id}} digest for {{project_key}}: {{get-issues.total}} open issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-search
          path: "/search"
          operations:
            - name: search-issues
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors Kong API gateway for services approaching rate limits, logs usage trends in Snowflake, and alerts the API platform team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Kong API Gateway Rate Limit Alerter"
  description: "Monitors Kong API gateway for services approaching rate limits, logs usage trends in Snowflake, and alerts the API platform team via Microsoft Teams."
  tags:
    - api-management
    - kong
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-ops
      port: 8080
      tools:
        - name: check-rate-limits
          description: "Given a Kong service name, check current rate limit usage, log trends, and alert if approaching thresholds. Use for API capacity management."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Kong service name."
          steps:
            - name: get-usage
              type: call
              call: "kong.get-service-metrics"
              with:
                service_name: "{{service_name}}"
            - name: log-usage
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO API_PLATFORM.RATE_LIMIT_USAGE VALUES ('{{service_name}}', {{get-usage.requests_per_minute}}, {{get-usage.rate_limit}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_api_platform_channel"
                text: "Kong rate limit check for {{service_name}}: {{get-usage.requests_per_minute}} RPM / {{get-usage.rate_limit}} limit ({{get-usage.pct_used}}% utilized)."
  consumes:
    - type: http
      namespace: kong
      baseUri: "https://bp-kong.example.com/admin-api"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.kong_admin_key"
        placement: header
      resources:
        - name: services
          path: "/services/{{service_name}}/plugins"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches engagement metrics for BP's LinkedIn sustainability and low-carbon content posts for the reporting period and posts a digest to the corporate communications Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Sustainability Content Performance Digest"
  description: "Fetches engagement metrics for BP's LinkedIn sustainability and low-carbon content posts for the reporting period and posts a digest to the corporate communications Teams channel."
  tags:
    - marketing
    - social
    - linkedin
    - microsoft-teams
    - reporting
    - sustainability
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-performance
          description: "Fetch follower growth and post engagement metrics from BP's LinkedIn company page for the specified period and post a digest to the corporate communications Teams channel. Use for weekly sustainability communications reporting."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date for the reporting period in ISO 8601 format."
            - name: end_date
              in: body
              type: string
              description: "End date for the reporting period in ISO 8601 format."
          steps:
            - name: get-follower-stats
              type: call
              call: "linkedin.get-follower-stats"
              with:
                organization_id: "$secrets.bp_linkedin_org_id"
            - name: get-share-stats
              type: call
              call: "linkedin-shares.get-share-stats"
              with:
                organization_id: "$secrets.bp_linkedin_org_id"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.comms_channel_id"
                text: "LinkedIn digest ({{start_date}} to {{end_date}}): followers {{get-follower-stats.follower_count}}, impressions {{get-share-stats.impression_count}}, engagements {{get-share-stats.engagement_count}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: follower-stats
          path: "/organizationalEntityFollowerStatistics"
          operations:
            - name: get-follower-stats
              method: GET
    - type: http
      namespace: linkedin-shares
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: share-stats
          path: "/organizationalEntityShareStatistics"
          operations:
            - name: get-share-stats
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Syncs open requisitions from Workday to LinkedIn job postings, tracks application counts in Snowflake, and sends a weekly digest to hiring managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Sync"
  description: "Syncs open requisitions from Workday to LinkedIn job postings, tracks application counts in Snowflake, and sends a weekly digest to hiring managers via Microsoft Teams."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-pipeline
      port: 8080
      tools:
        - name: sync-talent-pipeline
          description: "Given a Workday requisition ID, sync it as a LinkedIn job posting, record applicant stats in Snowflake, and notify the hiring manager. Use for recruiting pipeline management."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{get-requisition.title}}"
                description: "{{get-requisition.description}}"
                location: "{{get-requisition.location}}"
            - name: log-stats
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO HR.TALENT_PIPELINE VALUES ('{{requisition_id}}', '{{post-to-linkedin.posting_id}}', CURRENT_TIMESTAMP)"
            - name: notify-hiring-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-requisition.hiring_manager_email}}"
                text: "Job posting for {{get-requisition.title}} is live on LinkedIn. Posting ID: {{post-to-linkedin.posting_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: requisitions
          path: "/bp/jobRequisitions/{{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_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Syncs customer segments from Salesforce to MailChimp audience lists, triggers a campaign send, and logs delivery metrics in Snowflake.

naftiko: "0.5"
info:
  label: "MailChimp Customer Newsletter Sync"
  description: "Syncs customer segments from Salesforce to MailChimp audience lists, triggers a campaign send, and logs delivery metrics in Snowflake."
  tags:
    - marketing
    - mailchimp
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: sync-and-send-newsletter
          description: "Given a Salesforce report ID and MailChimp campaign ID, sync the audience segment and trigger the campaign. Use for monthly customer newsletter distribution."
          inputParameters:
            - name: sf_report_id
              in: body
              type: string
              description: "The Salesforce report ID containing the audience segment."
            - name: campaign_id
              in: body
              type: string
              description: "The MailChimp campaign ID to send."
          steps:
            - name: get-audience
              type: call
              call: "salesforce.run-report"
              with:
                report_id: "{{sf_report_id}}"
            - name: update-list
              type: call
              call: "mailchimp.update-audience"
              with:
                list_id: "$secrets.mailchimp_list_id"
                contacts: "{{get-audience.records}}"
            - name: send-campaign
              type: call
              call: "mailchimp.send-campaign"
              with:
                campaign_id: "{{campaign_id}}"
            - name: log-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO MARKETING.EMAIL_CAMPAIGNS VALUES ('{{campaign_id}}', {{get-audience.record_count}}, CURRENT_TIMESTAMP)"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: reports
          path: "/analytics/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: run-report
              method: GET
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: audiences
          path: "/lists/{{list_id}}/members"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: update-audience
              method: POST
        - name: campaigns
          path: "/campaigns/{{campaign_id}}/actions/send"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: send-campaign
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

When a Power Automate flow fails, captures the error details, creates a ServiceNow incident, and notifies the citizen developer and IT support via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Microsoft Power Automate Flow Failure Handler"
  description: "When a Power Automate flow fails, captures the error details, creates a ServiceNow incident, and notifies the citizen developer and IT support via Microsoft Teams."
  tags:
    - automation
    - microsoft-power-automate
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: flow-ops
      port: 8080
      tools:
        - name: handle-flow-failure
          description: "Given a Power Automate flow run ID and environment, capture failure details, create an incident, and notify. Use when automated business flows fail."
          inputParameters:
            - name: flow_id
              in: body
              type: string
              description: "The Power Automate flow ID."
            - name: run_id
              in: body
              type: string
              description: "The failed flow run ID."
          steps:
            - name: get-run-details
              type: call
              call: "power-automate.get-flow-run"
              with:
                flow_id: "{{flow_id}}"
                run_id: "{{run_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "automation"
                priority: "3"
                short_description: "Power Automate flow failure: {{get-run-details.flow_name}}"
                description: "Error: {{get-run-details.error_message}}"
            - name: notify-support
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_automation_support_channel"
                text: "Power Automate flow {{get-run-details.flow_name}} failed. Error: {{get-run-details.error_message}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: power-automate
      baseUri: "https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flow-runs
          path: "/environments/$secrets.power_automate_env/flows/{{flow_id}}/runs/{{run_id}}"
          inputParameters:
            - name: flow_id
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-flow-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sends a message to a specified Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Sender"
  description: "Sends a message to a specified Microsoft Teams channel."
  tags:
    - collaboration
    - microsoft-teams
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: send-channel-message
          description: "Given a Teams team ID, channel ID, and message text, post a message to the specified channel. Use for automated notifications and alerts."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID."
            - name: message_text
              in: body
              type: string
              description: "The message body to post."
          call: "msteams.send-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message_text}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new hire start date approaches, provisions Okta account, creates a ServiceNow hardware request, sets up GitHub organization membership, and notifies the hiring manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Hire IT Provisioning Workflow"
  description: "When a new hire start date approaches, provisions Okta account, creates a ServiceNow hardware request, sets up GitHub organization membership, and notifies the hiring manager via Microsoft Teams."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - github
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-provisioning
      port: 8080
      tools:
        - name: provision-new-hire
          description: "Given a Workday employee ID, provision all IT resources for the new hire including identity, hardware, and source control access. Use when a new hire record is approaching its start date."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-okta-user
              type: call
              call: "okta.create-user"
              with:
                first_name: "{{get-employee.first_name}}"
                last_name: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
            - name: create-hw-request
              type: call
              call: "servicenow.create-request"
              with:
                category: "hardware"
                short_description: "Laptop for new hire {{get-employee.full_name}}"
            - name: add-github-member
              type: call
              call: "github.add-org-member"
              with:
                org: "bp-digital"
                username: "{{get-employee.github_username}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "IT provisioning complete for {{get-employee.full_name}}. Okta: {{create-okta-user.status}}, Hardware: {{create-hw-request.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://bp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-members
          path: "/orgs/{{org}}/memberships/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: add-org-member
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves application performance metrics from New Relic including response time, throughput, and error rate.

naftiko: "0.5"
info:
  label: "New Relic Application Performance Check"
  description: "Retrieves application performance metrics from New Relic including response time, throughput, and error rate."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: apm
      port: 8080
      tools:
        - name: get-app-performance
          description: "Given a New Relic application ID, retrieve current response time, throughput, and error rate metrics. Use for performance reviews and capacity planning."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic.get-application"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: response_time
              type: string
              mapping: "$.application.application_summary.response_time"
            - name: throughput
              type: string
              mapping: "$.application.application_summary.throughput"
            - name: error_rate
              type: string
              mapping: "$.application.application_summary.error_rate"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-application
              method: GET

When an offshore platform sensor threshold is breached, logs the alert in Snowflake, creates a ServiceNow incident, and notifies the offshore operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Offshore Platform Sensor Alert Handler"
  description: "When an offshore platform sensor threshold is breached, logs the alert in Snowflake, creates a ServiceNow incident, and notifies the offshore operations team via Microsoft Teams."
  tags:
    - operations
    - energy
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: offshore-ops
      port: 8080
      tools:
        - name: handle-sensor-alert
          description: "Given a platform ID, sensor type, and reading value, log the alert, create an incident, and notify operations. Use when offshore IoT sensors breach defined thresholds."
          inputParameters:
            - name: platform_id
              in: body
              type: string
              description: "The offshore platform identifier."
            - name: sensor_type
              in: body
              type: string
              description: "Type of sensor, e.g. 'pressure', 'temperature', 'gas_detection'."
            - name: reading_value
              in: body
              type: string
              description: "The sensor reading value that triggered the alert."
          steps:
            - name: log-alert
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO OPERATIONS.SENSOR_ALERTS VALUES ('{{platform_id}}', '{{sensor_type}}', '{{reading_value}}', CURRENT_TIMESTAMP)"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "offshore_operations"
                priority: "2"
                short_description: "Sensor alert on {{platform_id}}: {{sensor_type}} reading {{reading_value}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_offshore_ops_channel"
                text: "SENSOR ALERT on {{platform_id}}: {{sensor_type}} = {{reading_value}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches all users assigned to a critical OT or financial system application in Okta and creates a ServiceNow review task for the security compliance team.

naftiko: "0.5"
info:
  label: "Okta User Access Review for Critical Systems"
  description: "Fetches all users assigned to a critical OT or financial system application in Okta and creates a ServiceNow review task for the security compliance team."
  tags:
    - identity
    - security
    - okta
    - servicenow
    - compliance
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-compliance
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Okta application ID and ServiceNow assignment group, list all application users, count active accounts, and create a ServiceNow access review task. Use for quarterly reviews of critical infrastructure system access."
          inputParameters:
            - name: okta_app_id
              in: body
              type: string
              description: "The Okta application ID for the critical system."
            - name: assignment_group
              in: body
              type: string
              description: "The ServiceNow group to assign the review task to."
          steps:
            - name: list-app-users
              type: call
              call: "okta.list-app-users"
              with:
                app_id: "{{okta_app_id}}"
            - name: create-review-task
              type: call
              call: "servicenow.create-incident"
              with:
                category: "access_review"
                short_description: "Access review: {{okta_app_id}} — {{list-app-users.count}} users"
                assigned_group: "{{assignment_group}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: list-app-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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

Looks up an Okta user by login email, returning profile status, last login time, and assigned groups count.

naftiko: "0.5"
info:
  label: "Okta User Lookup"
  description: "Looks up an Okta user by login email, returning profile status, last login time, and assigned groups count."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Given an Okta user login email, retrieve the user profile including status, last login, and MFA enrollment state. Use for access reviews and identity verification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login email, e.g. 'john.doe@bp.com'."
          call: "okta.get-user"
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://bp.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_login}}"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user
              method: GET

When a headcount request is approved in Workday, creates a job requisition and publishes the opening to LinkedIn to attract energy sector talent.

naftiko: "0.5"
info:
  label: "Open Role Job Posting Publisher"
  description: "When a headcount request is approved in Workday, creates a job requisition and publishes the opening to LinkedIn to attract energy sector talent."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: publish-job-posting
          description: "Given a Workday department ID, role title, location, and hiring manager ID, create a job requisition in Workday and publish a LinkedIn job posting. Use when headcount approval is granted."
          inputParameters:
            - name: role_title
              in: body
              type: string
              description: "The job title for the position, e.g. 'Petroleum Engineer', 'Data Scientist — Energy Transition'."
            - name: department_id
              in: body
              type: string
              description: "The Workday department ID for the open role."
            - name: hiring_manager_id
              in: body
              type: string
              description: "The Workday worker ID of the hiring manager."
          steps:
            - name: get-manager
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{hiring_manager_id}}"
            - name: create-req
              type: call
              call: "workday-rec.create-job-req"
              with:
                title: "{{role_title}}"
                department_id: "{{department_id}}"
                manager_id: "{{hiring_manager_id}}"
            - name: post-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{role_title}}"
                company_id: "$secrets.bp_linkedin_company_id"
                req_id: "{{create-req.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: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: workday-rec
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/bp/recruiting/jobRequisitions"
          operations:
            - name: create-job-req
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

When a safety incident is detected on a drilling platform or refinery via sensor data, creates a ServiceNow high-priority incident, pages the HSE team via PagerDuty, and posts an emergency alert to the operations Teams channel.

naftiko: "0.5"
info:
  label: "Operational Technology Safety Incident Reporter"
  description: "When a safety incident is detected on a drilling platform or refinery via sensor data, creates a ServiceNow high-priority incident, pages the HSE team via PagerDuty, and posts an emergency alert to the operations Teams channel."
  tags:
    - operations
    - safety
    - hse
    - servicenow
    - pagerduty
    - microsoft-teams
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: hse-ops
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Given a facility ID, incident type, and severity, create a P1 ServiceNow safety incident, trigger PagerDuty alert for the HSE on-call team, and post an emergency notification to the operations Teams channel. Use immediately when a safety event is detected."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The BP facility or platform identifier, e.g. 'NA-THUNDER-HORSE' or 'REF-ROTTERDAM'."
            - name: incident_type
              in: body
              type: string
              description: "Incident category, e.g. 'Hydrocarbon Release', 'Fire', 'Personnel Injury', 'Equipment Failure'."
            - name: severity
              in: body
              type: string
              description: "Severity tier: 'Tier 1' (Major), 'Tier 2' (Significant), 'Tier 3' (Minor)."
          steps:
            - name: create-safety-incident
              type: call
              call: "servicenow.create-incident"
              with:
                priority: "1"
                category: "hse_safety"
                short_description: "{{severity}} {{incident_type}} at {{facility_id}}"
                impact: "1"
            - name: page-hse
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Safety Event: {{incident_type}} at {{facility_id}} — {{severity}}"
                service_id: "$secrets.pagerduty_hse_service_id"
                body: "Facility: {{facility_id}}\nType: {{incident_type}}\nSeverity: {{severity}}\nSNOW: {{create-safety-incident.number}}"
            - name: alert-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.ops_emergency_channel_id"
                text: "SAFETY ALERT — {{severity}} {{incident_type}} at {{facility_id}}. ServiceNow: {{create-safety-incident.number}}. HSE team paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reconciles master data between Oracle E-Business Suite and SAP S/4HANA during the ERP migration, logs findings in Snowflake, and alerts the migration team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Oracle EBS to SAP Migration Reconciler"
  description: "Reconciles master data between Oracle E-Business Suite and SAP S/4HANA during the ERP migration, logs findings in Snowflake, and alerts the migration team via Microsoft Teams."
  tags:
    - erp
    - oracle
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: erp-migration
      port: 8080
      tools:
        - name: reconcile-migration-data
          description: "Given an entity type and batch ID, compare records between Oracle EBS and SAP, log discrepancies, and notify the migration team. Use during ERP cutover validation."
          inputParameters:
            - name: entity_type
              in: body
              type: string
              description: "The entity type to reconcile, e.g. 'vendor', 'customer', 'material'."
            - name: batch_id
              in: body
              type: string
              description: "The migration batch ID."
          steps:
            - name: get-oracle-count
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as count FROM MIGRATION.ORACLE_{{entity_type}} WHERE batch_id = '{{batch_id}}'"
            - name: get-sap-count
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as count FROM MIGRATION.SAP_{{entity_type}} WHERE batch_id = '{{batch_id}}'"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_migration_channel"
                text: "Migration reconciliation for {{entity_type}} batch {{batch_id}}: Oracle count={{get-oracle-count.count}}, SAP count={{get-sap-count.count}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Palo Alto Networks firewall detects a critical threat, logs the event in Splunk, creates a ServiceNow security incident, and alerts the SOC team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Palo Alto Security Incident Response"
  description: "When a Palo Alto Networks firewall detects a critical threat, logs the event in Splunk, creates a ServiceNow security incident, and alerts the SOC team via Microsoft Teams."
  tags:
    - security
    - palo-alto-networks
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-firewall-threat
          description: "Given a Palo Alto threat ID and severity, log to Splunk, create a security incident, and alert SOC. Use when critical firewall threats are detected."
          inputParameters:
            - name: threat_id
              in: body
              type: string
              description: "The Palo Alto Networks threat ID."
            - name: severity
              in: body
              type: string
              description: "Threat severity: critical, high, medium, low."
            - name: source_ip
              in: body
              type: string
              description: "The source IP address of the threat."
          steps:
            - name: log-to-splunk
              type: call
              call: "splunk.index-event"
              with:
                index: "security"
                event: "Palo Alto threat {{threat_id}} from {{source_ip}}, severity: {{severity}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "security"
                priority: "1"
                short_description: "Firewall threat {{threat_id}} ({{severity}}) from {{source_ip}}"
            - name: alert-soc
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_soc_channel"
                text: "SECURITY ALERT: Palo Alto threat {{threat_id}} ({{severity}}) from {{source_ip}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://bp-splunk.example.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/receivers/simple"
          operations:
            - name: index-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries SAP for pipelines due for integrity inspection, creates ServiceNow work orders, and notifies the pipeline operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pipeline Integrity Inspection Scheduler"
  description: "Queries SAP for pipelines due for integrity inspection, creates ServiceNow work orders, and notifies the pipeline operations team via Microsoft Teams."
  tags:
    - operations
    - energy
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pipeline-ops
      port: 8080
      tools:
        - name: schedule-inspections
          description: "Given an inspection type and region, find pipelines due for inspection, create work orders, and notify the team. Use for proactive pipeline integrity management."
          inputParameters:
            - name: inspection_type
              in: body
              type: string
              description: "Type of inspection, e.g. 'inline', 'external', 'cathodic_protection'."
            - name: region
              in: body
              type: string
              description: "Operating region, e.g. 'Gulf_of_Mexico', 'North_Sea'."
          steps:
            - name: get-due-pipelines
              type: call
              call: "sap.get-equipment-list"
              with:
                equipment_type: "pipeline"
                inspection_type: "{{inspection_type}}"
                region: "{{region}}"
            - name: create-work-orders
              type: call
              call: "servicenow.create-request"
              with:
                category: "pipeline_inspection"
                short_description: "{{inspection_type}} inspection for {{get-due-pipelines.count}} pipelines in {{region}}"
                assigned_group: "Pipeline_Integrity"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_pipeline_ops_channel"
                text: "{{get-due-pipelines.count}} pipelines in {{region}} due for {{inspection_type}} inspection. Work order: {{create-work-orders.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/Equipment"
          operations:
            - name: get-equipment-list
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes Pluralsight skill assessment results against role requirements in Workday, creates learning plan recommendations in Jira, and notifies managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight Skill Gap Analyzer"
  description: "Analyzes Pluralsight skill assessment results against role requirements in Workday, creates learning plan recommendations in Jira, and notifies managers via Microsoft Teams."
  tags:
    - learning
    - pluralsight
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: skill-development
      port: 8080
      tools:
        - name: analyze-skill-gaps
          description: "Given a team or department, compare Pluralsight skill levels against Workday role requirements, create learning recommendations, and notify managers. Use for quarterly skill development planning."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department or team to analyze."
          steps:
            - name: get-skill-assessments
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM LEARNING.PLURALSIGHT_SKILLS WHERE department = '{{department}}'"
            - name: get-role-requirements
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM HR.ROLE_SKILL_REQUIREMENTS WHERE department = '{{department}}'"
            - name: create-learning-plan
              type: call
              call: "jira.create-issue"
              with:
                project: "LEARN"
                issue_type: "Task"
                summary: "Skill gap analysis: {{department}} - {{get-skill-assessments.gap_count}} gaps identified"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_learning_channel"
                text: "Skill gap analysis for {{department}}: {{get-skill-assessments.gap_count}} gaps identified across {{get-skill-assessments.employee_count}} employees. Learning plan: {{create-learning-plan.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the last refresh status and timestamp for a Power BI dataset.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status and timestamp for a Power BI dataset."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Given a Power BI workspace and dataset ID, retrieve the last refresh status, start time, and end time. Use for monitoring report freshness and troubleshooting stale dashboards."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh-history"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Triggers a Power BI dataset refresh for the energy production KPI dashboard and notifies operations leadership via Teams when the refresh completes.

naftiko: "0.5"
info:
  label: "Power BI Energy Production Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the energy production KPI dashboard and notifies operations leadership via Teams when the refresh completes."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - operations
capability:
  exposes:
    - type: mcp
      namespace: ops-reporting
      port: 8080
      tools:
        - name: refresh-production-dashboard
          description: "Given a Power BI workspace and dataset ID for the production KPI dashboard, trigger a dataset refresh and notify the operations leadership Teams channel when complete. Use before daily operations briefings."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.ops_leadership_channel_id"
                text: "Energy production KPI dashboard dataset {{dataset_id}} has been refreshed and is ready for the daily briefing."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Traces data lineage through Qlik applications back to Snowflake source tables, logs the lineage map, and notifies the data governance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Qlik Data Lineage Tracker"
  description: "Traces data lineage through Qlik applications back to Snowflake source tables, logs the lineage map, and notifies the data governance team via Microsoft Teams."
  tags:
    - data-governance
    - qlik
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: trace-data-lineage
          description: "Given a Qlik app ID and a field name, trace the data lineage back to source tables and log the mapping. Use for data governance and audit compliance."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik application ID."
            - name: field_name
              in: body
              type: string
              description: "The field name to trace."
          steps:
            - name: get-lineage
              type: call
              call: "qlik.get-app-lineage"
              with:
                app_id: "{{app_id}}"
                field: "{{field_name}}"
            - name: log-lineage
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO GOVERNANCE.DATA_LINEAGE VALUES ('{{app_id}}', '{{field_name}}', '{{get-lineage.source_table}}', CURRENT_TIMESTAMP)"
            - name: notify-governance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_governance_channel"
                text: "Data lineage for {{field_name}} in Qlik app {{app_id}}: Source table {{get-lineage.source_table}}, {{get-lineage.transformation_count}} transformations."
  consumes:
    - type: http
      namespace: qlik
      baseUri: "https://bp-qlik.example.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: apps
          path: "/apps/{{app_id}}/lineage"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-lineage
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Red Hat Satellite for servers with outstanding security patches, logs compliance status in Snowflake, and alerts the Linux team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Red Hat Satellite Patch Compliance Reporter"
  description: "Queries Red Hat Satellite for servers with outstanding security patches, logs compliance status in Snowflake, and alerts the Linux team via Microsoft Teams."
  tags:
    - infrastructure
    - red-hat
    - snowflake
    - microsoft-teams
    - patch-management
capability:
  exposes:
    - type: mcp
      namespace: patch-compliance
      port: 8080
      tools:
        - name: report-patch-compliance
          description: "Given a server group and severity filter, check patch compliance via Red Hat Satellite, log results, and alert the team. Use for weekly security patch compliance reporting."
          inputParameters:
            - name: host_group
              in: body
              type: string
              description: "The Red Hat Satellite host group name."
            - name: severity
              in: body
              type: string
              description: "Minimum severity to report: Critical, Important, Moderate."
          steps:
            - name: get-compliance
              type: call
              call: "satellite.get-errata-compliance"
              with:
                host_group: "{{host_group}}"
                severity: "{{severity}}"
            - name: log-report
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO INFRA.PATCH_COMPLIANCE VALUES ('{{host_group}}', '{{severity}}', {{get-compliance.non_compliant_count}}, {{get-compliance.total_hosts}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_linux_channel"
                text: "Patch compliance for {{host_group}} ({{severity}}+): {{get-compliance.non_compliant_count}}/{{get-compliance.total_hosts}} servers non-compliant."
  consumes:
    - type: http
      namespace: satellite
      baseUri: "https://bp-satellite.example.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.satellite_user"
        password: "$secrets.satellite_password"
      resources:
        - name: errata
          path: "/hostgroups/{{host_group}}/errata"
          inputParameters:
            - name: host_group
              in: path
          operations:
            - name: get-errata-compliance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a refinery downtime event is reported, creates a ServiceNow P1 incident, pages the on-call engineer via Microsoft Teams, and opens a Jira tracking issue for root cause analysis.

naftiko: "0.5"
info:
  label: "Refinery Downtime Incident Chain"
  description: "When a refinery downtime event is reported, creates a ServiceNow P1 incident, pages the on-call engineer via Microsoft Teams, and opens a Jira tracking issue for root cause analysis."
  tags:
    - operations
    - servicenow
    - jira
    - microsoft-teams
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: refinery-ops
      port: 8080
      tools:
        - name: handle-refinery-downtime
          description: "Given a refinery site code and downtime description, create a ServiceNow P1 incident, page the on-call engineer, and open a Jira RCA ticket. Use when a refinery unit goes offline unexpectedly."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "BP refinery site code, e.g. 'WHI' for Whiting."
            - name: downtime_description
              in: body
              type: string
              description: "Description of the downtime event."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "refinery_ops"
                priority: "1"
                short_description: "Refinery downtime at {{site_code}}: {{downtime_description}}"
            - name: page-oncall
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_refinery_oncall_channel"
                text: "P1 REFINERY DOWNTIME at {{site_code}}: {{downtime_description}}. Incident: {{create-incident.number}}."
            - name: create-rca-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "REFOPS"
                issue_type: "Task"
                summary: "RCA: {{site_code}} downtime - {{downtime_description}}"
                description: "Root cause analysis for ServiceNow incident {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Pulls wind and solar generation forecasts, stores them in Snowflake, updates the trading desk Power BI dashboard, and notifies the renewables operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Renewable Energy Generation Forecast Sync"
  description: "Pulls wind and solar generation forecasts, stores them in Snowflake, updates the trading desk Power BI dashboard, and notifies the renewables operations team via Microsoft Teams."
  tags:
    - energy
    - renewables
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: renewables-ops
      port: 8080
      tools:
        - name: sync-generation-forecast
          description: "Given a forecast date and asset portfolio, pull generation forecasts, store in Snowflake, and refresh dashboards. Use for daily renewables trading preparation."
          inputParameters:
            - name: forecast_date
              in: body
              type: string
              description: "The forecast date in YYYY-MM-DD format."
            - name: portfolio
              in: body
              type: string
              description: "The renewables asset portfolio, e.g. 'WIND_US' or 'SOLAR_UK'."
          steps:
            - name: store-forecast
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL RENEWABLES.LOAD_GENERATION_FORECAST('{{forecast_date}}', '{{portfolio}}')"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_renewables_dataset_id"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_renewables_channel"
                text: "Generation forecast loaded for {{portfolio}} on {{forecast_date}}. Dashboard refresh status: {{refresh-dashboard.status}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a safety near-miss is reported, logs the event in ServiceNow, creates a Jira investigation ticket, updates SAP EHS module, and notifies HSE leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Safety Near-Miss Report Escalation"
  description: "When a safety near-miss is reported, logs the event in ServiceNow, creates a Jira investigation ticket, updates SAP EHS module, and notifies HSE leadership via Microsoft Teams."
  tags:
    - safety
    - servicenow
    - jira
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety-ops
      port: 8080
      tools:
        - name: escalate-near-miss
          description: "Given a near-miss report with location, description, and severity, log it across safety systems and notify HSE leadership. Use for all safety near-miss events."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Site or facility location."
            - name: description
              in: body
              type: string
              description: "Description of the near-miss event."
            - name: severity
              in: body
              type: string
              description: "Severity level: LOW, MEDIUM, HIGH."
          steps:
            - name: log-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "safety"
                priority: "{{severity}}"
                short_description: "Near-miss at {{location}}: {{description}}"
            - name: create-investigation
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                issue_type: "Task"
                summary: "Investigate near-miss at {{location}}"
                description: "{{description}}. ServiceNow: {{log-incident.number}}"
            - name: update-ehs
              type: call
              call: "sap-ehs.create-event"
              with:
                location: "{{location}}"
                event_type: "NEAR_MISS"
                description: "{{description}}"
            - name: notify-hse
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_hse_channel"
                text: "Near-miss reported at {{location}} ({{severity}}): {{description}}. Incident: {{log-incident.number}}, Investigation: {{create-investigation.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sap-ehs
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_EHS_INCIDENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: events
          path: "/EHSIncident"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches key account metrics from Salesforce for a given B2B energy client, and delivers a briefing to the account manager via Teams before client meetings.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Digest for Energy Clients"
  description: "Fetches key account metrics from Salesforce for a given B2B energy client, and delivers a briefing to the account manager via Teams before client meetings."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: crm-reporting
      port: 8080
      tools:
        - name: digest-account-health
          description: "Given a Salesforce account ID and account manager Teams user ID, retrieve account health data including open opportunities and last activity, then post a briefing to the manager's Teams DM. Use before client meetings."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "The Salesforce Account ID (18-character)."
            - name: manager_upn
              in: body
              type: string
              description: "The UPN of the account manager to receive the briefing."
          steps:
            - name: get-account
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: get-opps
              type: call
              call: "salesforce-opps.list-opportunities"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: send-briefing
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Account brief for {{get-account.Name}}: {{get-opps.count}} open opportunities. Last activity: {{get-account.LastActivityDate}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: salesforce-opps
      baseUri: "https://bp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: list-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Converts a qualified Salesforce lead to an opportunity, enriches the account with ZoomInfo data, and notifies the sales rep via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead-to-Opportunity Converter"
  description: "Converts a qualified Salesforce lead to an opportunity, enriches the account with ZoomInfo data, and notifies the sales rep via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - zoominfo
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-mgmt
      port: 8080
      tools:
        - name: convert-lead
          description: "Given a Salesforce lead ID, convert it to an opportunity, enrich the account from ZoomInfo, and notify the assigned rep. Use when leads are qualified by the BDR team."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-account
              type: call
              call: "zoominfo.enrich-company"
              with:
                company_name: "{{get-lead.company}}"
                domain: "{{get-lead.website}}"
            - name: convert-to-opportunity
              type: call
              call: "salesforce.convert-lead"
              with:
                lead_id: "{{lead_id}}"
                account_name: "{{get-lead.company}}"
                revenue: "{{enrich-account.revenue}}"
            - name: notify-rep
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-lead.owner_email}}"
                text: "Lead {{get-lead.company}} converted to opportunity {{convert-to-opportunity.opportunity_id}}. ZoomInfo revenue: {{enrich-account.revenue}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bp.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: convert-lead
              method: POST
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/enrich/company"
          operations:
            - name: enrich-company
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name."
  tags:
    - sales
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: get-opportunity
          description: "Given a Salesforce opportunity ID, retrieve the opportunity details including stage, amount, probability, and associated account. Use for pipeline reviews and deal tracking."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID, e.g. '006Dn00000ABC123'."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bp.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

When a new supplier is approved by procurement, creates the supplier profile in SAP Ariba, triggers the supplier qualification workflow, and notifies the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "When a new supplier is approved by procurement, creates the supplier profile in SAP Ariba, triggers the supplier qualification workflow, and notifies the procurement team via Teams."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given a supplier name, DUNS number, and commodity code, create a supplier profile in SAP Ariba, initiate the qualification survey, and notify the BP procurement team in Teams. Use when a new vendor relationship is approved."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "The legal name of the supplier company."
            - name: duns_number
              in: body
              type: string
              description: "The DUNS number for the supplier."
            - name: commodity_code
              in: body
              type: string
              description: "The commodity classification code for the supplier."
          steps:
            - name: create-supplier
              type: call
              call: "ariba.create-supplier"
              with:
                name: "{{supplier_name}}"
                duns: "{{duns_number}}"
                commodity: "{{commodity_code}}"
            - name: trigger-qualification
              type: call
              call: "ariba-qual.trigger-survey"
              with:
                supplier_id: "{{create-supplier.id}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.procurement_channel_id"
                text: "Supplier {{supplier_name}} onboarded in Ariba (ID: {{create-supplier.id}}). Qualification survey triggered."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: ariba-qual
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: qualification-surveys
          path: "/suppliers/{{supplier_id}}/qualificationSurveys"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: trigger-survey
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries SAP S/4HANA for budget and actuals data by cost center for a given fiscal period and posts a variance summary to the finance leadership Teams channel.

naftiko: "0.5"
info:
  label: "SAP Budget vs Actuals Variance Report"
  description: "Queries SAP S/4HANA for budget and actuals data by cost center for a given fiscal period and posts a variance summary to the finance leadership Teams channel."
  tags:
    - finance
    - erp
    - sap
    - reporting
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: publish-budget-variance
          description: "Given a SAP controlling area and fiscal period, retrieve cost center actuals vs. budget and post a variance summary to the finance Teams channel. Use monthly for budget reviews."
          inputParameters:
            - name: controlling_area
              in: body
              type: string
              description: "The SAP controlling area code."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period in YYYYMM format."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-cost-center-actuals"
              with:
                controlling_area: "{{controlling_area}}"
                period: "{{fiscal_period}}"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.finance_leadership_channel_id"
                text: "Budget variance for period {{fiscal_period}}: Actuals {{get-actuals.total_actual}}, Budget {{get-actuals.total_budget}}. Variance: {{get-actuals.variance_pct}}%."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/FCO_PI_CONTROLLING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActualsSet"
          operations:
            - name: get-cost-center-actuals
              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: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors SAP BW data load process chains, logs execution times in Snowflake, and alerts the data warehouse team via Microsoft Teams when loads fail or exceed SLA thresholds.

naftiko: "0.5"
info:
  label: "SAP BW Data Load Monitor"
  description: "Monitors SAP BW data load process chains, logs execution times in Snowflake, and alerts the data warehouse team via Microsoft Teams when loads fail or exceed SLA thresholds."
  tags:
    - data-engineering
    - sap-bw
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bw-monitoring
      port: 8080
      tools:
        - name: monitor-bw-loads
          description: "Given a SAP BW process chain ID, check the load status, log execution metrics, and alert on failures. Use for daily data warehouse load monitoring."
          inputParameters:
            - name: process_chain_id
              in: body
              type: string
              description: "The SAP BW process chain ID."
          steps:
            - name: check-load-status
              type: call
              call: "sap-bw.get-process-chain-status"
              with:
                chain_id: "{{process_chain_id}}"
            - name: log-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO DW.BW_LOAD_METRICS VALUES ('{{process_chain_id}}', '{{check-load-status.status}}', {{check-load-status.duration_seconds}}, CURRENT_TIMESTAMP)"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_dw_channel"
                text: "BW process chain {{process_chain_id}}: Status={{check-load-status.status}}, Duration={{check-load-status.duration_seconds}}s."
  consumes:
    - type: http
      namespace: sap-bw
      baseUri: "https://bp-bw.sap.com/sap/opu/odata/sap/RSPC_API_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: process-chains
          path: "/ProcessChains('{{chain_id}}')"
          inputParameters:
            - name: chain_id
              in: path
          operations:
            - name: get-process-chain-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves cost center details from SAP S/4HANA including responsible person, company code, and validity dates.

naftiko: "0.5"
info:
  label: "SAP Cost Center Lookup"
  description: "Retrieves cost center details from SAP S/4HANA including responsible person, company code, and validity dates."
  tags:
    - finance
    - sap
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-cost-center
          description: "Given a SAP cost center ID and controlling area, retrieve the cost center master data including description, responsible person, and hierarchy. Use for budget allocation and financial reporting."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID, e.g. '0000010200'."
          call: "sap.get-cost-center"
          with:
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.CostCenterDescription"
            - name: responsible_person
              type: string
              mapping: "$.d.PersonResponsible"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center
              method: GET

Retrieves the general ledger account balance from SAP for a given company code and fiscal period.

naftiko: "0.5"
info:
  label: "SAP General Ledger Balance Lookup"
  description: "Retrieves the general ledger account balance from SAP for a given company code and fiscal period."
  tags:
    - finance
    - sap
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: accounting
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Given a SAP company code, GL account number, and fiscal year, retrieve the account balance. Use for financial close procedures and variance analysis."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code, e.g. '1000'."
            - name: gl_account
              in: body
              type: string
              description: "The GL account number, e.g. '0000100000'."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year, e.g. '2026'."
          call: "sap.get-gl-balance"
          with:
            company_code: "{{company_code}}"
            gl_account: "{{gl_account}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: balance
              type: string
              mapping: "$.d.EndingBalanceAmtInCoCodeCrcy"
            - name: currency
              type: string
              mapping: "$.d.CompanyCodeCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountLineItem?$filter=CompanyCode eq '{{company_code}}' and GLAccount eq '{{gl_account}}'"
          inputParameters:
            - name: company_code
              in: query
            - name: gl_account
              in: query
          operations:
            - name: get-gl-balance
              method: GET

When a goods receipt is posted in SAP, validates the PO match, triggers payment scheduling, and notifies the AP manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Payment Automation"
  description: "When a goods receipt is posted in SAP, validates the PO match, triggers payment scheduling, and notifies the AP manager via Microsoft Teams."
  tags:
    - finance
    - sap
    - microsoft-teams
    - procure-to-pay
capability:
  exposes:
    - type: mcp
      namespace: procure-to-pay
      port: 8080
      tools:
        - name: process-goods-receipt-payment
          description: "Given a SAP goods receipt number, validate against the PO, schedule payment, and notify AP. Use for automating the procure-to-pay cycle."
          inputParameters:
            - name: gr_number
              in: body
              type: string
              description: "The SAP goods receipt document number."
          steps:
            - name: get-gr-details
              type: call
              call: "sap.get-goods-receipt"
              with:
                gr_number: "{{gr_number}}"
            - name: get-po-details
              type: call
              call: "sap.get-purchase-order"
              with:
                po_number: "{{get-gr-details.po_number}}"
            - name: schedule-payment
              type: call
              call: "sap.create-payment-proposal"
              with:
                vendor: "{{get-po-details.vendor}}"
                amount: "{{get-gr-details.amount}}"
                due_date: "{{get-po-details.payment_due_date}}"
            - name: notify-ap
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_ap_channel"
                text: "GR {{gr_number}} matched to PO {{get-gr-details.po_number}}. Payment of {{get-gr-details.amount}} scheduled for {{get-po-details.payment_due_date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-receipts
          path: "/A_GoodsReceipt('{{gr_number}}')"
          inputParameters:
            - name: gr_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
        - name: payment-proposals
          path: "/A_PaymentProposal"
          operations:
            - name: create-payment-proposal
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors SAP HANA database disk usage, logs growth trends in Snowflake, and alerts the DBA team via Microsoft Teams when thresholds are approached.

naftiko: "0.5"
info:
  label: "SAP HANA Data Volume Monitor"
  description: "Monitors SAP HANA database disk usage, logs growth trends in Snowflake, and alerts the DBA team via Microsoft Teams when thresholds are approached."
  tags:
    - database
    - sap-hana
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: db-ops
      port: 8080
      tools:
        - name: monitor-hana-volume
          description: "Given a HANA system ID, check disk utilization, log the trend, and alert if approaching capacity. Use for proactive database capacity management."
          inputParameters:
            - name: system_id
              in: body
              type: string
              description: "The SAP HANA system ID."
          steps:
            - name: get-disk-usage
              type: call
              call: "sap-hana.get-disk-usage"
              with:
                sid: "{{system_id}}"
            - name: log-trend
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO DBA.HANA_DISK_USAGE VALUES ('{{system_id}}', {{get-disk-usage.used_gb}}, {{get-disk-usage.total_gb}}, CURRENT_TIMESTAMP)"
            - name: alert-dba
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_dba_channel"
                text: "HANA {{system_id}} disk usage: {{get-disk-usage.used_gb}}GB / {{get-disk-usage.total_gb}}GB ({{get-disk-usage.pct_used}}%)."
  consumes:
    - type: http
      namespace: sap-hana
      baseUri: "https://bp-hana.example.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.hana_user"
        password: "$secrets.hana_password"
      resources:
        - name: disk-usage
          path: "/monitoring/disk/{{sid}}"
          inputParameters:
            - name: sid
              in: path
          operations:
            - name: get-disk-usage
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Posts intercompany journal entries in SAP S/4HANA, validates balancing entries, and notifies the accounting team via Microsoft Teams with confirmation details.

naftiko: "0.5"
info:
  label: "SAP Intercompany Journal Entry Poster"
  description: "Posts intercompany journal entries in SAP S/4HANA, validates balancing entries, and notifies the accounting team via Microsoft Teams with confirmation details."
  tags:
    - finance
    - sap
    - microsoft-teams
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: intercompany-accounting
      port: 8080
      tools:
        - name: post-intercompany-entry
          description: "Given sending and receiving company codes with amounts, post intercompany journal entries in SAP and notify accounting. Use for monthly intercompany settlement processing."
          inputParameters:
            - name: sending_company
              in: body
              type: string
              description: "The sending SAP company code."
            - name: receiving_company
              in: body
              type: string
              description: "The receiving SAP company code."
            - name: amount
              in: body
              type: string
              description: "The journal entry amount."
          steps:
            - name: post-sending-entry
              type: call
              call: "sap.create-journal-entry"
              with:
                company_code: "{{sending_company}}"
                amount: "{{amount}}"
                entry_type: "intercompany_debit"
            - name: post-receiving-entry
              type: call
              call: "sap.create-journal-entry"
              with:
                company_code: "{{receiving_company}}"
                amount: "{{amount}}"
                entry_type: "intercompany_credit"
            - name: notify-accounting
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_accounting_channel"
                text: "Intercompany entry posted: {{sending_company}} -> {{receiving_company}}, amount {{amount}}. Debit doc: {{post-sending-entry.document_number}}, Credit doc: {{post-receiving-entry.document_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-entries
          path: "/A_JournalEntryItemBasic"
          operations:
            - name: create-journal-entry
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates a vendor invoice against the SAP purchase order and goods receipt, flags discrepancies in ServiceNow, and notifies the AP team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Validator"
  description: "Validates a vendor invoice against the SAP purchase order and goods receipt, flags discrepancies in ServiceNow, and notifies the AP team via Microsoft Teams."
  tags:
    - finance
    - sap
    - servicenow
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-automation
      port: 8080
      tools:
        - name: validate-invoice-match
          description: "Given an invoice number and PO number, perform three-way matching between invoice, PO, and goods receipt. Flag mismatches and notify AP. Use for invoice processing automation."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number."
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          steps:
            - name: get-po
              type: call
              call: "sap.get-purchase-order"
              with:
                po_number: "{{po_number}}"
            - name: get-gr
              type: call
              call: "sap.get-goods-receipt"
              with:
                po_number: "{{po_number}}"
            - name: flag-mismatch
              type: call
              call: "servicenow.create-incident"
              with:
                category: "accounts_payable"
                short_description: "Three-way match issue: Invoice {{invoice_number}} vs PO {{po_number}}"
                description: "PO amount: {{get-po.total_amount}}, GR quantity: {{get-gr.quantity}}"
            - name: notify-ap
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_ap_channel"
                text: "Invoice {{invoice_number}} three-way match flagged for PO {{po_number}}. ServiceNow ticket: {{flag-mismatch.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
        - name: goods-receipts
          path: "/A_PurchaseOrder('{{po_number}}')/to_GoodsReceipt"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves real-time stock levels for a given material number from SAP S/4HANA, returning plant, storage location, and unrestricted quantity.

naftiko: "0.5"
info:
  label: "SAP Material Stock Level Check"
  description: "Retrieves real-time stock levels for a given material number from SAP S/4HANA, returning plant, storage location, and unrestricted quantity."
  tags:
    - supply-chain
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-material-stock
          description: "Given a SAP material number, retrieve current stock levels across plants and storage locations. Use for inventory checks and replenishment decisions."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number, e.g. '000000001234'."
          call: "sap.get-material-stock"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: plant
              type: string
              mapping: "$.d.Plant"
            - name: unrestricted_qty
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-stock
              method: GET

Retrieves a plant maintenance order from SAP by order number, returning equipment, work center, and status.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Lookup"
  description: "Retrieves a plant maintenance order from SAP by order number, returning equipment, work center, and status."
  tags:
    - operations
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: get-maintenance-order
          description: "Given a SAP maintenance order number, retrieve the order header including equipment, functional location, work center, and system status. Use for maintenance scheduling and operational planning."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP maintenance order number, e.g. '000004001234'."
          call: "sap.get-maintenance-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
            - name: system_status
              type: string
              mapping: "$.d.MaintenanceOrderSystemStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-maintenance-order
              method: GET

Looks up a SAP S/4HANA purchase order by number, returning header status, vendor, total value, and open line item count.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by number, returning header status, vendor, total value, and open line item count."
  tags:
    - finance
    - erp
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header including approval status, vendor, total amount, and currency. Use for procurement validation and AP invoice matching."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. '4500098765'."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Validates a SAP transport request against the ServiceNow change record, promotes it to production, and notifies the basis team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Transport Request Promotion Workflow"
  description: "Validates a SAP transport request against the ServiceNow change record, promotes it to production, and notifies the basis team via Microsoft Teams."
  tags:
    - erp
    - sap
    - servicenow
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: sap-transport
      port: 8080
      tools:
        - name: promote-transport
          description: "Given a SAP transport number and ServiceNow change number, validate approval, promote the transport, and notify the team. Use for controlled SAP change promotion."
          inputParameters:
            - name: transport_number
              in: body
              type: string
              description: "The SAP transport request number."
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: validate-change
              type: call
              call: "servicenow.get-change-request"
              with:
                change_number: "{{change_number}}"
            - name: promote-transport
              type: call
              call: "sap.release-transport"
              with:
                transport_number: "{{transport_number}}"
            - name: notify-basis
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_basis_channel"
                text: "SAP transport {{transport_number}} promoted. CR {{change_number}} status: {{validate-change.state}}. Transport status: {{promote-transport.status}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request?sysparm_query=number={{change_number}}"
          inputParameters:
            - name: change_number
              in: query
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_TRANSPORT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transports
          path: "/Transport('{{transport_number}}')/release"
          inputParameters:
            - name: transport_number
              in: path
          operations:
            - name: release-transport
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves vendor master data from SAP S/4HANA by vendor number, returning name, payment terms, and company code.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number, returning name, payment terms, and company code."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, retrieve the vendor master record including name, address, payment terms, and company code data. Use for supplier verification and AP processing."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number, e.g. '0000100234'."
          call: "sap.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves the current status, priority, and assignment group for a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status, priority, and assignment group for a ServiceNow incident by number."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, retrieve its current state, priority, assigned group, and short description. Use for status checks and SLA tracking."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. 'INC0012345'."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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

When a high-priority ServiceNow incident is raised for a critical energy infrastructure system, retrieves on-call information from PagerDuty, assigns the ticket, and posts to the operations Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Triage and On-Call Routing"
  description: "When a high-priority ServiceNow incident is raised for a critical energy infrastructure system, retrieves on-call information from PagerDuty, assigns the ticket, and posts to the operations Teams channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: triage-incident
          description: "Given a ServiceNow incident number and priority, fetch incident details, identify the on-call engineer from PagerDuty, assign the ticket, and post an alert to the IT operations Teams channel. Use for P1/P2 infrastructure incidents."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. 'INC0011111'."
            - name: priority
              in: body
              type: string
              description: "Incident priority: 1 (Critical), 2 (High)."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: get-oncall
              type: call
              call: "pagerduty.get-oncall-user"
              with:
                schedule_id: "$secrets.pagerduty_it_schedule_id"
            - name: assign-incident
              type: call
              call: "servicenow-assign.update-incident"
              with:
                sys_id: "{{get-incident.sys_id}}"
                assigned_to: "{{get-oncall.user_email}}"
            - name: notify-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.it_ops_channel_id"
                text: "P{{priority}} {{incident_number}}: {{get-incident.short_description}} — assigned to {{get-oncall.user_name}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall-user
              method: GET
    - type: http
      namespace: servicenow-assign
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident-update
          path: "/table/incident/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Scans SharePoint document libraries for files missing required metadata tags, logs non-compliant items in Snowflake, and notifies document owners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SharePoint Document Compliance Reviewer"
  description: "Scans SharePoint document libraries for files missing required metadata tags, logs non-compliant items in Snowflake, and notifies document owners via Microsoft Teams."
  tags:
    - compliance
    - sharepoint
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: doc-compliance
      port: 8080
      tools:
        - name: review-document-compliance
          description: "Given a SharePoint site and library name, scan for documents missing required metadata, log findings, and notify owners. Use for quarterly document governance audits."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: library_name
              in: body
              type: string
              description: "The document library name."
          steps:
            - name: scan-library
              type: call
              call: "sharepoint.list-documents"
              with:
                site_id: "{{site_id}}"
                library: "{{library_name}}"
            - name: log-findings
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO COMPLIANCE.DOC_AUDIT VALUES ('{{site_id}}', '{{library_name}}', {{scan-library.non_compliant_count}}, CURRENT_TIMESTAMP)"
            - name: notify-owners
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_compliance_channel"
                text: "SharePoint compliance scan for {{library_name}}: {{scan-library.non_compliant_count}} documents missing required metadata out of {{scan-library.total_count}} total."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drives"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: list-documents
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Snowflake for stale or failed data pipeline runs across trading, production, and refinery data domains, and opens Jira tasks for SLA breaches.

naftiko: "0.5"
info:
  label: "Snowflake Production Data Pipeline Health Check"
  description: "Monitors Snowflake for stale or failed data pipeline runs across trading, production, and refinery data domains, and opens Jira tasks for SLA breaches."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - monitoring
    - data-quality
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Given a Snowflake task name and SLA threshold in minutes, check if the pipeline completed within SLA and create a Jira task if breached. Use for monitoring oil production, trading, and refinery data pipelines."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "The Snowflake task or pipeline name, e.g. 'CRUDE_PRODUCTION_DAILY_LOAD'."
            - name: sla_minutes
              in: body
              type: integer
              description: "Maximum allowed minutes since last successful run."
          steps:
            - name: check-run
              type: call
              call: "snowflake.query-task-history"
              with:
                task_name: "{{pipeline_name}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Task"
                summary: "Pipeline SLA breach: {{pipeline_name}} exceeded {{sla_minutes}} minutes"
                description: "Pipeline: {{pipeline_name}}\nLast successful run: {{check-run.last_success_time}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/bp/schemas/monitoring/tasks/{{task_name}}/history"
          inputParameters:
            - name: task_name
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Executes a read-only SQL query against the BP Snowflake data warehouse and returns the result set.

naftiko: "0.5"
info:
  label: "Snowflake Query Executor"
  description: "Executes a read-only SQL query against the BP Snowflake data warehouse and returns the result set."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: execute-query
          description: "Given a SQL statement, execute it against the BP Snowflake warehouse and return the result set. Use for ad-hoc analytics, data validation, and reporting queries."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The read-only SQL query to execute."
          call: "snowflake.execute-statement"
          with:
            statement: "{{sql_statement}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.data.rowCount"
            - name: rows
              type: array
              mapping: "$.data.rows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Executes data quality validation rules on trading and commodity price data in Snowflake and creates Jira tasks for any validation failures found.

naftiko: "0.5"
info:
  label: "Snowflake Trading Data Quality Monitor"
  description: "Executes data quality validation rules on trading and commodity price data in Snowflake and creates Jira tasks for any validation failures found."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - data-quality
    - trading
capability:
  exposes:
    - type: mcp
      namespace: trading-data-ops
      port: 8080
      tools:
        - name: validate-trading-data
          description: "Given a Snowflake trading data schema and business date, execute data quality checks for completeness and consistency of commodity price feeds, and create Jira tasks for any failures. Use daily before trading operations open."
          inputParameters:
            - name: trading_schema
              in: body
              type: string
              description: "The Snowflake schema containing trading data, e.g. 'TRADING.CRUDE_PRICES'."
            - name: business_date
              in: body
              type: string
              description: "The trading business date to validate in ISO 8601 format."
          steps:
            - name: run-validation
              type: call
              call: "snowflake.execute-validation"
              with:
                schema: "{{trading_schema}}"
                date: "{{business_date}}"
            - name: create-dq-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Trading data quality failure: {{trading_schema}} for {{business_date}}"
                description: "Schema: {{trading_schema}}\nDate: {{business_date}}\nFailed checks: {{run-validation.failed_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: execute-validation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When SolarWinds detects a network device outage, creates a ServiceNow P1 incident, logs the event in Splunk, and notifies the network operations center via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SolarWinds Network Outage Responder"
  description: "When SolarWinds detects a network device outage, creates a ServiceNow P1 incident, logs the event in Splunk, and notifies the network operations center via Microsoft Teams."
  tags:
    - networking
    - solarwinds
    - servicenow
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: handle-network-outage
          description: "Given a SolarWinds node ID and alert description, create an incident, log the event, and notify NOC. Use when network devices go offline."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "The SolarWinds node ID."
            - name: alert_description
              in: body
              type: string
              description: "Description of the network alert."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "network"
                priority: "1"
                short_description: "Network outage: node {{node_id}} - {{alert_description}}"
            - name: log-event
              type: call
              call: "splunk.index-event"
              with:
                index: "network"
                event: "SolarWinds outage: node {{node_id}}, {{alert_description}}"
            - name: notify-noc
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_noc_channel"
                text: "NETWORK OUTAGE: Node {{node_id}} - {{alert_description}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bp.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: splunk
      baseUri: "https://bp-splunk.example.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/receivers/simple"
          operations:
            - name: index-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Executes a Splunk search query and returns the matching log events for a given time range.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Executes a Splunk search query and returns the matching log events for a given time range."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: search-logs
          description: "Given a Splunk search query and time range, execute the search and return matching events. Use for security investigations, troubleshooting, and audit log review."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk SPL search query."
            - name: earliest_time
              in: body
              type: string
              description: "Search start time, e.g. '-24h'."
          call: "splunk.create-search"
          with:
            search: "{{search_query}}"
            earliest_time: "{{earliest_time}}"
          outputParameters:
            - name: result_count
              type: integer
              mapping: "$.entry.content.resultCount"
            - name: sid
              type: string
              mapping: "$.entry.content.sid"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://bp-splunk.example.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Triggers a Tableau extract refresh, validates data freshness in Snowflake, and sends the dashboard link to executives via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tableau Executive Dashboard Auto-Refresh"
  description: "Triggers a Tableau extract refresh, validates data freshness in Snowflake, and sends the dashboard link to executives via Microsoft Teams."
  tags:
    - analytics
    - tableau
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: refresh-executive-dashboard
          description: "Given a Tableau workbook ID, trigger an extract refresh, validate source data freshness, and notify executives. Use for daily executive dashboard preparation."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          steps:
            - name: validate-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT MAX(updated_at) as last_update FROM EXEC.DASHBOARD_SOURCE_DATA"
            - name: trigger-refresh
              type: call
              call: "tableau.refresh-extract"
              with:
                workbook_id: "{{workbook_id}}"
            - name: notify-executives
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_executive_channel"
                text: "Executive dashboard refreshed. Data as of {{validate-data.last_update}}. Refresh status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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://bp-tableau.example.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/$secrets.tableau_site_id/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-extract
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compares row counts and checksums between Teradata source tables and Snowflake target tables, logs results, and alerts the data engineering team via Microsoft Teams if discrepancies are found.

naftiko: "0.5"
info:
  label: "Teradata to Snowflake Data Migration Validator"
  description: "Compares row counts and checksums between Teradata source tables and Snowflake target tables, logs results, and alerts the data engineering team via Microsoft Teams if discrepancies are found."
  tags:
    - data-engineering
    - teradata
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-migration
      port: 8080
      tools:
        - name: validate-migration
          description: "Given source and target table names, compare row counts and checksums between Teradata and Snowflake. Use during data warehouse migration validation."
          inputParameters:
            - name: source_table
              in: body
              type: string
              description: "The Teradata source table name."
            - name: target_table
              in: body
              type: string
              description: "The Snowflake target table name."
          steps:
            - name: get-source-count
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as row_count FROM {{source_table}}@teradata_link"
            - name: get-target-count
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as row_count FROM {{target_table}}"
            - name: log-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO MIGRATION.VALIDATION_LOG VALUES ('{{source_table}}', '{{target_table}}', {{get-source-count.row_count}}, {{get-target-count.row_count}}, CURRENT_TIMESTAMP)"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_data_engineering_channel"
                text: "Migration validation: {{source_table}} -> {{target_table}}. Source rows: {{get-source-count.row_count}}, Target rows: {{get-target-count.row_count}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Scans SAP Ariba for vendor contracts expiring within 90 days, creates a Jira task for procurement review, and sends a summary digest to the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Contract Renewal Alert"
  description: "Scans SAP Ariba for vendor contracts expiring within 90 days, creates a Jira task for procurement review, and sends a summary digest to the procurement team via Microsoft Teams."
  tags:
    - procurement
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: scan-contract-renewals
          description: "Given a lookback window in days, scan SAP Ariba for contracts nearing expiration, create Jira review tasks, and notify procurement. Use for proactive contract management."
          inputParameters:
            - name: days_to_expiry
              in: body
              type: integer
              description: "Number of days until contract expiration to scan, e.g. 90."
          steps:
            - name: get-expiring-contracts
              type: call
              call: "sap-ariba.get-contracts"
              with:
                days_to_expiry: "{{days_to_expiry}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                issue_type: "Task"
                summary: "Contract renewals due within {{days_to_expiry}} days: {{get-expiring-contracts.count}} contracts"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_procurement_channel"
                text: "{{get-expiring-contracts.count}} vendor contracts expire within {{days_to_expiry}} days. Review task: {{create-review-task.key}}."
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://bp.procurement.ariba.com/api"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts?expiring_within={{days_to_expiry}}"
          inputParameters:
            - name: days_to_expiry
              in: query
          operations:
            - name: get-contracts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects VMware vCenter cluster utilization metrics, stores them in Snowflake, and sends a weekly capacity planning digest to the infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "VMware Capacity Planning Report"
  description: "Collects VMware vCenter cluster utilization metrics, stores them in Snowflake, and sends a weekly capacity planning digest to the infrastructure team via Microsoft Teams."
  tags:
    - infrastructure
    - vmware
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-capacity
      port: 8080
      tools:
        - name: generate-capacity-report
          description: "Given a vCenter cluster name, collect CPU, memory, and storage utilization, store in Snowflake, and send a digest. Use for weekly infrastructure capacity reviews."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The VMware vCenter cluster name."
          steps:
            - name: get-cluster-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT AVG(cpu_pct) as avg_cpu, AVG(mem_pct) as avg_mem, AVG(storage_pct) as avg_storage FROM INFRA.VMWARE_METRICS WHERE cluster = '{{cluster_name}}' AND metric_date >= DATEADD(day, -7, CURRENT_DATE)"
            - name: log-report
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO INFRA.CAPACITY_REPORTS VALUES ('{{cluster_name}}', {{get-cluster-metrics.avg_cpu}}, {{get-cluster-metrics.avg_mem}}, {{get-cluster-metrics.avg_storage}}, CURRENT_TIMESTAMP)"
            - name: notify-infra
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_infra_channel"
                text: "Weekly capacity for {{cluster_name}}: CPU {{get-cluster-metrics.avg_cpu}}%, Memory {{get-cluster-metrics.avg_mem}}%, Storage {{get-cluster-metrics.avg_storage}}%."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Ingests well integrity test results from the field, stores them in Snowflake, updates the SAP asset record, and alerts the well integrity team via Microsoft Teams if any test fails.

naftiko: "0.5"
info:
  label: "Well Integrity Test Result Processor"
  description: "Ingests well integrity test results from the field, stores them in Snowflake, updates the SAP asset record, and alerts the well integrity team via Microsoft Teams if any test fails."
  tags:
    - operations
    - energy
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: well-integrity
      port: 8080
      tools:
        - name: process-test-result
          description: "Given a well ID and test result payload, store results in Snowflake, update the SAP equipment record, and alert if failure detected. Use after field well integrity tests."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "The well identifier, e.g. 'WELL-GOM-0042'."
            - name: test_result
              in: body
              type: string
              description: "Test result: PASS or FAIL."
            - name: test_date
              in: body
              type: string
              description: "Test date in YYYY-MM-DD format."
          steps:
            - name: store-result
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO OPERATIONS.WELL_INTEGRITY_TESTS VALUES ('{{well_id}}', '{{test_result}}', '{{test_date}}')"
            - name: update-sap-asset
              type: call
              call: "sap.update-equipment"
              with:
                equipment_id: "{{well_id}}"
                last_test_date: "{{test_date}}"
                test_status: "{{test_result}}"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_well_integrity_channel"
                text: "Well integrity test for {{well_id}} on {{test_date}}: {{test_result}}. SAP asset updated."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: update-equipment
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a compensation change is submitted in Workday, validates budget in SAP, routes for manager approval via Microsoft Teams, and logs the decision in Snowflake.

naftiko: "0.5"
info:
  label: "Workday Compensation Change Approval Workflow"
  description: "When a compensation change is submitted in Workday, validates budget in SAP, routes for manager approval via Microsoft Teams, and logs the decision in Snowflake."
  tags:
    - hr
    - compensation
    - workday
    - sap
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: compensation-mgmt
      port: 8080
      tools:
        - name: process-comp-change
          description: "Given a Workday employee ID and proposed compensation amount, validate budget availability, send approval request, and log the outcome. Use for compensation change requests."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: proposed_amount
              in: body
              type: string
              description: "The proposed new compensation amount."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: check-budget
              type: call
              call: "sap.get-cost-center-budget"
              with:
                cost_center: "{{get-employee.cost_center}}"
            - name: request-approval
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Compensation change request for {{get-employee.full_name}}: proposed {{proposed_amount}}. Current budget remaining: {{check-budget.remaining_budget}}. Please approve or deny."
            - name: log-request
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO HR.COMP_CHANGE_REQUESTS VALUES ('{{worker_id}}', '{{proposed_amount}}', '{{check-budget.remaining_budget}}', CURRENT_TIMESTAMP)"
  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: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bp-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bp.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Extracts diversity and inclusion metrics from Workday, aggregates them in Snowflake, refreshes the Power BI dashboard, and distributes the report to HR leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Quarterly Report"
  description: "Extracts diversity and inclusion metrics from Workday, aggregates them in Snowflake, refreshes the Power BI dashboard, and distributes the report to HR leadership via Microsoft Teams."
  tags:
    - hr
    - diversity
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dei-reporting
      port: 8080
      tools:
        - name: generate-dei-report
          description: "Given a fiscal quarter and region, extract DEI metrics, aggregate data, and distribute the report. Use for quarterly diversity and inclusion reporting."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter in YYYY-QN format."
            - name: region
              in: body
              type: string
              description: "Region filter, e.g. 'Global', 'North_America', 'Europe'."
          steps:
            - name: extract-metrics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL HR.EXTRACT_DEI_METRICS('{{fiscal_quarter}}', '{{region}}')"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_dei_dataset_id"
            - name: notify-hr-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_hr_leadership_channel"
                text: "Q{{fiscal_quarter}} DEI report for {{region}} is ready. Dashboard refreshed: {{refresh-dashboard.status}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bp.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Returns the current headcount by business unit and cost center from Workday for workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Returns the current headcount by business unit and cost center from Workday for workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns all active BP employees grouped by business unit and cost center from Workday. Use for headcount planning, workforce analytics, and finance budgeting."
          call: "workday.list-workers"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data[*]"
  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: "/bp/workers"
          operations:
            - name: list-workers
              method: GET

Checks Workday Learning for employees with overdue mandatory training, creates ServiceNow tasks for follow-up, and notifies managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Checks Workday Learning for employees with overdue mandatory training, creates ServiceNow tasks for follow-up, and notifies managers via Microsoft Teams."
  tags:
    - hr
    - compliance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: learning-compliance
      port: 8080
      tools:
        - name: track-overdue-training
          description: "Given a training program ID and grace period, identify employees with overdue mandatory training, create follow-up tasks, and notify managers. Use for compliance training enforcement."
          inputParameters:
            - name: program_id
              in: body
              type: string
              description: "The Workday Learning program ID."
            - name: grace_days
              in: body
              type: integer
              description: "Number of grace days past due date."
          steps:
            - name: get-overdue-learners
              type: call
              call: "workday.get-overdue-training"
              with:
                program_id: "{{program_id}}"
                grace_days: "{{grace_days}}"
            - name: create-followup
              type: call
              call: "servicenow.create-request"
              with:
                category: "compliance"
                short_description: "Overdue training: {{get-overdue-learners.count}} employees past due on {{program_id}}"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_hr_compliance_channel"
                text: "{{get-overdue-learners.count}} employees overdue on training program {{program_id}} (grace: {{grace_days}} days). Follow-up: {{create-followup.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/bp/learning/overdueTraining"
          operations:
            - name: get-overdue-training
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bp.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates a performance review cycle in Workday for a BP business unit, creates a Jira tracking epic, and notifies HR business partners via Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Kickoff"
  description: "Initiates a performance review cycle in Workday for a BP business unit, creates a Jira tracking epic, and notifies HR business partners via Teams."
  tags:
    - hr
    - performance-management
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: kickoff-review-cycle
          description: "Given a Workday business unit ID and review cycle period, initiate the performance review in Workday, create a Jira epic to track the cycle, and notify HR BPs in Teams. Use at the start of each semi-annual performance review."
          inputParameters:
            - name: business_unit_id
              in: body
              type: string
              description: "The Workday business unit ID, e.g. 'BU-UPSTREAM-AMERICAS'."
            - name: review_period
              in: body
              type: string
              description: "The performance review period, e.g. 'H2-2026'."
          steps:
            - name: initiate-review
              type: call
              call: "workday.create-review-process"
              with:
                business_unit_id: "{{business_unit_id}}"
                period: "{{review_period}}"
            - name: create-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "HR"
                issuetype: "Epic"
                summary: "Performance Review {{review_period}} — {{business_unit_id}}"
            - name: notify-hrbp
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.hrbp_channel_id"
                text: "Performance review {{review_period}} initiated for {{business_unit_id}}. Jira epic: {{create-epic.key}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-processes
          path: "/bp/performanceManagement/reviewProcesses"
          operations:
            - name: create-review-process
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Looks up a Workday worker profile by employee ID, returning name, title, department, and manager information.

naftiko: "0.5"
info:
  label: "Workday Worker Profile Lookup"
  description: "Looks up a Workday worker profile by employee ID, returning name, title, department, and manager information."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-worker-profile
          description: "Given a Workday employee ID, retrieve the worker's full profile including job title, department, and reporting chain. Use for HR inquiries and org chart lookups."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID, e.g. 'WD-100234'."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.fullName"
            - name: job_title
              type: string
              mapping: "$.worker.jobTitle"
            - name: department
              type: string
              mapping: "$.worker.department"
  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: "/bp/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

After a Zoom meeting ends, retrieves the recording transcript, creates Jira action items from identified tasks, and sends a summary to attendees via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Zoom Meeting Action Item Tracker"
  description: "After a Zoom meeting ends, retrieves the recording transcript, creates Jira action items from identified tasks, and sends a summary to attendees via Microsoft Teams."
  tags:
    - collaboration
    - zoom
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: meeting-ops
      port: 8080
      tools:
        - name: track-action-items
          description: "Given a Zoom meeting ID, retrieve the transcript, extract action items, create Jira tickets, and notify attendees. Use after important project meetings."
          inputParameters:
            - name: meeting_id
              in: body
              type: string
              description: "The Zoom meeting ID."
          steps:
            - name: get-transcript
              type: call
              call: "zoom.get-meeting-transcript"
              with:
                meeting_id: "{{meeting_id}}"
            - name: create-action-items
              type: call
              call: "jira.create-issue"
              with:
                project: "BPOPS"
                issue_type: "Task"
                summary: "Action items from Zoom meeting {{meeting_id}}"
                description: "{{get-transcript.summary}}"
            - name: notify-attendees
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.teams_general_channel"
                text: "Meeting {{meeting_id}} action items captured in Jira: {{create-action-items.key}}. Summary: {{get-transcript.summary}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/meetings/{{meeting_id}}/recordings"
          inputParameters:
            - name: meeting_id
              in: path
          operations:
            - name: get-meeting-transcript
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bp.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST