Marathon Petroleum Capabilities

Naftiko 0.5 capability definitions for Marathon Petroleum - 106 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Uses Anthropic Claude to summarize open ServiceNow incidents for a facility and post an executive briefing to the operations leadership Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Operations Incident Summary"
  description: "Uses Anthropic Claude to summarize open ServiceNow incidents for a facility and post an executive briefing to the operations leadership Teams channel."
  tags:
    - operations
    - ai
    - servicenow
    - anthropic
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ops-intelligence
      port: 8080
      tools:
        - name: summarize-open-incidents
          description: "Retrieve open ServiceNow incidents for a given facility, use Anthropic Claude to generate an executive summary, and post it to the operations leadership Teams channel."
          inputParameters:
            - name: facility
              type: string
              description: "Refinery or facility name to retrieve incidents for."
            - name: teams_channel_id
              type: string
              description: "Operations leadership Teams channel ID."
          steps:
            - name: get-incidents
              type: call
              call: servicenow.list-incidents
              with:
                location: "{{facility}}"
                state: "open"
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Summarize these open operational incidents for executive review at {{facility}}: {{get-incidents.data}}"
            - name: post-briefing
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Operations Incident Briefing — {{facility}}: {{generate-summary.content}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: location
              in: query
            - name: state
              in: query
          operations:
            - name: list-incidents
              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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/operations-leadership/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Uses Anthropic Claude to review a permit-to-work request, checks hazard conditions in Snowflake, and routes the approval via ServiceNow with a summary to the safety team.

naftiko: "0.5"
info:
  label: "AI-Assisted Permit to Work Review"
  description: "Uses Anthropic Claude to review a permit-to-work request, checks hazard conditions in Snowflake, and routes the approval via ServiceNow with a summary to the safety team."
  tags:
    - ehs
    - safety
    - anthropic
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: permit-review
      port: 8080
      tools:
        - name: review-permit
          description: "Given a permit-to-work request, use AI to review hazards and route for approval."
          inputParameters:
            - name: permit_id
              type: string
              description: "Permit to work identifier."
            - name: work_description
              type: string
              description: "Description of planned work."
            - name: location
              type: string
              description: "Work location."
          steps:
            - name: check-hazards
              type: call
              call: snowflake.query-hazard-history
              with:
                location: "{{location}}"
            - name: ai-review
              type: call
              call: anthropic.analyze-permit
              with:
                prompt: "Review this permit-to-work: {{work_description}} at {{location}}. Historical hazards: {{check-hazards.results}}. Identify risks and recommend controls."
            - name: create-approval
              type: call
              call: servicenow.create-change
              with:
                short_description: "Permit to work: {{permit_id}} at {{location}}"
                description: "AI review: {{ai-review.response}}"
            - name: notify-safety
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_safety_channel"
                text: "Permit {{permit_id}} at {{location}} reviewed | Risk assessment: {{ai-review.response}} | Approval: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-hazard-history
              method: POST
    - 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: analyze-permit
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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: create-change
              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/safety/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Datadog detects elevated API gateway latency, creates a ServiceNow incident, gathers recent error logs from Splunk, and notifies the platform team.

naftiko: "0.5"
info:
  label: "API Gateway Latency Alert"
  description: "When Datadog detects elevated API gateway latency, creates a ServiceNow incident, gathers recent error logs from Splunk, and notifies the platform team."
  tags:
    - devops
    - observability
    - datadog
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-ops
      port: 8080
      tools:
        - name: handle-latency-alert
          description: "Given an API gateway latency alert, gather context and escalate."
          inputParameters:
            - name: gateway_name
              type: string
              description: "API gateway identifier."
            - name: latency_ms
              type: string
              description: "Current p99 latency in milliseconds."
            - name: threshold_ms
              type: string
              description: "Threshold in milliseconds."
          steps:
            - name: get-error-logs
              type: call
              call: splunk.search-api-errors
              with:
                gateway: "{{gateway_name}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "API gateway latency: {{gateway_name}} at {{latency_ms}}ms (threshold: {{threshold_ms}}ms)"
                urgency: "2"
            - name: notify-platform
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_platform_channel"
                text: "API latency alert: {{gateway_name}} p99={{latency_ms}}ms (threshold: {{threshold_ms}}ms) | Recent errors: {{get-error-logs.count}} | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.marathon-petroleum.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: search-api-errors
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/platform/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for asphalt demand forecasts, updates SAP production planning, and notifies the asphalt operations team of schedule changes.

naftiko: "0.5"
info:
  label: "Asphalt Production Schedule Update"
  description: "Queries Snowflake for asphalt demand forecasts, updates SAP production planning, and notifies the asphalt operations team of schedule changes."
  tags:
    - operations
    - asphalt
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asphalt-ops
      port: 8080
      tools:
        - name: update-asphalt-schedule
          description: "Given a production week, pull demand data and update the schedule."
          inputParameters:
            - name: production_week
              type: string
              description: "Production week start date."
            - name: facility
              type: string
              description: "Asphalt production facility."
          steps:
            - name: get-demand
              type: call
              call: snowflake.query-asphalt-demand
              with:
                week: "{{production_week}}"
                facility: "{{facility}}"
            - name: update-plan
              type: call
              call: sap.update-production-plan
              with:
                facility: "{{facility}}"
                volume: "{{get-demand.forecast_tons}}"
            - name: notify-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_asphalt_channel"
                text: "Asphalt schedule {{facility}} (week of {{production_week}}): Demand: {{get-demand.forecast_tons}} tons | Grades: {{get-demand.grade_mix}} | Plan updated"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-asphalt-demand
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder"
          operations:
            - name: update-production-plan
              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/asphalt/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an Azure Databricks job fails, retrieves the error details, creates a Jira ticket for the data platform team, and sends a Teams notification.

naftiko: "0.5"
info:
  label: "Azure Databricks Job Failure Alert"
  description: "When an Azure Databricks job fails, retrieves the error details, creates a Jira ticket for the data platform team, and sends a Teams notification."
  tags:
    - data-engineering
    - azure
    - databricks
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: databricks-ops
      port: 8080
      tools:
        - name: handle-databricks-failure
          description: "Given a failed Databricks job, gather error details and create ticket."
          inputParameters:
            - name: job_id
              type: string
              description: "Databricks job ID."
            - name: run_id
              type: string
              description: "Databricks run ID."
            - name: error_message
              type: string
              description: "Error message from the failed run."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issuetype: Bug
                summary: "Databricks job failure: Job {{job_id}} Run {{run_id}}"
                description: "Error: {{error_message}}"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_data_platform_channel"
                text: "Databricks failure: Job {{job_id}} / Run {{run_id}} | Error: {{error_message}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/data-platform/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves cost data for a specific Azure resource group, returning current month spend and budget utilization percentage.

naftiko: "0.5"
info:
  label: "Azure Resource Cost Lookup"
  description: "Retrieves cost data for a specific Azure resource group, returning current month spend and budget utilization percentage."
  tags:
    - cloud
    - azure
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost
      port: 8080
      tools:
        - name: get-resource-cost
          description: "Look up Azure resource group costs for the current billing period."
          inputParameters:
            - name: resource_group
              type: string
              description: "Azure resource group name."
          call: azure.get-cost
          with:
            resource_group: "{{resource_group}}"
          outputParameters:
            - name: current_spend
              type: string
              mapping: "$.properties.rows[0][0]"
            - name: currency
              type: string
              mapping: "$.properties.columns[0].type"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/$secrets.azure_subscription_id/resourceGroups/{{resource_group}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: resource_group
              in: path
          operations:
            - name: get-cost
              method: POST

Pulls capital project status from SAP, queries Snowflake for spend variance, and posts the weekly project digest to the capital planning team.

naftiko: "0.5"
info:
  label: "Capital Project Status Digest"
  description: "Pulls capital project status from SAP, queries Snowflake for spend variance, and posts the weekly project digest to the capital planning team."
  tags:
    - finance
    - capital-projects
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: capex-reporting
      port: 8080
      tools:
        - name: generate-project-digest
          description: "Given a project code, pull SAP status and Snowflake spend data and post digest."
          inputParameters:
            - name: project_code
              type: string
              description: "SAP capital project code."
          steps:
            - name: get-project-status
              type: call
              call: sap.get-project
              with:
                project: "{{project_code}}"
            - name: query-spend-variance
              type: call
              call: snowflake.run-capex-query
              with:
                project: "{{project_code}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_capex_channel"
                text: "Capital project {{project_code}}: Status: {{get-project-status.status}} | Budget: ${{query-spend-variance.budget}}M | Actual: ${{query-spend-variance.actual}}M | Variance: {{query-spend-variance.variance_pct}}%"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: projects
          path: "/A_Project('{{project}}')"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-capex-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/capex/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Tracks catalyst age and performance via Snowflake, compares against SAP maintenance plans, and alerts the process engineering team when replacement is due.

naftiko: "0.5"
info:
  label: "Catalyst Lifecycle Tracking Workflow"
  description: "Tracks catalyst age and performance via Snowflake, compares against SAP maintenance plans, and alerts the process engineering team when replacement is due."
  tags:
    - operations
    - maintenance
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: catalyst-mgmt
      port: 8080
      tools:
        - name: track-catalyst-lifecycle
          description: "Given a catalyst bed ID, check performance metrics and replacement schedule."
          inputParameters:
            - name: catalyst_bed_id
              type: string
              description: "Catalyst bed identifier."
            - name: unit_id
              type: string
              description: "Process unit ID."
          steps:
            - name: get-performance
              type: call
              call: snowflake.query-catalyst-performance
              with:
                bed_id: "{{catalyst_bed_id}}"
            - name: get-replacement-plan
              type: call
              call: sap.get-maint-plan
              with:
                equipment: "{{catalyst_bed_id}}"
            - name: notify-engineering
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_process_eng_channel"
                text: "Catalyst {{catalyst_bed_id}} in {{unit_id}}: Activity: {{get-performance.activity_pct}}% | Age: {{get-performance.days_on_stream}} days | Next replacement: {{get-replacement-plan.planned_date}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-catalyst-performance
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEPLAN"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-plans
          path: "/MaintenancePlan"
          operations:
            - name: get-maint-plan
              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/process-eng/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions failure event, create a Jira bug, post a Datadog deployment event, and alert the engineering Teams channel with failure context."
          inputParameters:
            - name: repo
              type: string
              description: "GitHub repository full name (org/repo)."
            - name: branch
              type: string
              description: "Branch where the failure occurred."
            - name: workflow_run_id
              type: string
              description: "GitHub Actions workflow run ID."
            - name: commit_sha
              type: string
              description: "Commit SHA that triggered the run."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}}"
                description: "Run {{workflow_run_id}} failed on commit {{commit_sha}}"
            - name: post-event
              type: call
              call: datadog.create-event
              with:
                title: "CI failure: {{repo}}"
                text: "Branch {{branch}} pipeline failed. Jira: {{create-bug.key}}"
                alert_type: "error"
            - name: alert-engineering
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "engineering-alerts"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{workflow_run_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          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: channel-messages
          path: "/teams/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Detects AWS cloud spend anomalies above a configured threshold and creates a Jira cost-tracking task with a Datadog warning event.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Alert"
  description: "Detects AWS cloud spend anomalies above a configured threshold and creates a Jira cost-tracking task with a Datadog warning event."
  tags:
    - cloud
    - finops
    - aws
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cloud-cost-anomaly
          description: "Given an AWS account ID and spend threshold, query Cost Explorer for anomalies, open a Jira tracking task, and post a Datadog warning event. Use when AWS budget alerts trigger."
          inputParameters:
            - name: account_id
              type: string
              description: "AWS account ID to analyze."
            - name: threshold_usd
              type: number
              description: "Anomaly threshold in USD."
            - name: date_from
              type: string
              description: "Lookback start date in YYYY-MM-DD format."
          steps:
            - name: get-anomalies
              type: call
              call: aws-cost.get-anomalies
              with:
                accountId: "{{account_id}}"
                threshold: "{{threshold_usd}}"
                startDate: "{{date_from}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "CLOUD"
                issuetype: "Task"
                summary: "AWS cost anomaly: account {{account_id}}"
                description: "{{get-anomalies.summary}} exceeded {{threshold_usd}} USD"
            - name: post-event
              type: call
              call: datadog.create-event
              with:
                title: "Cost anomaly: {{account_id}}"
                text: "Threshold {{threshold_usd}} USD exceeded. Jira: {{create-task.key}}"
                alert_type: "warning"
  consumes:
    - type: http
      namespace: aws-cost
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_cost_explorer_token"
      resources:
        - name: anomalies
          path: "/GetAnomalies"
          operations:
            - name: get-anomalies
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Queries Workday for employees with overdue compliance training, creates a ServiceNow compliance ticket, and notifies managers via Teams.

naftiko: "0.5"
info:
  label: "Compliance Training Overdue Alert"
  description: "Queries Workday for employees with overdue compliance training, creates a ServiceNow compliance ticket, and notifies managers via Teams."
  tags:
    - hr
    - compliance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-compliance
      port: 8080
      tools:
        - name: alert-overdue-training
          description: "Given a training program, find overdue employees and escalate."
          inputParameters:
            - name: training_program
              type: string
              description: "Training program name."
          steps:
            - name: get-overdue
              type: call
              call: workday.get-overdue-training
              with:
                program: "{{training_program}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Overdue training: {{training_program}} — {{get-overdue.count}} employees"
                category: "compliance"
                urgency: "2"
            - name: notify-managers
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_compliance_channel"
                text: "Training overdue: {{training_program}} | {{get-overdue.count}} employees overdue | SNOW: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learning/assignments"
          operations:
            - name: get-overdue-training
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/hr-compliance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a Confluence wiki page by ID, returning the title, body content, and last updated date for operational documentation.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID, returning the title, body content, and last updated date for operational documentation."
  tags:
    - collaboration
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: wiki
      port: 8080
      tools:
        - name: get-page
          description: "Retrieve a Confluence page by ID."
          inputParameters:
            - name: page_id
              type: string
              description: "Confluence page ID."
          call: confluence.get-page
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://marathon-petroleum.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=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Pulls contractor timesheet data from Snowflake, validates against SAP service entry sheets, and notifies the project controls team of discrepancies.

naftiko: "0.5"
info:
  label: "Contractor Hours Reconciliation"
  description: "Pulls contractor timesheet data from Snowflake, validates against SAP service entry sheets, and notifies the project controls team of discrepancies."
  tags:
    - finance
    - contractor-management
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contractor-finance
      port: 8080
      tools:
        - name: reconcile-contractor-hours
          description: "Given a period and contractor, reconcile reported vs approved hours."
          inputParameters:
            - name: contractor_company
              type: string
              description: "Contractor company name."
            - name: period
              type: string
              description: "Billing period."
          steps:
            - name: get-reported-hours
              type: call
              call: snowflake.query-contractor-hours
              with:
                contractor: "{{contractor_company}}"
                period: "{{period}}"
            - name: get-sap-entries
              type: call
              call: sap.get-service-entries
              with:
                vendor: "{{contractor_company}}"
                period: "{{period}}"
            - name: post-reconciliation
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_project_controls_channel"
                text: "Contractor hours recon: {{contractor_company}} ({{period}}) | Reported: {{get-reported-hours.total_hours}} hrs | SAP approved: {{get-sap-entries.total_hours}} hrs | Variance: {{get-reported-hours.variance}} hrs"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-contractor-hours
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_SERVICE_ENTRY_SHEET"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: service-entries
          path: "/A_ServiceEntrySheet"
          operations:
            - name: get-service-entries
              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/project-controls/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Onboards a contractor by verifying safety certifications in SAP, provisioning badge access via Okta, and notifying the site safety team on Teams.

naftiko: "0.5"
info:
  label: "Contractor Safety Onboarding Workflow"
  description: "Onboards a contractor by verifying safety certifications in SAP, provisioning badge access via Okta, and notifying the site safety team on Teams."
  tags:
    - ehs
    - contractor-management
    - sap
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contractor-safety
      port: 8080
      tools:
        - name: onboard-contractor
          description: "Given contractor details and site, verify safety certs, provision access, and notify safety team."
          inputParameters:
            - name: contractor_name
              type: string
              description: "Contractor full name."
            - name: contractor_company
              type: string
              description: "Contractor company name."
            - name: site
              type: string
              description: "Refinery or facility site code."
            - name: certification_ids
              type: string
              description: "Comma-separated safety certification IDs."
          steps:
            - name: verify-certs
              type: call
              call: sap.verify-certifications
              with:
                contractor_name: "{{contractor_name}}"
                certification_ids: "{{certification_ids}}"
            - name: provision-badge
              type: call
              call: okta.create-user
              with:
                first_name: "{{contractor_name}}"
                login: "{{contractor_name}}@contractors.marathonpetroleum.com"
                group: "site-{{site}}-contractors"
            - name: notify-safety
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_safety_channel"
                text: "Contractor onboarded: {{contractor_name}} ({{contractor_company}}) at {{site}} | Certs: {{verify-certs.status}} | Badge: {{provision-badge.status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: certifications
          path: "/A_BusinessPartner"
          operations:
            - name: verify-certifications
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/safety/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a corrosion probe reading exceeds threshold, creates a ServiceNow work order, updates the inspection record in SAP, and alerts the integrity team.

naftiko: "0.5"
info:
  label: "Corrosion Monitoring Alert"
  description: "When a corrosion probe reading exceeds threshold, creates a ServiceNow work order, updates the inspection record in SAP, and alerts the integrity team."
  tags:
    - operations
    - integrity
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: integrity-mgmt
      port: 8080
      tools:
        - name: handle-corrosion-alert
          description: "Given a corrosion reading above threshold, create work order and notify integrity team."
          inputParameters:
            - name: probe_id
              type: string
              description: "Corrosion probe identifier."
            - name: reading_mpy
              type: string
              description: "Corrosion rate in mils per year."
            - name: threshold_mpy
              type: string
              description: "Alert threshold in mils per year."
            - name: equipment_id
              type: string
              description: "Associated equipment ID."
          steps:
            - name: create-work-order
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Corrosion alert: Probe {{probe_id}} on {{equipment_id}} at {{reading_mpy}} mpy"
                urgency: "2"
                category: "integrity"
            - name: update-inspection
              type: call
              call: sap.update-inspection-record
              with:
                equipment: "{{equipment_id}}"
                reading: "{{reading_mpy}}"
            - name: alert-integrity
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_integrity_channel"
                text: "Corrosion alert: {{probe_id}} on {{equipment_id}} | Rate: {{reading_mpy}} mpy (threshold: {{threshold_mpy}}) | Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-records
          path: "/MaintenanceOrder"
          operations:
            - name: update-inspection-record
              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/integrity/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When crude oil price breaches a configured threshold, queries Snowflake for margin impact, updates the Power BI trading dashboard, and alerts the trading desk via Teams.

naftiko: "0.5"
info:
  label: "Crude Oil Pricing Alert Workflow"
  description: "When crude oil price breaches a configured threshold, queries Snowflake for margin impact, updates the Power BI trading dashboard, and alerts the trading desk via Teams."
  tags:
    - trading
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading-alerts
      port: 8080
      tools:
        - name: handle-price-alert
          description: "Given a crude benchmark and price, calculate margin impact and notify the trading team."
          inputParameters:
            - name: benchmark
              type: string
              description: "Crude benchmark (e.g. WTI, Brent)."
            - name: price
              type: string
              description: "Current price per barrel."
            - name: threshold
              type: string
              description: "Alert threshold price."
          steps:
            - name: query-margin-impact
              type: call
              call: snowflake.run-margin-query
              with:
                benchmark: "{{benchmark}}"
                price: "{{price}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "$secrets.trading_dashboard_dataset_id"
            - name: alert-trading-desk
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_trading_channel"
                text: "PRICE ALERT: {{benchmark}} at ${{price}}/bbl (threshold: ${{threshold}}) | Margin impact: {{query-margin-impact.margin_delta}} | Dashboard refreshing"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-margin-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: 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/trading/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for crude slate analytics, pulls current pricing data, and posts the optimization recommendation to the crude trading team.

naftiko: "0.5"
info:
  label: "Crude Slate Optimization Report"
  description: "Queries Snowflake for crude slate analytics, pulls current pricing data, and posts the optimization recommendation to the crude trading team."
  tags:
    - trading
    - operations
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crude-optimization
      port: 8080
      tools:
        - name: generate-crude-slate-report
          description: "Given a refinery, analyze crude slate options and post recommendations."
          inputParameters:
            - name: refinery
              type: string
              description: "Refinery code."
            - name: planning_month
              type: string
              description: "Planning month."
          steps:
            - name: get-slate-analytics
              type: call
              call: snowflake.query-crude-slate
              with:
                refinery: "{{refinery}}"
                month: "{{planning_month}}"
            - name: get-pricing
              type: call
              call: snowflake.query-crude-pricing
              with:
                month: "{{planning_month}}"
            - name: post-recommendation
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_crude_trading_channel"
                text: "Crude slate {{refinery}} ({{planning_month}}): Optimal mix: {{get-slate-analytics.recommended_mix}} | Margin uplift: ${{get-slate-analytics.margin_uplift}}/bbl | Current differential: ${{get-pricing.differential}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-crude-slate
              method: POST
            - name: query-crude-pricing
              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/crude-trading/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for daily refinery yield data, refreshes the Power BI yield dashboard, and posts the summary to the operations leadership Teams channel.

naftiko: "0.5"
info:
  label: "Daily Refinery Yield Report"
  description: "Queries Snowflake for daily refinery yield data, refreshes the Power BI yield dashboard, and posts the summary to the operations leadership Teams channel."
  tags:
    - operations
    - reporting
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ops-reporting
      port: 8080
      tools:
        - name: generate-yield-report
          description: "Given a refinery and date, pull yield data, refresh dashboard, and post summary."
          inputParameters:
            - name: refinery
              type: string
              description: "Refinery name or code."
            - name: report_date
              type: string
              description: "Report date in ISO 8601 format."
          steps:
            - name: query-yield-data
              type: call
              call: snowflake.run-yield-query
              with:
                refinery: "{{refinery}}"
                date: "{{report_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "$secrets.yield_dashboard_dataset_id"
            - name: post-summary
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_leadership_channel"
                text: "Daily yield report {{refinery}} ({{report_date}}): Throughput: {{query-yield-data.throughput_bpd}} BPD | Yield: {{query-yield-data.yield_pct}}% | Dashboard refreshed"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-yield-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: 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/ops-leadership/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Snowflake ETL pipeline fails, queries error logs, creates a Jira ticket for the data engineering team, and notifies via Teams.

naftiko: "0.5"
info:
  label: "Data Pipeline Failure Recovery"
  description: "When a Snowflake ETL pipeline fails, queries error logs, creates a Jira ticket for the data engineering team, and notifies via Teams."
  tags:
    - data-engineering
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a failed pipeline name, gather error context, create ticket, and notify."
          inputParameters:
            - name: pipeline_name
              type: string
              description: "Data pipeline name."
            - name: error_message
              type: string
              description: "Pipeline error message."
          steps:
            - name: get-error-context
              type: call
              call: snowflake.query-pipeline-errors
              with:
                pipeline: "{{pipeline_name}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issuetype: Bug
                summary: "Pipeline failure: {{pipeline_name}}"
                description: "Error: {{error_message}}. Context: {{get-error-context.results}}"
            - name: notify-data-eng
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_data_eng_channel"
                text: "Pipeline failure: {{pipeline_name}} | Error: {{error_message}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-pipeline-errors
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/data-eng/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the current status of a Datadog monitor by ID, returning the monitor name, overall state, and last triggered timestamp.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Lookup"
  description: "Retrieves the current status of a Datadog monitor by ID, returning the monitor name, overall state, and last triggered timestamp."
  tags:
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Look up a Datadog monitor by ID and return its current state."
          inputParameters:
            - name: monitor_id
              type: string
              description: "The Datadog monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: overall_state
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Fetches SLO compliance data from Datadog for production services and posts a weekly summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Fetches SLO compliance data from Datadog for production services and posts a weekly summary to the engineering Teams channel."
  tags:
    - observability
    - slo
    - datadog
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-compliance
          description: "Fetch weekly SLO compliance metrics for all production services from Datadog and post a summary to the engineering Teams channel. Use for the weekly operations reliability review."
          inputParameters:
            - name: teams_channel_id
              type: string
              description: "Engineering Teams channel ID for the SLO report."
          steps:
            - name: get-slos
              type: call
              call: datadog.list-slos
              with:
                tags: "env:production"
            - name: post-report
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Weekly SLO Report: {{get-slos.complianceCount}} services meeting targets out of {{get-slos.totalCount}} total."
  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: slos
          path: "/slo"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: list-slos
              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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Coordinates an emergency response drill by pulling participant lists from Workday, creating a Jira action-item tracker, and sending drill notifications via Teams.

naftiko: "0.5"
info:
  label: "Emergency Response Drill Coordination"
  description: "Coordinates an emergency response drill by pulling participant lists from Workday, creating a Jira action-item tracker, and sending drill notifications via Teams."
  tags:
    - ehs
    - emergency-response
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: emergency-drills
      port: 8080
      tools:
        - name: coordinate-drill
          description: "Given drill details, pull participants, create tracking, and send notifications."
          inputParameters:
            - name: drill_type
              type: string
              description: "Type of drill (e.g. fire, chemical_release, shelter_in_place)."
            - name: facility
              type: string
              description: "Facility where drill will occur."
            - name: drill_date
              type: string
              description: "Scheduled drill date."
          steps:
            - name: get-participants
              type: call
              call: workday.get-facility-workers
              with:
                facility: "{{facility}}"
            - name: create-tracker
              type: call
              call: jira.create-issue
              with:
                project: EHS
                issuetype: Task
                summary: "Emergency drill: {{drill_type}} at {{facility}} on {{drill_date}}"
                description: "Participants: {{get-participants.count}} employees"
            - name: send-notification
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_emergency_channel"
                text: "DRILL SCHEDULED: {{drill_type}} at {{facility}} on {{drill_date}} | {{get-participants.count}} participants | Tracker: {{create-tracker.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: get-facility-workers
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/emergency/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee separation is processed in Workday, deactivates Okta SSO, disables Microsoft 365, and notifies the manager via Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee separation is processed in Workday, deactivates Okta SSO, disables Microsoft 365, and notifies the manager via Teams."
  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 last working day, deactivate Okta SSO, disable Microsoft 365 account, and notify the manager via Teams."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID of the departing employee."
            - name: last_day
              type: string
              description: "Last working day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                userId: "{{get-worker.work_email}}"
            - name: disable-m365
              type: call
              call: msgraph.update-user
              with:
                user_id: "{{get-worker.work_email}}"
                accountEnabled: "false"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Offboarding complete for {{get-worker.full_name}} (last day: {{last_day}}). All system access has been revoked."
  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: "/marathon-petroleum/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{userId}}/lifecycle/deactivate"
          inputParameters:
            - name: userId
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

When an emissions monitor detects a permit exceedance, logs the event in ServiceNow, creates a Jira remediation ticket, and notifies the EHS team via Teams.

naftiko: "0.5"
info:
  label: "Environmental Compliance Exceedance Response"
  description: "When an emissions monitor detects a permit exceedance, logs the event in ServiceNow, creates a Jira remediation ticket, and notifies the EHS team via Teams."
  tags:
    - ehs
    - compliance
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ehs-compliance
      port: 8080
      tools:
        - name: handle-exceedance
          description: "Given an emissions exceedance event, create compliance tracking and notify EHS leadership."
          inputParameters:
            - name: facility
              type: string
              description: "Facility name where exceedance occurred."
            - name: pollutant
              type: string
              description: "Pollutant type (e.g. SO2, NOx, VOC)."
            - name: reading
              type: string
              description: "Current reading value."
            - name: permit_limit
              type: string
              description: "Permit limit value."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Emissions exceedance: {{pollutant}} at {{facility}} — {{reading}} (limit: {{permit_limit}})"
                urgency: "1"
                category: "environmental"
            - name: create-remediation
              type: call
              call: jira.create-issue
              with:
                project: EHS
                issuetype: Task
                summary: "Remediate {{pollutant}} exceedance at {{facility}}"
                description: "Reading: {{reading}} vs permit limit: {{permit_limit}}. Incident: {{create-snow-incident.number}}"
            - name: notify-ehs
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ehs_channel"
                text: "EXCEEDANCE: {{facility}} | {{pollutant}}: {{reading}} (limit: {{permit_limit}}) | Incident: {{create-snow-incident.number}} | Jira: {{create-remediation.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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://marathon-petroleum.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/ehs/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors flare gas recovery rates via Snowflake, creates a ServiceNow work order when recovery drops, and notifies the environmental team.

naftiko: "0.5"
info:
  label: "Flare Gas Recovery Alert"
  description: "Monitors flare gas recovery rates via Snowflake, creates a ServiceNow work order when recovery drops, and notifies the environmental team."
  tags:
    - operations
    - environmental
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: flare-monitoring
      port: 8080
      tools:
        - name: handle-flare-alert
          description: "Given a flare system with low recovery, create work order and notify team."
          inputParameters:
            - name: flare_system_id
              type: string
              description: "Flare system identifier."
            - name: recovery_rate
              type: string
              description: "Current recovery rate percentage."
            - name: facility
              type: string
              description: "Facility name."
          steps:
            - name: get-flare-data
              type: call
              call: snowflake.query-flare-data
              with:
                system_id: "{{flare_system_id}}"
            - name: create-work-order
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Flare recovery low: {{flare_system_id}} at {{facility}} — {{recovery_rate}}%"
                urgency: "2"
                category: "environmental"
            - name: notify-environmental
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_environmental_channel"
                text: "Flare alert: {{flare_system_id}} at {{facility}} | Recovery: {{recovery_rate}}% | Flow: {{get-flare-data.flow_rate}} MSCFD | Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-flare-data
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/environmental/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a fleet vehicle hits a mileage threshold, creates an SAP maintenance notification and alerts the fleet management team via Teams.

naftiko: "0.5"
info:
  label: "Fleet Vehicle Maintenance Alert"
  description: "When a fleet vehicle hits a mileage threshold, creates an SAP maintenance notification and alerts the fleet management team via Teams."
  tags:
    - logistics
    - fleet
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fleet-ops
      port: 8080
      tools:
        - name: trigger-fleet-maintenance
          description: "Given a vehicle ID and mileage, create SAP maintenance order and notify fleet team."
          inputParameters:
            - name: vehicle_id
              type: string
              description: "Fleet vehicle identifier."
            - name: current_mileage
              type: string
              description: "Current vehicle mileage."
            - name: maintenance_type
              type: string
              description: "Type of maintenance due (e.g. oil_change, tire_rotation, inspection)."
          steps:
            - name: create-maintenance-notif
              type: call
              call: sap.create-maintenance-notification
              with:
                equipment: "{{vehicle_id}}"
                description: "{{maintenance_type}} due at {{current_mileage}} miles"
                notification_type: "M1"
            - name: notify-fleet
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_fleet_channel"
                text: "Fleet maintenance: Vehicle {{vehicle_id}} — {{maintenance_type}} at {{current_mileage}} mi | SAP: {{create-maintenance-notif.notification_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/MaintenanceNotification"
          operations:
            - name: create-maintenance-notification
              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/fleet/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Aggregates greenhouse gas emissions data from Snowflake, validates against EPA reporting thresholds, and distributes the report via Teams and SharePoint.

naftiko: "0.5"
info:
  label: "GHG Emissions Reporting Workflow"
  description: "Aggregates greenhouse gas emissions data from Snowflake, validates against EPA reporting thresholds, and distributes the report via Teams and SharePoint."
  tags:
    - ehs
    - sustainability
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: generate-ghg-report
          description: "Given a facility and reporting period, generate the GHG emissions report."
          inputParameters:
            - name: facility
              type: string
              description: "Facility code."
            - name: reporting_year
              type: string
              description: "Reporting year."
          steps:
            - name: aggregate-emissions
              type: call
              call: snowflake.query-ghg-emissions
              with:
                facility: "{{facility}}"
                year: "{{reporting_year}}"
            - name: upload-report
              type: call
              call: sharepoint.upload-document
              with:
                site: "sustainability"
                path: "/GHG-Reports/{{facility}}_{{reporting_year}}.xlsx"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_sustainability_channel"
                text: "GHG report {{facility}} ({{reporting_year}}): CO2e: {{aggregate-emissions.total_co2e}} metric tons | Scope 1: {{aggregate-emissions.scope1}} | Scope 2: {{aggregate-emissions.scope2}} | Report uploaded"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-ghg-emissions
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/sustainability/drive/root:/{{path}}:/content"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: upload-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/sustainability/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a GitHub release is tagged, generates polished release notes with Anthropic Claude and publishes to Confluence and the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release Notes Publisher"
  description: "When a GitHub release is tagged, generates polished release notes with Anthropic Claude and publishes to Confluence and the engineering Teams channel."
  tags:
    - devops
    - github
    - anthropic
    - confluence
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: publish-release-notes
          description: "Given a GitHub repository and release tag, fetch the release body, generate professional release notes with Anthropic Claude, publish to Confluence, and announce in Teams."
          inputParameters:
            - name: repo_owner
              type: string
              description: "GitHub organization or owner name."
            - name: repo_name
              type: string
              description: "GitHub repository name."
            - name: tag
              type: string
              description: "Release tag name (e.g., v3.0.0)."
            - name: teams_channel_id
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                tag: "{{tag}}"
            - name: generate-notes
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Write professional release notes for an engineering audience based on: {{get-release.body}}"
            - name: publish-confluence
              type: call
              call: confluence.create-page
              with:
                space_key: "ENG"
                title: "Release {{tag}} — {{repo_name}}"
                content: "{{generate-notes.content}}"
            - name: announce-teams
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Release {{tag}} published for {{repo_name}}. Confluence: {{publish-confluence.url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{owner}}/{{repo}}/releases/tags/{{tag}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              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://marathon-petroleum.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the status of the latest commit on a GitHub repository default branch, returning check runs and workflow status.

naftiko: "0.5"
info:
  label: "GitHub Repository Status Lookup"
  description: "Retrieves the status of the latest commit on a GitHub repository default branch, returning check runs and workflow status."
  tags:
    - devops
    - github
capability:
  exposes:
    - type: mcp
      namespace: source-control
      port: 8080
      tools:
        - name: get-repo-status
          description: "Look up the CI/CD status for the latest commit on a repository."
          inputParameters:
            - name: repo
              type: string
              description: "Repository name in org/repo format."
          call: github.get-status
          with:
            repo: "{{repo}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: total_count
              type: string
              mapping: "$.total_count"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: commit-status
          path: "/repos/{{repo}}/commits/HEAD/status"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-status
              method: GET

Retrieves critical Dependabot alerts from GitHub repositories and creates Jira security issues for each critical finding.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Scan"
  description: "Retrieves critical Dependabot alerts from GitHub repositories and creates Jira security issues for each critical finding."
  tags:
    - security
    - devops
    - github
    - jira
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: scan-repo-vulnerabilities
          description: "Given a GitHub repository, retrieve critical Dependabot alerts and create a Jira security issue for each. Use during weekly security scanning and compliance reviews."
          inputParameters:
            - name: repo_owner
              type: string
              description: "GitHub organization or owner name."
            - name: repo_name
              type: string
              description: "GitHub repository name."
          steps:
            - name: get-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                severity: "critical"
            - name: create-security-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Critical vulnerabilities: {{repo_owner}}/{{repo_name}}"
                description: "{{get-alerts.count}} critical Dependabot alerts. Repo: https://github.com/{{repo_owner}}/{{repo_name}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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

Monitors hydrogen production unit metrics via Snowflake, compares against targets in SAP, and posts the production digest to the operations team.

naftiko: "0.5"
info:
  label: "Hydrogen Production Monitoring"
  description: "Monitors hydrogen production unit metrics via Snowflake, compares against targets in SAP, and posts the production digest to the operations team."
  tags:
    - operations
    - hydrogen
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hydrogen-ops
      port: 8080
      tools:
        - name: monitor-hydrogen-production
          description: "Given a hydrogen unit, pull production data and compare to plan."
          inputParameters:
            - name: unit_id
              type: string
              description: "Hydrogen production unit identifier."
            - name: report_date
              type: string
              description: "Report date."
          steps:
            - name: get-production-data
              type: call
              call: snowflake.query-hydrogen-production
              with:
                unit_id: "{{unit_id}}"
                date: "{{report_date}}"
            - name: get-production-plan
              type: call
              call: sap.get-production-order
              with:
                unit_id: "{{unit_id}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hydrogen_channel"
                text: "H2 production {{unit_id}} ({{report_date}}): Actual: {{get-production-data.volume_mcf}} MCF | Plan: {{get-production-plan.planned_volume}} MCF | Variance: {{get-production-data.variance_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-hydrogen-production
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder"
          operations:
            - name: get-production-order
              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/hydrogen/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When GitHub Dependabot finds a critical vulnerability, creates a Jira remediation ticket, opens a ServiceNow change request, and alerts the security team via Teams.

naftiko: "0.5"
info:
  label: "IT Security Vulnerability Remediation"
  description: "When GitHub Dependabot finds a critical vulnerability, creates a Jira remediation ticket, opens a ServiceNow change request, and alerts the security team via Teams."
  tags:
    - security
    - github
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-remediation
      port: 8080
      tools:
        - name: remediate-vulnerability
          description: "Given a GitHub vulnerability alert, create remediation tracking across systems."
          inputParameters:
            - name: repo
              type: string
              description: "Repository name."
            - name: cve_id
              type: string
              description: "CVE identifier."
            - name: severity
              type: string
              description: "Vulnerability severity (critical, high, medium, low)."
            - name: package_name
              type: string
              description: "Affected package name."
          steps:
            - name: create-jira-ticket
              type: call
              call: jira.create-issue
              with:
                project: SEC
                issuetype: Bug
                summary: "Remediate {{cve_id}} in {{repo}} ({{severity}})"
                description: "Affected package: {{package_name}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "Security patch: {{cve_id}} in {{repo}}"
                category: "security"
            - name: alert-security
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_security_channel"
                text: "Vulnerability: {{cve_id}} ({{severity}}) in {{repo}} | Package: {{package_name}} | Jira: {{create-jira-ticket.key}} | Change: {{create-change-request.number}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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: servicenow
      baseUri: "https://marathon-petroleum.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: create-change
              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/security/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority for project tracking."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-mgmt
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, and assignee."
          inputParameters:
            - name: issue_key
              type: string
              description: "Jira issue key (e.g. OPS-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://marathon-petroleum.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

Summarizes completed Jira sprint story points and posts a velocity digest to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Digest"
  description: "Summarizes completed Jira sprint story points and posts a velocity digest to the engineering Teams channel."
  tags:
    - devops
    - project-management
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: digest-sprint-velocity
          description: "Given a Jira board ID and sprint ID, fetch completed issues and story points, then post a sprint velocity summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              type: string
              description: "Jira board ID."
            - name: sprint_id
              type: string
              description: "Jira sprint ID to report on."
            - name: teams_channel_id
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: get-sprint-issues
              type: call
              call: jira.get-sprint-issues
              with:
                boardId: "{{board_id}}"
                sprintId: "{{sprint_id}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Sprint {{sprint_id}} complete — {{get-sprint-issues.totalPoints}} story points across {{get-sprint-issues.issueCount}} issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
          inputParameters:
            - name: boardId
              in: path
            - name: sprintId
              in: path
          operations:
            - name: get-sprint-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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Datadog detects a Kubernetes pod crash loop, creates a ServiceNow incident, gathers pod logs from Splunk, and alerts the platform team via Teams.

naftiko: "0.5"
info:
  label: "Kubernetes Pod Failure Escalation"
  description: "When Datadog detects a Kubernetes pod crash loop, creates a ServiceNow incident, gathers pod logs from Splunk, and alerts the platform team via Teams."
  tags:
    - devops
    - kubernetes
    - datadog
    - servicenow
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: escalate-pod-failure
          description: "Given a failing pod and namespace, gather context, create incident, and notify team."
          inputParameters:
            - name: pod_name
              type: string
              description: "Kubernetes pod name."
            - name: namespace
              type: string
              description: "Kubernetes namespace."
            - name: cluster
              type: string
              description: "Cluster name."
          steps:
            - name: get-pod-logs
              type: call
              call: splunk.search-pod-logs
              with:
                pod: "{{pod_name}}"
                namespace: "{{namespace}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Pod crash loop: {{pod_name}} in {{namespace}} ({{cluster}})"
                urgency: "2"
                description: "Recent logs: {{get-pod-logs.results}}"
            - name: notify-platform
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_platform_channel"
                text: "Pod failure: {{pod_name}} in {{namespace}} ({{cluster}}) | SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.marathon-petroleum.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: search-pod-logs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/platform/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls open positions from Workday, creates LinkedIn job postings, and posts a campaign summary to the talent acquisition team via Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Campaign"
  description: "Pulls open positions from Workday, creates LinkedIn job postings, and posts a campaign summary to the talent acquisition team via Teams."
  tags:
    - hr
    - talent-acquisition
    - workday
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: launch-talent-campaign
          description: "Given a job family, pull open positions and create LinkedIn postings."
          inputParameters:
            - name: job_family
              type: string
              description: "Job family (e.g. Engineering, Operations, IT)."
          steps:
            - name: get-open-positions
              type: call
              call: workday.get-open-positions
              with:
                job_family: "{{job_family}}"
            - name: create-linkedin-posts
              type: call
              call: linkedin.create-job-posting
              with:
                positions: "{{get-open-positions.results}}"
            - name: notify-talent
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_talent_channel"
                text: "LinkedIn campaign launched for {{job_family}}: {{get-open-positions.count}} positions posted | LinkedIn: {{create-linkedin-posts.post_count}} jobs live"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: positions
          path: "/recruiting/positions"
          operations:
            - name: get-open-positions
              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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/talent/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for carrier delivery metrics, enriches with SAP freight cost data, and posts the scorecard to the logistics team via Teams.

naftiko: "0.5"
info:
  label: "Logistics Carrier Performance Scorecard"
  description: "Queries Snowflake for carrier delivery metrics, enriches with SAP freight cost data, and posts the scorecard to the logistics team via Teams."
  tags:
    - logistics
    - supply-chain
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics-reporting
      port: 8080
      tools:
        - name: generate-carrier-scorecard
          description: "Given a carrier and date range, generate the performance scorecard."
          inputParameters:
            - name: carrier_id
              type: string
              description: "Carrier identifier."
            - name: period
              type: string
              description: "Reporting period."
          steps:
            - name: get-delivery-metrics
              type: call
              call: snowflake.query-carrier-metrics
              with:
                carrier_id: "{{carrier_id}}"
                period: "{{period}}"
            - name: get-freight-costs
              type: call
              call: sap.get-freight-data
              with:
                carrier_id: "{{carrier_id}}"
                period: "{{period}}"
            - name: post-scorecard
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_logistics_channel"
                text: "Carrier scorecard {{carrier_id}} ({{period}}): On-time: {{get-delivery-metrics.on_time_pct}}% | Damage rate: {{get-delivery-metrics.damage_pct}}% | Freight cost: ${{get-freight-costs.total_cost}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-carrier-metrics
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: freight-orders
          path: "/A_FreightOrder"
          operations:
            - name: get-freight-data
              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/logistics/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Coordinates marine vessel arrivals by querying Snowflake for berth availability, validating SAP transportation orders, and notifying the marine operations team.

naftiko: "0.5"
info:
  label: "Marine Vessel Scheduling Workflow"
  description: "Coordinates marine vessel arrivals by querying Snowflake for berth availability, validating SAP transportation orders, and notifying the marine operations team."
  tags:
    - logistics
    - marine
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marine-ops
      port: 8080
      tools:
        - name: schedule-vessel
          description: "Given vessel details and arrival window, check berth availability and coordinate."
          inputParameters:
            - name: vessel_name
              type: string
              description: "Vessel name."
            - name: terminal
              type: string
              description: "Marine terminal code."
            - name: eta
              type: string
              description: "Estimated time of arrival."
          steps:
            - name: check-berth
              type: call
              call: snowflake.query-berth-availability
              with:
                terminal: "{{terminal}}"
                date: "{{eta}}"
            - name: validate-orders
              type: call
              call: sap.get-transport-orders
              with:
                vessel: "{{vessel_name}}"
            - name: notify-marine-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_marine_channel"
                text: "Vessel {{vessel_name}} ETA {{eta}} at {{terminal}} | Berth: {{check-berth.assigned_berth}} | Orders: {{validate-orders.order_count}} | Volume: {{validate-orders.total_barrels}} bbl"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-berth-availability
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_TRANSPORTATION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transport-orders
          path: "/A_TransportationOrder"
          operations:
            - name: get-transport-orders
              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/marine/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Posts a notification message to a specified Microsoft Teams channel for operational alerts and status updates.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notification"
  description: "Posts a notification message to a specified Microsoft Teams channel for operational alerts and status updates."
  tags:
    - collaboration
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: notifications
      port: 8080
      tools:
        - name: post-teams-message
          description: "Post a message to a Microsoft Teams channel."
          inputParameters:
            - name: channel_id
              type: string
              description: "The Teams channel ID."
            - name: message
              type: string
              description: "The message text to post."
          call: msteams.post-channel-message
          with:
            channel_id: "{{channel_id}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for pipeline nominations, validates against SAP transportation orders, and posts the optimized schedule to the logistics team via Teams.

naftiko: "0.5"
info:
  label: "Midstream Scheduling Optimization"
  description: "Queries Snowflake for pipeline nominations, validates against SAP transportation orders, and posts the optimized schedule to the logistics team via Teams."
  tags:
    - midstream
    - logistics
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: midstream-scheduling
      port: 8080
      tools:
        - name: optimize-schedule
          description: "Given a date range and pipeline system, optimize the midstream schedule."
          inputParameters:
            - name: pipeline_system
              type: string
              description: "Pipeline system identifier."
            - name: schedule_date
              type: string
              description: "Schedule date in ISO 8601 format."
          steps:
            - name: get-nominations
              type: call
              call: snowflake.run-nominations-query
              with:
                pipeline: "{{pipeline_system}}"
                date: "{{schedule_date}}"
            - name: validate-orders
              type: call
              call: sap.get-transport-orders
              with:
                pipeline: "{{pipeline_system}}"
                date: "{{schedule_date}}"
            - name: post-schedule
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_midstream_channel"
                text: "Midstream schedule {{pipeline_system}} for {{schedule_date}}: Nominations: {{get-nominations.total_volume}} bbl | Orders: {{validate-orders.order_count}} | Utilization: {{get-nominations.utilization_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-nominations-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_TRANSPORTATION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transport-orders
          path: "/A_TransportationOrder"
          operations:
            - name: get-transport-orders
              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/midstream/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 a Microsoft 365 account, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID, start date, and facility assignment, create a ServiceNow onboarding ticket, provision a Microsoft 365 account, and send a Teams welcome message to the new hire."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID for the new hire."
            - name: facility
              type: string
              description: "Refinery or facility name the employee is assigned to."
            - name: start_date
              type: string
              description: "Employment start date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}} — {{facility}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                mail: "{{get-worker.work_email}}"
                officeLocation: "{{facility}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Marathon Petroleum, {{get-worker.first_name}}! Your onboarding ticket is {{create-ticket.number}}. Start date: {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marathon-petroleum/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

When a ServiceNow access request is approved, provisions the user's Okta group membership and resolves the ticket with a confirmation.

naftiko: "0.5"
info:
  label: "Okta Access Provisioning"
  description: "When a ServiceNow access request is approved, provisions the user's Okta group membership and resolves the ticket with a confirmation."
  tags:
    - identity
    - security
    - okta
    - servicenow
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: fulfill-access-request
          description: "Given an approved ServiceNow access request, add the user to the specified Okta group, resolve the ticket, and confirm access via Teams."
          inputParameters:
            - name: snow_ticket_id
              type: string
              description: "ServiceNow access request sys_id."
            - name: user_email
              type: string
              description: "User email to provision access for."
            - name: okta_group_id
              type: string
              description: "Okta group ID to assign the user to."
          steps:
            - name: add-to-group
              type: call
              call: okta.add-user-to-group
              with:
                groupId: "{{okta_group_id}}"
                userId: "{{user_email}}"
            - name: resolve-ticket
              type: call
              call: servicenow.update-request
              with:
                sys_id: "{{snow_ticket_id}}"
                state: "3"
                close_notes: "Access provisioned to Okta group {{okta_group_id}}"
            - name: confirm-user
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{user_email}}"
                text: "Access granted: you have been added to the requested system (group: {{okta_group_id}})."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users/{{userId}}"
          inputParameters:
            - name: groupId
              in: path
            - name: userId
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-request
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Queries Okta for users without MFA enrolled, creates a ServiceNow compliance ticket, and notifies the IT security team via Teams.

naftiko: "0.5"
info:
  label: "Okta MFA Non-Compliance Escalation"
  description: "Queries Okta for users without MFA enrolled, creates a ServiceNow compliance ticket, and notifies the IT security team via Teams."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-compliance
      port: 8080
      tools:
        - name: escalate-mfa-noncompliance
          description: "Given a department or group, find non-compliant users and create escalation."
          inputParameters:
            - name: group_name
              type: string
              description: "Okta group to audit."
          steps:
            - name: get-noncompliant-users
              type: call
              call: okta.list-users-without-mfa
              with:
                group: "{{group_name}}"
            - name: create-compliance-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "MFA non-compliance: {{get-noncompliant-users.count}} users in {{group_name}}"
                category: "security"
                urgency: "2"
            - name: notify-security
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_it_security_channel"
                text: "MFA audit: {{get-noncompliant-users.count}} users in {{group_name}} without MFA | SNOW: {{create-compliance-ticket.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/groups/{{group}}/users"
          inputParameters:
            - name: group
              in: path
          operations:
            - name: list-users-without-mfa
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/it-security/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves an Okta user profile by login email, returning the user status, last login timestamp, and assigned groups.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Retrieves an Okta user profile by login email, returning the user status, last login timestamp, and assigned groups."
  tags:
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-okta-user
          description: "Look up an Okta user by email. Returns status and last login."
          inputParameters:
            - name: email
              type: string
              description: "User login email address."
          call: okta.get-user
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves a PagerDuty incident by ID, returning status, urgency, and assigned responders for on-call management.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Lookup"
  description: "Retrieves a PagerDuty incident by ID, returning status, urgency, and assigned responders for on-call management."
  tags:
    - itsm
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: on-call
      port: 8080
      tools:
        - name: get-pd-incident
          description: "Look up a PagerDuty incident by ID. Returns status and urgency."
          inputParameters:
            - name: incident_id
              type: string
              description: "PagerDuty incident ID."
          call: pagerduty.get-incident
          with:
            incident_id: "{{incident_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.incident.status"
            - name: urgency
              type: string
              mapping: "$.incident.urgency"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET

Retrieves active headcount by department and cost center from Workday for payroll planning and workforce cost reporting.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Retrieves active headcount by department and cost center from Workday for payroll planning and workforce cost reporting."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Return active employees grouped by department and cost center from Workday. Use for headcount planning, payroll budgeting, and facility staffing analysis."
          call: workday.headcount-export
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.fullName"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
  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-export
          path: "/marathon-petroleum/workers"
          operations:
            - name: headcount-export
              method: GET

When a SCADA system detects a potential pipeline leak, creates a ServiceNow P1 incident, notifies the pipeline operations team on Teams, and triggers a PagerDuty alert for the on-call engineer.

naftiko: "0.5"
info:
  label: "Pipeline Leak Detection Response"
  description: "When a SCADA system detects a potential pipeline leak, creates a ServiceNow P1 incident, notifies the pipeline operations team on Teams, and triggers a PagerDuty alert for the on-call engineer."
  tags:
    - operations
    - safety
    - servicenow
    - microsoft-teams
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: pipeline-safety
      port: 8080
      tools:
        - name: handle-leak-detection
          description: "Given a SCADA leak alert with pipeline segment and pressure data, create incident, notify team, and page on-call."
          inputParameters:
            - name: segment_id
              type: string
              description: "Pipeline segment identifier."
            - name: pressure_reading
              type: string
              description: "Current pressure reading in PSI."
            - name: threshold
              type: string
              description: "Normal pressure threshold in PSI."
            - name: location
              type: string
              description: "Geographic location of the segment."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Pipeline leak alert: Segment {{segment_id}} at {{location}} — pressure {{pressure_reading}} PSI"
                urgency: "1"
                impact: "1"
                category: "pipeline_safety"
            - name: notify-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_pipeline_ops_channel"
                text: "LEAK ALERT: Segment {{segment_id}} | Location: {{location}} | Pressure: {{pressure_reading}} PSI (threshold: {{threshold}} PSI) | Incident: {{create-incident.number}}"
            - name: page-on-call
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pd_pipeline_service_id"
                title: "Pipeline leak detection: {{segment_id}} at {{location}}"
                urgency: "high"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/pipeline-ops/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: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Triggers a refresh on a Power BI dataset by dataset ID for updated reporting and dashboards.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Trigger"
  description: "Triggers a refresh on a Power BI dataset by dataset ID for updated reporting and dashboards."
  tags:
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-dataset
          description: "Trigger a Power BI dataset refresh by dataset ID."
          inputParameters:
            - name: dataset_id
              type: string
              description: "Power BI dataset ID."
          call: powerbi.refresh-dataset
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - 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: refresh-dataset
              method: POST

Triggers a Power BI dataset refresh for the refinery operations dashboard and notifies the operations team when the latest data is available.

naftiko: "0.5"
info:
  label: "Power BI Operations Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the refinery operations dashboard and notifies the operations team when the latest data is available."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - operations
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-operations-dashboard
          description: "Trigger a Power BI dataset refresh for the refinery operations dashboard. Notify the operations Teams channel when the refresh is initiated."
          inputParameters:
            - name: workspace_id
              type: string
              description: "Power BI workspace ID containing the operations dashboard."
            - name: dataset_id
              type: string
              description: "Power BI operations dataset ID."
            - name: teams_channel_id
              type: string
              description: "Operations Teams channel ID."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-refresh
              with:
                workspaceId: "{{workspace_id}}"
                datasetId: "{{dataset_id}}"
            - name: notify-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Refinery operations dashboard refresh triggered. Latest throughput and efficiency data will be available shortly."
  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/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: workspaceId
              in: path
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls PSM action items from Jira, queries Snowflake for inspection history, and posts the compliance summary to the EHS leadership channel.

naftiko: "0.5"
info:
  label: "Process Safety Management Review"
  description: "Pulls PSM action items from Jira, queries Snowflake for inspection history, and posts the compliance summary to the EHS leadership channel."
  tags:
    - ehs
    - compliance
    - jira
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: psm-compliance
      port: 8080
      tools:
        - name: review-psm-status
          description: "Given a facility, generate the PSM compliance review digest."
          inputParameters:
            - name: facility
              type: string
              description: "Facility name."
          steps:
            - name: get-action-items
              type: call
              call: jira.search-issues
              with:
                jql: "project = PSM AND facility = '{{facility}}' AND status != Done"
            - name: get-inspection-history
              type: call
              call: snowflake.query-inspections
              with:
                facility: "{{facility}}"
            - name: post-review
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ehs_leadership_channel"
                text: "PSM review {{facility}}: Open items: {{get-action-items.total}} | Overdue: {{get-action-items.overdue}} | Last inspection: {{get-inspection-history.last_date}} | Next due: {{get-inspection-history.next_due}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-inspections
              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/ehs-leadership/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls lab quality data from Snowflake for a product batch, generates a certificate of analysis, uploads to SharePoint, and notifies the quality team.

naftiko: "0.5"
info:
  label: "Product Quality Certificate Generation"
  description: "Pulls lab quality data from Snowflake for a product batch, generates a certificate of analysis, uploads to SharePoint, and notifies the quality team."
  tags:
    - quality
    - operations
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-mgmt
      port: 8080
      tools:
        - name: generate-quality-cert
          description: "Given a batch number, pull lab data and generate quality certificate."
          inputParameters:
            - name: batch_number
              type: string
              description: "Production batch number."
            - name: product
              type: string
              description: "Product name."
          steps:
            - name: get-lab-results
              type: call
              call: snowflake.query-lab-results
              with:
                batch: "{{batch_number}}"
            - name: upload-certificate
              type: call
              call: sharepoint.upload-document
              with:
                site: "quality"
                path: "/Certificates/{{product}}_{{batch_number}}.pdf"
            - name: notify-quality
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_quality_channel"
                text: "Quality cert generated: {{product}} Batch {{batch_number}} | Specs: {{get-lab-results.summary}} | Certificate uploaded to SharePoint"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-lab-results
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/quality/drive/root:/{{path}}:/content"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: upload-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/quality/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls financial data from SAP and Snowflake, refreshes the executive Power BI dashboard, and posts the preparation checklist to the investor relations team.

naftiko: "0.5"
info:
  label: "Quarterly Earnings Data Preparation"
  description: "Pulls financial data from SAP and Snowflake, refreshes the executive Power BI dashboard, and posts the preparation checklist to the investor relations team."
  tags:
    - finance
    - investor-relations
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ir-reporting
      port: 8080
      tools:
        - name: prepare-earnings-data
          description: "Given a fiscal quarter, aggregate financial data and prepare reporting packages."
          inputParameters:
            - name: fiscal_quarter
              type: string
              description: "Fiscal quarter (e.g. Q1-2026)."
          steps:
            - name: get-financials
              type: call
              call: sap.get-quarterly-financials
              with:
                quarter: "{{fiscal_quarter}}"
            - name: get-ops-metrics
              type: call
              call: snowflake.query-quarterly-ops
              with:
                quarter: "{{fiscal_quarter}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "$secrets.executive_dashboard_id"
            - name: notify-ir
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ir_channel"
                text: "Earnings prep {{fiscal_quarter}}: Revenue: ${{get-financials.revenue}}M | Throughput: {{get-ops-metrics.throughput_bpd}} BPD | Dashboard refreshed"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: financials
          path: "/A_GLAccountBalance"
          operations:
            - name: get-quarterly-financials
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-quarterly-ops
              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: 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/ir/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for rail car location data, updates SAP transportation records, and posts the fleet position summary to the logistics team.

naftiko: "0.5"
info:
  label: "Rail Car Tracking Update"
  description: "Queries Snowflake for rail car location data, updates SAP transportation records, and posts the fleet position summary to the logistics team."
  tags:
    - logistics
    - rail
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rail-logistics
      port: 8080
      tools:
        - name: update-railcar-tracking
          description: "Given a date, pull rail car positions and update tracking systems."
          inputParameters:
            - name: report_date
              type: string
              description: "Report date."
          steps:
            - name: get-positions
              type: call
              call: snowflake.query-railcar-positions
              with:
                date: "{{report_date}}"
            - name: update-sap-transport
              type: call
              call: sap.update-transport-status
              with:
                date: "{{report_date}}"
            - name: post-summary
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_rail_channel"
                text: "Rail fleet ({{report_date}}): In transit: {{get-positions.in_transit}} | At terminal: {{get-positions.at_terminal}} | Delayed: {{get-positions.delayed}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-railcar-positions
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_TRANSPORTATION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transport-orders
          path: "/A_TransportationOrder"
          operations:
            - name: update-transport-status
              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/rail/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for refinery energy usage data, compares against budget in SAP, refreshes the Power BI energy dashboard, and posts the summary.

naftiko: "0.5"
info:
  label: "Refinery Energy Consumption Report"
  description: "Queries Snowflake for refinery energy usage data, compares against budget in SAP, refreshes the Power BI energy dashboard, and posts the summary."
  tags:
    - operations
    - energy
    - snowflake
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: energy-reporting
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a refinery and period, pull energy data and post the consumption report."
          inputParameters:
            - name: refinery
              type: string
              description: "Refinery identifier."
            - name: period
              type: string
              description: "Reporting period."
          steps:
            - name: query-energy-data
              type: call
              call: snowflake.run-energy-query
              with:
                refinery: "{{refinery}}"
                period: "{{period}}"
            - name: get-budget
              type: call
              call: sap.get-energy-budget
              with:
                refinery: "{{refinery}}"
                period: "{{period}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "$secrets.energy_dashboard_dataset_id"
            - name: post-report
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_energy_channel"
                text: "Energy report {{refinery}} ({{period}}): Consumption: {{query-energy-data.total_mmbtu}} MMBtu | Budget: {{get-budget.budget_mmbtu}} MMBtu | Variance: {{query-energy-data.variance_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-energy-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-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"
          operations:
            - name: get-energy-budget
              method: GET
    - 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: 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/energy/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Datadog monitor fires for a refinery operations system, creates a ServiceNow P1 incident and notifies the operations engineering Teams channel.

naftiko: "0.5"
info:
  label: "Refinery Operations Alert Response"
  description: "When a Datadog monitor fires for a refinery operations system, creates a ServiceNow P1 incident and notifies the operations engineering Teams channel."
  tags:
    - itsm
    - observability
    - datadog
    - servicenow
    - operations
capability:
  exposes:
    - type: mcp
      namespace: ops-triage
      port: 8080
      tools:
        - name: handle-operations-alert
          description: "Given a Datadog monitor ID and affected refinery system, create a ServiceNow P1 incident and alert the operations engineering Teams channel with full context."
          inputParameters:
            - name: monitor_id
              type: string
              description: "Datadog monitor ID that triggered the alert."
            - name: facility
              type: string
              description: "Refinery or facility name where the alert originated."
            - name: affected_system
              type: string
              description: "Name of the affected operations system or service."
            - name: severity
              type: string
              description: "Alert severity: critical or warning."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Operations alert: {{facility}} — {{affected_system}} ({{severity}})"
                urgency: "1"
                impact: "1"
                description: "Monitor {{monitor_id}}: {{get-monitor.message}}"
            - name: alert-ops-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "operations-alerts"
                text: "Refinery alert at {{facility}}: {{affected_system}} ({{severity}}) | ServiceNow: {{create-incident.number}} | Monitor: {{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Coordinates a refinery turnaround by pulling maintenance orders from SAP, creating a Jira project board, and posting the schedule to the operations Teams channel.

naftiko: "0.5"
info:
  label: "Refinery Turnaround Planning Workflow"
  description: "Coordinates a refinery turnaround by pulling maintenance orders from SAP, creating a Jira project board, and posting the schedule to the operations Teams channel."
  tags:
    - operations
    - maintenance
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: turnaround-planning
      port: 8080
      tools:
        - name: plan-turnaround
          description: "Given a refinery unit and planned date range, pull SAP maintenance orders, create Jira tracking, and notify the team."
          inputParameters:
            - name: refinery_unit
              type: string
              description: "Refinery unit identifier."
            - name: start_date
              type: string
              description: "Turnaround start date in ISO 8601 format."
            - name: end_date
              type: string
              description: "Turnaround end date in ISO 8601 format."
          steps:
            - name: get-maintenance-orders
              type: call
              call: sap.list-maintenance-orders
              with:
                plant: "{{refinery_unit}}"
                date_from: "{{start_date}}"
                date_to: "{{end_date}}"
            - name: create-jira-epic
              type: call
              call: jira.create-issue
              with:
                project: TURN
                issuetype: Epic
                summary: "Turnaround: {{refinery_unit}} ({{start_date}} to {{end_date}})"
                description: "Maintenance orders: {{get-maintenance-orders.count}} items scheduled"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_turnaround_channel"
                text: "Turnaround planned for {{refinery_unit}}: {{start_date}} to {{end_date}} | {{get-maintenance-orders.count}} work orders | Jira: {{create-jira-epic.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-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?$filter=MaintenancePlant eq '{{plant}}'"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: list-maintenance-orders
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/turnaround/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Jira for upcoming regulatory filing deadlines, validates completion status, and sends escalation notifications via Teams for overdue items.

naftiko: "0.5"
info:
  label: "Regulatory Filing Deadline Tracker"
  description: "Queries Jira for upcoming regulatory filing deadlines, validates completion status, and sends escalation notifications via Teams for overdue items."
  tags:
    - compliance
    - regulatory
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-compliance
      port: 8080
      tools:
        - name: track-filing-deadlines
          description: "Given a regulatory category, check upcoming deadlines and escalate overdue items."
          inputParameters:
            - name: category
              type: string
              description: "Regulatory category (e.g. EPA, DOT, OSHA, SEC)."
          steps:
            - name: get-filings
              type: call
              call: jira.search-issues
              with:
                jql: "project = REG AND category = '{{category}}' AND duedate <= 30d"
            - name: notify-compliance
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_compliance_channel"
                text: "Regulatory deadlines ({{category}}): Due in 30 days: {{get-filings.total}} | Overdue: {{get-filings.overdue}} | Next deadline: {{get-filings.next_due_date}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              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/compliance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for renewable diesel blending ratios, validates RIN credit compliance, and posts the daily blending report to the renewable fuels team.

naftiko: "0.5"
info:
  label: "Renewable Diesel Blending Report"
  description: "Queries Snowflake for renewable diesel blending ratios, validates RIN credit compliance, and posts the daily blending report to the renewable fuels team."
  tags:
    - renewable-fuels
    - compliance
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: renewable-ops
      port: 8080
      tools:
        - name: generate-blending-report
          description: "Given a facility and date, pull blending data and post compliance report."
          inputParameters:
            - name: facility
              type: string
              description: "Blending facility code."
            - name: report_date
              type: string
              description: "Report date."
          steps:
            - name: query-blending-data
              type: call
              call: snowflake.run-blending-query
              with:
                facility: "{{facility}}"
                date: "{{report_date}}"
            - name: check-rin-compliance
              type: call
              call: snowflake.run-rin-query
              with:
                facility: "{{facility}}"
                date: "{{report_date}}"
            - name: post-report
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_renewable_channel"
                text: "Blending report {{facility}} ({{report_date}}): Blend ratio: {{query-blending-data.blend_pct}}% | Volume: {{query-blending-data.total_gallons}} gal | RIN compliance: {{check-rin-compliance.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-blending-query
              method: POST
            - name: run-rin-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/renewable/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pushes fuel price updates to retail stations by querying Snowflake for competitive pricing data, updating SAP pricing records, and notifying the retail operations team.

naftiko: "0.5"
info:
  label: "Retail Fuel Pricing Update Workflow"
  description: "Pushes fuel price updates to retail stations by querying Snowflake for competitive pricing data, updating SAP pricing records, and notifying the retail operations team."
  tags:
    - retail
    - pricing
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail-pricing
      port: 8080
      tools:
        - name: update-fuel-pricing
          description: "Given a market region and fuel grade, pull competitive pricing and update station prices."
          inputParameters:
            - name: market_region
              type: string
              description: "Market region code."
            - name: fuel_grade
              type: string
              description: "Fuel grade (regular, midgrade, premium, diesel)."
          steps:
            - name: get-competitive-pricing
              type: call
              call: snowflake.run-pricing-query
              with:
                region: "{{market_region}}"
                grade: "{{fuel_grade}}"
            - name: update-sap-pricing
              type: call
              call: sap.update-condition-record
              with:
                region: "{{market_region}}"
                material: "{{fuel_grade}}"
                price: "{{get-competitive-pricing.recommended_price}}"
            - name: notify-retail-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_retail_ops_channel"
                text: "Fuel pricing update: {{market_region}} {{fuel_grade}} set to ${{get-competitive-pricing.recommended_price}}/gal (market avg: ${{get-competitive-pricing.market_avg}})"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-pricing-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: condition-records
          path: "/A_SlsPrcgConditionRecord"
          operations:
            - name: update-condition-record
              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/retail/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a safety incident is reported, creates a ServiceNow incident, assigns a Jira investigation task, and notifies EHS leadership via Teams.

naftiko: "0.5"
info:
  label: "Safety Incident Investigation Workflow"
  description: "When a safety incident is reported, creates a ServiceNow incident, assigns a Jira investigation task, and notifies EHS leadership via Teams."
  tags:
    - ehs
    - safety
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety-investigation
      port: 8080
      tools:
        - name: initiate-investigation
          description: "Given a safety incident report, create tracking across systems and notify leadership."
          inputParameters:
            - name: incident_type
              type: string
              description: "Type of safety incident (e.g. near_miss, first_aid, recordable)."
            - name: facility
              type: string
              description: "Facility where incident occurred."
            - name: description
              type: string
              description: "Incident description."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Safety incident: {{incident_type}} at {{facility}}"
                urgency: "1"
                category: "safety"
                description: "{{description}}"
            - name: create-investigation
              type: call
              call: jira.create-issue
              with:
                project: EHS
                issuetype: Task
                summary: "Investigate {{incident_type}} at {{facility}}"
                description: "ServiceNow: {{create-snow-incident.number}}. {{description}}"
            - name: notify-leadership
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ehs_leadership_channel"
                text: "Safety incident: {{incident_type}} at {{facility}} | SNOW: {{create-snow-incident.number}} | Investigation: {{create-investigation.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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://marathon-petroleum.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/ehs/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates a request for quotation in SAP Ariba, notifies selected suppliers, and posts the RFQ status to the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba RFQ Processing"
  description: "Creates a request for quotation in SAP Ariba, notifies selected suppliers, and posts the RFQ status to the procurement team via Teams."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-rfq
      port: 8080
      tools:
        - name: process-rfq
          description: "Given material requirements, create an RFQ and notify suppliers and procurement."
          inputParameters:
            - name: material_description
              type: string
              description: "Description of materials needed."
            - name: quantity
              type: string
              description: "Required quantity."
            - name: delivery_date
              type: string
              description: "Required delivery date."
          steps:
            - name: create-rfq
              type: call
              call: ariba.create-rfq
              with:
                description: "{{material_description}}"
                quantity: "{{quantity}}"
                delivery_date: "{{delivery_date}}"
            - name: notify-procurement
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_procurement_channel"
                text: "RFQ created: {{material_description}} | Qty: {{quantity}} | Delivery by: {{delivery_date}} | Ariba ID: {{create-rfq.rfq_id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: rfqs
          path: "/rfqs"
          operations:
            - name: create-rfq
              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/procurement/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Registers a new supplier in SAP Ariba, creates the vendor master record in SAP S/4HANA, and notifies the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba, creates the vendor master record in SAP S/4HANA, and notifies the procurement team via Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier name and country, register the supplier in SAP Ariba, create the SAP S/4HANA vendor master record, and notify the procurement manager via Teams."
          inputParameters:
            - name: supplier_name
              type: string
              description: "Legal name of the supplier."
            - name: supplier_country
              type: string
              description: "Two-letter ISO country code for the supplier."
            - name: procurement_manager_upn
              type: string
              description: "UPN of the procurement manager for notification."
          steps:
            - name: register-ariba
              type: call
              call: sap-ariba.create-supplier
              with:
                supplierName: "{{supplier_name}}"
                country: "{{supplier_country}}"
            - name: create-vendor
              type: call
              call: sap.create-vendor
              with:
                vendorName: "{{supplier_name}}"
                country: "{{supplier_country}}"
                aribaId: "{{register-ariba.supplierId}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{procurement_manager_upn}}"
                text: "Supplier {{supplier_name}} onboarded. Ariba ID: {{register-ariba.supplierId}}, SAP Vendor: {{create-vendor.vendorId}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://marathon-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"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Extracts cost center budget vs. actuals from SAP S/4HANA and pushes variance data to Power BI for finance and operations reporting.

naftiko: "0.5"
info:
  label: "SAP Budget vs Actuals Reporting"
  description: "Extracts cost center budget vs. actuals from SAP S/4HANA and pushes variance data to Power BI for finance and operations reporting."
  tags:
    - finance
    - erp
    - sap
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: publish-budget-variance
          description: "Given a fiscal period and cost center, extract budget vs. actuals from SAP S/4HANA and push the variance rows to the Power BI finance dashboard."
          inputParameters:
            - name: fiscal_period
              type: string
              description: "Fiscal period in YYYYMM format (e.g., 202603)."
            - name: cost_center
              type: string
              description: "SAP cost center code."
          steps:
            - name: get-actuals
              type: call
              call: sap.get-cost-center-actuals
              with:
                fiscalPeriod: "{{fiscal_period}}"
                costCenter: "{{cost_center}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                datasetId: "$secrets.powerbi_finance_dataset_id"
                tableName: "BudgetVariance"
                rows: "{{get-actuals.rows}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/YY1_COSTCENTERACTUALS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActuals"
          inputParameters:
            - name: fiscalPeriod
              in: query
            - name: costCenter
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-rows
          path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
          inputParameters:
            - name: datasetId
              in: path
            - name: tableName
              in: path
          operations:
            - name: push-rows
              method: POST

Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Review"
  description: "Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: review-pending-expenses
          description: "Retrieve pending expense reports from SAP Concur for a given cost center. Notify the manager via Teams for reports above the policy threshold."
          inputParameters:
            - name: cost_center
              type: string
              description: "SAP cost center code to retrieve pending expense reports for."
            - name: threshold_usd
              type: number
              description: "Dollar threshold above which manager approval is required."
          steps:
            - name: get-reports
              type: call
              call: concur.list-expense-reports
              with:
                costCenter: "{{cost_center}}"
                approvalStatus: "pending"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-reports.managerEmail}}"
                text: "Expense reports pending for cost center {{cost_center}} — reports above ${{threshold_usd}} need your approval."
  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"
          inputParameters:
            - name: costCenter
              in: query
            - name: approvalStatus
              in: query
          operations:
            - name: list-expense-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Retrieves cost center details from SAP by cost center ID, returning the responsible person, department, and controlling area.

