Bechtel Capabilities

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

Sort
Expand

Retrieves an engineering document or project file from Amazon S3 by bucket and key.

naftiko: "0.5"
info:
  label: "Amazon S3 Document Retrieval"
  description: "Retrieves an engineering document or project file from Amazon S3 by bucket and key."
  tags:
    - construction
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: s3
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a file from Amazon S3."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "S3 bucket name."
            - name: key
              in: body
              type: string
              description: "Object key."
          call: "s3.get-object"
          with:
            bucket: "{{bucket}}"
            key: "{{key}}"
          outputParameters:
            - name: content_type
              type: string
              mapping: "$.ContentType"
            - name: last_modified
              type: string
              mapping: "$.LastModified"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{bucket}}/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: get-object
              method: GET

Retrieves the latest version information for an AutoCAD drawing file stored in the Bechtel engineering document management system.

naftiko: "0.5"
info:
  label: "AutoCAD Drawing Version Tracker"
  description: "Retrieves the latest version information for an AutoCAD drawing file stored in the Bechtel engineering document management system."
  tags:
    - engineering
    - cad
    - autocad
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: engineering-docs
      port: 8080
      tools:
        - name: get-drawing-version
          description: "Look up the latest version of an AutoCAD drawing by drawing number."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "Engineering drawing number."
          call: "edms.get-drawing"
          with:
            drawing_number: "{{drawing_number}}"
          outputParameters:
            - name: version
              type: string
              mapping: "$.drawing.version"
            - name: last_modified
              type: string
              mapping: "$.drawing.last_modified_date"
            - name: author
              type: string
              mapping: "$.drawing.modified_by"
            - name: status
              type: string
              mapping: "$.drawing.approval_status"
  consumes:
    - type: http
      namespace: edms
      baseUri: "https://edms.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.edms_token"
      resources:
        - name: drawings
          path: "/drawings/{{drawing_number}}"
          inputParameters:
            - name: drawing_number
              in: path
          operations:
            - name: get-drawing
              method: GET

Creates an Azure AD security group for a new project team and adds initial members.

naftiko: "0.5"
info:
  label: "Azure Active Directory Group Provisioner"
  description: "Creates an Azure AD security group for a new project team and adds initial members."
  tags:
    - identity
    - azure-active-directory
    - security
capability:
  exposes:
    - type: mcp
      namespace: identity-mgmt
      port: 8080
      tools:
        - name: provision-project-group
          description: "Create an Azure AD group for a new project team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: project_name
              in: body
              type: string
              description: "Project name."
            - name: owner_email
              in: body
              type: string
              description: "Group owner email."
          steps:
            - name: create-group
              type: call
              call: "azuread.create-group"
              with:
                display_name: "Project-{{project_id}}-{{project_name}}"
                mail_nickname: "proj-{{project_id}}"
                owner: "{{owner_email}}"
            - name: notify-owner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{owner_email}}"
                text: "Azure AD group created for project {{project_name}} ({{project_id}}). Group ID: {{create-group.id}}."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: create-group
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chat/messages"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a user in Azure Active Directory by email, returning profile and group membership details.

naftiko: "0.5"
info:
  label: "Azure Active Directory User Lookup"
  description: "Looks up a user in Azure Active Directory by email, returning profile and group membership details."
  tags:
    - construction
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: aad
      port: 8080
      tools:
        - name: lookup-user
          description: "Look up user details in Azure AD."
          inputParameters:
            - name: user_principal_name
              in: body
              type: string
              description: "User principal name."
          call: "aad.get-user"
          with:
            upn: "{{user_principal_name}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: department
              type: string
              mapping: "$.department"
  consumes:
    - type: http
      namespace: aad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves the latest build status for an Azure DevOps pipeline used by the Bechtel digital engineering team.

naftiko: "0.5"
info:
  label: "Azure DevOps Pipeline Status Checker"
  description: "Retrieves the latest build status for an Azure DevOps pipeline used by the Bechtel digital engineering team."
  tags:
    - devops
    - ci-cd
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: cicd
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Check the latest build status for an Azure DevOps pipeline."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          call: "azdo.get-latest-build"
          with:
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: build_number
              type: string
              mapping: "$.value[0].buildNumber"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: finish_time
              type: string
              mapping: "$.value[0].finishTime"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/bechtel/Engineering/_apis/build"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: get-latest-build
              method: GET

Retrieves a secret from Azure Key Vault for use in automated workflows.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retriever"
  description: "Retrieves a secret from Azure Key Vault for use in automated workflows."
  tags:
    - security
    - azure-key-vault
capability:
  exposes:
    - type: mcp
      namespace: secrets
      port: 8080
      tools:
        - name: get-secret
          description: "Retrieve a secret value from Azure Key Vault."
          inputParameters:
            - name: secret_name
              in: body
              type: string
              description: "Secret name."
          call: "keyvault.get-secret"
          with:
            secret_name: "{{secret_name}}"
          outputParameters:
            - name: value
              type: string
              mapping: "$.value"
            - name: expires
              type: string
              mapping: "$.attributes.expires"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://bechtel-vault.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET

Retrieves an engineering document from Box cloud storage by file ID.

naftiko: "0.5"
info:
  label: "Box Document Retrieval"
  description: "Retrieves an engineering document from Box cloud storage by file ID."
  tags:
    - construction
    - box
capability:
  exposes:
    - type: mcp
      namespace: box
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a document from Box."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "Box file ID."
          call: "box.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: download_url
              type: string
              mapping: "$.shared_link.download_url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Processes a construction change order by creating it in SAP, updating the Primavera schedule, notifying the client via Microsoft Outlook, and alerting the project team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Change Order Processing Pipeline"
  description: "Processes a construction change order by creating it in SAP, updating the Primavera schedule, notifying the client via Microsoft Outlook, and alerting the project team via Microsoft Teams."
  tags:
    - construction
    - sap
    - microsoft-outlook
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-order
      port: 8080
      tools:
        - name: process-change-order
          description: "Orchestrate change order processing across project systems."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: description
              in: body
              type: string
              description: "Change order description."
            - name: cost_impact
              in: body
              type: number
              description: "Cost impact in dollars."
            - name: client_email
              in: body
              type: string
              description: "Client contact email."
          steps:
            - name: create-co
              type: call
              call: "sap.create-change-order"
              with:
                project_id: "{{project_id}}"
                description: "{{description}}"
                amount: "{{cost_impact}}"
            - name: update-schedule
              type: call
              call: "primavera.update-activity"
              with:
                project_id: "{{project_id}}"
                change_order_ref: "{{create-co.co_number}}"
            - name: notify-client
              type: call
              call: "outlook.send-email"
              with:
                to: "{{client_email}}"
                subject: "Change Order {{create-co.co_number}} - Project {{project_id}}"
                body: "A change order has been submitted. Description: {{description}}. Cost impact: ${{cost_impact}}."
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_{{project_id}}"
                text: "Change order {{create-co.co_number}} created. Cost: ${{cost_impact}}. Client notified."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: change-orders
          path: "/API_PROJECT_CHANGE_ORDER/ChangeOrder"
          operations:
            - name: create-change-order
              method: POST
    - type: http
      namespace: primavera
      baseUri: "https://primavera.bechtel.com/api/restapi"
      authentication:
        type: bearer
        token: "$secrets.primavera_token"
      resources:
        - name: activities
          path: "/activity"
          operations:
            - name: update-activity
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Cisco network infrastructure for device status and uptime.

naftiko: "0.5"
info:
  label: "Cisco Network Device Status Check"
  description: "Queries Cisco network infrastructure for device status and uptime."
  tags:
    - infrastructure
    - networking
    - cisco
capability:
  exposes:
    - type: mcp
      namespace: network
      port: 8080
      tools:
        - name: check-device-status
          description: "Check the status of a Cisco network device."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "Cisco device ID."
          call: "cisco.get-device"
          with:
            device_id: "{{device_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.device.reachabilityStatus"
            - name: uptime
              type: string
              mapping: "$.device.upTime"
            - name: hostname
              type: string
              mapping: "$.device.hostname"
  consumes:
    - type: http
      namespace: cisco
      baseUri: "https://dnac.bechtel.com/dna/intent/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cisco_dnac_token"
      resources:
        - name: devices
          path: "/network-device/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device
              method: GET

Processes client submittals by creating the submittal in Jira, uploading documents to SharePoint, notifying the client via Microsoft Outlook, and tracking status in Google Sheets.

naftiko: "0.5"
info:
  label: "Client Submittal Pipeline"
  description: "Processes client submittals by creating the submittal in Jira, uploading documents to SharePoint, notifying the client via Microsoft Outlook, and tracking status in Google Sheets."
  tags:
    - construction
    - jira
    - sharepoint
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: submittal
      port: 8080
      tools:
        - name: process-submittal
          description: "Orchestrate client submittal processing."
          inputParameters:
            - name: submittal_title
              in: body
              type: string
              description: "Submittal title."
            - name: client_email
              in: body
              type: string
              description: "Client email."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: create-submittal
              type: call
              call: "jira.create-issue"
              with:
                project: "SUBMIT"
                summary: "{{submittal_title}}"
                issue_type: "Task"
            - name: notify-client
              type: call
              call: "outlook.send-email"
              with:
                to: "{{client_email}}"
                subject: "Submittal for Review: {{submittal_title}}"
                body: "A new submittal has been uploaded for your review. Reference: {{create-submittal.issue_key}}."
            - name: log-submittal
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_submittals"
                data: "{{project_id}},{{create-submittal.issue_key}},{{submittal_title}},pending"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Manages system commissioning tests by creating a test plan in Jira, recording results in Google Sheets, uploading test reports to SharePoint, and notifying the commissioning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Commissioning Test Pipeline"
  description: "Manages system commissioning tests by creating a test plan in Jira, recording results in Google Sheets, uploading test reports to SharePoint, and notifying the commissioning team via Microsoft Teams."
  tags:
    - construction
    - jira
    - google-sheets
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: commissioning
      port: 8080
      tools:
        - name: execute-commissioning-test
          description: "Orchestrate commissioning test execution and documentation."
          inputParameters:
            - name: system_id
              in: body
              type: string
              description: "System ID."
            - name: test_type
              in: body
              type: string
              description: "Type of commissioning test."
            - name: result
              in: body
              type: string
              description: "Pass or fail."
          steps:
            - name: update-task
              type: call
              call: "jira.create-issue"
              with:
                project: "COMM"
                summary: "Commissioning test: {{system_id}} - {{test_type}} - {{result}}"
                issue_type: "Task"
            - name: log-result
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_commissioning"
                data: "{{system_id}},{{test_type}},{{result}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "commissioning"
                text: "Commissioning test {{test_type}} for system {{system_id}}: {{result}}. Task: {{update-task.issue_key}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Schedules a concrete pour by checking weather conditions, verifying material availability in SAP, creating a Jira task for the crew, and notifying the project manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Concrete Pour Scheduling Pipeline"
  description: "Schedules a concrete pour by checking weather conditions, verifying material availability in SAP, creating a Jira task for the crew, and notifying the project manager via Microsoft Teams."
  tags:
    - construction
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: concrete-pour
      port: 8080
      tools:
        - name: schedule-pour
          description: "Orchestrate concrete pour scheduling with weather and material checks."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: pour_date
              in: body
              type: string
              description: "Planned pour date."
            - name: volume_cubic_yards
              in: body
              type: number
              description: "Volume in cubic yards."
          steps:
            - name: check-weather
              type: call
              call: "weather.get-forecast"
              with:
                site_code: "{{site_code}}"
                date: "{{pour_date}}"
            - name: verify-material
              type: call
              call: "sap.check-material-availability"
              with:
                material: "CONCRETE_MIX"
                quantity: "{{volume_cubic_yards}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SITE"
                summary: "Concrete pour: {{volume_cubic_yards}} cy at {{site_code}} on {{pour_date}}"
                issue_type: "Task"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_mgmt"
                text: "Concrete pour scheduled: {{volume_cubic_yards}} cy at {{site_code}} on {{pour_date}}. Weather: {{check-weather.conditions}}. Material: {{verify-material.status}}."
  consumes:
    - type: http
      namespace: weather
      baseUri: "https://api.weather.bechtel.com/v1"
      authentication:
        type: bearer
        token: "$secrets.weather_api_token"
      resources:
        - name: forecast
          path: "/forecast"
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: material-availability
          path: "/API_MATERIAL_STOCK_SRV/A_MatlStkInAcctMod"
          operations:
            - name: check-material-availability
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches Confluence for engineering standards and procedures by keyword.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Search"
  description: "Searches Confluence for engineering standards and procedures by keyword."
  tags:
    - collaboration
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: search-standards
          description: "Search Confluence for engineering standards and best practices."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query."
          call: "confluence.search"
          with:
            cql: "text ~ \"{{query}}\" and space = ENG"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total
              type: number
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bechtel.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search
              method: GET

