Shell Capabilities

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

Sort
Expand

Accepts a regulatory document URL, summarizes it with Anthropic Claude, and creates a Jira task for the legal team to review the summary and action items.

naftiko: "0.5"
info:
  label: "AI-Assisted Document Summarization for Regulatory Filings"
  description: "Accepts a regulatory document URL, summarizes it with Anthropic Claude, and creates a Jira task for the legal team to review the summary and action items."
  tags:
    - ai
    - legal
    - compliance
    - anthropic
    - jira
    - document-processing
capability:
  exposes:
    - type: mcp
      namespace: legal-ai
      port: 8080
      tools:
        - name: summarize-regulatory-document
          description: "Given a URL to a regulatory filing or environmental report, use Anthropic Claude to extract a structured summary and action items, then create a Jira task for the legal team."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "Public URL to the regulatory document (PDF)."
            - name: document_title
              in: body
              type: string
              description: "Human-readable title of the regulatory document."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for the legal review task."
          steps:
            - name: summarize-document
              type: call
              call: "anthropic.summarize-document"
              with:
                documentUrl: "{{document_url}}"
                documentTitle: "{{document_title}}"
            - name: create-legal-task
              type: call
              call: "jira-legal.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Regulatory review: {{document_title}}"
                description: "Summary:\n{{summarize-document.summary}}\n\nAction Items:\n{{summarize-document.actionItems}}\n\nDocument: {{document_url}}"
  consumes:
    - 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: summarize-document
              method: POST
    - type: http
      namespace: jira-legal
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Detects Azure spending anomalies for Shell cloud subscriptions, generates an AI summary with OpenAI, and creates a ServiceNow cost-review request with the summary.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Response"
  description: "Detects Azure spending anomalies for Shell cloud subscriptions, generates an AI summary with OpenAI, and creates a ServiceNow cost-review request with the summary."
  tags:
    - cloud
    - cost-management
    - azure
    - openai
    - servicenow
    - ai
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost-ops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given an Azure subscription ID and cost threshold, query Azure Cost Management for anomalies, summarize with OpenAI, and create a ServiceNow financial review request."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID to check for spending anomalies."
            - name: threshold_usd
              in: body
              type: number
              description: "Monthly budget threshold in USD above which to flag an anomaly."
            - name: billing_period
              in: body
              type: string
              description: "Billing period in YYYY-MM format."
          steps:
            - name: get-cost-data
              type: call
              call: "azure-cost.query-costs"
              with:
                subscriptionId: "{{subscription_id}}"
                billingPeriod: "{{billing_period}}"
            - name: summarize-anomaly
              type: call
              call: "openai.summarize-cost"
              with:
                costData: "{{get-cost-data.rows}}"
                threshold: "{{threshold_usd}}"
            - name: create-review-request
              type: call
              call: "snow-finance.create-request"
              with:
                short_description: "Azure cost anomaly: {{subscription_id}} ({{billing_period}})"
                description: "{{summarize-anomaly.summary}}\n\nTotal: {{get-cost-data.totalCost}} USD vs threshold {{threshold_usd}} USD"
                category: "cloud_cost_review"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cost-queries
          path: "/subscriptions/{{subscriptionId}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscriptionId
              in: path
            - name: billingPeriod
              in: query
          operations:
            - name: query-costs
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_token"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: summarize-cost
              method: POST
    - type: http
      namespace: snow-finance
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Fetches current energy commodity prices from Bloomberg for Brent crude, natural gas, and refined products, returning bid, ask, and last trade values.

naftiko: "0.5"
info:
  label: "Bloomberg Energy Market Price Snapshot"
  description: "Fetches current energy commodity prices from Bloomberg for Brent crude, natural gas, and refined products, returning bid, ask, and last trade values."
  tags:
    - trading
    - bloomberg
    - energy-markets
capability:
  exposes:
    - type: mcp
      namespace: market-prices
      port: 8080
      tools:
        - name: get-energy-prices
          description: "Look up current energy commodity prices from Bloomberg by ticker symbol. Returns bid, ask, last trade price, and volume."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol (e.g., CO1 for Brent crude, NG1 for natural gas)."
          call: bloomberg.get-price
          with:
            ticker: "{{ticker}}"
          outputParameters:
            - name: bid
              type: number
              mapping: "$.data.bid"
            - name: ask
              type: number
              mapping: "$.data.ask"
            - name: last_trade
              type: number
              mapping: "$.data.lastTrade"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/fields"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: prices
          path: "/{{ticker}}/snapshot"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-price
              method: GET

Creates and updates Confluence pages for refinery turnaround planning, pulling scope from SAP PM and resources from Workday.

naftiko: "0.5"
info:
  label: "Confluence Turnaround Planning Knowledge Base"
  description: "Creates and updates Confluence pages for refinery turnaround planning, pulling scope from SAP PM and resources from Workday."
  tags:
    - refining
    - maintenance
    - confluence
    - sap
    - workday
capability:
  exposes:
    - type: mcp
      namespace: turnaround-kb
      port: 8080
      tools:
        - name: update-turnaround-plan
          description: "Given a turnaround project ID, pull SAP scope and Workday resources, then update Confluence."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Turnaround project identifier."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code."
          steps:
            - name: get-scope
              type: call
              call: sap.get-turnaround-scope
              with:
                project_id: "{{project_id}}"
                plant_code: "{{plant_code}}"
            - name: get-resources
              type: call
              call: workday.get-project-resources
              with:
                project_id: "{{project_id}}"
            - name: update-page
              type: call
              call: confluence.update-page
              with:
                space: "TURNAROUND"
                title: "TA-{{project_id}} Plan"
                body: "Scope: {{get-scope.summary}} | Resources: {{get-resources.headcount}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: turnaround
          path: "/A_MaintenanceOrder"
          operations:
            - name: get-turnaround-scope
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: project-resources
          path: "/workers"
          operations:
            - name: get-project-resources
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://shell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: update-page
              method: PUT

When CrowdStrike detects a threat on a Shell endpoint, creates a ServiceNow security incident, isolates the host, and alerts the security operations centre in Microsoft Teams.

naftiko: "0.5"
info:
  label: "CrowdStrike Endpoint Threat Response"
  description: "When CrowdStrike detects a threat on a Shell endpoint, creates a ServiceNow security incident, isolates the host, and alerts the security operations centre in Microsoft Teams."
  tags:
    - security
    - endpoint
    - crowdstrike
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: soc-ops
      port: 8080
      tools:
        - name: respond-to-endpoint-threat
          description: "Given a CrowdStrike detection ID, fetch the alert details, create a ServiceNow security incident, isolate the host via CrowdStrike, and alert the SOC Teams channel."
          inputParameters:
            - name: detection_id
              in: body
              type: string
              description: "CrowdStrike Falcon detection ID."
            - name: soc_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the Shell SOC."
          steps:
            - name: get-detection
              type: call
              call: "crowdstrike.get-detection"
              with:
                detectionId: "{{detection_id}}"
            - name: create-sec-incident
              type: call
              call: "snow-soc.create-incident"
              with:
                short_description: "Endpoint threat: {{get-detection.behavior.scenario}} on {{get-detection.device.hostname}}"
                severity: "1"
                description: "Detection ID: {{detection_id}}\nHost: {{get-detection.device.hostname}}\nUser: {{get-detection.behavior.user_name}}\nSeverity: {{get-detection.max_severity_displayname}}"
            - name: isolate-host
              type: call
              call: "crowdstrike-action.contain-host"
              with:
                deviceId: "{{get-detection.device.device_id}}"
            - name: alert-soc
              type: call
              call: "msteams-soc.send-channel-message"
              with:
                channelId: "{{soc_channel_id}}"
                text: "ENDPOINT THREAT: {{get-detection.device.hostname}} isolated | Detection: {{detection_id}} | Incident: {{create-sec-incident.number}} | Severity: {{get-detection.max_severity_displayname}}"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: detections
          path: "/detects/entities/detect/v2"
          inputParameters:
            - name: detectionId
              in: query
          operations:
            - name: get-detection
              method: GET
    - type: http
      namespace: snow-soc
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: security-incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: crowdstrike-action
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: device-actions
          path: "/devices/entities/devices-actions/v2"
          operations:
            - name: contain-host
              method: POST
    - type: http
      namespace: msteams-soc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls compressor station telemetry from Datadog and creates a SAP PM notification if readings exceed thresholds.

naftiko: "0.5"
info:
  label: "Datadog Compressor Station Health Check"
  description: "Pulls compressor station telemetry from Datadog and creates a SAP PM notification if readings exceed thresholds."
  tags:
    - upstream
    - maintenance
    - datadog
    - sap
capability:
  exposes:
    - type: mcp
      namespace: compressor-health
      port: 8080
      tools:
        - name: check-compressor-health
          description: "Given a Datadog host tag for a compressor station, pull health metrics and create a SAP PM notification."
          inputParameters:
            - name: host_tag
              in: body
              type: string
              description: "Datadog host tag for the compressor station."
          steps:
            - name: get-metrics
              type: call
              call: datadog.query-metrics
              with:
                host_tag: "{{host_tag}}"
            - name: create-notification
              type: call
              call: sap.create-pm-notification
              with:
                equipment: "{{host_tag}}"
                description: "Health check alert: {{get-metrics.summary}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/A_MaintenanceNotification"
          operations:
            - name: create-pm-notification
              method: POST

When Datadog detects a refinery process sensor anomaly, creates a ServiceNow HSSE incident, creates a SAP PM inspection work order, and alerts the plant operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Refinery Sensor Alert Response"
  description: "When Datadog detects a refinery process sensor anomaly, creates a ServiceNow HSSE incident, creates a SAP PM inspection work order, and alerts the plant operations team in Microsoft Teams."
  tags:
    - operations
    - hsse
    - manufacturing
    - datadog
    - servicenow
    - sap-pm
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: refinery-ops
      port: 8080
      tools:
        - name: respond-to-refinery-alert
          description: "Given a Datadog monitor ID for a refinery sensor anomaly and the affected SAP equipment number, create a ServiceNow HSSE incident, a SAP PM inspection work order, and alert the plant ops Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID for the refinery sensor alert."
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number for the affected asset."
            - name: plant_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the plant operations team."
          steps:
            - name: get-alert
              type: call
              call: "datadog-refinery.get-monitor"
              with:
                monitorId: "{{monitor_id}}"
            - name: create-hsse-incident
              type: call
              call: "snow-refinery.create-incident"
              with:
                short_description: "Refinery sensor anomaly: {{get-alert.name}} on equipment {{equipment_number}}"
                urgency: "1"
                category: "process_safety"
                description: "Monitor: {{monitor_id}}\nEquipment: {{equipment_number}}\nAlert: {{get-alert.query}}"
            - name: create-inspection-order
              type: call
              call: "sap-inspection.create-work-order"
              with:
                equipment: "{{equipment_number}}"
                description: "Inspection following Datadog sensor alert: {{get-alert.name}}"
                orderType: "PM02"
                priority: "1"
            - name: alert-plant-ops
              type: call
              call: "msteams-plant.send-channel-message"
              with:
                channelId: "{{plant_channel_id}}"
                text: "REFINERY ALERT: {{get-alert.name}} on equipment {{equipment_number}} | Incident: {{create-hsse-incident.number}} | PM Work Order: {{create-inspection-order.WorkOrder}}"
  consumes:
    - type: http
      namespace: datadog-refinery
      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/{{monitorId}}"
          inputParameters:
            - name: monitorId
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: snow-refinery
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sap-inspection
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-plant
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new hire record is created in SAP SuccessFactors, opens a ServiceNow onboarding task, provisions Microsoft Entra ID, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire record is created in SAP SuccessFactors, opens a ServiceNow onboarding task, provisions Microsoft Entra ID, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - sap-successfactors
    - servicenow
    - microsoft-entra
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a SuccessFactors employee ID and start date, open a ServiceNow onboarding task, provision an Entra ID account, and send a Teams welcome message."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "SuccessFactors employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format."
          steps:
            - name: get-employee
              type: call
              call: "successfactors.get-employee"
              with:
                employeeId: "{{employee_id}}"
            - name: create-onboarding-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "New hire onboarding: {{get-employee.displayName}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: provision-entra
              type: call
              call: "entra.create-user"
              with:
                displayName: "{{get-employee.displayName}}"
                userPrincipalName: "{{get-employee.workEmail}}"
                department: "{{get-employee.department}}"
            - name: send-welcome
              type: call
              call: "msteams-onboard.send-message"
              with:
                recipient_upn: "{{get-employee.workEmail}}"
                text: "Welcome to Shell, {{get-employee.firstName}}! Your onboarding ticket is {{create-onboarding-task.number}}. Your start date is {{start_date}}."
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: employees
          path: "/PerPerson('{{employeeId}}')"
          inputParameters:
            - name: employeeId
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: entra
      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-onboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an environmental exceedance is detected in Datadog sensor monitoring, creates a ServiceNow environmental incident and notifies the HSSE team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Environmental Compliance Incident Reporting"
  description: "When an environmental exceedance is detected in Datadog sensor monitoring, creates a ServiceNow environmental incident and notifies the HSSE team via Microsoft Teams."
  tags:
    - safety
    - hsse
    - compliance
    - datadog
    - servicenow
    - microsoft-teams
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: hsse-ops
      port: 8080
      tools:
        - name: report-environmental-incident
          description: "Given a Datadog monitor ID for an environmental sensor exceedance, create a ServiceNow HSSE incident and notify the safety team in Microsoft Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that detected the environmental exceedance."
            - name: sensor_location
              in: body
              type: string
              description: "Physical location identifier of the sensor that triggered the alert."
            - name: hsse_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the HSSE team."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitorId: "{{monitor_id}}"
            - name: create-hsse-incident
              type: call
              call: "snow-hsse.create-incident"
              with:
                short_description: "Environmental exceedance at {{sensor_location}}: {{get-monitor.name}}"
                urgency: "1"
                category: "environmental"
                description: "Monitor: {{monitor_id}}\nLocation: {{sensor_location}}\nQuery: {{get-monitor.query}}\nThreshold exceeded at: {{get-monitor.lastTriggeredTs}}"
            - name: notify-hsse-team
              type: call
              call: "msteams-hsse.send-channel-message"
              with:
                channelId: "{{hsse_channel_id}}"
                text: "ENVIRONMENTAL ALERT: Exceedance at {{sensor_location}} | {{get-monitor.name}} | Incident: {{create-hsse-incident.number}}"
  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/{{monitorId}}"
          inputParameters:
            - name: monitorId
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: snow-hsse
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-hsse
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a GitHub Actions workflow to deploy subsea control system firmware, verifies status, and logs in ServiceNow for change management.

naftiko: "0.5"
info:
  label: "GitHub Actions Subsea Control System Deployment"
  description: "Triggers a GitHub Actions workflow to deploy subsea control system firmware, verifies status, and logs in ServiceNow for change management."
  tags:
    - upstream
    - devops
    - github
    - servicenow
    - ot
capability:
  exposes:
    - type: mcp
      namespace: subsea-deploy
      port: 8080
      tools:
        - name: deploy-subsea-firmware
          description: "Given a firmware version and target system, trigger GitHub deployment and log in ServiceNow."
          inputParameters:
            - name: firmware_version
              in: body
              type: string
              description: "Firmware version to deploy."
            - name: target_system
              in: body
              type: string
              description: "Target subsea control system."
            - name: change_request_id
              in: body
              type: string
              description: "ServiceNow change request number."
          steps:
            - name: trigger-deployment
              type: call
              call: github.trigger-workflow
              with:
                repo: "shell/subsea-controls"
                workflow: "deploy.yml"
                ref: "{{firmware_version}}"
            - name: log-deployment
              type: call
              call: servicenow.update-change-request
              with:
                change_request_id: "{{change_request_id}}"
                status: "implemented"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/shell/subsea-controls/actions/workflows/deploy.yml/dispatches"
          operations:
            - name: trigger-workflow
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: update-change-request
              method: PATCH