naftiko: "0.5"
info:
  label: "SAP Cost Center Lookup"
  description: "Retrieves cost center details from SAP by cost center ID, returning the responsible person, department, and controlling area."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-controlling
      port: 8080
      tools:
        - name: get-cost-center
          description: "Look up an SAP cost center. Returns responsible person and department."
          inputParameters:
            - name: cost_center_id
              type: string
              description: "SAP cost center ID."
          call: sap.get-cost-center
          with:
            cost_center_id: "{{cost_center_id}}"
          outputParameters:
            - name: responsible_person
              type: string
              mapping: "$.d.ResponsiblePerson"
            - name: department
              type: string
              mapping: "$.d.CostCenterDescription"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-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_id}}')"
          inputParameters:
            - name: cost_center_id
              in: path
          operations:
            - name: get-cost-center
              method: GET

Processes a vendor credit memo in SAP, validates against the original invoice, and notifies the accounts payable team via Teams.

naftiko: "0.5"
info:
  label: "SAP Credit Memo Processing"
  description: "Processes a vendor credit memo in SAP, validates against the original invoice, and notifies the accounts payable team via Teams."
  tags:
    - finance
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ap-credits
      port: 8080
      tools:
        - name: process-credit-memo
          description: "Given a credit memo and original invoice, validate and process in SAP."
          inputParameters:
            - name: credit_memo_number
              type: string
              description: "Credit memo document number."
            - name: original_invoice
              type: string
              description: "Original invoice number."
            - name: credit_amount
              type: string
              description: "Credit amount."
          steps:
            - name: get-original-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{original_invoice}}"
            - name: post-credit-memo
              type: call
              call: sap.post-credit-memo
              with:
                reference: "{{original_invoice}}"
                amount: "{{credit_amount}}"
            - name: notify-ap
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ap_channel"
                text: "Credit memo processed: {{credit_memo_number}} for ${{credit_amount}} against invoice {{original_invoice}} (original: ${{get-original-invoice.amount}}) | Doc: {{post-credit-memo.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: credit-memos
          path: "/A_SupplierInvoice"
          operations:
            - name: post-credit-memo
              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/ap/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes a fixed asset capitalization in SAP, updates the asset register in Snowflake, and notifies the accounting team via Teams.