Tracks delivery status of construction materials from the logistics provider, updates the project schedule, and alerts the site supervisor via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Construction Material Delivery Tracker"
  description: "Tracks delivery status of construction materials from the logistics provider, updates the project schedule, and alerts the site supervisor via Microsoft Teams."
  tags:
    - logistics
    - construction
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: material-tracking
      port: 8080
      tools:
        - name: track-material-delivery
          description: "Check delivery status for a construction material shipment and update the project team."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "Shipment tracking ID."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: get-shipment
              type: call
              call: "logistics.get-shipment-status"
              with:
                shipment_id: "{{shipment_id}}"
            - name: update-schedule
              type: call
              call: "ms-project.update-delivery-date"
              with:
                project_id: "{{project_id}}"
                shipment_id: "{{shipment_id}}"
                eta: "{{get-shipment.estimated_delivery}}"
            - name: notify-site
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{project_id}}"
                text: "Material shipment {{shipment_id}} status: {{get-shipment.status}}. ETA: {{get-shipment.estimated_delivery}}."
  consumes:
    - type: http
      namespace: logistics
      baseUri: "https://logistics.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.logistics_token"
      resources:
        - name: shipments
          path: "/shipments/{{shipment_id}}"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment-status
              method: GET
    - type: http
      namespace: ms-project
      baseUri: "https://project.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.msproject_token"
      resources:
        - name: deliveries
          path: "/projects/{{project_id}}/deliveries/{{shipment_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: shipment_id
              in: path
          operations:
            - name: update-delivery-date
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Uploads site progress photos to SharePoint organized by project and date, and notifies the project team.

naftiko: "0.5"
info:
  label: "Construction Photo Documentation Pipeline"
  description: "Uploads site progress photos to SharePoint organized by project and date, and notifies the project team."
  tags:
    - construction
    - documentation
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: photo-docs
      port: 8080
      tools:
        - name: upload-progress-photos
          description: "Upload and organize construction progress photos."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: date
              in: body
              type: string
              description: "Photo date."
            - name: photo_count
              in: body
              type: number
              description: "Number of photos uploaded."
          steps:
            - name: upload
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "project_{{project_id}}"
                folder_path: "ProgressPhotos/{{date}}"
                file_name: "photos_{{date}}.zip"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_{{project_id}}"
                text: "{{photo_count}} progress photos uploaded for {{date}}. View: {{upload.url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages crane lift plan approval by retrieving the plan from SharePoint, creating an approval request in Jira, checking weather via the site weather service, and notifying the safety team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Crane Lift Plan Approval Pipeline"
  description: "Manages crane lift plan approval by retrieving the plan from SharePoint, creating an approval request in Jira, checking weather via the site weather service, and notifying the safety team via Microsoft Teams."
  tags:
    - construction
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lift-plan
      port: 8080
      tools:
        - name: submit-lift-plan
          description: "Orchestrate crane lift plan submission and approval."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Lift plan document ID."
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: lift_date
              in: body
              type: string
              description: "Planned lift date."
          steps:
            - name: get-plan
              type: call
              call: "sharepoint.get-file"
              with:
                site: "bechtel-engineering"
                path: "/lift-plans/{{plan_id}}.pdf"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Crane lift plan approval: {{plan_id}} at {{site_code}}"
                issue_type: "Approval"
                description: "Lift plan {{plan_id}} for {{lift_date}} at site {{site_code}} requires safety approval."
            - name: check-weather
              type: call
              call: "weather.get-forecast"
              with:
                site_code: "{{site_code}}"
                date: "{{lift_date}}"
            - name: notify-safety
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety"
                text: "Lift plan {{plan_id}} submitted for {{site_code}} on {{lift_date}}. Wind forecast: {{check-weather.wind_speed}} mph. Approval: {{create-approval.issue_key}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site}}/drive/root:/{{path}}:/content"
          inputParameters:
            - name: site
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: weather
      baseUri: "https://api.weather.bechtel.com/v1"
      authentication:
        type: bearer
        token: "$secrets.weather_api_token"
      resources:
        - name: forecast
          path: "/forecast"
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates the daily manpower report by pulling headcount from Workday, comparing against planned resources in SAP, logging in Google Sheets, and distributing via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Daily Manpower Report Pipeline"
  description: "Generates the daily manpower report by pulling headcount from Workday, comparing against planned resources in SAP, logging in Google Sheets, and distributing via Microsoft Teams."
  tags:
    - construction
    - workday
    - sap
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manpower
      port: 8080
      tools:
        - name: generate-manpower-report
          description: "Orchestrate daily manpower report generation."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: date
              in: body
              type: string
              description: "Report date."
          steps:
            - name: get-actual-headcount
              type: call
              call: "workday.get-site-headcount"
              with:
                site_code: "{{site_code}}"
                date: "{{date}}"
            - name: get-planned
              type: call
              call: "sap.get-planned-resources"
              with:
                site_code: "{{site_code}}"
                date: "{{date}}"
            - name: log-report
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_manpower"
                data: "{{site_code}},{{date}},{{get-actual-headcount.total}},{{get-planned.total}}"
            - name: distribute
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{site_code}}"
                text: "Daily manpower {{date}}: Actual={{get-actual-headcount.total}}, Planned={{get-planned.total}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bechtel"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/workers/headcount"
          operations:
            - name: get-site-headcount
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: resources
          path: "/API_PROJECT_RESOURCE_SRV/PlannedResource"
          operations:
            - name: get-planned-resources
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects daily progress data from the field, weather conditions, workforce counts, and generates a daily site report uploaded to SharePoint and emailed to the project director.

naftiko: "0.5"
info:
  label: "Daily Site Report Generator"
  description: "Collects daily progress data from the field, weather conditions, workforce counts, and generates a daily site report uploaded to SharePoint and emailed to the project director."
  tags:
    - construction
    - reporting
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: site-reporting
      port: 8080
      tools:
        - name: generate-daily-site-report
          description: "Compile and distribute the daily construction site report."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: date
              in: body
              type: string
              description: "Report date."
            - name: director_email
              in: body
              type: string
              description: "Project director email."
          steps:
            - name: get-progress
              type: call
              call: "field-data.get-daily-progress"
              with:
                project_id: "{{project_id}}"
                date: "{{date}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "project_{{project_id}}"
                folder_path: "DailyReports/{{date}}"
                file_name: "daily_site_report_{{date}}.pdf"
            - name: email-director
              type: call
              call: "outlook.send-email"
              with:
                to: "{{director_email}}"
                subject: "Daily Site Report - Project {{project_id}} - {{date}}"
                body: "Workforce: {{get-progress.workforce_count}}. Activities completed: {{get-progress.activities_completed}}. Weather: {{get-progress.weather}}. Safety incidents: {{get-progress.safety_incidents}}."
  consumes:
    - type: http
      namespace: field-data
      baseUri: "https://fielddata.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.field_data_token"
      resources:
        - name: daily-progress
          path: "/projects/{{project_id}}/daily/{{date}}"
          inputParameters:
            - name: project_id
              in: path
            - name: date
              in: path
          operations:
            - name: get-daily-progress
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Queries Datadog for the health status of Bechtel IT infrastructure services.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Monitor"
  description: "Queries Datadog for the health status of Bechtel IT infrastructure services."
  tags:
    - monitoring
    - devops
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-health
      port: 8080
      tools:
        - name: get-service-health
          description: "Check infrastructure service health in Datadog."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Service name."
          call: "datadog.get-service-status"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
            - name: uptime_pct
              type: number
              mapping: "$.uptime_percentage"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: monitors
          path: "/monitor/search?query=service:{{service_name}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-status
              method: GET

Processes a design drawing revision by uploading to SharePoint, notifying the engineering team via Microsoft Teams, creating a Jira review task, and logging the revision in Google Sheets.

naftiko: "0.5"
info:
  label: "Design Drawing Revision Pipeline"
  description: "Processes a design drawing revision by uploading to SharePoint, notifying the engineering team via Microsoft Teams, creating a Jira review task, and logging the revision in Google Sheets."
  tags:
    - construction
    - sharepoint
    - microsoft-teams
    - jira
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: drawing-rev
      port: 8080
      tools:
        - name: process-revision
          description: "Orchestrate design drawing revision workflow."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "Drawing number."
            - name: revision
              in: body
              type: string
              description: "Revision letter."
            - name: discipline
              in: body
              type: string
              description: "Engineering discipline."
          steps:
            - name: upload-drawing
              type: call
              call: "sharepoint.upload-file"
              with:
                site: "bechtel-engineering"
                folder: "drawings/{{drawing_number}}"
                file_name: "{{drawing_number}}_Rev{{revision}}.pdf"
            - name: notify-engineers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering_{{discipline}}"
                text: "Drawing {{drawing_number}} Rev {{revision}} uploaded. Please review."
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "ENG"
                summary: "Review drawing {{drawing_number}} Rev {{revision}}"
                issue_type: "Task"
            - name: log-revision
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_drawing_log"
                data: "{{drawing_number}},{{revision}},{{discipline}},{{create-review.issue_key}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site}}/drive/root:/{{folder}}/{{file_name}}:/content"
          inputParameters:
            - name: site
              in: path
            - name: folder
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Manages document transmittals by uploading documents to SharePoint, creating a transmittal record in Jira, sending the transmittal letter via Microsoft Outlook, and logging in Google Sheets.

naftiko: "0.5"
info:
  label: "Document Transmittal Pipeline"
  description: "Manages document transmittals by uploading documents to SharePoint, creating a transmittal record in Jira, sending the transmittal letter via Microsoft Outlook, and logging in Google Sheets."
  tags:
    - construction
    - sharepoint
    - jira
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: transmittal
      port: 8080
      tools:
        - name: send-transmittal
          description: "Orchestrate document transmittal to client or vendor."
          inputParameters:
            - name: recipient_email
              in: body
              type: string
              description: "Recipient email."
            - name: subject
              in: body
              type: string
              description: "Transmittal subject."
            - name: document_list
              in: body
              type: string
              description: "List of document numbers."
          steps:
            - name: create-record
              type: call
              call: "jira.create-issue"
              with:
                project: "DOC"
                summary: "Transmittal: {{subject}}"
                issue_type: "Task"
            - name: send-letter
              type: call
              call: "outlook.send-email"
              with:
                to: "{{recipient_email}}"
                subject: "Document Transmittal: {{subject}}"
                body: "Please find the attached documents: {{document_list}}. Transmittal ref: {{create-record.issue_key}}."
            - name: log-transmittal
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_transmittals"
                data: "{{create-record.issue_key}},{{recipient_email}},{{subject}},sent"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Queries Dynatrace for application performance metrics.

naftiko: "0.5"
info:
  label: "Dynatrace Application Monitor"
  description: "Queries Dynatrace for application performance metrics."
  tags:
    - monitoring
    - dynatrace
capability:
  exposes:
    - type: mcp
      namespace: apm
      port: 8080
      tools:
        - name: get-app-metrics
          description: "Retrieve application metrics from Dynatrace."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "Dynatrace entity ID."
          call: "dynatrace.get-metrics"
          with:
            entity_id: "{{entity_id}}"
          outputParameters:
            - name: response_time
              type: number
              mapping: "$.dataPoints[0].values[0]"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://bechtel.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query?entitySelector=entityId({{entity_id}})"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-metrics
              method: GET

When a new engineer is hired in Workday, creates a ServiceNow onboarding ticket, provisions a SharePoint project folder, sets up AutoCAD license access, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new engineer is hired in Workday, creates a ServiceNow onboarding ticket, provisions a SharePoint project folder, sets up AutoCAD license access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: onboard-engineer
          description: "Run the full onboarding workflow for a new Bechtel engineer."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: department
              in: body
              type: string
              description: "Department."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                description: "New engineer {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: create-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding"
                folder_path: "Engineers/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{department}}_team"
                text: "Welcome {{get-employee.first_name}} to Bechtel {{department}}! Starting {{start_date}}. Onboarding ticket: {{create-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an engineering document is submitted for approval, creates a review task in Jira, notifies the reviewing engineer via Microsoft Teams, and updates the document status in the EDMS upon approval.

naftiko: "0.5"
info:
  label: "Engineering Document Approval Workflow"
  description: "When an engineering document is submitted for approval, creates a review task in Jira, notifies the reviewing engineer via Microsoft Teams, and updates the document status in the EDMS upon approval."
  tags:
    - engineering
    - document-management
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: doc-approval
      port: 8080
      tools:
        - name: submit-for-approval
          description: "Submit an engineering document for review and route the approval workflow."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "Drawing number."
            - name: reviewer_email
              in: body
              type: string
              description: "Reviewer email."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "ENGREV"
                issue_type: "Task"
                summary: "Review drawing {{drawing_number}} for project {{project_id}}"
                assignee: "{{reviewer_email}}"
            - name: notify-reviewer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{reviewer_email}}"
                text: "Drawing {{drawing_number}} is ready for your review. Jira task: {{create-review.key}}."
            - name: update-status
              type: call
              call: "edms.update-drawing-status"
              with:
                drawing_number: "{{drawing_number}}"
                status: "in_review"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chat/messages"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: edms
      baseUri: "https://edms.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.edms_token"
      resources:
        - name: drawings
          path: "/drawings/{{drawing_number}}/status"
          inputParameters:
            - name: drawing_number
              in: path
          operations:
            - name: update-drawing-status
              method: PUT