On a GitHub Actions pipeline failure for a Shell digital platform, creates a ServiceNow incident and alerts the DevOps team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Pipeline Failure to ServiceNow Incident"
  description: "On a GitHub Actions pipeline failure for a Shell digital platform, creates a ServiceNow incident and alerts the DevOps team via Microsoft Teams."
  tags:
    - devops
    - cicd
    - github
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub workflow run ID and repo, fetch failure details, create a ServiceNow incident for the DevOps team, and alert the channel in Microsoft Teams."
          inputParameters:
            - name: github_repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: run_id
              in: body
              type: integer
              description: "GitHub Actions workflow run ID that failed."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the DevOps alert."
          steps:
            - name: get-run
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{github_repo}}"
                runId: "{{run_id}}"
            - name: create-incident
              type: call
              call: "snow-devops.create-incident"
              with:
                short_description: "Pipeline failure: {{get-run.name}} on {{get-run.head_branch}}"
                urgency: "2"
                description: "Repo: {{github_repo}}\nRun: {{run_id}}\nBranch: {{get-run.head_branch}}\nCommit: {{get-run.head_sha}}\nTriggered by: {{get-run.actor.login}}"
            - name: alert-teams
              type: call
              call: "msteams-devops.send-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                text: "Pipeline failure: {{github_repo}} ({{get-run.head_branch}}) | Incident: {{create-incident.number}} | Run: {{run_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{runId}}"
          inputParameters:
            - name: repo
              in: path
            - name: runId
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: snow-devops
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-devops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Exports active employee headcount from SAP SuccessFactors by department and cost center and pushes the snapshot to Power BI for workforce planning dashboards.

naftiko: "0.5"
info:
  label: "Headcount Snapshot for Workforce Planning"
  description: "Exports active employee headcount from SAP SuccessFactors by department and cost center and pushes the snapshot to Power BI for workforce planning dashboards."
  tags:
    - hr
    - finance
    - reporting
    - sap-successfactors
    - power-bi
    - workforce-planning
capability:
  exposes:
    - type: mcp
      namespace: workforce-reporting
      port: 8080
      tools:
        - name: publish-headcount-snapshot
          description: "Export active headcount by department and cost center from SuccessFactors and push the dataset to Power BI for workforce planning and budget review."
          inputParameters:
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to push headcount rows into."
            - name: powerbi_table_name
              in: body
              type: string
              description: "Table name in the Power BI dataset, e.g. Headcount."
          steps:
            - name: get-headcount
              type: call
              call: "sf-hc.get-headcount"
            - name: push-dataset
              type: call
              call: "powerbi-hc.push-rows"
              with:
                datasetId: "{{powerbi_dataset_id}}"
                tableName: "{{powerbi_table_name}}"
                rows: "{{get-headcount.results}}"
  consumes:
    - type: http
      namespace: sf-hc
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: emp-jobs
          path: "/EmpJob"
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: powerbi-hc
      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

Pulls active subsea project issues from Jira, aggregates status, and posts a daily digest to the deepwater operations Teams channel.

naftiko: "0.5"
info:
  label: "Jira Subsea Project Status Digest"
  description: "Pulls active subsea project issues from Jira, aggregates status, and posts a daily digest to the deepwater operations Teams channel."
  tags:
    - upstream
    - jira
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: subsea-digest
      port: 8080
      tools:
        - name: generate-subsea-digest
          description: "Given a Jira project key, compile a status digest and post to Teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key for subsea operations."
          steps:
            - name: get-issues
              type: call
              call: jira.search-issues
              with:
                project_key: "{{project_key}}"
                status: "In Progress,Blocked"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel: "deepwater-operations"
                text: "Subsea Digest | Active: {{get-issues.in_progress_count}} | Blocked: {{get-issues.blocked_count}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/deepwater/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Retrieves LinkedIn Campaign Manager performance metrics for Shell's brand campaigns, compares against targets in Salesforce, and posts a weekly digest to Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Campaign Performance Digest"
  description: "Retrieves LinkedIn Campaign Manager performance metrics for Shell's brand campaigns, compares against targets in Salesforce, and posts a weekly digest to Microsoft Teams."
  tags:
    - marketing
    - social
    - linkedin
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-linkedin-campaign-performance
          description: "Fetch impressions, clicks, and spend from LinkedIn Campaign Manager for a campaign, compare to Salesforce targets, and post a performance digest to the marketing Teams channel."
          inputParameters:
            - name: linkedin_campaign_id
              in: body
              type: string
              description: "LinkedIn Campaign Manager campaign ID."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "Salesforce campaign ID holding target KPIs."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the marketing team digest."
          steps:
            - name: get-linkedin-stats
              type: call
              call: "linkedin.get-campaign-stats"
              with:
                campaignId: "{{linkedin_campaign_id}}"
            - name: get-sf-targets
              type: call
              call: "salesforce-mkt.get-campaign"
              with:
                campaignId: "{{salesforce_campaign_id}}"
            - name: post-digest
              type: call
              call: "msteams-mkt.send-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                text: "LinkedIn Campaign Digest: Impressions={{get-linkedin-stats.impressions}} (target {{get-sf-targets.expectedImpressions}}) | Clicks={{get-linkedin-stats.clicks}} | Spend=${{get-linkedin-stats.spend}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-stats
          path: "/adAnalyticsV2"
          inputParameters:
            - name: campaignId
              in: query
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: salesforce-mkt
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaignId}}"
          inputParameters:
            - name: campaignId
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: msteams-mkt
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries OSIsoft PI (via REST) for upstream production metrics, loads the data into Snowflake, and triggers a Power BI dataset refresh for the operations dashboard.

naftiko: "0.5"
info:
  label: "Oil Production Metrics Dashboard Refresh"
  description: "Queries OSIsoft PI (via REST) for upstream production metrics, loads the data into Snowflake, and triggers a Power BI dataset refresh for the operations dashboard."
  tags:
    - operations
    - data
    - osisoft-pi
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: production-reporting
      port: 8080
      tools:
        - name: refresh-production-dashboard
          description: "Fetch upstream production metrics (oil, gas, water injection rates) from OSIsoft PI Web API, load into Snowflake, and trigger a Power BI dataset refresh. Use for daily operations dashboard updates."
          inputParameters:
            - name: pi_server_url
              in: body
              type: string
              description: "OSIsoft PI Web API base URL for the production asset server."
            - name: asset_path
              in: body
              type: string
              description: "PI asset database path for the production element, e.g. \\\\Server\\Field\\Well."
            - name: snowflake_table
              in: body
              type: string
              description: "Fully qualified Snowflake table to insert production data."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh after data load."
          steps:
            - name: get-pi-data
              type: call
              call: "osipi.get-element-data"
              with:
                assetPath: "{{asset_path}}"
            - name: load-snowflake
              type: call
              call: "snowflake-prod.insert-rows"
              with:
                tableName: "{{snowflake_table}}"
                rows: "{{get-pi-data.items}}"
            - name: refresh-powerbi
              type: call
              call: "powerbi.trigger-refresh"
              with:
                datasetId: "{{powerbi_dataset_id}}"
  consumes:
    - type: http
      namespace: osipi
      baseUri: "https://pi-server.shell.com/piwebapi"
      authentication:
        type: basic
        username: "$secrets.pi_user"
        password: "$secrets.pi_password"
      resources:
        - name: element-data
          path: "/assetdatabases"
          inputParameters:
            - name: assetPath
              in: query
          operations:
            - name: get-element-data
              method: GET
    - type: http
      namespace: snowflake-prod
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: table-rows
          path: "/statements"
          operations:
            - name: insert-rows
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              method: POST

When an employee termination is recorded in SAP SuccessFactors, deactivates the Okta account, revokes all active sessions, and confirms in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Employee Deprovisioning on Termination"
  description: "When an employee termination is recorded in SAP SuccessFactors, deactivates the Okta account, revokes all active sessions, and confirms in Microsoft Teams."
  tags:
    - hr
    - identity
    - security
    - sap-successfactors
    - okta
    - offboarding
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: offboarding-security
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a SuccessFactors employee ID and Okta user ID, verify termination, deactivate Okta user, clear all sessions, and confirm via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "SuccessFactors employee ID for the terminated employee."
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID to deactivate."
            - name: hr_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the HR deprovisioning confirmation."
          steps:
            - name: verify-termination
              type: call
              call: "sf-term.get-employee-status"
              with:
                employeeId: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                userId: "{{okta_user_id}}"
            - name: clear-sessions
              type: call
              call: "okta-sessions.clear-user-sessions"
              with:
                userId: "{{okta_user_id}}"
            - name: confirm-teams
              type: call
              call: "msteams-offboard.send-channel-message"
              with:
                channelId: "{{hr_channel_id}}"
                text: "Deprovisioning complete for employee {{employee_id}}. Okta account deactivated and sessions cleared."
  consumes:
    - type: http
      namespace: sf-term
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: employment-records
          path: "/EmpEmployment(personIdExternal='{{employeeId}}')"
          inputParameters:
            - name: employeeId
              in: path
          operations:
            - name: get-employee-status
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://shell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-deactivate
          path: "/users/{{userId}}/lifecycle/deactivate"
          inputParameters:
            - name: userId
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: okta-sessions
      baseUri: "https://shell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{userId}}/sessions"
          inputParameters:
            - name: userId
              in: path
          operations:
            - name: clear-user-sessions
              method: DELETE
    - type: http
      namespace: msteams-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Performs quarterly privileged access review for OT systems by pulling Okta assignments, cross-referencing Workday, and logging findings in ServiceNow.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Review for OT Systems"
  description: "Performs quarterly privileged access review for OT systems by pulling Okta assignments, cross-referencing Workday, and logging findings in ServiceNow."
  tags:
    - safety
    - security
    - okta
    - workday
    - servicenow
    - ot
capability:
  exposes:
    - type: mcp
      namespace: ot-access-review
      port: 8080
      tools:
        - name: review-ot-access
          description: "Given an Okta application ID for an OT system, pull privileged users, verify in Workday, and log in ServiceNow."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Okta application ID for the OT system."
          steps:
            - name: get-privileged-users
              type: call
              call: okta.get-app-users
              with:
                app_id: "{{app_id}}"
            - name: verify-employment
              type: call
              call: workday.verify-active-employees
              with:
                user_list: "{{get-privileged-users.users}}"
            - name: log-findings
              type: call
              call: servicenow.create-audit-record
              with:
                app_id: "{{app_id}}"
                total_users: "{{get-privileged-users.count}}"
                inactive_users: "{{verify-employment.inactive_count}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://shell.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-users
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: verify-active-employees
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audit-records
          path: "/table/u_access_review"
          operations:
            - name: create-audit-record
              method: POST

Generates a weekly upstream field performance report from Snowflake and publishes it to Power BI, then sends a summary notification to the asset management team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Upstream Performance Report"
  description: "Generates a weekly upstream field performance report from Snowflake and publishes it to Power BI, then sends a summary notification to the asset management team in Microsoft Teams."
  tags:
    - operations
    - reporting
    - snowflake
    - power-bi
    - microsoft-teams
    - upstream
capability:
  exposes:
    - type: mcp
      namespace: upstream-reporting
      port: 8080
      tools:
        - name: publish-upstream-performance-report
          description: "Execute a Snowflake query for upstream field KPIs (production efficiency, uptime, deferment), push to Power BI, and notify the asset management Teams channel."
          inputParameters:
            - name: field_name
              in: body
              type: string
              description: "Upstream field name to generate the report for."
            - name: report_week
              in: body
              type: string
              description: "Report week ending date in YYYY-MM-DD format."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the upstream performance report."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for asset management notification."
          steps:
            - name: get-field-kpis
              type: call
              call: "snowflake-upstream.query-field-kpis"
              with:
                fieldName: "{{field_name}}"
                weekEnding: "{{report_week}}"
            - name: push-powerbi
              type: call
              call: "powerbi-upstream.push-rows"
              with:
                datasetId: "{{powerbi_dataset_id}}"
                tableName: "UpstreamPerformance"
                rows: "{{get-field-kpis.rows}}"
            - name: notify-asset-mgmt
              type: call
              call: "msteams-upstream.send-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                text: "Weekly upstream performance report published for {{field_name}} (week ending {{report_week}}). Production efficiency: {{get-field-kpis.productionEfficiency}}%"
  consumes:
    - type: http
      namespace: snowflake-upstream
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: field-kpi-queries
          path: "/statements"
          operations:
            - name: query-field-kpis
              method: POST
    - type: http
      namespace: powerbi-upstream
      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
    - type: http
      namespace: msteams-upstream
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Aggregates project milestone data from Jira for Shell's renewable energy portfolio and publishes a weekly status digest to Power BI and a Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Renewable Energy Project Status Digest"
  description: "Aggregates project milestone data from Jira for Shell's renewable energy portfolio and publishes a weekly status digest to Power BI and a Microsoft Teams channel."
  tags:
    - operations
    - project-management
    - renewables
    - jira
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: renewables-reporting
      port: 8080
      tools:
        - name: publish-renewables-status-digest
          description: "Query Jira for open milestones and overdue tasks in the renewable energy project portfolio, push a status summary to Power BI, and notify the project leadership Teams channel."
          inputParameters:
            - name: jira_project_keys
              in: body
              type: string
              description: "Comma-separated Jira project keys for the renewables portfolio, e.g. WIND,SOLAR,HYDRO."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the renewable portfolio status."
            - name: leadership_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for leadership notification."
          steps:
            - name: get-project-status
              type: call
              call: "jira-renewables.search-issues"
              with:
                jql: "project in ({{jira_project_keys}}) AND issuetype = Epic AND status != Done"
            - name: push-powerbi
              type: call
              call: "powerbi-renewables.push-rows"
              with:
                datasetId: "{{powerbi_dataset_id}}"
                tableName: "RenewablesPortfolio"
                rows: "{{get-project-status.issues}}"
            - name: notify-leadership
              type: call
              call: "msteams-renewables.send-channel-message"
              with:
                channelId: "{{leadership_channel_id}}"
                text: "Renewables Portfolio Digest: {{get-project-status.total}} active epics across {{jira_project_keys}}. Power BI report updated."
  consumes:
    - type: http
      namespace: jira-renewables
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issue-search
          path: "/issue/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: powerbi-renewables
      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
    - type: http
      namespace: msteams-renewables
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Enriches a Salesforce energy customer account with financial data from ZoomInfo and upstream contract details from SAP, then updates the account record.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Enrichment"
  description: "Enriches a Salesforce energy customer account with financial data from ZoomInfo and upstream contract details from SAP, then updates the account record."
  tags:
    - crm
    - sales
    - salesforce
    - zoominfo
    - sap-s4hana
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: crm-enrichment
      port: 8080
      tools:
        - name: enrich-energy-customer
          description: "Given a Salesforce account ID and SAP customer number, fetch firmographic data from ZoomInfo, pull contract details from SAP S/4HANA, and update the Salesforce account with enriched fields."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID to enrich."
            - name: sap_customer_number
              in: body
              type: string
              description: "SAP customer number for the same account."
          steps:
            - name: get-sf-account
              type: call
              call: "salesforce.get-account"
              with:
                accountId: "{{salesforce_account_id}}"
            - name: enrich-zoominfo
              type: call
              call: "zoominfo.search-company"
              with:
                companyName: "{{get-sf-account.Name}}"
                website: "{{get-sf-account.Website}}"
            - name: get-sap-contracts
              type: call
              call: "sap-contracts.get-customer-contracts"
              with:
                customerNumber: "{{sap_customer_number}}"
            - name: update-account
              type: call
              call: "salesforce-update.update-account"
              with:
                accountId: "{{salesforce_account_id}}"
                employeeCount: "{{enrich-zoominfo.employeeCount}}"
                revenue: "{{enrich-zoominfo.revenue}}"
                activeContracts: "{{get-sap-contracts.count}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{accountId}}"
          inputParameters:
            - name: accountId
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: sap-contracts
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_SALES_CONTRACT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customer-contracts
          path: "/A_SalesContract"
          inputParameters:
            - name: customerNumber
              in: query
          operations:
            - name: get-customer-contracts
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: account-update
          path: "/sobjects/Account/{{accountId}}"
          inputParameters:
            - name: accountId
              in: path
          operations:
            - name: update-account
              method: PATCH

Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks, and sends a digest to the commercial operations Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Energy Contract Renewal Tracker"
  description: "Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks, and sends a digest to the commercial operations Teams channel."
  tags:
    - trading
    - salesforce
    - msteams
    - downstream
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: track-contract-renewals
          description: "Find contracts approaching renewal in Salesforce, create tasks, and notify commercial ops via Teams."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: number
              description: "Number of days before contract expiry to flag."
          steps:
            - name: find-expiring-contracts
              type: call
              call: salesforce.query-contracts
              with:
                days_until_expiry: "{{days_until_expiry}}"
            - name: create-tasks
              type: call
              call: salesforce.create-renewal-tasks
              with:
                contracts: "{{find-expiring-contracts.records}}"
            - name: notify-commercial
              type: call
              call: msteams.send-message
              with:
                channel: "commercial-operations"
                text: "Contract renewal digest | {{find-expiring-contracts.total_count}} contracts expiring within {{days_until_expiry}} days"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query"
          operations:
            - name: query-contracts
              method: GET
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-renewal-tasks
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/commercial/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