naftiko: "0.5"
info:
  label: "SAP Fixed Asset Capitalization"
  description: "Processes a fixed asset capitalization in SAP, updates the asset register in Snowflake, and notifies the accounting team via Teams."
  tags:
    - finance
    - fixed-assets
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-accounting
      port: 8080
      tools:
        - name: capitalize-asset
          description: "Given asset details, post capitalization in SAP and update tracking."
          inputParameters:
            - name: asset_description
              type: string
              description: "Asset description."
            - name: cost_center
              type: string
              description: "Cost center."
            - name: acquisition_value
              type: string
              description: "Acquisition value."
            - name: asset_class
              type: string
              description: "SAP asset class."
          steps:
            - name: post-capitalization
              type: call
              call: sap.create-fixed-asset
              with:
                description: "{{asset_description}}"
                cost_center: "{{cost_center}}"
                value: "{{acquisition_value}}"
                asset_class: "{{asset_class}}"
            - name: update-register
              type: call
              call: snowflake.insert-asset-record
              with:
                asset_number: "{{post-capitalization.asset_number}}"
                description: "{{asset_description}}"
                value: "{{acquisition_value}}"
            - name: notify-accounting
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_accounting_channel"
                text: "Asset capitalized: {{asset_description}} | SAP: {{post-capitalization.asset_number}} | Class: {{asset_class}} | Value: ${{acquisition_value}} | CC: {{cost_center}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fixed-assets
          path: "/A_FixedAsset"
          operations:
            - name: create-fixed-asset
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-asset-record
              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/accounting/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a general ledger account balance from SAP S/4HANA by company code and GL account number for financial reporting.