Manages engineering recruitment by posting jobs on LinkedIn, creating tracking tasks in Jira, logging applicants in Google Sheets, and notifying hiring managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Engineering Recruitment Pipeline"
  description: "Manages engineering recruitment by posting jobs on LinkedIn, creating tracking tasks in Jira, logging applicants in Google Sheets, and notifying hiring managers via Microsoft Teams."
  tags:
    - construction
    - linkedin
    - jira
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: recruitment
      port: 8080
      tools:
        - name: post-engineering-role
          description: "Orchestrate engineering job posting and tracking."
          inputParameters:
            - name: role_title
              in: body
              type: string
              description: "Job title."
            - name: location
              in: body
              type: string
              description: "Work location."
            - name: hiring_manager
              in: body
              type: string
              description: "Hiring manager name."
          steps:
            - name: post-job
              type: call
              call: "linkedin.create-job-post"
              with:
                title: "{{role_title}}"
                location: "{{location}}"
            - name: create-tracking
              type: call
              call: "jira.create-issue"
              with:
                project: "HR"
                summary: "Recruitment: {{role_title}} - {{location}}"
                issue_type: "Task"
            - name: log-posting
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_recruitment"
                data: "{{role_title}},{{location}},{{post-job.post_id}},{{create-tracking.issue_key}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hiring"
                text: "Job posted: {{role_title}} in {{location}}. LinkedIn: {{post-job.post_id}}. Tracking: {{create-tracking.issue_key}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-posts
          path: "/simpleJobPostings"
          operations:
            - name: create-job-post
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls environmental monitoring data, generates a compliance report, uploads it to SharePoint, and emails the environmental officer.

naftiko: "0.5"
info:
  label: "Environmental Compliance Report Generator"
  description: "Pulls environmental monitoring data, generates a compliance report, uploads it to SharePoint, and emails the environmental officer."
  tags:
    - compliance
    - environmental
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: environmental-compliance
      port: 8080
      tools:
        - name: generate-env-report
          description: "Generate and distribute an environmental compliance report for a project."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: report_period
              in: body
              type: string
              description: "Reporting period."
            - name: officer_email
              in: body
              type: string
              description: "Environmental officer email."
          steps:
            - name: get-env-data
              type: call
              call: "env-monitoring.get-data"
              with:
                project_id: "{{project_id}}"
                period: "{{report_period}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "compliance_{{project_id}}"
                folder_path: "Environmental/{{report_period}}"
                file_name: "env_compliance_{{report_period}}.pdf"
            - name: email-officer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{officer_email}}"
                subject: "Environmental Compliance Report - Project {{project_id}} - {{report_period}}"
                body: "Report generated and uploaded. Air quality: {{get-env-data.air_quality_status}}. Water: {{get-env-data.water_status}}. Noise: {{get-env-data.noise_status}}."
  consumes:
    - type: http
      namespace: env-monitoring
      baseUri: "https://envmon.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.envmon_token"
      resources:
        - name: data
          path: "/projects/{{project_id}}/environmental"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Responds to an environmental spill by creating a ServiceNow incident, notifying the environmental team via Microsoft Teams, alerting regulatory contacts via Microsoft Outlook, and logging in Google Sheets.

naftiko: "0.5"
info:
  label: "Environmental Spill Response Pipeline"
  description: "Responds to an environmental spill by creating a ServiceNow incident, notifying the environmental team via Microsoft Teams, alerting regulatory contacts via Microsoft Outlook, and logging in Google Sheets."
  tags:
    - construction
    - servicenow
    - microsoft-teams
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: spill-response
      port: 8080
      tools:
        - name: report-spill
          description: "Orchestrate environmental spill response."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: substance
              in: body
              type: string
              description: "Spilled substance."
            - name: volume
              in: body
              type: string
              description: "Estimated volume."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Environmental spill: {{substance}} at {{site_code}}"
                description: "Spill of {{substance}}, estimated {{volume}}, at site {{site_code}}."
                urgency: "1"
            - name: notify-env-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "environmental"
                text: "SPILL ALERT: {{substance}} ({{volume}}) at site {{site_code}}. Incident: {{create-incident.incident_number}}."
            - name: alert-regulatory
              type: call
              call: "outlook.send-email"
              with:
                to: "environmental-compliance@bechtel.com"
                subject: "URGENT: Environmental spill at {{site_code}}"
                body: "Substance: {{substance}}. Volume: {{volume}}. Incident: {{create-incident.incident_number}}. Regulatory notification may be required."
            - name: log-spill
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_env_incidents"
                data: "{{site_code}},{{substance}},{{volume}},{{create-incident.incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

When equipment maintenance is due, creates a ServiceNow work order, notifies the maintenance crew via Microsoft Teams, and logs the schedule in the asset management system.

naftiko: "0.5"
info:
  label: "Equipment Maintenance Scheduler"
  description: "When equipment maintenance is due, creates a ServiceNow work order, notifies the maintenance crew via Microsoft Teams, and logs the schedule in the asset management system."
  tags:
    - construction
    - maintenance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: equipment-maintenance
      port: 8080
      tools:
        - name: schedule-maintenance
          description: "Create a maintenance work order and notify the crew."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "Equipment asset ID."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance such as preventive or corrective."
            - name: due_date
              in: body
              type: string
              description: "Due date."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: create-work-order
              type: call
              call: "servicenow.create-work-order"
              with:
                short_description: "{{maintenance_type}} maintenance: equipment {{equipment_id}}"
                category: "equipment_maintenance"
                due_date: "{{due_date}}"
                description: "{{maintenance_type}} maintenance for {{equipment_id}} on project {{project_id}}."
            - name: log-asset
              type: call
              call: "asset-mgmt.log-maintenance"
              with:
                equipment_id: "{{equipment_id}}"
                type: "{{maintenance_type}}"
                work_order: "{{create-work-order.number}}"
            - name: notify-crew
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "maintenance_{{project_id}}"
                text: "Maintenance scheduled for equipment {{equipment_id}}: {{maintenance_type}} due {{due_date}}. Work order: {{create-work-order.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: asset-mgmt
      baseUri: "https://assets.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_mgmt_token"
      resources:
        - name: maintenance-log
          path: "/equipment/{{equipment_id}}/maintenance"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: log-maintenance
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes equipment rental requests by creating a requisition in SAP Ariba, logging in Google Sheets, and notifying the equipment coordinator via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Equipment Rental Request Pipeline"
  description: "Processes equipment rental requests by creating a requisition in SAP Ariba, logging in Google Sheets, and notifying the equipment coordinator via Microsoft Teams."
  tags:
    - construction
    - sap-ariba
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: equip-rental
      port: 8080
      tools:
        - name: request-rental
          description: "Orchestrate equipment rental request processing."
          inputParameters:
            - name: equipment_type
              in: body
              type: string
              description: "Type of equipment."
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: duration_days
              in: body
              type: number
              description: "Rental duration in days."
          steps:
            - name: create-requisition
              type: call
              call: "ariba.create-requisition"
              with:
                item: "{{equipment_type}}"
                delivery_site: "{{site_code}}"
                duration: "{{duration_days}}"
            - name: log-request
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_rentals"
                data: "{{equipment_type}},{{site_code}},{{duration_days}},{{create-requisition.req_number}}"
            - name: notify-coordinator
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "equipment"
                text: "Rental request: {{equipment_type}} for {{duration_days}} days at {{site_code}}. Req: {{create-requisition.req_number}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes field nonconformance reports by creating a Jira NCR ticket, logging in Google Sheets, uploading evidence to SharePoint, and alerting the QA manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Field Nonconformance Report Pipeline"
  description: "Processes field nonconformance reports by creating a Jira NCR ticket, logging in Google Sheets, uploading evidence to SharePoint, and alerting the QA manager via Microsoft Teams."
  tags:
    - construction
    - jira
    - google-sheets
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ncr
      port: 8080
      tools:
        - name: submit-ncr
          description: "Orchestrate nonconformance report submission."
          inputParameters:
            - name: description
              in: body
              type: string
              description: "NCR description."
            - name: severity
              in: body
              type: string
              description: "Severity level."
            - name: site_code
              in: body
              type: string
              description: "Site code."
          steps:
            - name: create-ncr
              type: call
              call: "jira.create-issue"
              with:
                project: "QA"
                summary: "NCR: {{description}}"
                issue_type: "Bug"
                priority: "{{severity}}"
            - name: log-ncr
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_ncr_log"
                data: "{{create-ncr.issue_key}},{{site_code}},{{severity}},{{description}}"
            - name: alert-qa
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality_assurance"
                text: "NCR {{create-ncr.issue_key}} at {{site_code}}: {{description}}. Severity: {{severity}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the status of VPN connections on the Fortinet firewall for remote site connectivity.

naftiko: "0.5"
info:
  label: "Fortinet VPN Connection Status"
  description: "Checks the status of VPN connections on the Fortinet firewall for remote site connectivity."
  tags:
    - construction
    - fortinet
capability:
  exposes:
    - type: mcp
      namespace: fortinet
      port: 8080
      tools:
        - name: get-vpn-status
          description: "Check Fortinet VPN connection status."
          inputParameters:
            - name: tunnel_name
              in: body
              type: string
              description: "VPN tunnel name."
          call: "fortinet.get-vpn"
          with:
            tunnel_name: "{{tunnel_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.results[0].status"
            - name: incoming_bytes
              type: number
              mapping: "$.results[0].incoming_bytes"
  consumes:
    - type: http
      namespace: fortinet
      baseUri: "https://fortinet.bechtel.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.fortinet_token"
      resources:
        - name: vpn
          path: "/monitor/vpn/ipsec"
          operations:
            - name: get-vpn
              method: GET

Checks the status of Fortinet VPN connections for remote construction site offices.

naftiko: "0.5"
info:
  label: "Fortinet VPN Status Check"
  description: "Checks the status of Fortinet VPN connections for remote construction site offices."
  tags:
    - security
    - networking
    - fortinet
capability:
  exposes:
    - type: mcp
      namespace: vpn
      port: 8080
      tools:
        - name: get-vpn-status
          description: "Check the status of a Fortinet VPN tunnel."
          inputParameters:
            - name: tunnel_name
              in: body
              type: string
              description: "VPN tunnel name."
          call: "fortinet.get-vpn-tunnel"
          with:
            tunnel_name: "{{tunnel_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.results.status"
            - name: incoming_bytes
              type: number
              mapping: "$.results.incoming_bytes"
            - name: outgoing_bytes
              type: number
              mapping: "$.results.outgoing_bytes"
  consumes:
    - type: http
      namespace: fortinet
      baseUri: "https://fortigate.bechtel.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.fortinet_token"
      resources:
        - name: vpn
          path: "/monitor/vpn/ipsec?name={{tunnel_name}}"
          inputParameters:
            - name: tunnel_name
              in: path
          operations:
            - name: get-vpn-tunnel
              method: GET

Checks the status of a GitHub Actions workflow run for infrastructure-as-code repositories.

naftiko: "0.5"
info:
  label: "GitHub Actions Workflow Status"
  description: "Checks the status of a GitHub Actions workflow run for infrastructure-as-code repositories."
  tags:
    - construction
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: get-workflow-status
          description: "Check GitHub Actions workflow run status."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository name."
            - name: run_id
              in: body
              type: string
              description: "Workflow run ID."
          call: "github.get-run"
          with:
            repo: "{{repo}}"
            run_id: "{{run_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: conclusion
              type: string
              mapping: "$.conclusion"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/bechtel/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET

Geocodes a construction site address using Google Maps API, returning latitude and longitude.

naftiko: "0.5"
info:
  label: "Google Maps Site Geolocation"
  description: "Geocodes a construction site address using Google Maps API, returning latitude and longitude."
  tags:
    - construction
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: gmaps
      port: 8080
      tools:
        - name: geocode-site
          description: "Geocode a construction site address."
          inputParameters:
            - name: address
              in: body
              type: string
              description: "Site address."
          call: "gmaps.geocode"
          with:
            address: "{{address}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.results[0].geometry.location.lat"
            - name: longitude
              type: number
              mapping: "$.results[0].geometry.location.lng"
  consumes:
    - type: http
      namespace: gmaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        key: "$secrets.google_maps_key"
      resources:
        - name: geocode
          path: "/geocode/json"
          operations:
            - name: geocode
              method: GET

Appends a row to a Google Sheets spreadsheet.

naftiko: "0.5"
info:
  label: "Google Sheets Logger"
  description: "Appends a row to a Google Sheets spreadsheet."
  tags:
    - productivity
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: sheets-logger
      port: 8080
      tools:
        - name: append-row
          description: "Append a row to Google Sheets."
          inputParameters:
            - name: spreadsheet_id
              in: body
              type: string
              description: "Spreadsheet ID."
            - name: range
              in: body
              type: string
              description: "Range."
            - name: values
              in: body
              type: array
              description: "Values."
          call: "gsheets.append-row"
          with:
            spreadsheet_id: "{{spreadsheet_id}}"
            range: "{{range}}"
            values: "{{values}}"
  consumes:
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-row
              method: POST

Generates a direct link to a Grafana dashboard for project infrastructure monitoring.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Link Generator"
  description: "Generates a direct link to a Grafana dashboard for project infrastructure monitoring."
  tags:
    - monitoring
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: get-dashboard
          description: "Retrieve a Grafana dashboard by UID."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dashboard"
          with:
            uid: "{{dashboard_uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
            - name: url
              type: string
              mapping: "$.meta.url"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.bechtel.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dashboard
              method: GET