When a Salesforce energy sales opportunity closes as won, creates a corresponding SAP S/4HANA sales order and writes the order number back to Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Sales Order"
  description: "When a Salesforce energy sales opportunity closes as won, creates a corresponding SAP S/4HANA sales order and writes the order number back to Salesforce."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap-s4hana
    - order-management
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: create-sales-order-from-opportunity
          description: "Given a Closed Won Salesforce opportunity ID, fetch the opportunity, create a SAP S/4HANA sales order, and write the SAP order number back to the Salesforce opportunity record."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID with Stage = Closed Won."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-opp.get-opportunity"
              with:
                opportunityId: "{{opportunity_id}}"
            - name: create-so
              type: call
              call: "sap-sd.create-sales-order"
              with:
                soldToParty: "{{get-opportunity.AccountId}}"
                orderValue: "{{get-opportunity.Amount}}"
                currency: "{{get-opportunity.CurrencyIsoCode}}"
                orderType: "OR"
            - name: update-opportunity
              type: call
              call: "salesforce-sf-update.update-opportunity"
              with:
                opportunityId: "{{opportunity_id}}"
                sapSalesOrderNumber: "{{create-so.SalesOrder}}"
  consumes:
    - type: http
      namespace: salesforce-opp
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunityId}}"
          inputParameters:
            - name: opportunityId
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-sd
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: salesforce-sf-update
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity-update
          path: "/sobjects/Opportunity/{{opportunityId}}"
          inputParameters:
            - name: opportunityId
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

Queries SAP Ariba for energy supply contracts expiring within a configurable window and sends expiry reminders to contract owners via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Notification"
  description: "Queries SAP Ariba for energy supply contracts expiring within a configurable window and sends expiry reminders to contract owners via Microsoft Teams."
  tags:
    - procurement
    - contract-management
    - sap-ariba
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: contract-monitoring
      port: 8080
      tools:
        - name: notify-expiring-contracts
          description: "Query Ariba for energy supply contracts expiring within a given number of days and send a Teams renewal reminder to each contract owner."
          inputParameters:
            - name: days_to_expiry
              in: body
              type: integer
              description: "Days ahead to look for expiring Ariba contracts."
          steps:
            - name: get-expiring-contracts
              type: call
              call: "ariba-contracts.get-expiring-contracts"
              with:
                daysToExpiry: "{{days_to_expiry}}"
            - name: notify-owner
              type: call
              call: "msteams-contract.send-message"
              with:
                recipient_upn: "{{get-expiring-contracts.ownerEmail}}"
                text: "Ariba contract {{get-expiring-contracts.contractId}} with {{get-expiring-contracts.supplierName}} expires on {{get-expiring-contracts.expiryDate}}. Please initiate renewal."
  consumes:
    - type: http
      namespace: ariba-contracts
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          inputParameters:
            - name: daysToExpiry
              in: query
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: msteams-contract
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls contract spend data from SAP Ariba for a commodity category, compares against SAP budget, and logs variance to Snowflake.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Spend Analysis"
  description: "Pulls contract spend data from SAP Ariba for a commodity category, compares against SAP budget, and logs variance to Snowflake."
  tags:
    - procurement
    - sap-ariba
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: contract-spend
      port: 8080
      tools:
        - name: analyze-contract-spend
          description: "Given a commodity category and fiscal period, pull Ariba spend, compare to SAP budget, and log variance."
          inputParameters:
            - name: commodity_category
              in: body
              type: string
              description: "Commodity category code."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-ariba-spend
              type: call
              call: ariba.get-spend
              with:
                category: "{{commodity_category}}"
                period: "{{fiscal_period}}"
            - name: get-sap-budget
              type: call
              call: sap.get-budget
              with:
                category: "{{commodity_category}}"
                period: "{{fiscal_period}}"
            - name: log-variance
              type: call
              call: snowflake.insert-variance
              with:
                category: "{{commodity_category}}"
                actual_spend: "{{get-ariba-spend.total}}"
                budgeted: "{{get-sap-budget.amount}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://shell.ariba.com/api/spend-visibility"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: spend
          path: "/reports/spend"
          operations:
            - name: get-spend
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/FI_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budget
          path: "/A_BudgetAllocation"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: variance
          path: "/statements"
          operations:
            - name: insert-variance
              method: POST

Initiates a new supplier onboarding request in SAP Ariba, creates a Jira task for the procurement team to complete supplier validation, and sends welcome instructions via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Initiates a new supplier onboarding request in SAP Ariba, creates a Jira task for the procurement team to complete supplier validation, and sends welcome instructions via Microsoft Teams."
  tags:
    - procurement
    - supplier-management
    - sap-ariba
    - jira
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given a supplier name and contact email, initiate an Ariba supplier onboarding registration, create a Jira validation task, and send instructions to the supplier contact via Teams."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the supplier to onboard."
            - name: supplier_contact_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
            - name: commodity_category
              in: body
              type: string
              description: "SAP Ariba commodity category code for this supplier."
          steps:
            - name: create-ariba-registration
              type: call
              call: "ariba.create-supplier-registration"
              with:
                supplierName: "{{supplier_name}}"
                contactEmail: "{{supplier_contact_email}}"
                commodityCode: "{{commodity_category}}"
            - name: create-validation-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PROC"
                issuetype: "Task"
                summary: "Supplier validation: {{supplier_name}}"
                description: "Ariba registration ID: {{create-ariba-registration.registrationId}}\nContact: {{supplier_contact_email}}\nCategory: {{commodity_category}}"
            - name: notify-supplier
              type: call
              call: "msteams-supplier.send-message"
              with:
                recipient_upn: "{{supplier_contact_email}}"
                text: "Welcome to Shell's supplier portal. Your registration ID is {{create-ariba-registration.registrationId}}. Please complete your profile at {{create-ariba-registration.portalUrl}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-registration/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: supplier-registrations
          path: "/registrations"
          operations:
            - name: create-supplier-registration
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-supplier
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves biofuels feedstock procurement data from SAP, returning supplier, feedstock type, volume, and sustainability certification status.

naftiko: "0.5"
info:
  label: "SAP Biofuels Feedstock Procurement Tracker"
  description: "Retrieves biofuels feedstock procurement data from SAP, returning supplier, feedstock type, volume, and sustainability certification status."
  tags:
    - downstream
    - renewable-energy
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: biofuels-procurement
      port: 8080
      tools:
        - name: get-biofuels-procurement
          description: "Look up biofuels feedstock by purchase order. Returns supplier, feedstock type, volume, and cert status."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
          call: sap.get-biofuels-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: supplier
              type: string
              mapping: "$.d.SupplierName"
            - name: feedstock_type
              type: string
              mapping: "$.d.FeedstockType"
            - name: volume_mt
              type: number
              mapping: "$.d.TotalQuantity"
            - name: iscc_certified
              type: boolean
              mapping: "$.d.ISCCCertified"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-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-biofuels-po
              method: GET

Retrieves batch quality inspection results from SAP QM for chemical plant batches, returning conformance status and disposition.

naftiko: "0.5"
info:
  label: "SAP Chemical Plant Batch Quality Check"
  description: "Retrieves batch quality inspection results from SAP QM for chemical plant batches, returning conformance status and disposition."
  tags:
    - downstream
    - quality
    - sap