naftiko: "0.5"
info:
  label: "SAP GL Account Balance Lookup"
  description: "Retrieves a general ledger account balance from SAP S/4HANA by company code and GL account number for financial reporting."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up an SAP GL account balance by company code and account number."
          inputParameters:
            - name: company_code
              type: string
              description: "SAP company code."
            - name: gl_account
              type: string
              description: "GL account number."
          call: sap.get-gl-balance
          with:
            company_code: "{{company_code}}"
            gl_account: "{{gl_account}}"
          outputParameters:
            - name: balance
              type: string
              mapping: "$.d.EndingBalanceAmtInCoCodeCrcy"
            - name: currency
              type: string
              mapping: "$.d.CompanyCodeCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-accounts
          path: "/A_GLAccountBalance(CompanyCode='{{company_code}}',GLAccount='{{gl_account}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: gl_account
              in: path
          operations:
            - name: get-gl-balance
              method: GET

Processes a goods receipt in SAP against a purchase order, updates Snowflake inventory records, and notifies the warehouse team via Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Processing"
  description: "Processes a goods receipt in SAP against a purchase order, updates Snowflake inventory records, and notifies the warehouse team via Teams."
  tags:
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: process-goods-receipt
          description: "Given a PO number and delivery details, post goods receipt in SAP and update inventory."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: quantity
              type: string
              description: "Quantity received."
            - name: storage_location
              type: string
              description: "Storage location code."
          steps:
            - name: post-goods-receipt
              type: call
              call: sap.post-goods-receipt
              with:
                po_number: "{{po_number}}"
                quantity: "{{quantity}}"
                storage_location: "{{storage_location}}"
            - name: update-inventory
              type: call
              call: snowflake.update-inventory
              with:
                po_number: "{{po_number}}"
                quantity: "{{quantity}}"
            - name: notify-warehouse
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_warehouse_channel"
                text: "Goods receipt: PO {{po_number}} | Qty: {{quantity}} to {{storage_location}} | GR doc: {{post-goods-receipt.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_GOODS_RECEIPT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-receipts
          path: "/A_GoodsReceipt"
          operations:
            - name: post-goods-receipt
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: update-inventory
              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/warehouse/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls intercompany balances from SAP, runs matching logic in Snowflake, and posts unmatched items to the accounting team via Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Reconciliation"
  description: "Pulls intercompany balances from SAP, runs matching logic in Snowflake, and posts unmatched items to the accounting team via Teams."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ic-reconciliation
      port: 8080
      tools:
        - name: reconcile-intercompany
          description: "Given a fiscal period, run intercompany reconciliation and report exceptions."
          inputParameters:
            - name: fiscal_period
              type: string
              description: "Fiscal period."
            - name: company_code_1
              type: string
              description: "First company code."
            - name: company_code_2
              type: string
              description: "Second company code."
          steps:
            - name: get-ic-balances
              type: call
              call: sap.get-ic-balances
              with:
                period: "{{fiscal_period}}"
                co1: "{{company_code_1}}"
                co2: "{{company_code_2}}"
            - name: run-matching
              type: call
              call: snowflake.run-ic-matching
              with:
                period: "{{fiscal_period}}"
                co1: "{{company_code_1}}"
                co2: "{{company_code_2}}"
            - name: post-results
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_accounting_channel"
                text: "IC recon {{company_code_1}}<>{{company_code_2}} ({{fiscal_period}}): Matched: {{run-matching.matched_count}} | Unmatched: {{run-matching.unmatched_count}} | Variance: ${{run-matching.variance_amount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ic-balances
          path: "/A_GLAccountBalance"
          operations:
            - name: get-ic-balances
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-ic-matching
              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/accounting/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an SAP material falls below reorder point, creates a purchase requisition, notifies the procurement team via Teams, and logs the event in Snowflake.