Tracks hazardous materials on site by logging inventory in SAP, storing SDS documents in SharePoint, creating compliance tasks in Jira, and alerting the safety team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Hazardous Materials Tracking Pipeline"
  description: "Tracks hazardous materials on site by logging inventory in SAP, storing SDS documents in SharePoint, creating compliance tasks in Jira, and alerting the safety team via Microsoft Teams."
  tags:
    - construction
    - sap
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hazmat
      port: 8080
      tools:
        - name: track-hazmat
          description: "Orchestrate hazardous materials tracking and compliance."
          inputParameters:
            - name: material_name
              in: body
              type: string
              description: "Hazardous material name."
            - name: quantity
              in: body
              type: string
              description: "Quantity on site."
            - name: site_code
              in: body
              type: string
              description: "Site code."
          steps:
            - name: log-inventory
              type: call
              call: "sap.update-hazmat-inventory"
              with:
                material_name: "{{material_name}}"
                quantity: "{{quantity}}"
                site: "{{site_code}}"
            - name: create-compliance-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Hazmat compliance check: {{material_name}} at {{site_code}}"
                issue_type: "Task"
            - name: alert-safety
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety"
                text: "Hazmat update: {{material_name}} ({{quantity}}) at {{site_code}}. Compliance task: {{create-compliance-task.issue_key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: hazmat
          path: "/API_MATERIAL_SRV/Material"
          operations:
            - name: update-hazmat-inventory
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When heavy equipment fails on site, logs the incident in ServiceNow, creates a maintenance work order in SAP, notifies the site supervisor via Microsoft Teams, and updates the equipment tracker in Google Sheets.

naftiko: "0.5"
info:
  label: "Heavy Equipment Failure Response Pipeline"
  description: "When heavy equipment fails on site, logs the incident in ServiceNow, creates a maintenance work order in SAP, notifies the site supervisor via Microsoft Teams, and updates the equipment tracker in Google Sheets."
  tags:
    - construction
    - servicenow
    - sap
    - microsoft-teams
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: equip-failure
      port: 8080
      tools:
        - name: handle-equipment-failure
          description: "Orchestrate equipment failure response across systems."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "Equipment asset ID."
            - name: site_code
              in: body
              type: string
              description: "Construction site code."
            - name: failure_description
              in: body
              type: string
              description: "Description of failure."
          steps:
            - name: log-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Equipment failure: {{equipment_id}} at site {{site_code}}"
                description: "{{failure_description}}"
                urgency: "1"
            - name: create-work-order
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment_id: "{{equipment_id}}"
                description: "{{failure_description}}"
                priority: "high"
            - name: notify-supervisor
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{site_code}}"
                text: "Equipment {{equipment_id}} failure reported. SNOW: {{log-incident.incident_number}}. SAP WO: {{create-work-order.order_number}}."
            - name: update-tracker
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_equip_tracker"
                data: "{{equipment_id}},{{site_code}},down,{{log-incident.incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: maintenance-orders
          path: "/API_MAINTORDER_SRV/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Processes hot work permit requests by creating the permit in Jira, verifying fire watch requirements in the safety system, logging in Google Sheets, and notifying the area supervisor via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Hot Work Permit Pipeline"
  description: "Processes hot work permit requests by creating the permit in Jira, verifying fire watch requirements in the safety system, logging in Google Sheets, and notifying the area supervisor via Microsoft Teams."
  tags:
    - construction
    - jira
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hot-work
      port: 8080
      tools:
        - name: request-hot-work-permit
          description: "Orchestrate hot work permit request and approval."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Work location."
            - name: work_type
              in: body
              type: string
              description: "Type of hot work."
            - name: site_code
              in: body
              type: string
              description: "Site code."
          steps:
            - name: create-permit
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Hot work permit: {{work_type}} at {{location}}"
                issue_type: "Approval"
            - name: log-permit
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_permits"
                data: "{{site_code}},{{location}},{{work_type}},{{create-permit.issue_key}},pending"
            - name: notify-supervisor
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{site_code}}"
                text: "Hot work permit requested: {{work_type}} at {{location}}. Permit: {{create-permit.issue_key}}. Fire watch required."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates a Jira issue. Reusable building block for task creation.

naftiko: "0.5"
info:
  label: "Jira Issue Creator"
  description: "Creates a Jira issue. Reusable building block for task creation."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: task-mgmt
      port: 8080
      tools:
        - name: create-jira-issue
          description: "Create a new Jira issue."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project key."
            - name: issue_type
              in: body
              type: string
              description: "Issue type."
            - name: summary
              in: body
              type: string
              description: "Summary."
          call: "jira.create-issue"
          with:
            project: "{{project}}"
            issue_type: "{{issue_type}}"
            summary: "{{summary}}"
          outputParameters:
            - name: issue_key
              type: string
              mapping: "$.key"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves the status, assignee, and due date of a Jira issue.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves the status, assignee, and due date of a Jira issue."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: due_date
              type: string
              mapping: "$.fields.duedate"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Reconciles labor timesheets by pulling data from Workday, comparing against SAP project charges, flagging discrepancies in Google Sheets, and notifying project controls via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Labor Timesheet Reconciliation Pipeline"
  description: "Reconciles labor timesheets by pulling data from Workday, comparing against SAP project charges, flagging discrepancies in Google Sheets, and notifying project controls via Microsoft Teams."
  tags:
    - construction
    - workday
    - sap
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: timesheet-recon
      port: 8080
      tools:
        - name: reconcile-timesheets
          description: "Orchestrate labor timesheet reconciliation."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: period
              in: body
              type: string
              description: "Pay period."
          steps:
            - name: get-workday-hours
              type: call
              call: "workday.get-time-entries"
              with:
                project_id: "{{project_id}}"
                period: "{{period}}"
            - name: get-sap-charges
              type: call
              call: "sap.get-labor-charges"
              with:
                project_id: "{{project_id}}"
                period: "{{period}}"
            - name: log-discrepancies
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_timesheet_recon"
                data: "{{project_id}},{{period}},{{get-workday-hours.total}},{{get-sap-charges.total}}"
            - name: notify-controls
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_controls"
                text: "Timesheet reconciliation for {{project_id}} period {{period}}: Workday={{get-workday-hours.total}} hrs, SAP={{get-sap-charges.total}} hrs."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bechtel"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-entries
          path: "/workers/timeEntries"
          operations:
            - name: get-time-entries
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: labor
          path: "/API_PROJECT_LABOR_SRV/LaborCharges"
          operations:
            - name: get-labor-charges
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Posts an engineering job opening to LinkedIn and logs it in Google Sheets.

naftiko: "0.5"
info:
  label: "LinkedIn Engineering Job Publisher"
  description: "Posts an engineering job opening to LinkedIn and logs it in Google Sheets."
  tags:
    - hr
    - recruiting
    - linkedin
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: post-engineering-job
          description: "Publish an engineering job on LinkedIn and track it."
          inputParameters:
            - name: title
              in: body
              type: string
              description: "Job title."
            - name: description
              in: body
              type: string
              description: "Job description."
            - name: location
              in: body
              type: string
              description: "Location."
          steps:
            - name: create-posting
              type: call
              call: "linkedin.create-job"
              with:
                title: "{{title}}"
                description: "{{description}}"
                location: "{{location}}"
                company_id: "bechtel"
            - name: log-posting
              type: call
              call: "gsheets.append-row"
              with:
                spreadsheet_id: "bechtel_recruiting"
                range: "Jobs!A:D"
                values:
                  - "{{title}}"
                  - "{{location}}"
                  - "{{create-posting.id}}"
                  - "active"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: jobs
          path: "/simpleJobPostings"
          operations:
            - name: create-job
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: append-row
              method: POST

Procures construction materials by creating a purchase requisition in SAP Ariba, checking lead times with the supplier, logging in Google Sheets, and notifying procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Material Procurement Pipeline"
  description: "Procures construction materials by creating a purchase requisition in SAP Ariba, checking lead times with the supplier, logging in Google Sheets, and notifying procurement via Microsoft Teams."
  tags:
    - construction
    - sap-ariba
    - google-sheets
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: material-procurement
      port: 8080
      tools:
        - name: procure-materials
          description: "Orchestrate material procurement workflow."
          inputParameters:
            - name: material_id
              in: body
              type: string
              description: "Material ID."
            - name: quantity
              in: body
              type: number
              description: "Required quantity."
            - name: site_code
              in: body
              type: string
              description: "Delivery site code."
          steps:
            - name: create-requisition
              type: call
              call: "ariba.create-requisition"
              with:
                material_id: "{{material_id}}"
                quantity: "{{quantity}}"
                delivery_site: "{{site_code}}"
            - name: log-procurement
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_procurement_log"
                data: "{{material_id}},{{quantity}},{{site_code}},{{create-requisition.req_number}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement"
                text: "Material requisition {{create-requisition.req_number}} created: {{quantity}} units of {{material_id}} for site {{site_code}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a MATLAB simulation on Bechtel engineering compute infrastructure and retrieves the results.

naftiko: "0.5"
info:
  label: "MATLAB Engineering Simulation Runner"
  description: "Triggers a MATLAB simulation on Bechtel engineering compute infrastructure and retrieves the results."
  tags:
    - engineering
    - simulation
    - matlab
capability:
  exposes:
    - type: mcp
      namespace: engineering-compute
      port: 8080
      tools:
        - name: run-simulation
          description: "Execute a MATLAB engineering simulation and return results."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "MATLAB model name."
            - name: parameters
              in: body
              type: object
              description: "Simulation input parameters."
          steps:
            - name: submit-job
              type: call
              call: "matlab.submit-job"
              with:
                model: "{{model_name}}"
                inputs: "{{parameters}}"
            - name: get-results
              type: call
              call: "matlab.get-job-results"
              with:
                job_id: "{{submit-job.job_id}}"
  consumes:
    - type: http
      namespace: matlab
      baseUri: "https://matlab-compute.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.matlab_token"
      resources:
        - name: jobs
          path: "/jobs"
          operations:
            - name: submit-job
              method: POST
        - name: results
          path: "/jobs/{{job_id}}/results"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: get-job-results
              method: GET

Retrieves calendar events for a given date range from Microsoft Outlook for project meeting coordination.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Calendar Lookup"
  description: "Retrieves calendar events for a given date range from Microsoft Outlook for project meeting coordination."
  tags:
    - construction
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: outlook
      port: 8080
      tools:
        - name: get-calendar-events
          description: "Retrieve Outlook calendar events for a date range."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          call: "outlook.list-events"
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: events
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: calendar
          path: "/me/calendarView"
          operations:
            - name: list-events
              method: GET

Sends an email via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Email Sender"
  description: "Sends an email via Microsoft Outlook."
  tags:
    - collaboration
    - microsoft-outlook
    - email
capability:
  exposes:
    - type: mcp
      namespace: email
      port: 8080
      tools:
        - name: send-email
          description: "Send an email via Outlook."
          inputParameters:
            - name: to
              in: body
              type: string
              description: "Recipient."
            - name: subject
              in: body
              type: string
              description: "Subject."
            - name: body
              in: body
              type: string
              description: "Body."
          call: "outlook.send-email"
          with:
            to: "{{to}}"
            subject: "{{subject}}"
            body: "{{body}}"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Triggers a Power Automate flow for business process automation.

naftiko: "0.5"
info:
  label: "Microsoft Power Automate Flow Trigger"
  description: "Triggers a Power Automate flow for business process automation."
  tags:
    - automation
    - microsoft-power-automate
capability:
  exposes:
    - type: mcp
      namespace: workflow-automation
      port: 8080
      tools:
        - name: trigger-flow
          description: "Trigger a Power Automate flow."
          inputParameters:
            - name: flow_id
              in: body
              type: string
              description: "Flow ID."
            - name: payload
              in: body
              type: object
              description: "Input payload."
          call: "power-automate.trigger-flow"
          with:
            flow_id: "{{flow_id}}"
            body: "{{payload}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: power-automate
      baseUri: "https://api.flow.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/flows/{{flow_id}}/triggers/manual/run"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST

Sends a message to a Microsoft Teams channel. Reusable notification building block.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notifier"
  description: "Sends a message to a Microsoft Teams channel. Reusable notification building block."
  tags:
    - collaboration
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: teams-messaging
      port: 8080
      tools:
        - name: send-channel-message
          description: "Post a message to a Teams channel."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
            - name: text
              in: body
              type: string
              description: "Message."
          call: "msteams.send-message"
          with:
            channel_id: "{{channel_id}}"
            text: "{{text}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates monthly cost forecasts by pulling actuals from SAP, running forecast models in Snowflake, refreshing the Power BI dashboard, and distributing the report via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Monthly Cost Forecast Pipeline"
  description: "Generates monthly cost forecasts by pulling actuals from SAP, running forecast models in Snowflake, refreshing the Power BI dashboard, and distributing the report via Microsoft Outlook."
  tags:
    - construction
    - sap
    - snowflake
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: cost-forecast
      port: 8080
      tools:
        - name: generate-forecast
          description: "Orchestrate monthly cost forecast generation."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: month
              in: body
              type: string
              description: "Forecast month."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-project-costs"
              with:
                project_id: "{{project_id}}"
                period: "{{month}}"
            - name: run-forecast
              type: call
              call: "snowflake.run-forecast-model"
              with:
                project_id: "{{project_id}}"
                actuals: "{{get-actuals.cost_data}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "bechtel_forecast_{{project_id}}"
            - name: distribute-report
              type: call
              call: "outlook.send-email"
              with:
                to: "project-{{project_id}}-stakeholders@bechtel.com"
                subject: "Monthly Cost Forecast - {{project_id}} - {{month}}"
                body: "Actual cost: ${{get-actuals.total}}. Forecast at completion: ${{run-forecast.eac}}. Variance: ${{run-forecast.variance}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: costs
          path: "/API_PROJECT_COST_SRV/ProjectCost"
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bechtel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-forecast-model
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Kicks off a new project by creating the project structure in SAP, setting up the Primavera schedule, provisioning a SharePoint site, and scheduling a kickoff meeting via Zoom.