capability:
  exposes:
    - type: mcp
      namespace: batch-quality
      port: 8080
      tools:
        - name: get-batch-quality
          description: "Look up quality inspection results by batch number."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "SAP batch number."
          call: sap.get-inspection-lot
          with:
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: conformance
              type: string
              mapping: "$.d.ConformanceStatus"
            - name: disposition
              type: string
              mapping: "$.d.UsageDecision"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot(Batch='{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Retrieves pending expense reports from SAP Concur for energy project travel, applies a policy check, and notifies approvers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Report Approval"
  description: "Retrieves pending expense reports from SAP Concur for energy project travel, applies a policy check, and notifies approvers via Microsoft Teams."
  tags:
    - finance
    - travel
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given a Concur expense report ID and approver UPN, fetch the report, post the approval, and notify the submitter in Teams. Use for automating energy project expense approval chains."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
            - name: approver_upn
              in: body
              type: string
              description: "UPN of the manager approving the report."
            - name: decision
              in: body
              type: string
              description: "Approval action: 'approve' or 'send_back'."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                reportId: "{{report_id}}"
            - name: post-decision
              type: call
              call: "concur.approve-report"
              with:
                reportId: "{{report_id}}"
                action: "{{decision}}"
            - name: notify-submitter
              type: call
              call: "msteams-expense.send-message"
              with:
                recipient_upn: "{{get-report.ownerEmail}}"
                text: "Your expense report {{report_id}} ({{get-report.name}}, {{get-report.total}}) has been {{decision}}d by {{approver_upn}}."
  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/reportdigests/{{reportId}}"
          inputParameters:
            - name: reportId
              in: path
          operations:
            - name: get-expense-report
              method: GET
        - name: expense-approvals
          path: "/expense/reports/{{reportId}}/approve"
          inputParameters:
            - name: reportId
              in: path
          operations:
            - name: approve-report
              method: POST
    - type: http
      namespace: msteams-expense
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance.

naftiko: "0.5"
info:
  label: "SAP Corrosion Inhibitor Injection Rate"
  description: "Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance."
  tags:
    - upstream
    - safety
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: corrosion-inhibitor
      port: 8080
      tools:
        - name: get-inhibitor-rate
          description: "Look up corrosion inhibitor injection rate by equipment number."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number for the injection point."
          call: sap.get-inhibitor-data
          with:
            equipment_number: "{{equipment_number}}"
          outputParameters:
            - name: current_rate_ppm
              type: number
              mapping: "$.d.CurrentRate"
            - name: target_rate_ppm
              type: number
              mapping: "$.d.TargetRate"
            - name: compliant
              type: boolean
              mapping: "$.d.WithinSpec"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inhibitor-data
          path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
          inputParameters:
            - name: equipment_number
              in: path
          operations:
            - name: get-inhibitor-data
              method: GET

Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target specifications.

naftiko: "0.5"
info:
  label: "SAP Crude Blending Recipe Lookup"
  description: "Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target specifications."
  tags:
    - refining
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: crude-blending
      port: 8080
      tools:
        - name: get-blend-recipe
          description: "Look up crude blending recipe by process order number. Returns feedstock grades, ratios, and target specs."
          inputParameters:
            - name: process_order
              in: body
              type: string
              description: "SAP process order number for the refinery run."
          call: sap.get-recipe
          with:
            process_order: "{{process_order}}"
          outputParameters:
            - name: feedstocks
              type: string
              mapping: "$.d.FeedstockList"
            - name: target_api
              type: number
              mapping: "$.d.TargetAPIGravity"
            - name: target_sulfur_pct
              type: number
              mapping: "$.d.TargetSulfurContent"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: recipes
          path: "/A_ProcessOrder('{{process_order}}')/to_Recipe"
          inputParameters:
            - name: process_order
              in: path
          operations:
            - name: get-recipe
              method: GET

Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps.

naftiko: "0.5"
info:
  label: "SAP Crude Oil Inventory Lookup"
  description: "Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps."
  tags:
    - upstream
    - inventory
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: crude-inventory
      port: 8080
      tools:
        - name: get-crude-inventory
          description: "Look up crude oil inventory by storage terminal ID. Returns tank volumes, product grades, and last measurement timestamps."
          inputParameters:
            - name: terminal_id
              in: body
              type: string
              description: "SAP plant code for the storage terminal."
          call: sap.get-inventory
          with:
            terminal_id: "{{terminal_id}}"
          outputParameters:
            - name: total_volume_bbl
              type: number
              mapping: "$.d.TotalVolume"
            - name: product_grade
              type: string
              mapping: "$.d.MaterialGrade"
            - name: last_measured
              type: string
              mapping: "$.d.LastMeasurementDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inventory
          path: "/A_MaterialStock(Plant='{{terminal_id}}')"
          inputParameters:
            - name: terminal_id
              in: path
          operations:
            - name: get-inventory
              method: GET

Retrieves spare parts availability from SAP for deepwater drilling rigs, returning stock levels, warehouse location, and lead times.

naftiko: "0.5"
info:
  label: "SAP Deepwater Rig Spare Parts Lookup"
  description: "Retrieves spare parts availability from SAP for deepwater drilling rigs, returning stock levels, warehouse location, and lead times."
  tags:
    - upstream
    - inventory
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: rig-spares
      port: 8080
      tools:
        - name: lookup-spare-parts
          description: "Look up spare parts by material number and rig plant code. Returns stock, location, and lead time."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the spare part."
            - name: rig_code
              in: body
              type: string
              description: "SAP plant code for the deepwater rig."
          call: sap.get-spare-stock
          with:
            material_number: "{{material_number}}"
            rig_code: "{{rig_code}}"
          outputParameters:
            - name: available_qty
              type: number
              mapping: "$.d.AvailableStock"
            - name: warehouse
              type: string
              mapping: "$.d.StorageLocation"
            - name: lead_time_days
              type: number
              mapping: "$.d.ReplenishmentLeadTime"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MaterialStock"
          operations:
            - name: get-spare-stock
              method: GET

Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, rates, and claim amounts.

naftiko: "0.5"
info:
  label: "SAP Demurrage Claim Tracker"
  description: "Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, rates, and claim amounts."
  tags:
    - downstream
    - trading
    - sap
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: demurrage
      port: 8080
      tools:
        - name: get-demurrage-claim
          description: "Look up demurrage claim by voyage number. Returns wait time, rate, and claim amount."
          inputParameters:
            - name: voyage_number
              in: body
              type: string
              description: "SAP voyage/shipment reference number."
          call: sap.get-demurrage
          with:
            voyage_number: "{{voyage_number}}"
          outputParameters:
            - name: wait_hours
              type: number
              mapping: "$.d.WaitingHours"
            - name: demurrage_rate
              type: number
              mapping: "$.d.DailyRate"
            - name: claim_amount
              type: number
              mapping: "$.d.ClaimAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: demurrage
          path: "/A_DemurrageClaim('{{voyage_number}}')"
          inputParameters:
            - name: voyage_number
              in: path
          operations:
            - name: get-demurrage
              method: GET

Looks up the shipment status of a downstream petroleum product delivery in SAP, returning carrier, ETA, and delivery quantity.

naftiko: "0.5"
info:
  label: "SAP Downstream Product Shipment Status"
  description: "Looks up the shipment status of a downstream petroleum product delivery in SAP, returning carrier, ETA, and delivery quantity."
  tags:
    - downstream
    - logistics
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: shipment-status
      port: 8080
      tools:
        - name: get-shipment-status
          description: "Look up a downstream product shipment by delivery number. Returns carrier name, current status, ETA, and quantity."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery document number."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: carrier
              type: string
              mapping: "$.d.CarrierName"
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: eta
              type: string
              mapping: "$.d.PlannedArrivalDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutboundDelivery('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Retrieves EV charging station operational status from SAP, returning charger availability, utilization rate, and fault codes for Shell Recharge network management.

naftiko: "0.5"
info:
  label: "SAP EV Charging Station Status Lookup"
  description: "Retrieves EV charging station operational status from SAP, returning charger availability, utilization rate, and fault codes for Shell Recharge network management."
  tags:
    - downstream
    - renewable-energy
    - sap
capability:
  exposes:
    - type: mcp
      namespace: ev-charging
      port: 8080
      tools:
        - name: get-charger-status
          description: "Look up EV charging station status by site ID. Returns charger availability, utilization, and active faults."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Shell Recharge site identifier."
          call: sap.get-charger-status
          with:
            site_id: "{{site_id}}"
          outputParameters:
            - name: available_chargers
              type: number
              mapping: "$.d.AvailableCount"
            - name: utilization_pct
              type: number
              mapping: "$.d.UtilizationRate"
            - name: active_faults
              type: number
              mapping: "$.d.FaultCount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: chargers
          path: "/A_Equipment(Site='{{site_id}}')"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-charger-status
              method: GET

When a contingent worker is approved in SAP Fieldglass for a Shell project, provisions an Okta guest account and opens a ServiceNow access request.

naftiko: "0.5"
info:
  label: "SAP Fieldglass Contractor Onboarding"
  description: "When a contingent worker is approved in SAP Fieldglass for a Shell project, provisions an Okta guest account and opens a ServiceNow access request."
  tags:
    - hr
    - contingent-workforce
    - sap-fieldglass
    - okta
    - servicenow
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: contractor-onboarding
      port: 8080
      tools:
        - name: onboard-contractor
          description: "Given a Fieldglass work order ID, fetch the approved contractor details, provision an Okta guest account, and open a ServiceNow access request for project systems."
          inputParameters:
            - name: work_order_id
              in: body
              type: string
              description: "SAP Fieldglass work order ID for the approved contractor."
          steps:
            - name: get-work-order
              type: call
              call: "fieldglass.get-work-order"
              with:
                workOrderId: "{{work_order_id}}"
            - name: provision-okta-guest
              type: call
              call: "okta-guest.create-user"
              with:
                firstName: "{{get-work-order.workerFirstName}}"
                lastName: "{{get-work-order.workerLastName}}"
                email: "{{get-work-order.workerEmail}}"
            - name: create-access-request
              type: call
              call: "snow-access.create-request"
              with:
                short_description: "Contractor access request: {{get-work-order.workerName}}"
                category: "contractor_access"
                description: "Fieldglass work order: {{work_order_id}}\nProject: {{get-work-order.projectName}}\nOkta user: {{provision-okta-guest.userId}}"
  consumes:
    - type: http
      namespace: fieldglass
      baseUri: "https://www.fieldglass.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fieldglass_token"
      resources:
        - name: work-orders
          path: "/workorders/{{workOrderId}}"
          inputParameters:
            - name: workOrderId
              in: path
          operations:
            - name: get-work-order
              method: GET
    - type: http
      namespace: okta-guest
      baseUri: "https://shell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: snow-access
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Retrieves flare gas recovery rates from SAP for a given refinery unit, returning recovery percentage, flare volume, and compliance status.

naftiko: "0.5"
info:
  label: "SAP Flare Gas Recovery Monitoring"
  description: "Retrieves flare gas recovery rates from SAP for a given refinery unit, returning recovery percentage, flare volume, and compliance status."
  tags:
    - environmental
    - refining
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: flare-recovery
      port: 8080
      tools:
        - name: get-flare-recovery
          description: "Look up flare gas recovery metrics by refinery unit. Returns recovery rate, flare volume, and compliance status."
          inputParameters:
            - name: unit_id
              in: body
              type: string
              description: "SAP functional location for the refinery unit."
          call: sap.get-flare-metrics
          with:
            unit_id: "{{unit_id}}"
          outputParameters:
            - name: recovery_pct
              type: number
              mapping: "$.d.RecoveryPercentage"
            - name: flare_volume_mcf
              type: number
              mapping: "$.d.FlareVolume"
            - name: compliant
              type: boolean
              mapping: "$.d.RegulatoryCompliant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: flare-metrics
          path: "/A_MeasurementDocument(FunctionalLocation='{{unit_id}}')"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-flare-metrics
              method: GET

Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals.

naftiko: "0.5"
info:
  label: "SAP Fuel Rack Pricing Update"
  description: "Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals."
  tags:
    - downstream
    - trading
    - sap
capability:
  exposes:
    - type: mcp
      namespace: rack-pricing
      port: 8080
      tools:
        - name: get-rack-prices
          description: "Look up fuel rack prices by terminal and product type."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "Terminal code for pricing lookup."
            - name: product_type
              in: body
              type: string
              description: "Product type: gasoline, diesel, jet-fuel."
          call: sap.get-rack-price
          with:
            terminal_code: "{{terminal_code}}"
            product_type: "{{product_type}}"
          outputParameters:
            - name: posted_price
              type: number
              mapping: "$.d.PostedPrice"
            - name: effective_date
              type: string
              mapping: "$.d.EffectiveDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: rack-prices
          path: "/A_PricingCondition"
          operations:
            - name: get-rack-price
              method: GET

Retrieves NGL recovery data from SAP for a gas processing plant, returning volumes by product and recovery efficiency.

naftiko: "0.5"
info:
  label: "SAP Gas Plant NGL Recovery Report"
  description: "Retrieves NGL recovery data from SAP for a gas processing plant, returning volumes by product and recovery efficiency."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: ngl-recovery
      port: 8080
      tools:
        - name: get-ngl-recovery
          description: "Look up NGL recovery metrics by gas plant code."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the gas processing facility."
          call: sap.get-ngl-data
          with:
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: ethane_bbl
              type: number
              mapping: "$.d.EthaneVolume"
            - name: propane_bbl
              type: number
              mapping: "$.d.PropaneVolume"
            - name: recovery_efficiency_pct
              type: number
              mapping: "$.d.RecoveryEfficiency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ngl-data
          path: "/A_GasPlantProduction"
          operations:
            - name: get-ngl-data
              method: GET

Checks the period-close status for a given SAP S/4HANA company code and fiscal period, and notifies the finance team in Microsoft Teams with the open/closed status of each accounting area.

naftiko: "0.5"
info:
  label: "SAP GL Period-Close Status Check"
  description: "Checks the period-close status for a given SAP S/4HANA company code and fiscal period, and notifies the finance team in Microsoft Teams with the open/closed status of each accounting area."
  tags:
    - finance
    - erp
    - sap-s4hana
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: check-period-close-status
          description: "Given a SAP company code and fiscal period, retrieve the period-close status from S/4HANA and post a status summary to the finance Microsoft Teams channel."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code, e.g. GB01 for Shell UK."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period number, e.g. 03 for March."
            - name: finance_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the finance team."
          steps:
            - name: get-period-status
              type: call
              call: "sap-close.get-period-close-status"
              with:
                CompanyCode: "{{company_code}}"
                FiscalYear: "{{fiscal_year}}"
                FiscalPeriod: "{{fiscal_period}}"
            - name: notify-finance
              type: call
              call: "msteams-finance.send-channel-message"
              with:
                channelId: "{{finance_channel_id}}"
                text: "Period close status for {{company_code}} {{fiscal_year}}/{{fiscal_period}}: FI={{get-period-status.fiStatus}} | CO={{get-period-status.coStatus}} | MM={{get-period-status.mmStatus}}"
  consumes:
    - type: http
      namespace: sap-close
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_FISCALYEARVARIANT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close-status
          path: "/A_FiscalYearVariant"
          inputParameters:
            - name: CompanyCode
              in: query
            - name: FiscalYear
              in: query
            - name: FiscalPeriod
              in: query
          operations:
            - name: get-period-close-status
              method: GET
    - type: http
      namespace: msteams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves heat exchanger performance data from SAP, calculating fouling factor trends and flagging units needing cleaning.

naftiko: "0.5"
info:
  label: "SAP Heat Exchanger Fouling Monitor"
  description: "Retrieves heat exchanger performance data from SAP, calculating fouling factor trends and flagging units needing cleaning."
  tags:
    - refining
    - maintenance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: hx-fouling
      port: 8080
      tools:
        - name: get-fouling-status
          description: "Look up heat exchanger fouling metrics by equipment number."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number for the heat exchanger."
          call: sap.get-hx-performance
          with:
            equipment_number: "{{equipment_number}}"
          outputParameters:
            - name: fouling_factor
              type: number
              mapping: "$.d.FoulingFactor"
            - name: duty_degradation_pct
              type: number
              mapping: "$.d.DutyDegradation"
            - name: cleaning_recommended
              type: boolean
              mapping: "$.d.CleaningRecommended"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: hx-data
          path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
          inputParameters:
            - name: equipment_number
              in: path
          operations:
            - name: get-hx-performance
              method: GET

Retrieves hydrogen inventory levels at Shell hydrogen fueling stations from SAP, returning current stock, delivery schedule, and station status.

naftiko: "0.5"
info:
  label: "SAP Hydrogen Fueling Station Inventory"
  description: "Retrieves hydrogen inventory levels at Shell hydrogen fueling stations from SAP, returning current stock, delivery schedule, and station status."
  tags:
    - downstream
    - renewable-energy
    - sap
capability:
  exposes:
    - type: mcp
      namespace: h2-station
      port: 8080
      tools:
        - name: get-h2-station-inventory
          description: "Look up hydrogen fueling station inventory by site ID. Returns stock level, next delivery, and station status."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Shell hydrogen station site identifier."
          call: sap.get-h2-inventory
          with:
            site_id: "{{site_id}}"
          outputParameters:
            - name: current_kg
              type: number
              mapping: "$.d.CurrentStock"
            - name: next_delivery
              type: string
              mapping: "$.d.NextDeliveryDate"
            - name: station_status
              type: string
              mapping: "$.d.OperationalStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: h2-inventory
          path: "/A_MaterialStock(Plant='{{site_id}}')"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-h2-inventory
              method: GET

Retrieves intercompany crude oil transfer pricing from SAP, returning base price, quality adjustment, and transportation differential.

naftiko: "0.5"
info:
  label: "SAP Intercompany Crude Transfer Pricing"
  description: "Retrieves intercompany crude oil transfer pricing from SAP, returning base price, quality adjustment, and transportation differential."
  tags:
    - trading
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: transfer-pricing
      port: 8080
      tools:
        - name: get-transfer-price
          description: "Look up intercompany crude transfer price by contract and period."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "SAP intercompany contract number."
            - name: period
              in: body
              type: string
              description: "Pricing period in YYYY-MM format."
          call: sap.get-transfer-price
          with:
            contract_number: "{{contract_number}}"
            period: "{{period}}"
          outputParameters:
            - name: base_price
              type: number
              mapping: "$.d.BasePrice"
            - name: quality_adjustment
              type: number
              mapping: "$.d.QualityDifferential"
            - name: transport_cost
              type: number
              mapping: "$.d.TransportCost"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfer-prices
          path: "/A_IntercompanyPrice"
          operations:
            - name: get-transfer-price
              method: GET

Retrieves production volumes from SAP and calculates royalty payments for mineral rights owners, posting results to Snowflake.

naftiko: "0.5"
info:
  label: "SAP Lease Royalty Payment Calculation"
  description: "Retrieves production volumes from SAP and calculates royalty payments for mineral rights owners, posting results to Snowflake."
  tags:
    - upstream
    - finance
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: royalty-calc
      port: 8080
      tools:
        - name: calculate-royalties
          description: "Given a lease ID and production month, pull SAP volumes, calculate royalties, and log to Snowflake."
          inputParameters:
            - name: lease_id
              in: body
              type: string
              description: "SAP lease contract ID."
            - name: production_month
              in: body
              type: string
              description: "Production month in YYYY-MM format."
          steps:
            - name: get-production
              type: call
              call: sap.get-lease-production
              with:
                lease_id: "{{lease_id}}"
                month: "{{production_month}}"
            - name: log-royalty
              type: call
              call: snowflake.insert-royalty-record
              with:
                lease_id: "{{lease_id}}"
                volume: "{{get-production.total_volume}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: lease-production
          path: "/A_LeaseProduction"
          operations:
            - name: get-lease-production
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: royalties
          path: "/statements"
          operations:
            - name: insert-royalty-record
              method: POST

Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, and vessel assignment.

naftiko: "0.5"
info:
  label: "SAP LNG Cargo Nomination Status"
  description: "Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, and vessel assignment."
  tags:
    - trading
    - logistics
    - sap
    - downstream
capability:
  exposes:
    - type: mcp
      namespace: lng-nomination
      port: 8080
      tools:
        - name: get-lng-nomination
          description: "Look up LNG cargo nomination by contract number. Returns volume, ports, vessel, and laycan dates."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "SAP LNG contract/nomination number."
          call: sap.get-lng-nomination
          with:
            contract_number: "{{contract_number}}"
          outputParameters:
            - name: volume_mmbtu
              type: number
              mapping: "$.d.NominatedVolume"
            - name: loading_port
              type: string
              mapping: "$.d.LoadingPort"
            - name: vessel
              type: string
              mapping: "$.d.VesselName"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: lng-nominations
          path: "/A_LNGNomination('{{contract_number}}')"
          inputParameters:
            - name: contract_number
              in: path
          operations:
            - name: get-lng-nomination
              method: GET

Tracks Shell lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation.

naftiko: "0.5"
info:
  label: "SAP Lubricants Order Fulfillment Tracker"
  description: "Tracks Shell lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation."
  tags:
    - downstream
    - sap
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: lubricants-fulfillment
      port: 8080
      tools:
        - name: get-lubricant-order-status
          description: "Look up lubricant order fulfillment by sales order number. Returns status, shipped quantities, and delivery dates."
          inputParameters:
            - name: sales_order
              in: body
              type: string
              description: "SAP sales order number."
          call: sap.get-sales-order
          with:
            sales_order: "{{sales_order}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallDeliveryStatus"
            - name: shipped_qty
              type: number
              mapping: "$.d.TotalDeliveredQuantity"
            - name: delivery_date
              type: string
              mapping: "$.d.ActualDeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{sales_order}}')"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: get-sales-order
              method: GET

Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, and loading window.

naftiko: "0.5"
info:
  label: "SAP Marine Vessel Loading Schedule"
  description: "Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, and loading window."
  tags:
    - downstream
    - logistics
    - sap
    - trading
capability:
  exposes:
    - type: mcp
      namespace: vessel-loading
      port: 8080
      tools:
        - name: get-loading-schedule
          description: "Look up vessel loading schedule by terminal and date. Returns vessel names, cargo types, and windows."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "SAP terminal plant code."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          call: sap.get-vessel-schedule
          with:
            terminal_code: "{{terminal_code}}"
            date_from: "{{date_from}}"
          outputParameters:
            - name: vessels
              type: string
              mapping: "$.d.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vessel-schedule
          path: "/A_Shipment"
          operations:
            - name: get-vessel-schedule
              method: GET

Monitors material stock levels in SAP and triggers reorder alerts when inventory falls below the safety stock threshold for refinery and terminal consumables.

naftiko: "0.5"
info:
  label: "SAP Material Inventory Reorder Alert"
  description: "Monitors material stock levels in SAP and triggers reorder alerts when inventory falls below the safety stock threshold for refinery and terminal consumables."
  tags:
    - inventory
    - sap
    - supply-chain
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: material-reorder
      port: 8080
      tools:
        - name: check-reorder-status
          description: "Check material inventory levels against safety stock thresholds and return items needing reorder."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the facility."
            - name: storage_location
              in: body
              type: string
              description: "SAP storage location identifier."
          call: "sap.get-stock-levels"
          with:
            plant_code: "{{plant_code}}"
            storage_location: "{{storage_location}}"
          outputParameters:
            - name: below_threshold_items
              type: array
              mapping: "$.d.results"
            - name: total_alerts
              type: number
              mapping: "$.d.__count"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock-levels
          path: "/A_MaterialStock?$filter=Plant eq '{{plant_code}}' and StorageLocation eq '{{storage_location}}' and AvailableStock lt SafetyStock"
          inputParameters:
            - name: plant_code
              in: query
            - name: storage_location
              in: query
          operations:
            - name: get-stock-levels
              method: GET

Retrieves the material safety data sheet for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and PPE requirements.

naftiko: "0.5"
info:
  label: "SAP Material Safety Data Sheet Lookup"
  description: "Retrieves the material safety data sheet for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and PPE requirements."
  tags:
    - safety
    - environmental
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: msds-lookup
      port: 8080
      tools:
        - name: get-msds
          description: "Look up an MSDS by SAP material number. Returns hazard class, handling instructions, and PPE requirements."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the chemical."
          call: sap.get-msds
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: hazard_class
              type: string
              mapping: "$.d.HazardClassification"
            - name: handling_instructions
              type: string
              mapping: "$.d.HandlingInstructions"
            - name: ppe_required
              type: string
              mapping: "$.d.PPERequirements"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/EHS_MSDS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: safety-data-sheets
          path: "/A_MaterialSafetySheet('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-msds
              method: GET

Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes and imbalance quantity.

naftiko: "0.5"
info:
  label: "SAP Natural Gas Nomination Balance"
  description: "Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes and imbalance quantity."
  tags:
    - trading
    - upstream
    - sap
capability:
  exposes:
    - type: mcp
      namespace: gas-nomination
      port: 8080
      tools:
        - name: get-nomination-balance
          description: "Look up gas nomination balance by pipeline contract. Returns nominated, actual, and imbalance volumes."
          inputParameters:
            - name: pipeline_contract
              in: body
              type: string
              description: "SAP pipeline transportation contract number."
          call: sap.get-gas-balance
          with:
            pipeline_contract: "{{pipeline_contract}}"
          outputParameters:
            - name: nominated_mcf
              type: number
              mapping: "$.d.NominatedVolume"
            - name: actual_mcf
              type: number
              mapping: "$.d.ActualVolume"
            - name: imbalance_mcf
              type: number
              mapping: "$.d.ImbalanceVolume"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/OG_GAS_BALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gas-balances
          path: "/A_GasNominationBalance('{{pipeline_contract}}')"
          inputParameters:
            - name: pipeline_contract
              in: path
          operations:
            - name: get-gas-balance
              method: GET

Creates preventive maintenance work orders in SAP for FPSO vessel equipment, scheduling critical rotating equipment inspections and hull integrity checks.

naftiko: "0.5"
info:
  label: "SAP Offshore FPSO Maintenance Scheduler"
  description: "Creates preventive maintenance work orders in SAP for FPSO vessel equipment, scheduling critical rotating equipment inspections and hull integrity checks."
  tags:
    - upstream
    - maintenance
    - sap
    - safety
capability:
  exposes:
    - type: mcp
      namespace: fpso-maintenance
      port: 8080
      tools:
        - name: schedule-fpso-pm
          description: "Given an FPSO functional location and PM type, create a work order in SAP and notify the offshore team via Teams."
          inputParameters:
            - name: fpso_location
              in: body
              type: string
              description: "SAP functional location for the FPSO."
            - name: pm_type
              in: body
              type: string
              description: "PM type: rotating-equipment, hull-integrity, process-safety."
          steps:
            - name: create-work-order
              type: call
              call: sap.create-pm-work-order
              with:
                functional_location: "{{fpso_location}}"
                short_text: "Scheduled {{pm_type}} for FPSO {{fpso_location}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel: "offshore-operations"
                text: "FPSO PM scheduled | {{fpso_location}} | Type: {{pm_type}} | WO: {{create-work-order.order_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/offshore/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Retrieves pipeline integrity inspection records from SAP, returning last inspection date, wall thickness, corrosion rate, and next scheduled inspection.

naftiko: "0.5"
info:
  label: "SAP Pipeline Integrity Inspection Tracker"
  description: "Retrieves pipeline integrity inspection records from SAP, returning last inspection date, wall thickness, corrosion rate, and next scheduled inspection."
  tags:
    - upstream
    - safety
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: pipeline-integrity
      port: 8080
      tools:
        - name: get-inspection-status
          description: "Look up pipeline integrity inspection by functional location. Returns inspection history and corrosion data."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the pipeline segment."
          call: sap.get-inspection-records
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: last_inspection
              type: string
              mapping: "$.d.LastInspectionDate"
            - name: wall_thickness_mm
              type: number
              mapping: "$.d.WallThickness"
            - name: corrosion_rate
              type: number
              mapping: "$.d.CorrosionRate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspections
          path: "/A_MeasurementDocument"
          operations:
            - name: get-inspection-records
              method: GET

Converts a ServiceNow equipment breakdown incident into a SAP PM work order, assigns a field technician, and notifies the maintenance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Creation"
  description: "Converts a ServiceNow equipment breakdown incident into a SAP PM work order, assigns a field technician, and notifies the maintenance team in Microsoft Teams."
  tags:
    - manufacturing
    - maintenance
    - sap-pm
    - servicenow
    - microsoft-teams
    - hsse
capability:
  exposes:
    - type: mcp
      namespace: maintenance-ops
      port: 8080
      tools:
        - name: create-pm-work-order
          description: "Given a ServiceNow breakdown incident number and SAP equipment number, create a SAP PM corrective maintenance work order and notify the maintenance team in Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number for the equipment breakdown."
            - name: equipment_number
              in: body
              type: string
              description: "SAP PM equipment number requiring maintenance."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the maintenance team."
          steps:
            - name: get-incident
              type: call
              call: "snow-maint.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-work-order
              type: call
              call: "sap-pm.create-work-order"
              with:
                equipment: "{{equipment_number}}"
                description: "{{get-incident.short_description}}"
                priority: "{{get-incident.priority}}"
                orderType: "PM01"
            - name: notify-maintenance
              type: call
              call: "msteams-maint.send-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                text: "SAP PM work order {{create-work-order.WorkOrder}} created for equipment {{equipment_number}} | Incident: {{incident_number}} | Priority: {{get-incident.priority}}"
  consumes:
    - type: http
      namespace: snow-maint
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: sap-pm
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-maint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder status, and remaining catalyst life.

naftiko: "0.5"
info:
  label: "SAP Refinery Catalyst Inventory Check"
  description: "Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder status, and remaining catalyst life."
  tags:
    - refining
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: catalyst-inventory
      port: 8080
      tools:
        - name: check-catalyst-inventory
          description: "Look up catalyst inventory by material number and plant. Returns stock, reorder status, and remaining life."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the catalyst."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code."
          call: sap.get-catalyst-stock
          with:
            material_number: "{{material_number}}"
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: available_qty
              type: number
              mapping: "$.d.AvailableStock"
            - name: reorder_needed
              type: boolean
              mapping: "$.d.BelowReorderPoint"
            - name: catalyst_life_days
              type: number
              mapping: "$.d.RemainingLifeDays"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MaterialStock"
          operations:
            - name: get-catalyst-stock
              method: GET

Retrieves energy consumption data from SAP for refinery units including steam, electricity, and fuel gas, and pushes to Power BI.

naftiko: "0.5"
info:
  label: "SAP Refinery Energy Consumption Report"
  description: "Retrieves energy consumption data from SAP for refinery units including steam, electricity, and fuel gas, and pushes to Power BI."
  tags:
    - refining
    - environmental
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: energy-consumption
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a plant code and date range, pull energy consumption from SAP and push to Power BI."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: get-consumption
              type: call
              call: sap.get-energy-consumption
              with:
                plant_code: "{{plant_code}}"
                date_from: "{{date_from}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "refinery-energy-consumption"
                rows: "{{get-consumption.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy
          path: "/A_UtilityConsumption"
          operations:
            - name: get-energy-consumption
              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/refinery-energy-consumption/rows"
          operations:
            - name: push-rows
              method: POST

Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards.

naftiko: "0.5"
info:
  label: "SAP Refinery Throughput Report"
  description: "Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards."
  tags:
    - refining
    - reporting
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: refinery-throughput
      port: 8080
      tools:
        - name: generate-throughput-report
          description: "Given a SAP plant code and date range, pull throughput data, aggregate by unit, and push to Power BI."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-throughput
              type: call
              call: sap.get-throughput-data
              with:
                plant_code: "{{plant_code}}"
                date_from: "{{date_from}}"
                date_to: "{{date_to}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "refinery-throughput-daily"
                rows: "{{get-throughput.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: throughput
          path: "/A_ProductionOutput"
          operations:
            - name: get-throughput-data
              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/refinery-throughput-daily/rows"
          operations:
            - name: push-rows
              method: POST

Retrieves fuel inventory levels at Shell retail stations from SAP, returning stock by grade, tank capacity, and days of supply remaining.

naftiko: "0.5"
info:
  label: "SAP Retail Station Fuel Inventory"
  description: "Retrieves fuel inventory levels at Shell retail stations from SAP, returning stock by grade, tank capacity, and days of supply remaining."
  tags:
    - downstream
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: retail-fuel
      port: 8080
      tools:
        - name: get-station-inventory
          description: "Look up retail station fuel inventory by station ID. Returns stock by grade and days of supply."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "Shell retail station identifier."
          call: sap.get-fuel-inventory
          with:
            station_id: "{{station_id}}"
          outputParameters:
            - name: regular_gallons
              type: number
              mapping: "$.d.RegularStock"
            - name: premium_gallons
              type: number
              mapping: "$.d.PremiumStock"
            - name: diesel_gallons
              type: number
              mapping: "$.d.DieselStock"
            - name: days_of_supply
              type: number
              mapping: "$.d.DaysOfSupply"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fuel-inventory
          path: "/A_MaterialStock(Plant='{{station_id}}')"
          inputParameters:
            - name: station_id
              in: path
          operations:
            - name: get-fuel-inventory
              method: GET

Retrieves a pending purchase order from SAP S/4HANA for review, posts an approval decision, and notifies the procurement manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Approval"
  description: "Retrieves a pending purchase order from SAP S/4HANA for review, posts an approval decision, and notifies the procurement manager via Microsoft Teams."
  tags:
    - procurement
    - erp
    - sap-s4hana
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: approve-purchase-order
          description: "Given a SAP purchase order number and approval decision, post the decision to SAP S/4HANA and notify the procurement manager in Microsoft Teams. Use for automating the PO approval loop."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number, e.g. 4500001234."
            - name: decision
              in: body
              type: string
              description: "Approval decision: 'approve' or 'reject'."
            - name: approver_upn
              in: body
              type: string
              description: "UPN of the approver for Teams notification."
          steps:
            - name: get-po
              type: call
              call: "sap-mm.get-po"
              with:
                poNumber: "{{po_number}}"
            - name: post-approval
              type: call
              call: "sap-mm.approve-po"
              with:
                poNumber: "{{po_number}}"
                decision: "{{decision}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "PO {{po_number}} ({{get-po.supplierName}}, {{get-po.totalAmount}}) has been {{decision}}d. SAP document: {{post-approval.documentNumber}}"
  consumes:
    - type: http
      namespace: sap-mm
      baseUri: "https://shell-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('{{poNumber}}')"
          inputParameters:
            - name: poNumber
              in: path
          operations:
            - name: get-po
              method: GET
            - name: approve-po
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Enrolls employees in mandatory safety and compliance training in SAP SuccessFactors Learning and sends calendar invites via Microsoft 365.

naftiko: "0.5"
info:
  label: "SAP SuccessFactors Learning Compliance Enrollment"
  description: "Enrolls employees in mandatory safety and compliance training in SAP SuccessFactors Learning and sends calendar invites via Microsoft 365."
  tags:
    - hr
    - learning
    - compliance
    - sap-successfactors
    - microsoft-365
    - hsse
capability:
  exposes:
    - type: mcp
      namespace: compliance-learning
      port: 8080
      tools:
        - name: enroll-compliance-training
          description: "Given an employee ID and mandatory compliance course ID, enroll the employee in SuccessFactors Learning and send an Outlook calendar invite for the training date."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "SuccessFactors employee ID."
            - name: course_id
              in: body
              type: string
              description: "SuccessFactors Learning compliance course ID."
            - name: training_date
              in: body
              type: string
              description: "Training session date in ISO 8601 format."
          steps:
            - name: enroll-user
              type: call
              call: "sf-learning.enroll-user"
              with:
                userId: "{{employee_id}}"
                courseId: "{{course_id}}"
            - name: get-employee-email
              type: call
              call: "sf-emails.get-email"
              with:
                employeeId: "{{employee_id}}"
            - name: send-calendar-invite
              type: call
              call: "m365.create-calendar-event"
              with:
                recipientEmail: "{{get-employee-email.email}}"
                subject: "Mandatory Safety Training: {{enroll-user.courseTitle}}"
                startDate: "{{training_date}}"
  consumes:
    - type: http
      namespace: sf-learning
      baseUri: "https://api4.successfactors.com/learning/odatav4/public"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: enrollments
          path: "/enrollments"
          operations:
            - name: enroll-user
              method: POST
    - type: http
      namespace: sf-emails
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: employee-emails
          path: "/PerEmail(personIdExternal='{{employeeId}}')"
          inputParameters:
            - name: employeeId
              in: path
          operations:
            - name: get-email
              method: GET
    - type: http
      namespace: m365
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: calendar-events
          path: "/users/{{recipientEmail}}/events"
          inputParameters:
            - name: recipientEmail
              in: path
          operations:
            - name: create-calendar-event
              method: POST

Checks the status of a SAP SuccessFactors EC Payroll run for a given payroll area and notifies the HR payroll team via Microsoft Teams when complete or on error.

naftiko: "0.5"
info:
  label: "SAP SuccessFactors Payroll Run Monitoring"
  description: "Checks the status of a SAP SuccessFactors EC Payroll run for a given payroll area and notifies the HR payroll team via Microsoft Teams when complete or on error."
  tags:
    - hr
    - payroll
    - sap-successfactors
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: payroll-monitoring
      port: 8080
      tools:
        - name: monitor-payroll-run
          description: "Given a payroll area and pay period, fetch the SAP payroll run status from SuccessFactors EC Payroll and notify the HR team channel in Microsoft Teams."
          inputParameters:
            - name: payroll_area
              in: body
              type: string
              description: "SAP payroll area code, e.g. GB for UK monthly payroll."
            - name: pay_period
              in: body
              type: string
              description: "Pay period in YYYYMM format, e.g. 202603."
            - name: hr_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the HR payroll notification."
          steps:
            - name: get-payroll-status
              type: call
              call: "sf-payroll.get-payroll-run"
              with:
                payrollArea: "{{payroll_area}}"
                payPeriod: "{{pay_period}}"
            - name: notify-hr
              type: call
              call: "msteams-payroll.send-channel-message"
              with:
                channelId: "{{hr_channel_id}}"
                text: "Payroll run {{payroll_area}}/{{pay_period}}: Status={{get-payroll-status.status}}, Employees={{get-payroll-status.employeeCount}}, Errors={{get-payroll-status.errorCount}}"
  consumes:
    - type: http
      namespace: sf-payroll
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: payroll-runs
          path: "/PayrollRun"
          inputParameters:
            - name: payrollArea
              in: query
            - name: payPeriod
              in: query
          operations:
            - name: get-payroll-run
              method: GET
    - type: http
      namespace: msteams-payroll
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: send-channel-message
              method: POST

Processes an employee role change in SAP SuccessFactors, updates Okta group memberships for the new role, and logs the change in a Jira HR ticket.

naftiko: "0.5"
info:
  label: "SAP SuccessFactors Role Change Processing"
  description: "Processes an employee role change in SAP SuccessFactors, updates Okta group memberships for the new role, and logs the change in a Jira HR ticket."
  tags:
    - hr
    - identity
    - sap-successfactors
    - okta
    - jira
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: role-change-ops
      port: 8080
      tools:
        - name: process-role-change
          description: "Given a SuccessFactors employee ID, new job code, and Okta user ID, update the employee's job code in SuccessFactors, sync Okta group memberships, and log the change in Jira HR."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "SuccessFactors employee ID undergoing the role change."
            - name: new_job_code
              in: body
              type: string
              description: "New job code to assign in SuccessFactors."
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID to update group memberships for."
          steps:
            - name: update-job-code
              type: call
              call: "sf-role.update-employee-job"
              with:
                employeeId: "{{employee_id}}"
                jobCode: "{{new_job_code}}"
            - name: update-okta-groups
              type: call
              call: "okta-groups.update-user-groups"
              with:
                userId: "{{okta_user_id}}"
                newRole: "{{new_job_code}}"
            - name: log-change
              type: call
              call: "jira-role.create-issue"
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Role change processed: {{employee_id}} to {{new_job_code}}"
                description: "Employee: {{employee_id}}\nNew job code: {{new_job_code}}\nOkta user: {{okta_user_id}}\nOkta groups updated: {{update-okta-groups.groupsUpdated}}"
  consumes:
    - type: http
      namespace: sf-role
      baseUri: "https://api4.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.sf_token"
      resources:
        - name: employee-jobs
          path: "/EmpJob(employeeId='{{employeeId}}')"
          inputParameters:
            - name: employeeId
              in: path
          operations:
            - name: update-employee-job
              method: PATCH
    - type: http
      namespace: okta-groups
      baseUri: "https://shell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-group-membership
          path: "/users/{{userId}}/groups"
          inputParameters:
            - name: userId
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: jira-role
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves safety certification and compliance training records from SAP SuccessFactors for offshore and refinery personnel, flagging expired or soon-to-expire certifications.

naftiko: "0.5"
info:
  label: "SAP SuccessFactors Safety Certification Tracker"
  description: "Retrieves safety certification and compliance training records from SAP SuccessFactors for offshore and refinery personnel, flagging expired or soon-to-expire certifications."
  tags:
    - hse
    - compliance
    - sap
    - workforce
capability:
  exposes:
    - type: mcp
      namespace: safety-certifications
      port: 8080
      tools:
        - name: get-safety-certifications
          description: "Look up safety certification status for an employee by person ID in SAP SuccessFactors."
          inputParameters:
            - name: person_id
              in: body
              type: string
              description: "SAP SuccessFactors person ID."
            - name: certification_type
              in: body
              type: string
              description: "Certification type code, e.g. H2S, BOSIET, HUET."
          call: "successfactors.get-certifications"
          with:
            person_id: "{{person_id}}"
            certification_type: "{{certification_type}}"
          outputParameters:
            - name: certification_status
              type: string
              mapping: "$.d.results[0].status"
            - name: expiry_date
              type: string
              mapping: "$.d.results[0].expirationDate"
            - name: days_until_expiry
              type: number
              mapping: "$.d.results[0].daysUntilExpiry"
  consumes:
    - type: http
      namespace: successfactors
      baseUri: "https://api.successfactors.com/odata/v2"
      authentication:
        type: bearer
        token: "$secrets.successfactors_token"
      resources:
        - name: certifications
          path: "/Certification?$filter=userId eq '{{person_id}}' and certificationType eq '{{certification_type}}'"
          inputParameters:
            - name: person_id
              in: query
            - name: certification_type
              in: query
          operations:
            - name: get-certifications
              method: GET

Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, and available capacity.

naftiko: "0.5"
info:
  label: "SAP Tank Farm Gauge Reading"
  description: "Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, and available capacity."
  tags:
    - downstream
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: tank-gauge
      port: 8080
      tools:
        - name: get-tank-reading
          description: "Look up latest tank gauge reading by tank ID. Returns current level, temperature, and available capacity."
          inputParameters:
            - name: tank_id
              in: body
              type: string
              description: "SAP equipment ID for the storage tank."
          call: sap.get-gauge-reading
          with:
            tank_id: "{{tank_id}}"
          outputParameters:
            - name: level_feet
              type: number
              mapping: "$.d.CurrentLevel"
            - name: temperature_c
              type: number
              mapping: "$.d.Temperature"
            - name: available_capacity_bbl
              type: number
              mapping: "$.d.AvailableCapacity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: measurements
          path: "/A_MeasurementDocument(Equipment='{{tank_id}}')"
          inputParameters:
            - name: tank_id
              in: path
          operations:
            - name: get-gauge-reading
              method: GET

Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, logging results in Snowflake.

naftiko: "0.5"
info:
  label: "SAP Tank-to-Ship Transfer Reconciliation"
  description: "Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, logging results in Snowflake."
  tags:
    - downstream
    - trading
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: transfer-recon
      port: 8080
      tools:
        - name: reconcile-transfer
          description: "Given a shipment ID, pull tank gauge and BOL data from SAP, calculate variance, and log in Snowflake."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "SAP shipment document number."
          steps:
            - name: get-transfer-data
              type: call
              call: sap.get-transfer-records
              with:
                shipment_id: "{{shipment_id}}"
            - name: log-reconciliation
              type: call
              call: snowflake.insert-recon-record
              with:
                shipment_id: "{{shipment_id}}"
                tank_volume: "{{get-transfer-data.tank_volume}}"
                bol_volume: "{{get-transfer-data.bol_volume}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfers
          path: "/A_Shipment('{{shipment_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-transfer-records
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: reconciliation
          path: "/statements"
          operations:
            - name: insert-recon-record
              method: POST

Pulls turnaround project cost actuals from SAP, compares to budget, and posts variance summary to Teams.

naftiko: "0.5"
info:
  label: "SAP Turnaround Cost Tracking"
  description: "Pulls turnaround project cost actuals from SAP, compares to budget, and posts variance summary to Teams."
  tags:
    - refining
    - finance
    - sap
    - msteams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: ta-cost-tracking
      port: 8080
      tools:
        - name: track-turnaround-costs
          description: "Given a SAP project number, pull cost actuals vs budget and post variance to Teams."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "SAP Project Systems project number."
          steps:
            - name: get-costs
              type: call
              call: sap.get-project-costs
              with:
                project_number: "{{project_number}}"
            - name: post-variance
              type: call
              call: msteams.send-message
              with:
                channel: "refinery-management"
                text: "TA Cost | Project: {{project_number}} | Actual: ${{get-costs.actual_cost}} | Budget: ${{get-costs.planned_cost}} | Variance: {{get-costs.variance_pct}}%"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PS_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: project-costs
          path: "/A_ProjectCost('{{project_number}}')"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/refinery/channels/management/messages"
          operations:
            - name: send-message
              method: POST

Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, and clearing document number.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Status Lookup"
  description: "Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, and clearing document number."
  tags:
    - procurement
    - sap
    - finance
capability:
  exposes:
    - type: mcp
      namespace: vendor-payment
      port: 8080
      tools:
        - name: get-payment-status
          description: "Look up vendor payment status by invoice number. Returns payment date, amount, and clearing document."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP vendor invoice number."
          call: sap.get-payment
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: payment_date
              type: string
              mapping: "$.d.ClearingDate"
            - name: amount
              type: number
              mapping: "$.d.AmountInCompanyCodeCurrency"
            - name: clearing_document
              type: string
              mapping: "$.d.ClearingDocumentNumber"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/FI_AP_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-payment
              method: GET

Retrieves wastewater effluent quality data from SAP EHS, returning pH, total suspended solids, and oil and grease levels against permit limits.

naftiko: "0.5"
info:
  label: "SAP Wastewater Treatment Compliance Check"
  description: "Retrieves wastewater effluent quality data from SAP EHS, returning pH, total suspended solids, and oil and grease levels against permit limits."
  tags:
    - environmental
    - refining
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: wastewater-compliance
      port: 8080
      tools:
        - name: check-effluent-quality
          description: "Look up wastewater effluent quality by outfall ID. Returns measured values and compliance status."
          inputParameters:
            - name: outfall_id
              in: body
              type: string
              description: "SAP outfall monitoring point ID."
          call: sap.get-effluent-data
          with:
            outfall_id: "{{outfall_id}}"
          outputParameters:
            - name: ph
              type: number
              mapping: "$.d.PHValue"
            - name: tss_mgl
              type: number
              mapping: "$.d.TotalSuspendedSolids"
            - name: compliant
              type: boolean
              mapping: "$.d.WithinPermitLimits"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/EHS_MONITORING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: effluent
          path: "/A_EffluentMonitoring('{{outfall_id}}')"
          inputParameters:
            - name: outfall_id
              in: path
          operations:
            - name: get-effluent-data
              method: GET

Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes.

naftiko: "0.5"
info:
  label: "SAP Well Production Daily Allocation"
  description: "Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: well-allocation
      port: 8080
      tools:
        - name: get-well-allocation
          description: "Look up daily production allocation for a well by functional location and date."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the well."
            - name: allocation_date
              in: body
              type: string
              description: "Allocation date in YYYY-MM-DD format."
          call: sap.get-allocation
          with:
            functional_location: "{{functional_location}}"
            allocation_date: "{{allocation_date}}"
          outputParameters:
            - name: oil_bbl
              type: number
              mapping: "$.d.OilVolume"
            - name: gas_mcf
              type: number
              mapping: "$.d.GasVolume"
            - name: water_bbl
              type: number
              mapping: "$.d.WaterVolume"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: allocations
          path: "/A_WellAllocation"
          operations:
            - name: get-allocation
              method: GET

Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure.

naftiko: "0.5"
info:
  label: "SAP Wellhead Pressure Reading"
  description: "Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: wellhead-pressure
      port: 8080
      tools:
        - name: get-wellhead-pressure
          description: "Look up wellhead pressure by functional location. Returns tubing, casing, and flow line pressure readings."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the well."
          call: sap.get-pressure-reading
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: tubing_pressure_psi
              type: number
              mapping: "$.d.TubingPressure"
            - name: casing_pressure_psi
              type: number
              mapping: "$.d.CasingPressure"
            - name: flowline_pressure_psi
              type: number
              mapping: "$.d.FlowLinePressure"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/OG_WELL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pressure-readings
          path: "/A_WellMeasurement(FunctionalLocation='{{functional_location}}')"
          inputParameters:
            - name: functional_location
              in: path
          operations:
            - name: get-pressure-reading
              method: GET

Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Environmental Permit Tracker"
  description: "Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams."
  tags:
    - environmental
    - compliance
    - servicenow
    - snowflake
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: env-permit
      port: 8080
      tools:
        - name: track-env-permits
          description: "Given a lookahead window in days, find environmental permits nearing expiry in ServiceNow, log to Snowflake, and alert the team."
          inputParameters:
            - name: days_lookahead
              in: body
              type: number
              description: "Number of days to look ahead for permit expirations."
          steps:
            - name: query-permits
              type: call
              call: servicenow.query-permits
              with:
                days_lookahead: "{{days_lookahead}}"
            - name: log-report
              type: call
              call: snowflake.insert-permit-report
              with:
                permits: "{{query-permits.records}}"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel: "environmental-affairs"
                text: "Environmental permit alert | {{query-permits.total_count}} permits expiring within {{days_lookahead}} days"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: permits
          path: "/table/u_environmental_permit"
          operations:
            - name: query-permits
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: permit-reports
          path: "/statements"
          operations:
            - name: insert-permit-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/environmental/channels/affairs/messages"
          operations:
            - name: send-message
              method: POST

Queries ServiceNow CMDB for IT assets nearing end-of-life, creates a Confluence replacement plan, and opens Ariba procurement requisitions.

naftiko: "0.5"
info:
  label: "ServiceNow IT Asset Lifecycle Audit"
  description: "Queries ServiceNow CMDB for IT assets nearing end-of-life, creates a Confluence replacement plan, and opens Ariba procurement requisitions."
  tags:
    - it-operations
    - servicenow
    - confluence
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: asset-lifecycle
      port: 8080
      tools:
        - name: audit-asset-lifecycle
          description: "Given an asset category and EOL threshold, find aging assets, create Confluence plan, and raise Ariba requisitions."
          inputParameters:
            - name: asset_category
              in: body
              type: string
              description: "Asset category to audit."
            - name: eol_months
              in: body
              type: number
              description: "Months until end-of-life to flag."
          steps:
            - name: find-aging-assets
              type: call
              call: servicenow.query-assets
              with:
                category: "{{asset_category}}"
                eol_months: "{{eol_months}}"
            - name: create-replacement-plan
              type: call
              call: confluence.create-page
              with:
                space: "IT-LIFECYCLE"
                title: "Replacement Plan - {{asset_category}}"
                body: "{{find-aging-assets.summary}}"
            - name: create-requisition
              type: call
              call: ariba.create-requisition
              with:
                items: "{{find-aging-assets.critical_assets}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb-assets
          path: "/table/cmdb_ci"
          operations:
            - name: query-assets
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://shell.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://shell.ariba.com/api/procurement"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST

Initiates a Management of Change workflow in ServiceNow for process safety modifications, routing through hazard review and HSE sign-off with Teams notifications.

naftiko: "0.5"
info:
  label: "ServiceNow Management of Change Workflow"
  description: "Initiates a Management of Change workflow in ServiceNow for process safety modifications, routing through hazard review and HSE sign-off with Teams notifications."
  tags:
    - safety
    - servicenow
    - msteams
    - compliance
    - refining
capability:
  exposes:
    - type: mcp
      namespace: moc-workflow
      port: 8080
      tools:
        - name: initiate-moc
          description: "Given a change description and facility, create a MOC record in ServiceNow and notify stakeholders via Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed process change."
            - name: facility
              in: body
              type: string
              description: "Facility where the change will be implemented."
            - name: change_type
              in: body
              type: string
              description: "Type: temporary, permanent, emergency."
          steps:
            - name: create-moc
              type: call
              call: servicenow.create-moc
              with:
                description: "{{change_description}}"
                facility: "{{facility}}"
                type: "{{change_type}}"
            - name: notify-reviewers
              type: call
              call: msteams.send-message
              with:
                channel: "process-safety"
                text: "New MOC submitted | {{change_type}} | Facility: {{facility}} | MOC#: {{create-moc.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: moc
          path: "/table/u_management_of_change"
          operations:
            - name: create-moc
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/safety/channels/process/messages"
          operations:
            - name: send-message
              method: POST

Creates a ServiceNow investigation record for process safety events, assigns an investigation team from Workday, logs details in Snowflake, and notifies HSE leadership via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Process Safety Event Investigation"
  description: "Creates a ServiceNow investigation record for process safety events, assigns an investigation team from Workday, logs details in Snowflake, and notifies HSE leadership via Teams."
  tags:
    - safety
    - servicenow
    - workday
    - snowflake
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: pse-investigation
      port: 8080
      tools:
        - name: initiate-pse-investigation
          description: "Given event details and severity, create a ServiceNow investigation, assign team, log to Snowflake, and alert HSE leadership."
          inputParameters:
            - name: event_description
              in: body
              type: string
              description: "Description of the process safety event."
            - name: facility
              in: body
              type: string
              description: "Facility where the event occurred."
            - name: severity
              in: body
              type: string
              description: "Event severity: tier-1, tier-2, tier-3."
          steps:
            - name: create-investigation
              type: call
              call: servicenow.create-investigation
              with:
                description: "{{event_description}}"
                facility: "{{facility}}"
                severity: "{{severity}}"
            - name: assign-team
              type: call
              call: workday.get-investigation-team
              with:
                facility: "{{facility}}"
            - name: log-event
              type: call
              call: snowflake.insert-pse-record
              with:
                investigation_id: "{{create-investigation.sys_id}}"
                facility: "{{facility}}"
            - name: alert-leadership
              type: call
              call: msteams.send-message
              with:
                channel: "hse-leadership"
                text: "PSE Alert | {{severity}} | Facility: {{facility}} | Investigation: {{create-investigation.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: investigations
          path: "/table/u_pse_investigation"
          operations:
            - name: create-investigation
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: teams
          path: "/workers"
          operations:
            - name: get-investigation-team
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: pse-records
          path: "/statements"
          operations:
            - name: insert-pse-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hse/channels/leadership/messages"
          operations:
            - name: send-message
              method: POST

Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying stakeholders via Teams, and pulling revised throughput from SAP.

naftiko: "0.5"
info:
  label: "ServiceNow Refinery Outage Management"
  description: "Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying stakeholders via Teams, and pulling revised throughput from SAP."
  tags:
    - refining
    - servicenow
    - msteams
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: refinery-outage
      port: 8080
      tools:
        - name: manage-refinery-outage
          description: "Given a refinery unit and outage type, create a major incident, notify stakeholders, and pull revised throughput."
          inputParameters:
            - name: unit_id
              in: body
              type: string
              description: "Refinery unit identifier."
            - name: outage_type
              in: body
              type: string
              description: "Type: unplanned, emergency, weather."
            - name: estimated_duration_hrs
              in: body
              type: number
              description: "Estimated outage duration in hours."
          steps:
            - name: create-major-incident
              type: call
              call: servicenow.create-major-incident
              with:
                unit_id: "{{unit_id}}"
                outage_type: "{{outage_type}}"
            - name: get-throughput-impact
              type: call
              call: sap.get-unit-throughput
              with:
                unit_id: "{{unit_id}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-message
              with:
                channel: "refinery-management"
                text: "OUTAGE | Unit: {{unit_id}} | Type: {{outage_type}} | Est: {{estimated_duration_hrs}}h | Impact: {{get-throughput-impact.daily_bbl}} bbl/d"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://shell.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-major-incident
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: throughput
          path: "/A_ProductionOutput"
          operations:
            - name: get-unit-throughput
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/refinery/channels/management/messages"
          operations:
            - name: send-message
              method: POST

Retrieves a draft energy trading contract from Salesforce, routes it for legal sign-off via DocuSign, and updates the Salesforce opportunity status on completion.

naftiko: "0.5"
info:
  label: "Shell Energy Trading Contract Approval"
  description: "Retrieves a draft energy trading contract from Salesforce, routes it for legal sign-off via DocuSign, and updates the Salesforce opportunity status on completion."
  tags:
    - sales
    - contract-management
    - salesforce
    - docusign
    - trading
    - approval
capability:
  exposes:
    - type: mcp
      namespace: contract-approval
      port: 8080
      tools:
        - name: route-trading-contract
          description: "Given a Salesforce opportunity ID and contract document URL, create a DocuSign envelope for legal signature and update the Salesforce opportunity stage to Pending Legal Sign-Off."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID for the trading contract."
            - name: contract_document_url
              in: body
              type: string
              description: "URL to the contract PDF document to route for signature."
            - name: signer_email
              in: body
              type: string
              description: "Email address of the legal signatory."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-contract.get-opportunity"
              with:
                opportunityId: "{{opportunity_id}}"
            - name: create-envelope
              type: call
              call: "docusign.create-envelope"
              with:
                documentUrl: "{{contract_document_url}}"
                signerEmail: "{{signer_email}}"
                subject: "Contract approval: {{get-opportunity.Name}}"
            - name: update-opportunity-stage
              type: call
              call: "salesforce-stage.update-opportunity"
              with:
                opportunityId: "{{opportunity_id}}"
                stageName: "Pending Legal Sign-Off"
                docusignEnvelopeId: "{{create-envelope.envelopeId}}"
  consumes:
    - type: http
      namespace: salesforce-contract
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunityId}}"
          inputParameters:
            - name: opportunityId
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: docusign
      baseUri: "https://www.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/$secrets.docusign_account_id/envelopes"
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: salesforce-stage
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity-stage
          path: "/sobjects/Opportunity/{{opportunityId}}"
          inputParameters:
            - name: opportunityId
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