naftiko: "0.5"
info:
  label: "SAP Inventory Reorder Point Alert"
  description: "When an SAP material falls below reorder point, creates a purchase requisition, notifies the procurement team via Teams, and logs the event in Snowflake."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: inventory-mgmt
      port: 8080
      tools:
        - name: handle-reorder-alert
          description: "Given a material at reorder point, create PR and notify procurement."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
            - name: plant
              type: string
              description: "Plant code."
            - name: current_stock
              type: string
              description: "Current stock quantity."
            - name: reorder_point
              type: string
              description: "Reorder point quantity."
          steps:
            - name: create-purchase-req
              type: call
              call: sap.create-purchase-requisition
              with:
                material: "{{material_number}}"
                plant: "{{plant}}"
                quantity: "{{reorder_point}}"
            - name: notify-procurement
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_procurement_channel"
                text: "Reorder alert: Material {{material_number}} at {{plant}} | Stock: {{current_stock}} (reorder: {{reorder_point}}) | PR: {{create-purchase-req.pr_number}}"
            - name: log-event
              type: call
              call: snowflake.log-reorder-event
              with:
                material: "{{material_number}}"
                plant: "{{plant}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-purchase-requisition
              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/procurement/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: log-reorder-event
              method: POST

Retrieves an accounts payable invoice payment status from SAP by invoice number, returning payment date and clearing document.