naftiko: "0.5"
info:
  label: "New Project Kickoff Orchestrator"
  description: "Kicks off a new project by creating the project structure in SAP, setting up the Primavera schedule, provisioning a SharePoint site, and scheduling a kickoff meeting via Zoom."
  tags:
    - construction
    - sap
    - sharepoint
    - zoom
capability:
  exposes:
    - type: mcp
      namespace: project-kickoff
      port: 8080
      tools:
        - name: kickoff-project
          description: "Orchestrate new project kickoff across systems."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "Project name."
            - name: project_code
              in: body
              type: string
              description: "Project code."
            - name: pm_email
              in: body
              type: string
              description: "Project manager email."
          steps:
            - name: create-sap-project
              type: call
              call: "sap.create-project"
              with:
                project_code: "{{project_code}}"
                project_name: "{{project_name}}"
            - name: create-schedule
              type: call
              call: "primavera.create-project"
              with:
                project_code: "{{project_code}}"
                project_name: "{{project_name}}"
            - name: provision-site
              type: call
              call: "sharepoint.create-site"
              with:
                name: "Project-{{project_code}}"
                template: "project_site"
            - name: schedule-kickoff
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "Project Kickoff: {{project_name}}"
                duration: 60
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: projects
          path: "/API_PROJECT_SRV/Project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: primavera
      baseUri: "https://primavera.bechtel.com/api/restapi"
      authentication:
        type: bearer
        token: "$secrets.primavera_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sites
          path: "/sites"
          operations:
            - name: create-site
              method: POST
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST

When New Relic fires a performance alert, creates a ServiceNow incident and notifies the SRE team.

naftiko: "0.5"
info:
  label: "New Relic Alert Handler"
  description: "When New Relic fires a performance alert, creates a ServiceNow incident and notifies the SRE team."
  tags:
    - monitoring
    - new-relic
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: perf-alerting
      port: 8080
      tools:
        - name: handle-alert
          description: "Process a New Relic alert through incident management."
          inputParameters:
            - name: condition_name
              in: body
              type: string
              description: "Alert condition."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Alert: {{condition_name}}"
                urgency: "{{severity}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sre_alerts"
                text: "Alert: {{condition_name}} ({{severity}}). Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves monthly cloud infrastructure costs from Oracle Cloud for Bechtel project environments.

naftiko: "0.5"
info:
  label: "Oracle Cloud Cost Report"
  description: "Retrieves monthly cloud infrastructure costs from Oracle Cloud for Bechtel project environments."
  tags:
    - finance
    - cloud
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: cloud-costs
      port: 8080
      tools:
        - name: get-cloud-costs
          description: "Retrieve Oracle Cloud monthly cost report for a project compartment."
          inputParameters:
            - name: compartment_id
              in: body
              type: string
              description: "Oracle Cloud compartment ID."
            - name: month
              in: body
              type: string
              description: "Month in YYYY-MM format."
          call: "oci.get-cost-report"
          with:
            compartment_id: "{{compartment_id}}"
            time_period: "{{month}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.data.total_cost"
            - name: service_breakdown
              type: array
              mapping: "$.data.services"
  consumes:
    - type: http
      namespace: oci
      baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
      authentication:
        type: bearer
        token: "$secrets.oci_token"
      resources:
        - name: usage
          path: "/usage"
          operations:
            - name: get-cost-report
              method: POST

Processes an OSHA recordable incident by creating a ServiceNow incident, alerting the safety director via Microsoft Teams, sending a regulatory report via Microsoft Outlook, and logging in Google Sheets.

naftiko: "0.5"
info:
  label: "OSHA Recordable Incident Pipeline"
  description: "Processes an OSHA recordable incident by creating a ServiceNow incident, alerting the safety director via Microsoft Teams, sending a regulatory report via Microsoft Outlook, and logging in Google Sheets."
  tags:
    - construction
    - servicenow
    - microsoft-teams
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: osha-incident
      port: 8080
      tools:
        - name: report-osha-incident
          description: "Orchestrate OSHA recordable incident reporting."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: description
              in: body
              type: string
              description: "Incident description."
            - name: severity
              in: body
              type: string
              description: "Incident severity."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "OSHA recordable: {{site_code}}"
                description: "{{description}}"
                urgency: "1"
            - name: alert-director
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety_leadership"
                text: "OSHA RECORDABLE at {{site_code}}: {{description}}. Severity: {{severity}}. Incident: {{create-incident.incident_number}}."
            - name: regulatory-report
              type: call
              call: "outlook.send-email"
              with:
                to: "safety-compliance@bechtel.com"
                subject: "OSHA Recordable Incident - {{site_code}}"
                body: "Incident: {{create-incident.incident_number}}. {{description}}. Immediate regulatory review required."
            - name: log-incident
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_osha_log"
                data: "{{site_code}},{{severity}},{{create-incident.incident_number}},{{description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Retrieves the details and hit count of a firewall rule from Palo Alto Networks.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Rule Lookup"
  description: "Retrieves the details and hit count of a firewall rule from Palo Alto Networks."
  tags:
    - security
    - networking
    - palo-alto-networks
capability:
  exposes:
    - type: mcp
      namespace: firewall
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto firewall rule by name."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "Firewall rule name."
          call: "paloalto.get-rule"
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: action
              type: string
              mapping: "$.result.entry.action"
            - name: source_zone
              type: string
              mapping: "$.result.entry.from.member"
            - name: destination_zone
              type: string
              mapping: "$.result.entry.to.member"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.bechtel.com/restapi/v10.2"
      authentication:
        type: apikey
        key: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: path
          operations:
            - name: get-rule
              method: GET

When a construction permit is needed, gathers project details from Oracle Primavera, prepares the application documents, uploads to SharePoint, and creates a Jira task to track the permit application.

naftiko: "0.5"
info:
  label: "Permit Application Pipeline"
  description: "When a construction permit is needed, gathers project details from Oracle Primavera, prepares the application documents, uploads to SharePoint, and creates a Jira task to track the permit application."
  tags:
    - construction
    - compliance
    - permits
    - oracle
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: permits
      port: 8080
      tools:
        - name: initiate-permit-application
          description: "Prepare and track a construction permit application."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: permit_type
              in: body
              type: string
              description: "Type of permit."
            - name: jurisdiction
              in: body
              type: string
              description: "Regulatory jurisdiction."
          steps:
            - name: get-project-details
              type: call
              call: "oracle-primavera.get-project"
              with:
                project_id: "{{project_id}}"
            - name: upload-application
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "project_{{project_id}}"
                folder_path: "Permits/{{permit_type}}"
                file_name: "permit_application_{{permit_type}}.pdf"
            - name: create-tracker
              type: call
              call: "jira.create-issue"
              with:
                project: "PERMITS"
                issue_type: "Task"
                summary: "{{permit_type}} permit for project {{project_id}} - {{jurisdiction}}"
                description: "Application uploaded: {{upload-application.url}}. Project: {{get-project-details.name}}."
  consumes:
    - type: http
      namespace: oracle-primavera
      baseUri: "https://primavera.bechtel.com/p6ws/restapi"
      authentication:
        type: basic
        username: "$secrets.primavera_user"
        password: "$secrets.primavera_password"
      resources:
        - name: projects
          path: "/project?Filter=ObjectId={{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Manages piping isometric drawing reviews by retrieving drawings from AutoCAD via SharePoint, creating review tasks in Jira, and notifying the piping lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Piping Isometric Review Pipeline"
  description: "Manages piping isometric drawing reviews by retrieving drawings from AutoCAD via SharePoint, creating review tasks in Jira, and notifying the piping lead via Microsoft Teams."
  tags:
    - construction
    - autocad
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: iso-review
      port: 8080
      tools:
        - name: submit-iso-for-review
          description: "Orchestrate piping isometric drawing review."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "Isometric drawing number."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: get-drawing
              type: call
              call: "sharepoint.get-file"
              with:
                site: "bechtel-piping"
                path: "/isometrics/{{drawing_number}}.dwg"
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "PIPE"
                summary: "ISO review: {{drawing_number}}"
                issue_type: "Task"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "piping_engineering"
                text: "Piping ISO {{drawing_number}} submitted for review. Task: {{create-review.issue_key}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site}}/drive/root:/{{path}}:/content"
          inputParameters:
            - name: site
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Power BI dataset refresh for a project dashboard and notifies the project controls team.

naftiko: "0.5"
info:
  label: "Power BI Project Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for a project dashboard and notifies the project controls team."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: refresh-project-dashboard
          description: "Trigger a Power BI refresh for a project dashboard and notify the team."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_controls_{{project_id}}"
                text: "Power BI dashboard refreshed for project {{project_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls schedule variance data from Oracle Primavera and emails a summary to the project director.

naftiko: "0.5"
info:
  label: "Primavera Schedule Variance Report"
  description: "Pulls schedule variance data from Oracle Primavera and emails a summary to the project director."
  tags:
    - project-management
    - oracle
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: schedule-analytics
      port: 8080
      tools:
        - name: get-schedule-variance
          description: "Retrieve schedule variance and email the director."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: director_email
              in: body
              type: string
              description: "Director email."
          steps:
            - name: get-variance
              type: call
              call: "oracle-primavera.get-variance"
              with:
                project_id: "{{project_id}}"
            - name: email-report
              type: call
              call: "outlook.send-email"
              with:
                to: "{{director_email}}"
                subject: "Schedule Variance - Project {{project_id}}"
                body: "SPI: {{get-variance.spi}}. Critical path delay: {{get-variance.delay_days}} days."
  consumes:
    - type: http
      namespace: oracle-primavera
      baseUri: "https://primavera.bechtel.com/p6ws/restapi"
      authentication:
        type: basic
        username: "$secrets.primavera_user"
        password: "$secrets.primavera_password"
      resources:
        - name: variance
          path: "/project/{{project_id}}/scheduleVariance"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-variance
              method: GET
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Orchestrates project closeout by closing the SAP project, archiving documents in SharePoint, generating the final cost report in Power BI, and notifying stakeholders via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Project Closeout Orchestrator"
  description: "Orchestrates project closeout by closing the SAP project, archiving documents in SharePoint, generating the final cost report in Power BI, and notifying stakeholders via Microsoft Outlook."
  tags:
    - construction
    - sap
    - sharepoint
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: closeout
      port: 8080
      tools:
        - name: close-project
          description: "Orchestrate project closeout workflow."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: close-sap
              type: call
              call: "sap.close-project"
              with:
                project_id: "{{project_id}}"
            - name: archive-docs
              type: call
              call: "sharepoint.archive-site"
              with:
                site: "Project-{{project_id}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "bechtel_closeout_{{project_id}}"
            - name: notify-stakeholders
              type: call
              call: "outlook.send-email"
              with:
                to: "project-{{project_id}}-stakeholders@bechtel.com"
                subject: "Project {{project_id}} - Closeout Complete"
                body: "Project {{project_id}} has been officially closed. SAP closed, documents archived, final report available in Power BI."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: projects
          path: "/API_PROJECT_SRV/Project('{{project_id}}')"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: close-project
              method: PATCH
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sites
          path: "/sites/{{site}}"
          inputParameters:
            - name: site
              in: path
          operations:
            - name: archive-site
              method: PATCH
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