When a Qualtrics NPS survey response is received from a Shell energy customer, updates the Salesforce account NPS score and creates a Jira follow-up task for the account team.

naftiko: "0.5"
info:
  label: "Shell NPS Survey Response Processing"
  description: "When a Qualtrics NPS survey response is received from a Shell energy customer, updates the Salesforce account NPS score and creates a Jira follow-up task for the account team."
  tags:
    - crm
    - customer-success
    - qualtrics
    - salesforce
    - jira
    - nps
capability:
  exposes:
    - type: mcp
      namespace: nps-ops
      port: 8080
      tools:
        - name: process-nps-response
          description: "Given a Qualtrics response ID and Salesforce account ID, fetch the NPS score, update the Salesforce account, and create a Jira task if the score is detractor (0-6)."
          inputParameters:
            - name: qualtrics_survey_id
              in: body
              type: string
              description: "Qualtrics survey ID."
            - name: qualtrics_response_id
              in: body
              type: string
              description: "Qualtrics survey response ID."
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID to update with the NPS score."
          steps:
            - name: get-response
              type: call
              call: "qualtrics.get-response"
              with:
                surveyId: "{{qualtrics_survey_id}}"
                responseId: "{{qualtrics_response_id}}"
            - name: update-sf-nps
              type: call
              call: "salesforce-nps.update-account"
              with:
                accountId: "{{salesforce_account_id}}"
                npsScore: "{{get-response.npsScore}}"
                npsVerbatim: "{{get-response.verbatim}}"
            - name: create-followup-task
              type: call
              call: "jira-nps.create-issue"
              with:
                project_key: "CS"
                issuetype: "Task"
                summary: "NPS detractor follow-up: {{salesforce_account_id}} (score {{get-response.npsScore}})"
                description: "Account: {{salesforce_account_id}}\nScore: {{get-response.npsScore}}\nFeedback: {{get-response.verbatim}}\nSurvey response: {{qualtrics_response_id}}"
  consumes:
    - type: http
      namespace: qualtrics
      baseUri: "https://shell.qualtrics.com/API/v3"
      authentication:
        type: apikey
        key: "X-API-TOKEN"
        value: "$secrets.qualtrics_token"
        placement: header
      resources:
        - name: survey-responses
          path: "/surveys/{{surveyId}}/responses/{{responseId}}"
          inputParameters:
            - name: surveyId
              in: path
            - name: responseId
              in: path
          operations:
            - name: get-response
              method: GET
    - type: http
      namespace: salesforce-nps
      baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: account-nps
          path: "/sobjects/Account/{{accountId}}"
          inputParameters:
            - name: accountId
              in: path
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: jira-nps
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries Snowflake for carbon capture and storage project data including CO2 injection volumes and storage capacity utilization, then pushes to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Carbon Capture Project Dashboard"
  description: "Queries Snowflake for carbon capture and storage project data including CO2 injection volumes and storage capacity utilization, then pushes to Power BI."
  tags:
    - environmental
    - upstream
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: carbon-capture
      port: 8080
      tools:
        - name: generate-ccs-dashboard
          description: "Given a CCS project ID and date range, query Snowflake for injection data and push to Power BI."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Carbon capture project identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-ccs-data
              type: call
              call: snowflake.query-ccs-metrics
              with:
                project_id: "{{project_id}}"
                date_from: "{{date_from}}"
            - name: push-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "carbon-capture-monitoring"
                rows: "{{query-ccs-data.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: ccs-metrics
          path: "/statements"
          operations:
            - name: query-ccs-metrics
              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/carbon-capture-monitoring/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for Shell's carbon credit portfolio including voluntary and compliance credits, tracks vintage and registry, and pushes to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Carbon Credit Portfolio Tracker"
  description: "Queries Snowflake for Shell's carbon credit portfolio including voluntary and compliance credits, tracks vintage and registry, and pushes to Power BI."
  tags:
    - environmental
    - trading
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: carbon-credits
      port: 8080
      tools:
        - name: track-carbon-portfolio
          description: "Given a credit type and date range, query carbon credit positions from Snowflake and push to Power BI."
          inputParameters:
            - name: credit_type
              in: body
              type: string
              description: "Credit type: voluntary, eu-ets, uk-ets, all."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-credits
              type: call
              call: snowflake.query-carbon-credits
              with:
                credit_type: "{{credit_type}}"
                date_from: "{{date_from}}"
            - name: push-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "carbon-credit-portfolio"
                rows: "{{query-credits.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: carbon-credits
          path: "/statements"
          operations:
            - name: query-carbon-credits
              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/carbon-credit-portfolio/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads, and pushes to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Downstream Margin Analysis"
  description: "Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads, and pushes to Power BI."
  tags:
    - downstream
    - trading
    - snowflake
    - power-bi
    - finance