naftiko: "0.5"
info:
  label: "SAP Invoice Payment Status Lookup"
  description: "Retrieves an accounts payable invoice payment status from SAP by invoice number, returning payment date and clearing document."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-ap
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Look up an SAP invoice payment status by document number."
          inputParameters:
            - name: invoice_number
              type: string
              description: "SAP invoice document number."
          call: sap.get-invoice
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: payment_status
              type: string
              mapping: "$.d.ClearingStatus"
            - name: payment_date
              type: string
              mapping: "$.d.ClearingDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET

Performs a three-way match between SAP purchase order, goods receipt, and vendor invoice, posting exceptions to the AP team via Teams.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match"
  description: "Performs a three-way match between SAP purchase order, goods receipt, and vendor invoice, posting exceptions to the AP team via Teams."
  tags:
    - finance
    - procurement
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ap-matching
      port: 8080
      tools:
        - name: run-three-way-match
          description: "Given an invoice number, perform three-way match and report exceptions."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Vendor invoice number."
            - name: po_number
              type: string
              description: "Purchase order number."
          steps:
            - name: get-po
              type: call
              call: sap.get-purchase-order
              with:
                po_number: "{{po_number}}"
            - name: get-goods-receipt
              type: call
              call: sap.get-goods-receipt
              with:
                po_number: "{{po_number}}"
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: post-result
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ap_channel"
                text: "Three-way match: Invoice {{invoice_number}} / PO {{po_number}} | PO amt: {{get-po.total_value}} | GR qty: {{get-goods-receipt.quantity}} | Invoice amt: {{get-invoice.amount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-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_GoodsReceipt"
          operations:
            - name: get-goods-receipt
              method: GET
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              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/ap/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves material master data from SAP by material number, returning description, unit of measure, and stock levels for refinery supplies.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP by material number, returning description, unit of measure, and stock levels for refinery supplies."
  tags:
    - supply-chain
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-materials
      port: 8080
      tools:
        - name: get-material
          description: "Look up an SAP material by number. Returns description and stock."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: unrestricted_stock
              type: string
              mapping: "$.d.UnrestrictedStock"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Orchestrates month-end close by pulling SAP GL balances, running Snowflake variance analysis, and posting the reconciliation summary to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period Close Reconciliation"
  description: "Orchestrates month-end close by pulling SAP GL balances, running Snowflake variance analysis, and posting the reconciliation summary to the finance Teams channel."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-period-close
          description: "Given a fiscal period, pull GL balances, analyze variances, and post summary."
          inputParameters:
            - name: fiscal_period
              type: string
              description: "Fiscal period (e.g. 2026-03)."
            - name: company_code
              type: string
              description: "SAP company code."
          steps:
            - name: get-gl-balances
              type: call
              call: sap.get-trial-balance
              with:
                company_code: "{{company_code}}"
                period: "{{fiscal_period}}"
            - name: run-variance-analysis
              type: call
              call: snowflake.run-variance-query
              with:
                period: "{{fiscal_period}}"
            - name: post-summary
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_finance_channel"
                text: "Period close {{fiscal_period}} for {{company_code}}: Total assets: {{get-gl-balances.total_assets}} | Variance items: {{run-variance-analysis.exception_count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: trial-balance
          path: "/A_GLAccountBalance"
          operations:
            - name: get-trial-balance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-variance-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a plant maintenance order from SAP by order number, returning equipment, status, and planned dates for refinery turnaround planning.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Lookup"
  description: "Retrieves a plant maintenance order from SAP by order number, returning equipment, status, and planned dates for refinery turnaround planning."
  tags:
    - operations
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: erp-maintenance
      port: 8080
      tools:
        - name: get-maintenance-order
          description: "Look up an SAP maintenance order. Returns equipment, status, and dates."
          inputParameters:
            - name: order_number
              type: string
              description: "SAP maintenance order number."
          call: sap.get-maint-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
            - name: status
              type: string
              mapping: "$.d.MaintOrderRoutingStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-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-maint-order
              method: GET

Looks up a SAP S/4HANA purchase order by PO number and returns status, vendor, and total value for procurement and AP tracking.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by PO number and returns status, vendor, and total value for procurement and AP tracking."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up an SAP purchase order by number. Returns approval status, vendor name, total amount, and currency. Use for procurement approval and accounts payable workflows."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number (10-digit numeric string)."
          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_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-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

Monitors SAP transportation orders for delays, updates the Snowflake tracking table, and notifies the supply chain team via Teams.

