Marathon Petroleum Capabilities
Naftiko 0.5 capability definitions for Marathon Petroleum - 106 capabilities showing integration workflows and service orchestrations.
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