capability:
  exposes:
    - type: mcp
      namespace: margin-analysis
      port: 8080
      tools:
        - name: analyze-downstream-margins
          description: "Given a refinery and date range, query product margins from Snowflake and push to Power BI."
          inputParameters:
            - name: refinery_code
              in: body
              type: string
              description: "Refinery code (e.g., Pernis, Scotford)."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-margins
              type: call
              call: snowflake.query-product-margins
              with:
                refinery_code: "{{refinery_code}}"
                date_from: "{{date_from}}"
            - name: push-results
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "downstream-margins"
                rows: "{{query-margins.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: margins
          path: "/statements"
          operations:
            - name: query-product-margins
              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/downstream-margins/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Drilling Cost Per Foot Analysis"
  description: "Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI."
  tags:
    - upstream
    - drilling
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: drilling-cost
      port: 8080
      tools:
        - name: analyze-drilling-cost
          description: "Given a basin and date range, query drilling costs from Snowflake and push to Power BI."
          inputParameters:
            - name: basin
              in: body
              type: string
              description: "Basin name (e.g., North Sea, Prelude, Nigeria)."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-costs
              type: call
              call: snowflake.query-drilling-costs
              with:
                basin: "{{basin}}"
                date_from: "{{date_from}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "drilling-cost-per-foot"
                rows: "{{query-costs.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: drilling-costs
          path: "/statements"
          operations:
            - name: query-drilling-costs
              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/drilling-cost-per-foot/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting.