When a construction milestone is completed in Oracle Primavera, updates the project schedule in Microsoft Project, creates a compliance inspection task in ServiceNow, uploads progress photos to SharePoint, and notifies the project team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Project Construction Milestone Orchestrator"
  description: "When a construction milestone is completed in Oracle Primavera, updates the project schedule in Microsoft Project, creates a compliance inspection task in ServiceNow, uploads progress photos to SharePoint, and notifies the project team in Microsoft Teams."
  tags:
    - construction
    - project-management
    - oracle
    - microsoft-project
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: project-milestones
      port: 8080
      tools:
        - name: complete-milestone
          description: "Process a construction milestone completion across project management, compliance, and documentation systems."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Bechtel project identifier."
            - name: milestone_id
              in: body
              type: string
              description: "Milestone identifier."
            - name: completion_date
              in: body
              type: string
              description: "Completion date in YYYY-MM-DD format."
            - name: inspector_email
              in: body
              type: string
              description: "Assigned inspector email."
          steps:
            - name: get-milestone
              type: call
              call: "oracle-primavera.get-activity"
              with:
                project_id: "{{project_id}}"
                activity_id: "{{milestone_id}}"
            - name: update-schedule
              type: call
              call: "ms-project.update-task"
              with:
                project_id: "{{project_id}}"
                task_id: "{{milestone_id}}"
                actual_finish: "{{completion_date}}"
                percent_complete: 100
            - name: create-inspection
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Inspection required: milestone {{get-milestone.name}} on project {{project_id}}"
                category: "construction_inspection"
                assigned_to: "{{inspector_email}}"
                description: "Milestone {{get-milestone.name}} completed {{completion_date}}. Inspection required before proceeding."
            - name: upload-photos
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "project_{{project_id}}"
                folder_path: "Milestones/{{milestone_id}}/Photos"
                file_name: "completion_{{completion_date}}.zip"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_{{project_id}}"
                text: "Milestone '{{get-milestone.name}}' completed on {{completion_date}}. Inspection ticket: {{create-inspection.number}}. Photos uploaded to SharePoint."
  consumes:
    - type: http
      namespace: oracle-primavera
      baseUri: "https://primavera.bechtel.com/p6ws/restapi"
      authentication:
        type: basic
        username: "$secrets.primavera_user"
        password: "$secrets.primavera_password"
      resources:
        - name: activities
          path: "/activity?Fields=Name,Status,PlannedFinish&Filter=ObjectId={{activity_id}}"
          inputParameters:
            - name: activity_id
              in: path
          operations:
            - name: get-activity
              method: GET
    - type: http
      namespace: ms-project
      baseUri: "https://project.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.msproject_token"
      resources:
        - name: tasks
          path: "/projects/{{project_id}}/tasks/{{task_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: task_id
              in: path
          operations:
            - name: update-task
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compares actual project costs in SAP against the budgeted amounts and sends a variance alert to the project controller if thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Project Cost Variance Alerter"
  description: "Compares actual project costs in SAP against the budgeted amounts and sends a variance alert to the project controller if thresholds are exceeded."
  tags:
    - finance
    - project-management
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cost-control
      port: 8080
      tools:
        - name: check-cost-variance
          description: "Compare actual vs budgeted project costs and alert on variances."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "SAP project ID."
            - name: variance_threshold_pct
              in: body
              type: number
              description: "Threshold percentage for alerting."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-project-costs"
              with:
                project_id: "{{project_id}}"
            - name: alert-controller
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_controls_{{project_id}}"
                text: "Cost variance alert for project {{project_id}}: Budget ${{get-actuals.budget}}, Actual ${{get-actuals.actual}}, Variance {{get-actuals.variance_pct}}%."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bechtel-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: project-costs
          path: "/A_Project('{{project_id}}')/CostSummary"
          inputParameters:
            - name: project_id
              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.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages construction punch list items by creating tasks in Jira, tracking completion in Google Sheets, notifying the superintendent via Microsoft Teams, and emailing the client upon closure via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Punch List Closeout Pipeline"
  description: "Manages construction punch list items by creating tasks in Jira, tracking completion in Google Sheets, notifying the superintendent via Microsoft Teams, and emailing the client upon closure via Microsoft Outlook."
  tags:
    - construction
    - jira
    - google-sheets
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: punch-list
      port: 8080
      tools:
        - name: process-punch-item
          description: "Orchestrate punch list item tracking and closeout."
          inputParameters:
            - name: item_description
              in: body
              type: string
              description: "Punch list item description."
            - name: area
              in: body
              type: string
              description: "Area or zone."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PUNCH"
                summary: "{{item_description}} - {{area}}"
                issue_type: "Task"
            - name: log-item
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_punch_list"
                data: "{{project_id}},{{area}},{{item_description}},open,{{create-task.issue_key}}"
            - name: notify-super
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "construction"
                text: "Punch list item added: {{item_description}} in {{area}}. Task: {{create-task.issue_key}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a reload of a Qlik Sense app to refresh project analytics dashboards with latest data.

naftiko: "0.5"
info:
  label: "Qlik Sense Dashboard Reload"
  description: "Triggers a reload of a Qlik Sense app to refresh project analytics dashboards with latest data."
  tags:
    - construction
    - qlik-sense
capability:
  exposes:
    - type: mcp
      namespace: qlik
      port: 8080
      tools:
        - name: reload-app
          description: "Trigger a Qlik Sense app reload."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Qlik Sense app ID."
          call: "qlik.reload-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: reload_id
              type: string
              mapping: "$.id"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: qlik
      baseUri: "https://qlik.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: reloads
          path: "/reloads"
          operations:
            - name: reload-app
              method: POST

When a quality inspection is completed, updates the inspection record in ServiceNow, uploads the inspection report to SharePoint, and notifies the project quality manager.

naftiko: "0.5"
info:
  label: "Quality Inspection Closure Pipeline"
  description: "When a quality inspection is completed, updates the inspection record in ServiceNow, uploads the inspection report to SharePoint, and notifies the project quality manager."
  tags:
    - quality
    - construction
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: close-inspection
          description: "Close a quality inspection and distribute the report."
          inputParameters:
            - name: inspection_id
              in: body
              type: string
              description: "ServiceNow inspection record ID."
            - name: result
              in: body
              type: string
              description: "Inspection result such as pass or fail."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: update-record
              type: call
              call: "servicenow.update-incident"
              with:
                sys_id: "{{inspection_id}}"
                state: "closed"
                close_notes: "Inspection result: {{result}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "project_{{project_id}}"
                folder_path: "QualityInspections"
                file_name: "inspection_{{inspection_id}}_{{result}}.pdf"
            - name: notify-qm
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality_{{project_id}}"
                text: "Inspection {{inspection_id}} closed with result: {{result}}. Report uploaded to SharePoint."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-incident
              method: PUT
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks Request for Information responses by creating the RFI in Jira, notifying the design team via Microsoft Teams, storing documents in SharePoint, and logging status in Google Sheets.

naftiko: "0.5"
info:
  label: "RFI Response Tracking Pipeline"
  description: "Tracks Request for Information responses by creating the RFI in Jira, notifying the design team via Microsoft Teams, storing documents in SharePoint, and logging status in Google Sheets."
  tags:
    - construction
    - jira
    - microsoft-teams
    - sharepoint
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: rfi-track
      port: 8080
      tools:
        - name: track-rfi
          description: "Orchestrate RFI creation and tracking."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: question
              in: body
              type: string
              description: "RFI question."
            - name: discipline
              in: body
              type: string
              description: "Engineering discipline."
          steps:
            - name: create-rfi
              type: call
              call: "jira.create-issue"
              with:
                project: "RFI"
                summary: "RFI: {{discipline}} - Project {{project_id}}"
                description: "{{question}}"
                issue_type: "Task"
            - name: notify-design
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "design_{{discipline}}"
                text: "New RFI {{create-rfi.issue_key}} for project {{project_id}}: {{question}}"
            - name: log-rfi
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_rfi_log"
                data: "{{create-rfi.issue_key}},{{project_id}},{{discipline}},open"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Creates a new risk entry in the project risk register on SharePoint and notifies the risk manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Risk Register Entry Creator"
  description: "Creates a new risk entry in the project risk register on SharePoint and notifies the risk manager via Microsoft Teams."
  tags:
    - project-management
    - risk-management
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-management
      port: 8080
      tools:
        - name: create-risk-entry
          description: "Add a risk to the project risk register and notify the risk manager."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: risk_description
              in: body
              type: string
              description: "Risk description."
            - name: likelihood
              in: body
              type: string
              description: "Likelihood rating."
            - name: impact
              in: body
              type: string
              description: "Impact rating."
          steps:
            - name: add-to-register
              type: call
              call: "sharepoint.add-list-item"
              with:
                site_id: "project_{{project_id}}"
                list_name: "RiskRegister"
                fields:
                  Description: "{{risk_description}}"
                  Likelihood: "{{likelihood}}"
                  Impact: "{{impact}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "risk_{{project_id}}"
                text: "New risk logged on project {{project_id}}: {{risk_description}} ({{likelihood}}/{{impact}}). ID: {{add-to-register.id}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: add-list-item
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a safety incident occurs on a construction site, creates a ServiceNow incident, logs the event in the safety management system, notifies the safety officer via Microsoft Teams, and uploads incident photos to SharePoint.

naftiko: "0.5"
info:
  label: "Safety Incident Reporting Pipeline"
  description: "When a safety incident occurs on a construction site, creates a ServiceNow incident, logs the event in the safety management system, notifies the safety officer via Microsoft Teams, and uploads incident photos to SharePoint."
  tags:
    - safety
    - construction
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety-reporting
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Report a safety incident and propagate across compliance and notification systems."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project identifier."
            - name: incident_type
              in: body
              type: string
              description: "Type such as near_miss, injury, or environmental."
            - name: description
              in: body
              type: string
              description: "Incident description."
            - name: location
              in: body
              type: string
              description: "Site location where incident occurred."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety incident: {{incident_type}} at {{location}}"
                category: "safety"
                urgency: "1"
                description: "{{description}} | Project: {{project_id}} | Location: {{location}}"
            - name: log-safety-event
              type: call
              call: "safety-mgmt.create-event"
              with:
                project_id: "{{project_id}}"
                type: "{{incident_type}}"
                description: "{{description}}"
                location: "{{location}}"
            - name: upload-photos
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "safety_{{project_id}}"
                folder_path: "Incidents/{{create-ticket.number}}"
                file_name: "incident_report.pdf"
            - name: alert-safety-officer
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety_{{project_id}}"
                text: "SAFETY ALERT: {{incident_type}} at {{location}} on project {{project_id}}. Ticket: {{create-ticket.number}}. {{description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: safety-mgmt
      baseUri: "https://safety.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.safety_token"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a project opportunity in Salesforce by opportunity ID, returning deal stage and value.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Looks up a project opportunity in Salesforce by opportunity ID, returning deal stage and value."
  tags:
    - construction
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Opportunity ID."
          call: "salesforce.get-opp"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: number
              mapping: "$.Amount"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bechtel.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opp
              method: GET

Creates a procurement requisition in SAP Ariba for construction materials and routes for approval.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Requisition"
  description: "Creates a procurement requisition in SAP Ariba for construction materials and routes for approval."
  tags:
    - procurement
    - sap-ariba
    - construction
capability:
  exposes:
    - type: mcp
      namespace: procurement-ariba
      port: 8080
      tools:
        - name: create-requisition
          description: "Create a procurement requisition in SAP Ariba for construction materials."
          inputParameters:
            - name: material_description
              in: body
              type: string
              description: "Material description."
            - name: quantity
              in: body
              type: number
              description: "Quantity needed."
            - name: project_id
              in: body
              type: string
              description: "Project ID for cost allocation."
            - name: urgency
              in: body
              type: string
              description: "Urgency level."
          call: "ariba.create-requisition"
          with:
            description: "{{material_description}}"
            quantity: "{{quantity}}"
            project_id: "{{project_id}}"
            urgency: "{{urgency}}"
          outputParameters:
            - name: requisition_id
              type: string
              mapping: "$.requisition.id"
            - name: status
              type: string
              mapping: "$.requisition.status"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST

Pulls project cost analytics from SAP BW and returns budget utilization and forecast data.

naftiko: "0.5"
info:
  label: "SAP BW Project Cost Report"
  description: "Pulls project cost analytics from SAP BW and returns budget utilization and forecast data."
  tags:
    - finance
    - analytics
    - sap-bw
capability:
  exposes:
    - type: mcp
      namespace: cost-analytics
      port: 8080
      tools:
        - name: get-cost-report
          description: "Retrieve project cost analytics from SAP BW."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: period
              in: body
              type: string
              description: "Reporting period."
          call: "sap-bw.get-project-costs"
          with:
            project_id: "{{project_id}}"
            period: "{{period}}"
          outputParameters:
            - name: budget_utilized_pct
              type: number
              mapping: "$.data.budget_utilization"
            - name: forecast_at_completion
              type: number
              mapping: "$.data.eac"
  consumes:
    - type: http
      namespace: sap-bw
      baseUri: "https://bechtel-bw.sap.com/sap/bw/odata/v1"
      authentication:
        type: basic
        username: "$secrets.sap_bw_user"
        password: "$secrets.sap_bw_password"
      resources:
        - name: project-costs
          path: "/ProjectCosts(ProjectId='{{project_id}}')"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-costs
              method: GET

Checks the status of an expense report in SAP Concur by report ID.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Status"
  description: "Checks the status of an expense report in SAP Concur by report ID."
  tags:
    - construction
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: concur
      port: 8080
      tools:
        - name: get-expense-status
          description: "Check expense report status in SAP Concur."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Expense report ID."
          call: "concur.get-report"
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ApprovalStatusName"
            - name: total
              type: number
              mapping: "$.Total"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

When an engineer submits a travel expense report in SAP Concur, validates against project budget in SAP, creates an approval workflow in Microsoft Power Automate, and notifies the project manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Processor"
  description: "When an engineer submits a travel expense report in SAP Concur, validates against project budget in SAP, creates an approval workflow in Microsoft Power Automate, and notifies the project manager in Microsoft Teams."
  tags:
    - finance
    - travel
    - sap-concur
    - sap
    - microsoft-power-automate
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-expenses
      port: 8080
      tools:
        - name: process-expense-report
          description: "Validate and route a travel expense report through the approval workflow."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur expense report ID."
            - name: project_id
              in: body
              type: string
              description: "Associated project ID."
            - name: pm_email
              in: body
              type: string
              description: "Project manager email."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: check-budget
              type: call
              call: "sap.check-project-budget"
              with:
                project_id: "{{project_id}}"
                amount: "{{get-report.total_amount}}"
            - name: trigger-approval
              type: call
              call: "power-automate.trigger-flow"
              with:
                flow_id: "expense_approval"
                report_id: "{{report_id}}"
                amount: "{{get-report.total_amount}}"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pm_email}}"
                text: "Expense report {{report_id}} submitted for project {{project_id}}: ${{get-report.total_amount}}. Budget status: {{check-budget.status}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bechtel-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_Project('{{project_id}}')/Budget"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: check-project-budget
              method: GET
    - type: http
      namespace: power-automate
      baseUri: "https://api.flow.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/flows/{{flow_id}}/triggers/manual/run"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/chat/messages"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks current inventory levels for a material in SAP by material number and plant code.

