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