naftiko: "0.5"
info:
  label: "Snowflake Emissions Monitoring Report"
  description: "Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting."
  tags:
    - environmental
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: emissions-report
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a reporting period and facility type, query Snowflake for GHG emissions data and push to Power BI."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
            - name: facility_type
              in: body
              type: string
              description: "Facility type: upstream, refining, chemical, all."
          steps:
            - name: query-emissions
              type: call
              call: snowflake.query-emissions
              with:
                period: "{{period}}"
                facility_type: "{{facility_type}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "ghg-emissions-quarterly"
                rows: "{{query-emissions.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: emissions
          path: "/statements"
          operations:
            - name: query-emissions
              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/ghg-emissions-quarterly/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for current energy trading positions across crude, LNG, and power, aggregates exposure by desk, and pushes to Power BI for risk monitoring.

naftiko: "0.5"
info:
  label: "Snowflake Energy Trading Position Report"
  description: "Queries Snowflake for current energy trading positions across crude, LNG, and power, aggregates exposure by desk, and pushes to Power BI for risk monitoring."
  tags:
    - trading
    - risk-management
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: trading-positions
      port: 8080
      tools:
        - name: generate-position-report
          description: "Given a trading desk and valuation date, query Snowflake for open positions and push to Power BI."
          inputParameters:
            - name: desk
              in: body
              type: string
              description: "Trading desk identifier (e.g., crude-europe, lng-asia, power-uk)."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
          steps:
            - name: query-positions
              type: call
              call: snowflake.query-trading-positions
              with:
                desk: "{{desk}}"
                valuation_date: "{{valuation_date}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "trading-positions-daily"
                rows: "{{query-positions.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: positions
          path: "/statements"
          operations:
            - name: query-trading-positions
              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/trading-positions-daily/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for LNG fleet utilization data across Shell's shipping portfolio, calculates vessel utilization rates, and pushes to Power BI for commercial planning.

naftiko: "0.5"
info:
  label: "Snowflake LNG Fleet Utilization Report"
  description: "Queries Snowflake for LNG fleet utilization data across Shell's shipping portfolio, calculates vessel utilization rates, and pushes to Power BI for commercial planning."
  tags:
    - trading
    - logistics
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: lng-fleet
      port: 8080
      tools:
        - name: generate-fleet-report
          description: "Given a fleet segment and date range, query Snowflake for vessel utilization and push to Power BI."
          inputParameters:
            - name: fleet_segment
              in: body
              type: string
              description: "Fleet segment: conventional, q-flex, q-max."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-utilization
              type: call
              call: snowflake.query-fleet-utilization
              with:
                fleet_segment: "{{fleet_segment}}"
                date_from: "{{date_from}}"
            - name: push-report
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "lng-fleet-utilization"
                rows: "{{query-utilization.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: fleet
          path: "/statements"
          operations:
            - name: query-fleet-utilization
              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/lng-fleet-utilization/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for methane LDAR survey results, identifies active leaks, and creates work orders in SAP for repair.

naftiko: "0.5"
info:
  label: "Snowflake Methane Leak Detection Report"
  description: "Queries Snowflake for methane LDAR survey results, identifies active leaks, and creates work orders in SAP for repair."
  tags:
    - environmental
    - upstream
    - snowflake
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: methane-ldar
      port: 8080
      tools:
        - name: process-ldar-results
          description: "Given a facility and survey date, query Snowflake for LDAR results and create SAP work orders for detected leaks."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "Facility identifier for the LDAR survey."
            - name: survey_date
              in: body
              type: string
              description: "Survey date in YYYY-MM-DD format."
          steps:
            - name: query-leaks
              type: call
              call: snowflake.query-ldar-results
              with:
                facility_id: "{{facility_id}}"
                survey_date: "{{survey_date}}"
            - name: create-repair-orders
              type: call
              call: sap.create-pm-work-orders
              with:
                leaks: "{{query-leaks.active_leaks}}"
                facility: "{{facility_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: ldar
          path: "/statements"
          operations:
            - name: query-ldar-results
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-orders
              method: POST

Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team.

naftiko: "0.5"
info:
  label: "Snowflake Pipeline Flow Rate Anomaly Detector"
  description: "Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team."
  tags:
    - upstream
    - pipeline
    - snowflake
    - servicenow
    - safety
capability:
  exposes:
    - type: mcp
      namespace: pipeline-anomaly
      port: 8080
      tools:
        - name: detect-flow-anomaly
          description: "Given a pipeline segment ID and time window, query Snowflake for flow rate data, detect anomalies, and raise a ServiceNow incident if thresholds are breached."
          inputParameters:
            - name: pipeline_segment_id
              in: body
              type: string
              description: "Unique identifier for the pipeline segment."
            - name: hours_lookback
              in: body
              type: number
              description: "Number of hours to look back for anomaly detection."
          steps:
            - name: query-flow-data
              type: call
              call: snowflake.query-flow-rates
              with:
                pipeline_segment_id: "{{pipeline_segment_id}}"
                hours_lookback: "{{hours_lookback}}"
            - name: raise-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Pipeline flow anomaly on segment {{pipeline_segment_id}}"
                description: "Anomaly detected: {{query-flow-data.anomaly_summary}}"
                urgency: "2"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: flow-rates
          path: "/statements"
          operations:
            - name: query-flow-rates
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://shell.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

Queries Snowflake for power trading profit and loss data across Shell Energy Trading markets, aggregates by region, and pushes to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Power Trading P&L Report"
  description: "Queries Snowflake for power trading profit and loss data across Shell Energy Trading markets, aggregates by region, and pushes to Power BI."
  tags:
    - trading
    - finance
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: power-trading-pnl
      port: 8080
      tools:
        - name: generate-pnl-report
          description: "Given a trading region and date, query power trading P&L from Snowflake and push to Power BI."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Trading region (e.g., europe, north-america, apac)."
            - name: trade_date
              in: body
              type: string
              description: "Trade date in YYYY-MM-DD format."
          steps:
            - name: query-pnl
              type: call
              call: snowflake.query-power-pnl
              with:
                region: "{{region}}"
                trade_date: "{{trade_date}}"
            - name: push-report
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "power-trading-pnl"
                rows: "{{query-pnl.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: pnl
          path: "/statements"
          operations:
            - name: query-power-pnl
              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/power-trading-pnl/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for historical well production data, performs decline curve analysis, and pushes EUR estimates to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Reservoir Decline Curve Analysis"
  description: "Queries Snowflake for historical well production data, performs decline curve analysis, and pushes EUR estimates to Power BI."
  tags:
    - upstream
    - production
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: decline-curve
      port: 8080
      tools:
        - name: run-decline-analysis
          description: "Given a well ID and history window, query production data and push EUR estimates to Power BI."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "Unique well identifier."
            - name: months_history
              in: body
              type: number
              description: "Months of production history to analyze."
          steps:
            - name: query-production
              type: call
              call: snowflake.query-well-production
              with:
                well_id: "{{well_id}}"
                months_history: "{{months_history}}"
            - name: push-forecasts
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "decline-curve-eur"
                rows: "{{query-production.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: production
          path: "/statements"
          operations:
            - name: query-well-production
              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/decline-curve-eur/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake to benchmark drilling rig utilization rates across Shell operating regions, returning utilization percentages, non-productive time, and peer comparisons.