naftiko: "0.5"
info:
  label: "SAP Material Inventory Check"
  description: "Checks current inventory levels for a material in SAP by material number and plant code."
  tags:
    - construction
    - sap
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: check-material-inventory
          description: "Check material inventory in SAP."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: "sap.get-inventory"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: quantity_on_hand
              type: number
              mapping: "$.d.AvailableQuantity"
            - name: unit
              type: string
              mapping: "$.d.UnitOfMeasure"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: inventory
          path: "/API_MATERIAL_STOCK_SRV/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-inventory
              method: GET

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date."
  tags:
    - procurement
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bechtel-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Manages scaffold inspections by creating a Jira inspection task, logging results in Google Sheets, uploading photos to SharePoint, and notifying the safety team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Scaffold Inspection Pipeline"
  description: "Manages scaffold inspections by creating a Jira inspection task, logging results in Google Sheets, uploading photos to SharePoint, and notifying the safety team via Microsoft Teams."
  tags:
    - construction
    - jira
    - google-sheets
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: scaffold-inspect
      port: 8080
      tools:
        - name: process-inspection
          description: "Orchestrate scaffold inspection workflow."
          inputParameters:
            - name: scaffold_id
              in: body
              type: string
              description: "Scaffold ID."
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: result
              in: body
              type: string
              description: "Pass or fail."
          steps:
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Scaffold inspection: {{scaffold_id}} at {{site_code}} - {{result}}"
                issue_type: "Task"
            - name: log-result
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_scaffold_log"
                data: "{{scaffold_id}},{{site_code}},{{result}}"
            - name: notify-safety
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety"
                text: "Scaffold {{scaffold_id}} at {{site_code}}: {{result}}. Task: {{create-task.issue_key}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current state, priority, and assignment for a ServiceNow incident.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current state, priority, and assignment for a ServiceNow incident."
  tags:
    - it-support
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-support
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident
              method: GET

Retrieves a document from a SharePoint site.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves a document from a SharePoint site."
  tags:
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a document from SharePoint."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "File path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Provisions site access for a new worker by verifying safety certifications in Workday, creating an access badge request in ServiceNow, adding to Azure AD security group, and notifying the site manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Site Access Provisioning Pipeline"
  description: "Provisions site access for a new worker by verifying safety certifications in Workday, creating an access badge request in ServiceNow, adding to Azure AD security group, and notifying the site manager via Microsoft Teams."
  tags:
    - construction
    - workday
    - servicenow
    - azure-active-directory
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: site-access
      port: 8080
      tools:
        - name: provision-site-access
          description: "Orchestrate site access provisioning for new workers."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
            - name: site_code
              in: body
              type: string
              description: "Construction site code."
          steps:
            - name: verify-certs
              type: call
              call: "workday.get-certifications"
              with:
                employee_id: "{{employee_id}}"
            - name: create-badge-request
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Site access badge: {{employee_id}} for {{site_code}}"
                category: "site_access"
            - name: add-to-group
              type: call
              call: "aad.add-group-member"
              with:
                group: "site_{{site_code}}_access"
                user_id: "{{employee_id}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{site_code}}"
                text: "Site access provisioned for {{employee_id}}. Certifications: {{verify-certs.status}}. Badge request: {{create-badge-request.request_number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bechtel"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/workers/{{employee_id}}/certifications"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: aad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: groups
          path: "/groups/{{group}}/members/$ref"
          inputParameters:
            - name: group
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates site mobilization by provisioning IT infrastructure via Terraform, creating site profiles in SAP, setting up SharePoint document libraries, and scheduling an orientation via Zoom.

naftiko: "0.5"
info:
  label: "Site Mobilization Orchestrator"
  description: "Orchestrates site mobilization by provisioning IT infrastructure via Terraform, creating site profiles in SAP, setting up SharePoint document libraries, and scheduling an orientation via Zoom."
  tags:
    - construction
    - terraform
    - sap
    - sharepoint
    - zoom
capability:
  exposes:
    - type: mcp
      namespace: mobilization
      port: 8080
      tools:
        - name: mobilize-site
          description: "Orchestrate construction site mobilization."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "New site code."
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          steps:
            - name: provision-infra
              type: call
              call: "terraform.create-run"
              with:
                workspace: "site-{{site_code}}"
                auto_apply: true
            - name: create-site-profile
              type: call
              call: "sap.create-plant"
              with:
                plant_code: "{{site_code}}"
                project_id: "{{project_id}}"
            - name: create-doc-library
              type: call
              call: "sharepoint.create-site"
              with:
                name: "Site-{{site_code}}"
                template: "construction_site"
            - name: schedule-orientation
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "Site {{site_code}} Orientation"
                duration: 90
  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: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: plants
          path: "/API_PLANT_SRV/Plant"
          operations:
            - name: create-plant
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sites
          path: "/sites"
          operations:
            - name: create-site
              method: POST
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST

Responds to construction site network outages by checking Cisco device status, creating a ServiceNow incident, alerting IT via Microsoft Teams, and escalating to the network vendor via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Site Network Outage Response Pipeline"
  description: "Responds to construction site network outages by checking Cisco device status, creating a ServiceNow incident, alerting IT via Microsoft Teams, and escalating to the network vendor via Microsoft Outlook."
  tags:
    - construction
    - cisco
    - servicenow
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: network-outage
      port: 8080
      tools:
        - name: handle-network-outage
          description: "Orchestrate site network outage response."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: device_id
              in: body
              type: string
              description: "Network device ID."
          steps:
            - name: check-device
              type: call
              call: "cisco.get-device-status"
              with:
                device_id: "{{device_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Network outage at site {{site_code}}"
                description: "Device {{device_id}} status: {{check-device.status}}"
                urgency: "1"
            - name: alert-it
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "it_network"
                text: "Network outage at {{site_code}}. Device: {{device_id}}. Status: {{check-device.status}}. Incident: {{create-incident.incident_number}}."
            - name: escalate
              type: call
              call: "outlook.send-email"
              with:
                to: "network-support@bechtel.com"
                subject: "URGENT: Network outage at site {{site_code}}"
                body: "Device {{device_id}} is {{check-device.status}}. Incident: {{create-incident.incident_number}}."
  consumes:
    - type: http
      namespace: cisco
      baseUri: "https://cisco-dnac.bechtel.com/dna/intent/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cisco_token"
      resources:
        - name: devices
          path: "/network-device/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bechtel.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Distributes daily safety toolbox talk materials by retrieving the topic from SharePoint, sending to site crews via Microsoft Teams, logging attendance in Google Sheets, and creating a Jira follow-up task.

naftiko: "0.5"
info:
  label: "Site Safety Toolbox Talk Pipeline"
  description: "Distributes daily safety toolbox talk materials by retrieving the topic from SharePoint, sending to site crews via Microsoft Teams, logging attendance in Google Sheets, and creating a Jira follow-up task."
  tags:
    - construction
    - sharepoint
    - microsoft-teams
    - google-sheets
    - jira
capability:
  exposes:
    - type: mcp
      namespace: toolbox-talk
      port: 8080
      tools:
        - name: distribute-toolbox-talk
          description: "Orchestrate daily safety toolbox talk distribution."
          inputParameters:
            - name: site_code
              in: body
              type: string
              description: "Site code."
            - name: topic_id
              in: body
              type: string
              description: "Safety topic ID."
          steps:
            - name: get-topic
              type: call
              call: "sharepoint.get-file"
              with:
                site: "bechtel-safety"
                path: "/topics/{{topic_id}}.pdf"
            - name: send-to-crew
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "site_{{site_code}}_safety"
                text: "Today's Toolbox Talk: {{get-topic.file_name}}. Please review and confirm attendance."
            - name: log-distribution
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_safety_log"
                data: "{{site_code}},{{topic_id}},distributed"
            - name: create-followup
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Verify toolbox talk attendance: {{site_code}}"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site}}/drive/root:/{{path}}:/content"
          inputParameters:
            - name: site
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves current weather conditions for a construction site location to inform work scheduling decisions.

naftiko: "0.5"
info:
  label: "Site Weather Monitor"
  description: "Retrieves current weather conditions for a construction site location to inform work scheduling decisions."
  tags:
    - construction
    - weather
    - safety
capability:
  exposes:
    - type: mcp
      namespace: weather
      port: 8080
      tools:
        - name: get-site-weather
          description: "Get current weather conditions for a site location."
          inputParameters:
            - name: latitude
              in: body
              type: number
              description: "Site latitude."
            - name: longitude
              in: body
              type: number
              description: "Site longitude."
          call: "weather.get-current"
          with:
            lat: "{{latitude}}"
            lon: "{{longitude}}"
          outputParameters:
            - name: temperature
              type: number
              mapping: "$.main.temp"
            - name: conditions
              type: string
              mapping: "$.weather[0].description"
            - name: wind_speed
              type: number
              mapping: "$.wind.speed"
  consumes:
    - type: http
      namespace: weather
      baseUri: "https://api.openweathermap.org/data/2.5"
      authentication:
        type: apikey
        key: "$secrets.openweather_api_key"
      resources:
        - name: current
          path: "/weather?lat={{lat}}&lon={{lon}}&appid={{api_key}}"
          operations:
            - name: get-current
              method: GET

Executes a predefined query against the Snowflake data warehouse for project analytics data.

naftiko: "0.5"
info:
  label: "Snowflake Project Data Query"
  description: "Executes a predefined query against the Snowflake data warehouse for project analytics data."
  tags:
    - construction
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: query-project-data
          description: "Query Snowflake for project analytics."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
          call: "snowflake.run-query"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.data"
            - name: row_count
              type: number
              mapping: "$.rowCount"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bechtel.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Queries SolarWinds for network device performance metrics and uptime across Bechtel project sites.

naftiko: "0.5"
info:
  label: "SolarWinds Network Performance Monitor"
  description: "Queries SolarWinds for network device performance metrics and uptime across Bechtel project sites."
  tags:
    - monitoring
    - networking
    - solarwinds
capability:
  exposes:
    - type: mcp
      namespace: network-monitoring
      port: 8080
      tools:
        - name: get-node-performance
          description: "Retrieve network node performance from SolarWinds."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "SolarWinds node ID."
          call: "solarwinds.get-node"
          with:
            node_id: "{{node_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: response_time
              type: number
              mapping: "$.ResponseTime"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.bechtel.com:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: nodes
          path: "/Query?query=SELECT+*+FROM+Orion.Nodes+WHERE+NodeID={{node_id}}"
          inputParameters:
            - name: node_id
              in: path
          operations:
            - name: get-node
              method: GET

Executes a search query against Splunk for construction site operational logs and IoT sensor data.

naftiko: "0.5"
info:
  label: "Splunk Construction Log Search"
  description: "Executes a search query against Splunk for construction site operational logs and IoT sensor data."
  tags:
    - construction
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: splunk
      port: 8080
      tools:
        - name: search-logs
          description: "Search Splunk for construction site logs."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Splunk search query."
          call: "splunk.create-search"
          with:
            search: "{{query}}"
          outputParameters:
            - name: search_id
              type: string
              mapping: "$.sid"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.bechtel.com:8089"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/services/search/jobs"
          operations:
            - name: create-search
              method: POST

Searches Splunk for security events matching a query and returns the results.

naftiko: "0.5"
info:
  label: "Splunk Security Log Search"
  description: "Searches Splunk for security events matching a query and returns the results."
  tags:
    - security
    - monitoring
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: security-logs
      port: 8080
      tools:
        - name: search-security-logs
          description: "Search Splunk for security events."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk search query."
            - name: time_range
              in: body
              type: string
              description: "Time range such as -24h or -7d."
          call: "splunk.search"
          with:
            search: "{{search_query}}"
            earliest_time: "{{time_range}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_count
              type: number
              mapping: "$.result_count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.bechtel.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs/export"
          operations:
            - name: search
              method: POST

Processes subcontractor invoices by verifying scope in SAP, creating an approval task in Jira, notifying project controls via Microsoft Teams, and sending payment status to the subcontractor via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Subcontractor Invoice Approval Pipeline"
  description: "Processes subcontractor invoices by verifying scope in SAP, creating an approval task in Jira, notifying project controls via Microsoft Teams, and sending payment status to the subcontractor via Microsoft Outlook."
  tags:
    - construction
    - sap
    - jira
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: sub-invoice
      port: 8080
      tools:
        - name: process-sub-invoice
          description: "Orchestrate subcontractor invoice approval."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "Invoice number."
            - name: subcontractor_name
              in: body
              type: string
              description: "Subcontractor name."
            - name: amount
              in: body
              type: number
              description: "Invoice amount."
          steps:
            - name: verify-scope
              type: call
              call: "sap.verify-subcontract"
              with:
                invoice_number: "{{invoice_number}}"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "FINANCE"
                summary: "Invoice approval: {{subcontractor_name}} - ${{amount}}"
                issue_type: "Approval"
            - name: notify-controls
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "project_controls"
                text: "Sub invoice {{invoice_number}} from {{subcontractor_name}}: ${{amount}}. Approval: {{create-approval.issue_key}}."
            - name: notify-sub
              type: call
              call: "outlook.send-email"
              with:
                to: "{{verify-scope.contact_email}}"
                subject: "Invoice {{invoice_number}} - Under Review"
                body: "Your invoice {{invoice_number}} for ${{amount}} is being reviewed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: subcontracts
          path: "/API_PURCHASEORDER_SRV/PurchaseOrder"
          operations:
            - name: verify-subcontract
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