naftiko: "0.5"
info:
  label: "SAP Transport Order Delay Notification"
  description: "Monitors SAP transportation orders for delays, updates the Snowflake tracking table, and notifies the supply chain team via Teams."
  tags:
    - logistics
    - supply-chain
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: transport-monitoring
      port: 8080
      tools:
        - name: handle-transport-delay
          description: "Given a delayed transport order, update tracking and notify supply chain."
          inputParameters:
            - name: transport_order
              type: string
              description: "SAP transportation order number."
            - name: delay_hours
              type: string
              description: "Delay in hours."
            - name: reason
              type: string
              description: "Delay reason."
          steps:
            - name: get-order-details
              type: call
              call: sap.get-transport-order
              with:
                order_number: "{{transport_order}}"
            - name: update-tracking
              type: call
              call: snowflake.update-transport-tracking
              with:
                order: "{{transport_order}}"
                delay: "{{delay_hours}}"
            - name: notify-supply-chain
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_supply_chain_channel"
                text: "Transport delay: Order {{transport_order}} | Delay: {{delay_hours}} hrs | Reason: {{reason}} | Origin: {{get-order-details.origin}} | Dest: {{get-order-details.destination}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_TRANSPORTATION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transport-orders
          path: "/A_TransportationOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-transport-order
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: update-transport-tracking
              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/supply-chain/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and address.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and address."
  tags:
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-vendors
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up an SAP vendor by number. Returns name and payment terms."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor number."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

When a SCADA alarm fires, queries Datadog for system context, creates a ServiceNow incident, and pages the on-call process engineer.

naftiko: "0.5"
info:
  label: "SCADA Alarm Triage Workflow"
  description: "When a SCADA alarm fires, queries Datadog for system context, creates a ServiceNow incident, and pages the on-call process engineer."
  tags:
    - operations
    - scada
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: scada-triage
      port: 8080
      tools:
        - name: triage-scada-alarm
          description: "Given a SCADA alarm ID and unit, gather context, create incident, and page engineer."
          inputParameters:
            - name: alarm_id
              type: string
              description: "SCADA alarm identifier."
            - name: process_unit
              type: string
              description: "Process unit where alarm originated."
            - name: alarm_priority
              type: string
              description: "Alarm priority level."
          steps:
            - name: get-system-context
              type: call
              call: datadog.get-host-metrics
              with:
                host: "{{process_unit}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SCADA alarm {{alarm_id}} on {{process_unit}} ({{alarm_priority}})"
                urgency: "1"
                impact: "2"
            - name: page-engineer
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pd_process_eng_service"
                title: "SCADA alarm: {{alarm_id}} on {{process_unit}}"
                urgency: "high"
  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: hosts
          path: "/hosts/{{host}}"
          inputParameters:
            - name: host
              in: path
          operations:
            - name: get-host-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Creates a ServiceNow change request for a planned infrastructure or operations change, routes to the CAB, and notifies the requester via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Workflow"
  description: "Creates a ServiceNow change request for a planned infrastructure or operations change, routes to the CAB, and notifies the requester via Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, risk level, and planned date, create a ServiceNow change request for the CAB and notify the requester via Teams."
          inputParameters:
            - name: short_description
              type: string
              description: "Brief description of the planned change."
            - name: risk
              type: string
              description: "Risk level: low, medium, or high."
            - name: implementation_date
              type: string
              description: "Planned change date in YYYY-MM-DD format."
            - name: requester_upn
              type: string
              description: "UPN of the change requester."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "{{short_description}}"
                risk: "{{risk}}"
                start_date: "{{implementation_date}}"
                assignment_group: "CAB"
            - name: notify-requester
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Change request {{create-change.number}} submitted to CAB. Risk: {{risk}}, Planned date: {{implementation_date}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Compares ServiceNow CMDB records with Okta application inventory and SAP asset master to identify discrepancies and notify the IT asset team.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Reconciliation"
  description: "Compares ServiceNow CMDB records with Okta application inventory and SAP asset master to identify discrepancies and notify the IT asset team."
  tags:
    - itsm
    - asset-management
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-mgmt
      port: 8080
      tools:
        - name: reconcile-cmdb
          description: "Given an application category, run CMDB reconciliation across systems."
          inputParameters:
            - name: category
              type: string
              description: "Application or asset category."
          steps:
            - name: get-cmdb-assets
              type: call
              call: servicenow.get-cmdb-records
              with:
                category: "{{category}}"
            - name: get-okta-apps
              type: call
              call: okta.list-applications
              with:
                filter: "{{category}}"
            - name: notify-asset-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_it_asset_channel"
                text: "CMDB reconciliation ({{category}}): CMDB: {{get-cmdb-assets.count}} | Okta: {{get-okta-apps.count}} | Review required for discrepancies"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci_appl"
          operations:
            - name: get-cmdb-records
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: applications
          path: "/apps"
          operations:
            - name: list-applications
              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/it-asset/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a ServiceNow incident by number, returning the short description, state, priority, and assigned group.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning the short description, state, priority, and assigned group."
  tags:
    - itsm
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns state, priority, and assignment group."
          inputParameters:
            - name: incident_number
              type: string
              description: "ServiceNow incident number (e.g. INC0012345)."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result[0].state"
            - name: priority
              type: string
              mapping: "$.result[0].priority"
            - name: assigned_to
              type: string
              mapping: "$.result[0].assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Searches SharePoint Online for documents matching a keyword query, returning file names, URLs, and last modified dates.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches SharePoint Online for documents matching a keyword query, returning file names, URLs, and last modified dates."
  tags:
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-documents
          description: "Search SharePoint for documents by keyword query."
          inputParameters:
            - name: query
              type: string
              description: "Search keyword or phrase."
          call: sharepoint.search
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/search/query"
          operations:
            - name: search
              method: POST

Runs a Snowflake SQL query against the crude oil inventory table, returning current barrel counts by terminal location.

naftiko: "0.5"
info:
  label: "Snowflake Crude Inventory Query"
  description: "Runs a Snowflake SQL query against the crude oil inventory table, returning current barrel counts by terminal location."
  tags:
    - operations
    - snowflake
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: ops-analytics
      port: 8080
      tools:
        - name: query-crude-inventory
          description: "Query crude oil inventory levels by terminal from Snowflake."
          inputParameters:
            - name: terminal_code
              type: string
              description: "Terminal location code."
          call: snowflake.run-query
          with:
            terminal_code: "{{terminal_code}}"
          outputParameters:
            - name: barrels_on_hand
              type: string
              mapping: "$.data[0].BARRELS_ON_HAND"
            - name: capacity_pct
              type: string
              mapping: "$.data[0].CAPACITY_PCT"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Monitors Snowflake pipeline task completions for operations analytics and creates a Jira issue when failure counts exceed a threshold.

naftiko: "0.5"
info:
  label: "Snowflake Operations Data Pipeline Health"
  description: "Monitors Snowflake pipeline task completions for operations analytics and creates a Jira issue when failure counts exceed a threshold."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-ops-pipeline-health
          description: "Query Snowflake task history for the operations analytics database over the past N hours. Create a Jira issue and alert the data engineering Teams channel if failures exceed the threshold."
          inputParameters:
            - name: database
              type: string
              description: "Snowflake database name (e.g., OPS_ANALYTICS)."
            - name: hours_back
              type: integer
              description: "Number of hours to check for failures."
            - name: failure_threshold
              type: integer
              description: "Failure count above which an alert fires."
          steps:
            - name: get-task-history
              type: call
              call: snowflake.query-task-history
              with:
                database: "{{database}}"
                hoursBack: "{{hours_back}}"
            - name: create-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Snowflake pipeline failures in {{database}}"
                description: "{{get-task-history.failureCount}} task failures in last {{hours_back}}h"
            - name: alert-data-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "data-engineering"
                text: "Pipeline alert: {{get-task-history.failureCount}} failures in {{database}} (last {{hours_back}}h). Jira: {{create-issue.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/information_schema/tasks"
          inputParameters:
            - name: database
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/data/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for pipeline throughput metrics by pipeline segment, returning barrels per day and utilization percentage.

naftiko: "0.5"
info:
  label: "Snowflake Pipeline Throughput Query"
  description: "Queries Snowflake for pipeline throughput metrics by pipeline segment, returning barrels per day and utilization percentage."
  tags:
    - operations
    - snowflake
    - midstream
capability:
  exposes:
    - type: mcp
      namespace: ops-analytics
      port: 8080
      tools:
        - name: query-pipeline-throughput
          description: "Query pipeline throughput data from Snowflake by segment ID."
          inputParameters:
            - name: segment_id
              type: string
              description: "Pipeline segment identifier."
          call: snowflake.run-query
          with:
            segment_id: "{{segment_id}}"
          outputParameters:
            - name: barrels_per_day
              type: string
              mapping: "$.data[0].BPD"
            - name: utilization_pct
              type: string
              mapping: "$.data[0].UTILIZATION_PCT"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Queries Snowflake for retail store performance metrics, refreshes the Power BI retail dashboard, and posts the daily digest to the retail operations team.

naftiko: "0.5"
info:
  label: "Speedway Store Performance Digest"
  description: "Queries Snowflake for retail store performance metrics, refreshes the Power BI retail dashboard, and posts the daily digest to the retail operations team."
  tags:
    - retail
    - reporting
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail-reporting
      port: 8080
      tools:
        - name: generate-store-digest
          description: "Given a market region and date, generate the store performance digest."
          inputParameters:
            - name: region
              type: string
              description: "Market region."
            - name: report_date
              type: string
              description: "Report date."
          steps:
            - name: get-store-metrics
              type: call
              call: snowflake.query-store-performance
              with:
                region: "{{region}}"
                date: "{{report_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "$secrets.retail_dashboard_id"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_retail_ops_channel"
                text: "Store digest {{region}} ({{report_date}}): Revenue: ${{get-store-metrics.revenue}} | Fuel vol: {{get-store-metrics.fuel_gallons}} gal | Inside sales: ${{get-store-metrics.inside_sales}} | Transactions: {{get-store-metrics.transactions}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-store-performance
              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: 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/retail-ops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Executes a Splunk search query against operational logs and returns matching events for troubleshooting pipeline and refinery systems.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Executes a Splunk search query against operational logs and returns matching events for troubleshooting pipeline and refinery systems."
  tags:
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: logging
      port: 8080
      tools:
        - name: search-logs
          description: "Run a Splunk search query and return results."
          inputParameters:
            - name: search_query
              type: string
              description: "SPL search query string."
          call: splunk.run-search
          with:
            search: "{{search_query}}"
          outputParameters:
            - name: results
              type: string
              mapping: "$.results"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.marathon-petroleum.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST

When Splunk detects a correlated security event, queries Okta for user context, creates a ServiceNow security incident, and alerts the SOC team via Teams.

naftiko: "0.5"
info:
  label: "Splunk Security Event Correlation"
  description: "When Splunk detects a correlated security event, queries Okta for user context, creates a ServiceNow security incident, and alerts the SOC team via Teams."
  tags:
    - security
    - splunk
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: soc-correlation
      port: 8080
      tools:
        - name: correlate-security-event
          description: "Given a Splunk security alert, enrich with user context and create incident."
          inputParameters:
            - name: alert_id
              type: string
              description: "Splunk alert ID."
            - name: source_ip
              type: string
              description: "Source IP address."
            - name: user_email
              type: string
              description: "Associated user email."
          steps:
            - name: get-user-context
              type: call
              call: okta.get-user
              with:
                email: "{{user_email}}"
            - name: create-security-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Correlated security event: {{alert_id}} from {{source_ip}}"
                category: "security"
                urgency: "1"
                description: "User: {{user_email}} ({{get-user-context.status}}) | Source: {{source_ip}}"
            - name: alert-soc
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_soc_channel"
                text: "Security event {{alert_id}}: {{source_ip}} | User: {{user_email}} (Okta: {{get-user-context.status}}) | SNOW: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/soc/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors sulfur recovery unit performance via Snowflake, validates against environmental permits, and alerts the operations team when recovery drops below target.

naftiko: "0.5"
info:
  label: "Sulfur Recovery Unit Monitoring"
  description: "Monitors sulfur recovery unit performance via Snowflake, validates against environmental permits, and alerts the operations team when recovery drops below target."
  tags:
    - operations
    - environmental
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sru-monitoring
      port: 8080
      tools:
        - name: monitor-sru-performance
          description: "Given an SRU unit, check recovery efficiency and alert if below target."
          inputParameters:
            - name: sru_unit_id
              type: string
              description: "Sulfur recovery unit identifier."
            - name: target_recovery_pct
              type: string
              description: "Target recovery percentage."
          steps:
            - name: get-sru-data
              type: call
              call: snowflake.query-sru-performance
              with:
                unit_id: "{{sru_unit_id}}"
            - name: notify-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel"
                text: "SRU {{sru_unit_id}}: Recovery: {{get-sru-data.recovery_pct}}% (target: {{target_recovery_pct}}%) | Throughput: {{get-sru-data.throughput_tpd}} TPD | Tail gas: {{get-sru-data.tail_gas_ppm}} ppm"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-sru-performance
              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/ops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors tank farm utilization via Snowflake queries, creates a ServiceNow work order when capacity exceeds threshold, and notifies logistics via Teams.

naftiko: "0.5"
info:
  label: "Tank Farm Capacity Monitoring Workflow"
  description: "Monitors tank farm utilization via Snowflake queries, creates a ServiceNow work order when capacity exceeds threshold, and notifies logistics via Teams."
  tags:
    - operations
    - logistics
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tank-ops
      port: 8080
      tools:
        - name: monitor-tank-capacity
          description: "Given a tank farm ID, check capacity and trigger work order if threshold exceeded."
          inputParameters:
            - name: tank_farm_id
              type: string
              description: "Tank farm identifier."
            - name: capacity_threshold
              type: string
              description: "Capacity percentage threshold to trigger alert."
          steps:
            - name: query-capacity
              type: call
              call: snowflake.run-capacity-query
              with:
                tank_farm_id: "{{tank_farm_id}}"
            - name: create-work-order
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Tank farm {{tank_farm_id}} at {{query-capacity.utilization_pct}}% capacity"
                urgency: "2"
                category: "logistics"
            - name: notify-logistics
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_logistics_channel"
                text: "Tank farm {{tank_farm_id}}: {{query-capacity.utilization_pct}}% full (threshold: {{capacity_threshold}}%) | Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-capacity-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/logistics/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls tank inspection due dates from SAP, creates ServiceNow work orders for upcoming inspections, and notifies the inspection team via Teams.

naftiko: "0.5"
info:
  label: "Tank Inspection Scheduling Workflow"
  description: "Pulls tank inspection due dates from SAP, creates ServiceNow work orders for upcoming inspections, and notifies the inspection team via Teams."
  tags:
    - operations
    - integrity
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tank-inspections
      port: 8080
      tools:
        - name: schedule-tank-inspections
          description: "Given a facility and date range, identify tanks due for inspection and schedule."
          inputParameters:
            - name: facility
              type: string
              description: "Facility code."
            - name: due_within_days
              type: string
              description: "Number of days to look ahead."
          steps:
            - name: get-due-inspections
              type: call
              call: sap.get-inspection-schedule
              with:
                facility: "{{facility}}"
                days: "{{due_within_days}}"
            - name: create-work-orders
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Tank inspections due at {{facility}}: {{get-due-inspections.count}} tanks"
                category: "inspection"
                urgency: "3"
            - name: notify-inspection-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_inspection_channel"
                text: "Tank inspections due at {{facility}} within {{due_within_days}} days: {{get-due-inspections.count}} tanks | Work order: {{create-work-orders.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://marathon-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEPLAN"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-plans
          path: "/MaintenancePlan"
          operations:
            - name: get-inspection-schedule
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/inspection/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers a Terraform Cloud workspace run for infrastructure changes at Marathon Petroleum facilities, creating a Jira task and Teams notification.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Run"
  description: "Triggers a Terraform Cloud workspace run for infrastructure changes at Marathon Petroleum facilities, creating a Jira task and Teams notification."
  tags:
    - cloud
    - devops
    - terraform
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-infrastructure-run
          description: "Given a Terraform Cloud workspace and change description, trigger a plan-and-apply infrastructure run, create a Jira tracking task, and notify the DevOps Teams channel."
          inputParameters:
            - name: workspace_id
              type: string
              description: "Terraform Cloud workspace ID."
            - name: change_description
              type: string
              description: "Description of the infrastructure change."
            - name: teams_channel_id
              type: string
              description: "DevOps Teams channel ID."
          steps:
            - name: create-run
              type: call
              call: terraform.create-run
              with:
                workspaceId: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "INFRA"
                issuetype: "Task"
                summary: "Terraform: {{change_description}}"
                description: "Workspace {{workspace_id}} | Run: {{create-run.runId}}"
            - name: notify-devops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Terraform run triggered: {{change_description}} | Workspace: {{workspace_id}} | Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/devops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a thermal imaging scan detects an equipment anomaly, creates a ServiceNow inspection order and notifies the reliability engineering team.

naftiko: "0.5"
info:
  label: "Thermal Imaging Anomaly Response"
  description: "When a thermal imaging scan detects an equipment anomaly, creates a ServiceNow inspection order and notifies the reliability engineering team."
  tags:
    - operations
    - reliability
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reliability-ops
      port: 8080
      tools:
        - name: handle-thermal-anomaly
          description: "Given a thermal anomaly detection, create inspection order and notify team."
          inputParameters:
            - name: equipment_id
              type: string
              description: "Equipment identifier."
            - name: temperature_delta
              type: string
              description: "Temperature deviation in degrees F."
            - name: location
              type: string
              description: "Equipment location."
          steps:
            - name: create-inspection
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Thermal anomaly: {{equipment_id}} at {{location}} (+{{temperature_delta}}F)"
                urgency: "2"
                category: "reliability"
            - name: notify-reliability
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_reliability_channel"
                text: "Thermal anomaly: {{equipment_id}} at {{location}} | Delta: +{{temperature_delta}}F | Inspection: {{create-inspection.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/reliability/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a vendor contract approaches expiry in SAP Ariba, creates a Jira procurement task, notifies the category manager via Teams, and updates the contract tracker in Snowflake.

naftiko: "0.5"
info:
  label: "Vendor Contract Renewal Workflow"
  description: "When a vendor contract approaches expiry in SAP Ariba, creates a Jira procurement task, notifies the category manager via Teams, and updates the contract tracker in Snowflake."
  tags:
    - procurement
    - sap-ariba
    - jira
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: contract-mgmt
      port: 8080
      tools:
        - name: handle-contract-renewal
          description: "Given a contract nearing expiry, create renewal tracking and notify procurement."
          inputParameters:
            - name: contract_id
              type: string
              description: "SAP Ariba contract ID."
            - name: vendor_name
              type: string
              description: "Vendor company name."
            - name: expiry_date
              type: string
              description: "Contract expiry date."
            - name: annual_value
              type: string
              description: "Annual contract value."
          steps:
            - name: create-renewal-task
              type: call
              call: jira.create-issue
              with:
                project: PROC
                issuetype: Task
                summary: "Contract renewal: {{vendor_name}} ({{contract_id}}) expiring {{expiry_date}}"
                description: "Annual value: ${{annual_value}}"
            - name: notify-category-mgr
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_procurement_channel"
                text: "Contract renewal due: {{vendor_name}} | ID: {{contract_id}} | Expires: {{expiry_date}} | Value: ${{annual_value}} | Jira: {{create-renewal-task.key}}"
            - name: log-renewal
              type: call
              call: snowflake.log-contract-event
              with:
                contract_id: "{{contract_id}}"
                event_type: "renewal_initiated"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/procurement/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: log-contract-event
              method: POST

Submits a vendor invoice to SAP Ariba for three-way match, creates a ServiceNow approval task, and notifies the AP manager via Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Approval Workflow"
  description: "Submits a vendor invoice to SAP Ariba for three-way match, creates a ServiceNow approval task, and notifies the AP manager via Teams."
  tags:
    - finance
    - procurement
    - sap-ariba
    - servicenow
    - approval
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given a vendor invoice number, amount, and approver UPN, submit to SAP Ariba for matching, create a ServiceNow approval task, and notify the AP manager via Teams."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Vendor invoice number."
            - name: vendor_id
              type: string
              description: "SAP vendor ID."
            - name: amount
              type: number
              description: "Invoice total amount."
            - name: approver_upn
              type: string
              description: "UPN of the accounts payable approver."
          steps:
            - name: submit-invoice
              type: call
              call: sap-ariba.create-invoice
              with:
                invoiceNumber: "{{invoice_number}}"
                vendorId: "{{vendor_id}}"
                totalAmount: "{{amount}}"
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Invoice approval: {{invoice_number}}"
                assigned_to: "{{approver_upn}}"
                description: "Ariba invoice ID: {{submit-invoice.invoiceId}} | Amount: {{amount}}"
            - name: notify-approver
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Invoice {{invoice_number}} requires approval. ServiceNow: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices"
          operations:
            - name: create-invoice
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Queries Snowflake for wastewater discharge metrics, validates against permit limits, and creates a ServiceNow compliance record with team notification.

naftiko: "0.5"
info:
  label: "Wastewater Discharge Compliance Check"
  description: "Queries Snowflake for wastewater discharge metrics, validates against permit limits, and creates a ServiceNow compliance record with team notification."
  tags:
    - ehs
    - compliance
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: water-compliance
      port: 8080
      tools:
        - name: check-discharge-compliance
          description: "Given a facility and date, check wastewater discharge compliance."
          inputParameters:
            - name: facility
              type: string
              description: "Facility identifier."
            - name: sample_date
              type: string
              description: "Sample date."
          steps:
            - name: get-discharge-data
              type: call
              call: snowflake.query-discharge-metrics
              with:
                facility: "{{facility}}"
                date: "{{sample_date}}"
            - name: create-compliance-record
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Wastewater discharge report: {{facility}} ({{sample_date}})"
                category: "environmental"
                description: "TSS: {{get-discharge-data.tss_mg_l}} mg/L | pH: {{get-discharge-data.ph}} | BOD: {{get-discharge-data.bod_mg_l}} mg/L"
            - name: notify-ehs
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ehs_channel"
                text: "Discharge report {{facility}} ({{sample_date}}): TSS: {{get-discharge-data.tss_mg_l}} mg/L | pH: {{get-discharge-data.ph}} | Compliance: {{get-discharge-data.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marathon-petroleum.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-discharge-metrics
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ehs/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Launches the annual performance review cycle by pulling headcount from Workday, creating a Jira tracking epic, and notifying HR business partners via Teams.

naftiko: "0.5"
info:
  label: "Workday Annual Review Cycle Launch"
  description: "Launches the annual performance review cycle by pulling headcount from Workday, creating a Jira tracking epic, and notifying HR business partners via Teams."
  tags:
    - hr
    - performance
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review year, launch the performance review cycle and notify stakeholders."
          inputParameters:
            - name: review_year
              type: string
              description: "Performance review year."
          steps:
            - name: get-headcount
              type: call
              call: workday.get-active-headcount
              with:
                year: "{{review_year}}"
            - name: create-tracking
              type: call
              call: jira.create-issue
              with:
                project: HR
                issuetype: Epic
                summary: "Annual performance review cycle {{review_year}}"
                description: "Active employees: {{get-headcount.count}}"
            - name: notify-hr
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_channel"
                text: "Review cycle {{review_year}} launched | {{get-headcount.count}} employees | Tracking: {{create-tracking.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: get-active-headcount
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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/hr/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Workday for employees with incomplete benefits enrollment, generates a reminder list, and sends notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for employees with incomplete benefits enrollment, generates a reminder list, and sends notifications via Microsoft Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment deadline, find incomplete enrollments and send reminders."
          inputParameters:
            - name: enrollment_period
              type: string
              description: "Benefits enrollment period identifier."
            - name: deadline
              type: string
              description: "Enrollment deadline date."
          steps:
            - name: get-incomplete
              type: call
              call: workday.get-incomplete-enrollments
              with:
                period: "{{enrollment_period}}"
            - name: notify-hr
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_benefits_channel"
                text: "Benefits enrollment reminder: {{get-incomplete.count}} employees with incomplete enrollment for {{enrollment_period}} (deadline: {{deadline}})"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/benefits/enrollments"
          operations:
            - name: get-incomplete-enrollments
              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/hr/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a compensation change is submitted in Workday, validates budget availability in SAP, notifies the manager via Teams, and logs the approval in ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Compensation Change Approval"
  description: "When a compensation change is submitted in Workday, validates budget availability in SAP, notifies the manager via Teams, and logs the approval in ServiceNow."
  tags:
    - hr
    - workday
    - sap
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: process-comp-change
          description: "Given a compensation change request, validate budget and route for approval."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
            - name: new_salary
              type: string
              description: "Proposed new salary amount."
            - name: cost_center
              type: string
              description: "SAP cost center for budget validation."
          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: "{{cost_center}}"
            - name: notify-manager
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_hr_channel"
                text: "Compensation change: {{get-employee.full_name}} | New salary: ${{new_salary}} | Budget available: {{check-budget.remaining_budget}}"
            - name: log-approval
              type: call
              call: servicenow.create-change
              with:
                short_description: "Comp change for {{get-employee.full_name}} to ${{new_salary}}"
                category: "hr"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://marathon-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-budget
              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/hr/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marathon-petroleum.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: create-change
              method: POST

Retrieves an employee profile from Workday by worker ID, returning name, title, department, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, title, department, and manager."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-profiles
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Workday employee by worker ID. Returns name, title, department, and manager."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.legalName.fullName"
            - name: title
              type: string
              mapping: "$.worker.position.title"
            - name: department
              type: string
              mapping: "$.worker.position.department"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

When a new hire is confirmed in Workday, creates their Okta account, provisions role-based access, and notifies the IT support team via Teams.

naftiko: "0.5"
info:
  label: "Workday New Hire IT Provisioning"
  description: "When a new hire is confirmed in Workday, creates their Okta account, provisions role-based access, and notifies the IT support team via Teams."
  tags:
    - hr
    - it
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-it-provisioning
      port: 8080
      tools:
        - name: provision-new-hire
          description: "Given a Workday new hire event, create Okta account and provision access."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
            - name: start_date
              type: string
              description: "Employee start date."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-okta-user
              type: call
              call: okta.create-user
              with:
                email: "{{get-employee.work_email}}"
                first_name: "{{get-employee.first_name}}"
                last_name: "{{get-employee.last_name}}"
                department: "{{get-employee.department}}"
            - name: notify-it
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_it_support_channel"
                text: "New hire provisioned: {{get-employee.full_name}} ({{get-employee.department}}) | Start: {{start_date}} | Okta: {{create-okta-user.status}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/it-support/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates a job requisition in Workday when headcount is approved and opens a corresponding Jira ticket for the talent acquisition team.

naftiko: "0.5"
info:
  label: "Workday Open Position Requisition"
  description: "Creates a job requisition in Workday when headcount is approved and opens a corresponding Jira ticket for the talent acquisition team."
  tags:
    - hr
    - recruiting
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: open-job-requisition
          description: "Given a job title, department, and hiring manager Workday ID, create a Workday job requisition and a Jira task in the TA project for tracking sourcing progress."
          inputParameters:
            - name: job_title
              type: string
              description: "Job title for the open position."
            - name: department
              type: string
              description: "Department or facility requesting the headcount."
            - name: hiring_manager_id
              type: string
              description: "Workday worker ID of the hiring manager."
          steps:
            - name: create-requisition
              type: call
              call: workday.create-job-requisition
              with:
                jobTitle: "{{job_title}}"
                department: "{{department}}"
                hiringManagerId: "{{hiring_manager_id}}"
            - name: create-ta-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "TA"
                issuetype: "Task"
                summary: "Recruit: {{job_title}} — {{department}}"
                description: "Workday requisition: {{create-requisition.requisitionId}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/marathon-petroleum/jobRequisitions"
          operations:
            - name: create-job-requisition
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://marathon-petroleum.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 an employee changes roles in Workday, updates Okta group memberships and notifies the employee via Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Sync"
  description: "When an employee changes roles in Workday, updates Okta group memberships and notifies the employee via Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-identity
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID, new role, and Okta group IDs, remove the user from the old role group, add to the new group, and send a Teams confirmation to the employee."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID of the employee changing roles."
            - name: new_role
              type: string
              description: "New job role or title."
            - name: okta_new_group_id
              type: string
              description: "Okta group ID for the new role."
            - name: okta_old_group_id
              type: string
              description: "Okta group ID for the previous role."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: remove-old-group
              type: call
              call: okta.remove-user-from-group
              with:
                groupId: "{{okta_old_group_id}}"
                userId: "{{get-worker.work_email}}"
            - name: add-new-group
              type: call
              call: okta.add-user-to-group
              with:
                groupId: "{{okta_new_group_id}}"
                userId: "{{get-worker.work_email}}"
            - name: notify-employee
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your role has been updated to {{new_role}}. System access has been adjusted to reflect your new position."
  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: "/marathon-petroleum/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://marathon-petroleum.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users/{{userId}}"
          inputParameters:
            - name: groupId
              in: path
            - name: userId
              in: path
          operations:
            - name: remove-user-from-group
              method: DELETE
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Retrieves an employee time off balance from Workday by worker ID, returning vacation and sick leave accruals.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves an employee time off balance from Workday by worker ID, returning vacation and sick leave accruals."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-time
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Look up time off balance by worker ID."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
          call: workday.get-time-off
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: vacation_balance
              type: string
              mapping: "$.timeOffBalance.vacation"
            - name: sick_balance
              type: string
              mapping: "$.timeOffBalance.sick"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/marathon-petroleum"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-time-off
              method: GET