naftiko: "0.5"
info:
  label: "Snowflake Rig Utilization Benchmarking"
  description: "Queries Snowflake to benchmark drilling rig utilization rates across Shell operating regions, returning utilization percentages, non-productive time, and peer comparisons."
  tags:
    - upstream
    - drilling
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: rig-benchmarking
      port: 8080
      tools:
        - name: get-rig-utilization-benchmark
          description: "Run a rig utilization benchmarking query across operating regions in Snowflake."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Operating region code, e.g. NAM, EUR, APAC."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT rig_id, region, utilization_pct, npt_hours, benchmark_pct FROM drilling_ops.rig_utilization WHERE region='{{region}}' AND period='{{period}}' ORDER BY utilization_pct DESC"
          outputParameters:
            - name: rig_data
              type: array
              mapping: "$.data"
            - name: row_count
              type: number
              mapping: "$.resultSetMetaData.numRows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for solar farm generation data, compares actual output vs nameplate capacity, and pushes performance ratios to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Solar Farm Performance Tracker"
  description: "Queries Snowflake for solar farm generation data, compares actual output vs nameplate capacity, and pushes performance ratios to Power BI."
  tags:
    - renewable-energy
    - production
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: solar-performance
      port: 8080
      tools:
        - name: track-solar-performance
          description: "Given a solar farm ID and date range, query generation data and push performance metrics to Power BI."
          inputParameters:
            - name: solar_farm_id
              in: body
              type: string
              description: "Solar farm project identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-generation
              type: call
              call: snowflake.query-solar-generation
              with:
                solar_farm_id: "{{solar_farm_id}}"
                date_from: "{{date_from}}"
            - name: push-performance
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "solar-farm-performance"
                rows: "{{query-generation.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: solar-data
          path: "/statements"
          operations:
            - name: query-solar-generation
              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/solar-farm-performance/rows"
          operations:
            - name: push-rows
              method: POST

Monitors Snowflake data pipeline execution for energy trading analytics and creates a ServiceNow incident when pipeline jobs fail or produce stale data.

naftiko: "0.5"
info:
  label: "Snowflake Trading Analytics Pipeline Monitor"
  description: "Monitors Snowflake data pipeline execution for energy trading analytics and creates a ServiceNow incident when pipeline jobs fail or produce stale data."
  tags:
    - data
    - analytics
    - trading
    - snowflake
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: trading-analytics
      port: 8080
      tools:
        - name: monitor-trading-pipeline
          description: "Query Snowflake for the latest pipeline run status for energy trading data, and if the data is stale or the job failed, create a ServiceNow data incident."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "Name of the Snowflake trading data pipeline to check."
            - name: max_staleness_hours
              in: body
              type: integer
              description: "Maximum acceptable data age in hours before raising an incident."
          steps:
            - name: check-pipeline-status
              type: call
              call: "snowflake-trading.check-pipeline-status"
              with:
                pipelineName: "{{pipeline_name}}"
            - name: create-data-incident
              type: call
              call: "snow-trading.create-incident"
              with:
                short_description: "Trading pipeline stale or failed: {{pipeline_name}}"
                urgency: "2"
                description: "Pipeline: {{pipeline_name}}\nLast run: {{check-pipeline-status.lastRunTime}}\nStatus: {{check-pipeline-status.status}}\nStaleness threshold: {{max_staleness_hours}} hours"
  consumes:
    - type: http
      namespace: snowflake-trading
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: pipeline-status
          path: "/statements"
          inputParameters:
            - name: pipelineName
              in: query
          operations:
            - name: check-pipeline-status
              method: POST
    - type: http
      namespace: snow-trading
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Snowflake for trading counterparty credit exposure, aggregates by counterparty and commodity, and pushes risk report to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Trading Counterparty Exposure Report"
  description: "Queries Snowflake for trading counterparty credit exposure, aggregates by counterparty and commodity, and pushes risk report to Power BI."
  tags:
    - trading
    - risk-management
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: counterparty-exposure
      port: 8080
      tools:
        - name: generate-exposure-report
          description: "Given a valuation date and threshold, query counterparty exposure from Snowflake and push to Power BI."
          inputParameters:
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
            - name: threshold_usd
              in: body
              type: number
              description: "Minimum exposure in USD to include."
          steps:
            - name: query-exposure
              type: call
              call: snowflake.query-counterparty-exposure
              with:
                valuation_date: "{{valuation_date}}"
                threshold_usd: "{{threshold_usd}}"
            - name: push-report
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "counterparty-exposure"
                rows: "{{query-exposure.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: exposure
          path: "/statements"
          operations:
            - name: query-counterparty-exposure
              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/counterparty-exposure/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for produced water disposal well injection data, checks against permit limits, and creates ServiceNow alert if nearing thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Water Disposal Well Monitoring"
  description: "Queries Snowflake for produced water disposal well injection data, checks against permit limits, and creates ServiceNow alert if nearing thresholds."
  tags:
    - upstream
    - environmental
    - snowflake
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: water-disposal
      port: 8080
      tools:
        - name: monitor-disposal-well
          description: "Given a disposal well ID, query injection data and alert via ServiceNow if nearing limits."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "Disposal well identifier."
          steps:
            - name: query-injection-data
              type: call
              call: snowflake.query-injection-volumes
              with:
                well_id: "{{well_id}}"
            - name: create-alert
              type: call
              call: servicenow.create-alert
              with:
                well_id: "{{well_id}}"
                current_volume: "{{query-injection-data.daily_volume}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: injection-data
          path: "/statements"
          operations:
            - name: query-injection-volumes
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: alerts
          path: "/table/u_environmental_alert"
          operations:
            - name: create-alert
              method: POST

Queries Snowflake for offshore and onshore wind farm generation data, compares actual output to forecasted capacity, and pushes to Power BI for renewable energy portfolio tracking.

naftiko: "0.5"
info:
  label: "Snowflake Wind Farm Generation Dashboard"
  description: "Queries Snowflake for offshore and onshore wind farm generation data, compares actual output to forecasted capacity, and pushes to Power BI for renewable energy portfolio tracking."
  tags:
    - renewable-energy
    - production
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: wind-generation
      port: 8080
      tools:
        - name: generate-wind-dashboard
          description: "Given a wind farm ID and date range, query generation data from Snowflake and push to Power BI."
          inputParameters:
            - name: wind_farm_id
              in: body
              type: string
              description: "Wind farm project identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-generation
              type: call
              call: snowflake.query-wind-generation
              with:
                wind_farm_id: "{{wind_farm_id}}"
                date_from: "{{date_from}}"
            - name: push-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "wind-farm-generation"
                rows: "{{query-generation.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://shell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: wind-data
          path: "/statements"
          operations:
            - name: query-wind-generation
              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/wind-farm-generation/rows"
          operations:
            - name: push-rows
              method: POST

Triggers a Terraform Cloud workspace run to provision Azure infrastructure for a Shell digital project and logs the result in a Jira ticket.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning for Azure"
  description: "Triggers a Terraform Cloud workspace run to provision Azure infrastructure for a Shell digital project and logs the result in a Jira ticket."
  tags:
    - cloud
    - infrastructure
    - terraform
    - azure
    - jira
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-azure-infrastructure
          description: "Given a Terraform Cloud workspace ID and Jira ticket key, trigger a Terraform run to provision Azure infrastructure and update the Jira ticket with the run result."
          inputParameters:
            - name: terraform_workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID to run."
            - name: jira_ticket_key
              in: body
              type: string
              description: "Jira ticket key to update with the provisioning result."
            - name: run_message
              in: body
              type: string
              description: "Message to associate with the Terraform run."
          steps:
            - name: trigger-run
              type: call
              call: "terraform.create-run"
              with:
                workspaceId: "{{terraform_workspace_id}}"
                message: "{{run_message}}"
            - name: update-jira
              type: call
              call: "jira-infra.add-comment"
              with:
                issueKey: "{{jira_ticket_key}}"
                comment: "Terraform run triggered. Run ID: {{trigger-run.runId}} | Status: {{trigger-run.status}} | Workspace: {{terraform_workspace_id}}"
  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-infra
      baseUri: "https://shell.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issue-comments
          path: "/issue/{{issueKey}}/comment"
          inputParameters:
            - name: issueKey
              in: path
          operations:
            - name: add-comment
              method: POST

Provisions edge computing infrastructure for LNG terminal monitoring using Terraform Cloud, registers in ServiceNow CMDB, and notifies the OT team.

naftiko: "0.5"
info:
  label: "Terraform Cloud LNG Terminal Edge Infrastructure"
  description: "Provisions edge computing infrastructure for LNG terminal monitoring using Terraform Cloud, registers in ServiceNow CMDB, and notifies the OT team."
  tags:
    - downstream
    - ot
    - terraform
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: lng-edge-infra
      port: 8080
      tools:
        - name: provision-lng-edge
          description: "Given a terminal ID and device count, run Terraform to provision edge infra, register in ServiceNow, and notify OT team."
          inputParameters:
            - name: terminal_id
              in: body
              type: string
              description: "LNG terminal identifier."
            - name: device_count
              in: body
              type: number
              description: "Number of edge devices."
          steps:
            - name: run-terraform
              type: call
              call: terraform.create-run
              with:
                workspace: "lng-terminal-edge"
                variables: "terminal_id={{terminal_id}},device_count={{device_count}}"
            - name: register-devices
              type: call
              call: servicenow.create-ci
              with:
                terminal_id: "{{terminal_id}}"
                device_count: "{{device_count}}"
            - name: notify-ot
              type: call
              call: msteams.send-message
              with:
                channel: "ot-infrastructure"
                text: "LNG edge infra provisioned | Terminal: {{terminal_id}} | Devices: {{device_count}}"
  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: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: ci
          path: "/table/cmdb_ci"
          operations:
            - name: create-ci
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/ot/channels/infrastructure/messages"
          operations:
            - name: send-message
              method: POST

Verifies that field contractors in Workday have valid safety certifications and site access clearances before allowing facility entry, notifying supervisors of gaps via Teams.

naftiko: "0.5"
info:
  label: "Workday Contractor Compliance Verification"
  description: "Verifies that field contractors in Workday have valid safety certifications and site access clearances before allowing facility entry, notifying supervisors of gaps via Teams."
  tags:
    - safety
    - compliance
    - workday
    - msteams
    - upstream
capability:
  exposes:
    - type: mcp
      namespace: contractor-compliance
      port: 8080
      tools:
        - name: verify-contractor
          description: "Given a contractor worker ID and site code, check safety certs and site access in Workday and notify supervisor via Teams if non-compliant."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday contingent worker ID."
            - name: site_code
              in: body
              type: string
              description: "Facility site code requiring access."
          steps:
            - name: check-certifications
              type: call
              call: workday.get-worker-certifications
              with:
                worker_id: "{{worker_id}}"
            - name: check-clearance
              type: call
              call: workday.get-site-access
              with:
                worker_id: "{{worker_id}}"
                site_code: "{{site_code}}"
            - name: notify-supervisor
              type: call
              call: msteams.send-message
              with:
                channel: "field-supervisors"
                text: "Contractor compliance | Worker: {{worker_id}} | Site: {{site_code}} | Certs valid: {{check-certifications.all_valid}} | Access cleared: {{check-clearance.cleared}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/workers/certifications"
          operations:
            - name: get-worker-certifications
              method: GET
        - name: site-access
          path: "/workers/site-access"
          operations:
            - name: get-site-access
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/field/channels/supervisors/messages"
          operations:
            - name: send-message
              method: POST

Queries Workday for available certified crew, matches to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel.

naftiko: "0.5"
info:
  label: "Workday Field Crew Scheduling Optimizer"
  description: "Queries Workday for available certified crew, matches to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel."
  tags:
    - upstream
    - workday
    - sap
    - msteams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: crew-scheduling
      port: 8080
      tools:
        - name: optimize-crew-schedule
          description: "Given a location and date, find available crew, match to SAP work orders, and post schedule."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Field location code."
            - name: schedule_date
              in: body
              type: string
              description: "Date in YYYY-MM-DD format."
          steps:
            - name: get-available-crew
              type: call
              call: workday.get-available-workers
              with:
                location: "{{location}}"
                date: "{{schedule_date}}"
            - name: get-pending-orders
              type: call
              call: sap.get-open-work-orders
              with:
                location: "{{location}}"
            - name: post-schedule
              type: call
              call: msteams.send-message
              with:
                channel: "field-operations"
                text: "Crew Schedule {{schedule_date}} | Location: {{location}} | Crew: {{get-available-crew.count}} | WOs: {{get-pending-orders.count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: get-available-workers
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: get-open-work-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/field/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Pulls headcount data from Workday, combines with ServiceNow incident records, calculates TRIR and DART rates, and pushes to Power BI.

naftiko: "0.5"
info:
  label: "Workday HSE Incident Rate Dashboard"
  description: "Pulls headcount data from Workday, combines with ServiceNow incident records, calculates TRIR and DART rates, and pushes to Power BI."
  tags:
    - safety
    - workday
    - servicenow
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: hse-rates
      port: 8080
      tools:
        - name: calculate-hse-rates
          description: "Given a business unit and period, pull Workday hours, ServiceNow incidents, calculate safety rates, and push to Power BI."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "Business unit code."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-hours
              type: call
              call: workday.get-hours-worked
              with:
                business_unit: "{{business_unit}}"
                period: "{{period}}"
            - name: get-incidents
              type: call
              call: servicenow.query-hse-incidents
              with:
                business_unit: "{{business_unit}}"
                period: "{{period}}"
            - name: push-rates
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "hse-incident-rates"
                rows: "{{get-incidents.summary}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: hours
          path: "/time-tracking/hours"
          operations:
            - name: get-hours-worked
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://shell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: hse-incidents
          path: "/table/u_hse_incident"
          operations:
            - name: query-hse-incidents
              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/hse-incident-rates/rows"
          operations:
            - name: push-rows
              method: POST

Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams.

naftiko: "0.5"
info:
  label: "Workday Safety Training Compliance Check"
  description: "Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams."
  tags:
    - safety
    - training
    - workday
    - msteams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-training
      port: 8080
      tools:
        - name: check-safety-training
          description: "Given a worker ID, verify all required HSE training modules are complete in Workday. If any are overdue, notify the safety coordinator in Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID to check training compliance for."
          steps:
            - name: get-training-status
              type: call
              call: workday.get-learning-records
              with:
                worker_id: "{{worker_id}}"
            - name: notify-overdue
              type: call
              call: msteams.send-message
              with:
                channel: "hse-compliance"
                text: "Safety training check for {{worker_id}} | Overdue modules: {{get-training-status.overdue_count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/learning/records"
          operations:
            - name: get-learning-records
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hse/channels/compliance/messages"
          operations:
            - name: send-message
              method: POST

Retrieves succession pipeline data from Workday for critical operational roles and posts readiness summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Succession Planning for Critical Roles"
  description: "Retrieves succession pipeline data from Workday for critical operational roles and posts readiness summary to the HR leadership Teams channel."
  tags:
    - hr
    - workday
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: succession-planning
      port: 8080
      tools:
        - name: review-succession-pipeline
          description: "Given a business unit, pull succession data from Workday and post readiness summary to Teams."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "Business unit to review."
          steps:
            - name: get-succession-data
              type: call
              call: workday.get-succession-plans
              with:
                business_unit: "{{business_unit}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel: "hr-leadership"
                text: "Succession Pipeline | {{business_unit}} | Ready now: {{get-succession-data.ready_now}} | Gaps: {{get-succession-data.gap_count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: succession
          path: "/talent/succession-plans"
          operations:
            - name: get-succession-plans
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/leadership/messages"
          operations:
            - name: send-message
              method: POST