When a new subcontractor applies, collects their documents from the vendor portal, runs a compliance check, stores certificates in SharePoint, creates a Jira review task, and notifies the procurement team.

naftiko: "0.5"
info:
  label: "Subcontractor Pre-Qualification Pipeline"
  description: "When a new subcontractor applies, collects their documents from the vendor portal, runs a compliance check, stores certificates in SharePoint, creates a Jira review task, and notifies the procurement team."
  tags:
    - procurement
    - compliance
    - construction
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: subcontractor-qual
      port: 8080
      tools:
        - name: qualify-subcontractor
          description: "Process a subcontractor pre-qualification application."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor identifier."
            - name: vendor_name
              in: body
              type: string
              description: "Vendor company name."
            - name: trade
              in: body
              type: string
              description: "Construction trade specialty."
          steps:
            - name: get-documents
              type: call
              call: "vendor-portal.get-qualification-docs"
              with:
                vendor_id: "{{vendor_id}}"
            - name: upload-certs
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "vendor_qualifications"
                folder_path: "Subcontractors/{{vendor_name}}"
                file_name: "qualification_package.pdf"
                file_content: "{{get-documents.package}}"
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "PROCUREMENT"
                issue_type: "Task"
                summary: "Pre-qualification review: {{vendor_name}} ({{trade}})"
                description: "Documents: {{upload-certs.url}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement_team"
                text: "New subcontractor application: {{vendor_name}} ({{trade}}). Review task: {{create-review.key}}."
  consumes:
    - type: http
      namespace: vendor-portal
      baseUri: "https://vendors.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.vendor_portal_token"
      resources:
        - name: qualification
          path: "/vendors/{{vendor_id}}/qualification-docs"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-qualification-docs
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://bechtel.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves project analytics views from Tableau Server for executive review.

naftiko: "0.5"
info:
  label: "Tableau Project Analytics Dashboard"
  description: "Retrieves project analytics views from Tableau Server for executive review."
  tags:
    - analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: project-analytics
      port: 8080
      tools:
        - name: get-dashboard-url
          description: "Retrieve a Tableau dashboard URL for a project."
          inputParameters:
            - name: workbook_name
              in: body
              type: string
              description: "Tableau workbook name."
          call: "tableau.get-workbook"
          with:
            workbook_name: "{{workbook_name}}"
          outputParameters:
            - name: url
              type: string
              mapping: "$.workbook.contentUrl"
            - name: last_updated
              type: string
              mapping: "$.workbook.updatedAt"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.bechtel.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks?filter=name:eq:{{workbook_name}}"
          inputParameters:
            - name: workbook_name
              in: path
          operations:
            - name: get-workbook
              method: GET

Retrieves the latest run status for a Terraform Cloud workspace used for infrastructure provisioning.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Status"
  description: "Retrieves the latest run status for a Terraform Cloud workspace used for infrastructure provisioning."
  tags:
    - devops
    - infrastructure
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: iac
      port: 8080
      tools:
        - name: get-workspace-status
          description: "Check the latest Terraform run status."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-latest-run"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.attributes.status"
            - name: created_at
              type: string
              mapping: "$.data.attributes.created-at"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace_id}}/runs?page[size]=1"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-latest-run
              method: GET

Deploys cloud infrastructure for a construction site by running a Terraform plan, applying changes, validating via Datadog, and notifying the DevOps team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Site Infrastructure Pipeline"
  description: "Deploys cloud infrastructure for a construction site by running a Terraform plan, applying changes, validating via Datadog, and notifying the DevOps team via Microsoft Teams."
  tags:
    - construction
    - terraform
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tf-deploy
      port: 8080
      tools:
        - name: deploy-infrastructure
          description: "Orchestrate Terraform infrastructure deployment for a site."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace name."
            - name: site_code
              in: body
              type: string
              description: "Site code."
          steps:
            - name: run-plan
              type: call
              call: "terraform.create-run"
              with:
                workspace: "{{workspace}}"
                auto_apply: true
            - name: validate-health
              type: call
              call: "datadog.get-service-status"
              with:
                service: "site-{{site_code}}-infra"
            - name: notify-devops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "devops"
                text: "Terraform deployment complete for site {{site_code}}. Run: {{run-plan.run_id}}. Health: {{validate-health.status}}."
  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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: services
          path: "/check_run"
          operations:
            - name: get-service-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes employee travel requests by creating the request in SAP Concur, getting manager approval via Jira, booking via the travel system, and notifying the employee via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Travel Request Approval Pipeline"
  description: "Processes employee travel requests by creating the request in SAP Concur, getting manager approval via Jira, booking via the travel system, and notifying the employee via Microsoft Outlook."
  tags:
    - construction
    - sap-concur
    - jira
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: travel-request
      port: 8080
      tools:
        - name: process-travel-request
          description: "Orchestrate travel request approval workflow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
            - name: destination
              in: body
              type: string
              description: "Travel destination."
            - name: travel_dates
              in: body
              type: string
              description: "Travel date range."
          steps:
            - name: create-request
              type: call
              call: "concur.create-travel-request"
              with:
                employee_id: "{{employee_id}}"
                destination: "{{destination}}"
                dates: "{{travel_dates}}"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "TRAVEL"
                summary: "Travel approval: {{employee_id}} to {{destination}}"
                issue_type: "Approval"
            - name: notify-employee
              type: call
              call: "outlook.send-email"
              with:
                to: "{{employee_id}}@bechtel.com"
                subject: "Travel Request Submitted - {{destination}}"
                body: "Your travel request to {{destination}} for {{travel_dates}} has been submitted. Concur ref: {{create-request.request_id}}. Approval: {{create-approval.issue_key}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: travel-requests
          path: "/travelrequest/requests"
          operations:
            - name: create-travel-request
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Processes vendor payments by verifying the invoice in SAP, creating a payment run in SAP Ariba, notifying the vendor via Microsoft Outlook, and logging in Google Sheets.

naftiko: "0.5"
info:
  label: "Vendor Payment Processing Pipeline"
  description: "Processes vendor payments by verifying the invoice in SAP, creating a payment run in SAP Ariba, notifying the vendor via Microsoft Outlook, and logging in Google Sheets."
  tags:
    - construction
    - sap
    - sap-ariba
    - microsoft-outlook
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: vendor-payment
      port: 8080
      tools:
        - name: process-payment
          description: "Orchestrate vendor payment processing."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_email
              in: body
              type: string
              description: "Vendor email."
          steps:
            - name: verify-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: create-payment
              type: call
              call: "ariba.create-payment-run"
              with:
                invoice_id: "{{invoice_id}}"
                amount: "{{verify-invoice.amount}}"
            - name: notify-vendor
              type: call
              call: "outlook.send-email"
              with:
                to: "{{vendor_email}}"
                subject: "Payment Processed: Invoice {{invoice_id}}"
                body: "Payment of ${{verify-invoice.amount}} for invoice {{invoice_id}} has been processed. Reference: {{create-payment.payment_ref}}."
            - name: log-payment
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_payments"
                data: "{{invoice_id}},{{verify-invoice.amount}},{{create-payment.payment_ref}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: invoices
          path: "/API_SUPPLIERINVOICE_SRV/A_SupplierInvoice('{{invoice_id}}')"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: payments
          path: "/payment-runs"
          operations:
            - name: create-payment-run
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST

Generates weekly project progress reports by pulling schedule data from Primavera, cost data from SAP, refreshing the Power BI dashboard, and emailing the report to stakeholders via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Weekly Progress Report Orchestrator"
  description: "Generates weekly project progress reports by pulling schedule data from Primavera, cost data from SAP, refreshing the Power BI dashboard, and emailing the report to stakeholders via Microsoft Outlook."
  tags:
    - construction
    - sap
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: weekly-report
      port: 8080
      tools:
        - name: generate-weekly-report
          description: "Orchestrate weekly project progress report generation."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date."
          steps:
            - name: get-schedule-data
              type: call
              call: "primavera.get-schedule-status"
              with:
                project_id: "{{project_id}}"
            - name: get-cost-data
              type: call
              call: "sap.get-project-costs"
              with:
                project_id: "{{project_id}}"
                period: "{{week_ending}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "bechtel_project_{{project_id}}"
            - name: email-stakeholders
              type: call
              call: "outlook.send-email"
              with:
                to: "project-{{project_id}}-stakeholders@bechtel.com"
                subject: "Weekly Progress Report - Project {{project_id}} - {{week_ending}}"
                body: "Schedule: {{get-schedule-data.percent_complete}}% complete. Cost: ${{get-cost-data.actual_cost}} of ${{get-cost-data.budget}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: primavera
      baseUri: "https://primavera.bechtel.com/api/restapi"
      authentication:
        type: bearer
        token: "$secrets.primavera_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: get-schedule-status
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.bechtel.com/sap/opu/odata/sap"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: project-costs
          path: "/API_PROJECT_COST_SRV/ProjectCost"
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Processes weld inspections by logging results in Google Sheets, creating a Jira task for failures, uploading NDE reports to SharePoint, and notifying the QC team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Weld Inspection Pipeline"
  description: "Processes weld inspections by logging results in Google Sheets, creating a Jira task for failures, uploading NDE reports to SharePoint, and notifying the QC team via Microsoft Teams."
  tags:
    - construction
    - google-sheets
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weld-inspect
      port: 8080
      tools:
        - name: process-weld-inspection
          description: "Orchestrate weld inspection result processing."
          inputParameters:
            - name: weld_id
              in: body
              type: string
              description: "Weld identification number."
            - name: result
              in: body
              type: string
              description: "Pass or fail."
            - name: nde_method
              in: body
              type: string
              description: "NDE method used."
          steps:
            - name: log-result
              type: call
              call: "gsheets.append-rows"
              with:
                spreadsheet_id: "bechtel_weld_log"
                data: "{{weld_id}},{{nde_method}},{{result}}"
            - name: create-repair-task
              type: call
              call: "jira.create-issue"
              with:
                project: "QC"
                summary: "Weld repair: {{weld_id}} - {{result}}"
                issue_type: "Task"
            - name: notify-qc
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality_control"
                text: "Weld {{weld_id}} inspection ({{nde_method}}): {{result}}. Task: {{create-repair-task.issue_key}}."
  consumes:
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values:append"
          inputParameters:
            - name: spreadsheet_id
              in: path
          operations:
            - name: append-rows
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bechtel.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an employee profile from Workday including name, department, and job title.

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

Queries Workday for an employee's current time-off balance by employee ID.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Queries Workday for an employee's current time-off balance by employee ID."
  tags:
    - construction
    - workday
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Look up employee time-off balance in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-balance"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: vacation_hours
              type: number
              mapping: "$.data.vacation_balance"
            - name: sick_hours
              type: number
              mapping: "$.data.sick_balance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/bechtel"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/workers/{{employee_id}}/timeOffBalance"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-balance
              method: GET

Retrieves weekly work schedules for construction crews from the workforce management system.

naftiko: "0.5"
info:
  label: "Workforce Scheduling Viewer"
  description: "Retrieves weekly work schedules for construction crews from the workforce management system."
  tags:
    - hr
    - workforce-management
    - construction
capability:
  exposes:
    - type: mcp
      namespace: workforce
      port: 8080
      tools:
        - name: get-crew-schedule
          description: "Retrieve weekly crew schedules for a project site."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Project ID."
            - name: week_start
              in: body
              type: string
              description: "Week start date."
          call: "wfm.get-schedule"
          with:
            project_id: "{{project_id}}"
            week_start: "{{week_start}}"
          outputParameters:
            - name: crews
              type: array
              mapping: "$.schedules"
            - name: total_headcount
              type: number
              mapping: "$.total_workers"
  consumes:
    - type: http
      namespace: wfm
      baseUri: "https://wfm.bechtel.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.wfm_token"
      resources:
        - name: schedules
          path: "/projects/{{project_id}}/schedules"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-schedule
              method: GET

Creates a scheduled Zoom meeting for project coordination calls and safety briefings.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler"
  description: "Creates a scheduled Zoom meeting for project coordination calls and safety briefings."
  tags:
    - construction
    - zoom
capability:
  exposes:
    - type: mcp
      namespace: zoom
      port: 8080
      tools:
        - name: create-meeting
          description: "Schedule a Zoom meeting."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "Meeting topic."
            - name: start_time
              in: body
              type: string
              description: "Start time in ISO 8601."
          call: "zoom.create-meeting"
          with:
            topic: "{{topic}}"
            start_time: "{{start_time}}"
          outputParameters:
            - name: meeting_id
              type: string
              mapping: "$.id"
            - name: join_url
              type: string
              mapping: "$.join_url"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST