AECOM Capabilities

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

Sort
Expand

Retrieves payroll summary data from ADP for a given employee ID, returning gross pay, net pay, and pay period for project labor cost tracking.

naftiko: "0.5"
info:
  label: "ADP Payroll Data Lookup"
  description: "Retrieves payroll summary data from ADP for a given employee ID, returning gross pay, net pay, and pay period for project labor cost tracking."
  tags:
    - hr
    - adp
    - payroll
capability:
  exposes:
    - type: mcp
      namespace: payroll
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Retrieve payroll summary from ADP by employee ID."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The ADP employee identifier."
          call: "adp.get-payroll"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: gross_pay
              type: string
              mapping: "$.payStatements[0].grossPayAmount"
            - name: net_pay
              type: string
              mapping: "$.payStatements[0].netPayAmount"
            - name: pay_period
              type: string
              mapping: "$.payStatements[0].payPeriod"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/workers/{{employee_id}}/pay-statements"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-payroll
              method: GET

Reads a Jira epic and its child issues, creates corresponding Asana tasks for non-technical stakeholders, and sends a Slack summary to the project channel.

naftiko: "0.5"
info:
  label: "Asana Task Assignment from Jira Epic"
  description: "Reads a Jira epic and its child issues, creates corresponding Asana tasks for non-technical stakeholders, and sends a Slack summary to the project channel."
  tags:
    - project-management
    - jira
    - asana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cross-platform-tasks
      port: 8080
      tools:
        - name: sync-epic-to-asana
          description: "Pull a Jira epic with children, create Asana tasks, and notify via Slack."
          inputParameters:
            - name: epic_key
              in: body
              type: string
              description: "The Jira epic issue key."
            - name: asana_project_gid
              in: body
              type: string
              description: "The Asana project GID."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel name."
          steps:
            - name: get-epic
              type: call
              call: "jira.get-issue"
              with:
                issue_key: "{{epic_key}}"
            - name: create-asana-task
              type: call
              call: "asana.create-task"
              with:
                project_gid: "{{asana_project_gid}}"
                name: "{{get-epic.summary}}"
                notes: "From Jira: {{epic_key}}. Status: {{get-epic.status}}. Priority: {{get-epic.priority}}."
            - name: notify-channel
              type: call
              call: "slack.send-message"
              with:
                channel: "{{slack_channel}}"
                text: "Jira epic {{epic_key}} synced to Asana. Task: {{create-asana-task.url}}. Status: {{get-epic.status}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.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
    - type: http
      namespace: asana
      baseUri: "https://app.asana.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.asana_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Fetches the latest version metadata of an AutoCAD drawing stored in Autodesk BIM 360, including revision number, last modified date, and author.

naftiko: "0.5"
info:
  label: "AutoCAD Drawing Version Retrieval"
  description: "Fetches the latest version metadata of an AutoCAD drawing stored in Autodesk BIM 360, including revision number, last modified date, and author."
  tags:
    - engineering
    - autocad
    - autodesk
capability:
  exposes:
    - type: mcp
      namespace: cad-management
      port: 8080
      tools:
        - name: get-drawing-version
          description: "Retrieve the latest revision metadata of an AutoCAD drawing from Autodesk BIM 360 by item ID."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The BIM 360 project identifier."
            - name: item_id
              in: body
              type: string
              description: "The drawing item identifier in BIM 360."
          call: "autodesk.get-item-versions"
          with:
            project_id: "{{project_id}}"
            item_id: "{{item_id}}"
          outputParameters:
            - name: version_number
              type: string
              mapping: "$.data[0].attributes.versionNumber"
            - name: last_modified
              type: string
              mapping: "$.data[0].attributes.lastModifiedTime"
            - name: author
              type: string
              mapping: "$.data[0].attributes.lastModifiedUserName"
  consumes:
    - type: http
      namespace: autodesk
      baseUri: "https://developer.api.autodesk.com/data/v1/projects"
      authentication:
        type: bearer
        token: "$secrets.autodesk_token"
      resources:
        - name: item-versions
          path: "/{{project_id}}/items/{{item_id}}/versions"
          inputParameters:
            - name: project_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-item-versions
              method: GET

Collects bid requirements from Salesforce, assembles cost estimates from Oracle, generates proposal in Confluence, and notifies bid team.

naftiko: "0.5"
info:
  label: "Bid Proposal Assembly Pipeline"
  description: "Collects bid requirements from Salesforce, assembles cost estimates from Oracle, generates proposal in Confluence, and notifies bid team."
  tags:
    - bidding
    - salesforce
    - oracle
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: bidding
      port: 8080
      tools:
        - name: bid_proposal_assembly_pipeline
          description: "Orchestrate bid proposal assembly pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-salesforce
              type: call
              call: "salesforce.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-oracle
              type: call
              call: "oracle.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Receives change orders, validates scope and cost in Oracle, routes for approval in ServiceNow, updates project budget, and notifies stakeholders.

naftiko: "0.5"
info:
  label: "Change Order Processing Pipeline"
  description: "Receives change orders, validates scope and cost in Oracle, routes for approval in ServiceNow, updates project budget, and notifies stakeholders."
  tags:
    - change-management
    - oracle
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: change_order_processing_pipeline
          description: "Orchestrate change order processing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Extracts billing data from Oracle, reconciles with project costs in Snowflake, creates invoices, logs in ServiceNow, and notifies finance.

naftiko: "0.5"
info:
  label: "Client Billing Reconciliation Pipeline"
  description: "Extracts billing data from Oracle, reconciles with project costs in Snowflake, creates invoices, logs in ServiceNow, and notifies finance."
  tags:
    - finance
    - oracle
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: client_billing_reconciliation_pipeline
          description: "Orchestrate client billing reconciliation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Generates a client invoice by pulling billable hours from Oracle EBS, creating the invoice document in Google Docs, uploading to SharePoint, updating the Salesforce opportunity, and emailing the client via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Invoice Generation Pipeline"
  description: "Generates a client invoice by pulling billable hours from Oracle EBS, creating the invoice document in Google Docs, uploading to SharePoint, updating the Salesforce opportunity, and emailing the client via Microsoft Outlook."
  tags:
    - finance
    - oracle-e-business-suite
    - google-docs
    - sharepoint
    - salesforce
    - microsoft-outlook
    - invoicing
capability:
  exposes:
    - type: mcp
      namespace: invoicing
      port: 8080
      tools:
        - name: generate-client-invoice
          description: "Pull billable data, create invoice, upload, update CRM, and email client."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
            - name: client_email
              in: body
              type: string
              description: "The client contact email."
            - name: billing_period
              in: body
              type: string
              description: "The billing period (e.g., 2026-Q1)."
          steps:
            - name: get-billable-data
              type: call
              call: "oracle-ebs.get-billable-hours"
              with:
                project_number: "{{project_number}}"
                period: "{{billing_period}}"
            - name: create-invoice-doc
              type: call
              call: "googledocs.create-document"
              with:
                title: "Invoice: {{project_number}} - {{billing_period}}"
                body: "Billable hours: {{get-billable-data.total_hours}}. Amount: ${{get-billable-data.total_amount}}. Period: {{billing_period}}."
            - name: upload-invoice
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "finance_invoices"
                folder_path: "Invoices/{{project_number}}"
                file_name: "invoice_{{billing_period}}.pdf"
            - name: update-opportunity
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                last_invoice_date: "{{billing_period}}"
                invoiced_amount: "{{get-billable-data.total_amount}}"
            - name: email-client
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{client_email}}"
                subject: "Invoice: Project {{project_number}} - {{billing_period}}"
                body: "Please find attached the invoice for {{billing_period}}. Total: ${{get-billable-data.total_amount}}. Document: {{upload-invoice.url}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: billable
          path: "/billable-hours/{{project_number}}?period={{period}}"
          inputParameters:
            - name: project_number
              in: path
            - name: period
              in: query
          operations:
            - name: get-billable-hours
              method: GET
    - type: http
      namespace: googledocs
      baseUri: "https://docs.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_docs_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: create-document
              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}}/{{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: salesforce
      baseUri: "https://aecom.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: update-opportunity
              method: PATCH
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves an engineering design specification page from Confluence by page ID, returning the title, body content, and last update timestamp.

naftiko: "0.5"
info:
  label: "Confluence Design Spec Retrieval"
  description: "Retrieves an engineering design specification page from Confluence by page ID, returning the title, body content, and last update timestamp."
  tags:
    - engineering
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge-management
      port: 8080
      tools:
        - name: get-design-spec
          description: "Retrieve a Confluence page used as an engineering design specification."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page identifier."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: last_updated
              type: string
              mapping: "$.version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage,version"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Retrieves Confluence page content for AECOM knowledge base.

naftiko: "0.5"
info:
  label: "Confluence Page Retrieval"
  description: "Retrieves Confluence page content for AECOM knowledge base."
  tags:
    - collaboration
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Get page at AECOM."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The page_id to look up." 
          call: "confluence.get-page_id"
          with:
            page_id: "{{page_id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence_page_retrieval
              method: GET

When a construction change order is submitted in Oracle EBS, creates a Jira change request, updates the project schedule in Microsoft Project, and notifies the project manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Construction Change Order Pipeline"
  description: "When a construction change order is submitted in Oracle EBS, creates a Jira change request, updates the project schedule in Microsoft Project, and notifies the project manager via Microsoft Teams."
  tags:
    - construction
    - oracle-e-business-suite
    - jira
    - microsoft-project
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: change-order-management
      port: 8080
      tools:
        - name: process-change-order
          description: "Orchestrate processing of a construction change order from Oracle EBS through Jira tracking, schedule update, and PM notification."
          inputParameters:
            - name: change_order_id
              in: body
              type: string
              description: "The Oracle EBS change order identifier."
            - name: project_id
              in: body
              type: string
              description: "The Microsoft Project GUID."
            - name: pm_email
              in: body
              type: string
              description: "The project manager email for notification."
          steps:
            - name: get-change-order
              type: call
              call: "oracle-ebs.get-change-order"
              with:
                change_order_id: "{{change_order_id}}"
            - name: create-change-request
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CONSTR"
                summary: "CO: {{get-change-order.description}}"
                description: "Change Order {{change_order_id}} - Cost Impact: ${{get-change-order.cost_impact}}. Schedule Impact: {{get-change-order.schedule_days}} days."
                issue_type: "Change Request"
            - name: update-schedule
              type: call
              call: "msproject.update-task"
              with:
                project_id: "{{project_id}}"
                task_name: "{{get-change-order.affected_task}}"
                duration_change: "{{get-change-order.schedule_days}}"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pm_email}}"
                text: "Change Order {{change_order_id}} processed. Cost: ${{get-change-order.cost_impact}}. Jira: {{create-change-request.key}}. Schedule updated by {{get-change-order.schedule_days}} days."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: change-orders
          path: "/change-orders/{{change_order_id}}"
          inputParameters:
            - name: change_order_id
              in: path
          operations:
            - name: get-change-order
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: msproject
      baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "('{{project_id}}')/Tasks"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: update-task
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Receives claims, validates against contracts in Oracle, analyzes in Snowflake, creates resolution workflow in ServiceNow, and notifies legal.

naftiko: "0.5"
info:
  label: "Construction Claims Management Pipeline"
  description: "Receives claims, validates against contracts in Oracle, analyzes in Snowflake, creates resolution workflow in ServiceNow, and notifies legal."
  tags:
    - claims
    - oracle
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: claims
      port: 8080
      tools:
        - name: construction_claims_management_pipeline
          description: "Orchestrate construction claims management pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Compares project costs against industry benchmarks in Snowflake, identifies optimization opportunities, creates Jira tasks, and reports to management.

naftiko: "0.5"
info:
  label: "Construction Cost Benchmarking"
  description: "Compares project costs against industry benchmarks in Snowflake, identifies optimization opportunities, creates Jira tasks, and reports to management."
  tags:
    - cost-management
    - snowflake
    - jira
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cost-management
      port: 8080
      tools:
        - name: construction_cost_benchmarking
          description: "Orchestrate construction cost benchmarking workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Analyzes schedule delays from Oracle Primavera, identifies critical path impacts in Snowflake, creates recovery plans in Jira, and notifies management.

naftiko: "0.5"
info:
  label: "Construction Delay Analysis Pipeline"
  description: "Analyzes schedule delays from Oracle Primavera, identifies critical path impacts in Snowflake, creates recovery plans in Jira, and notifies management."
  tags:
    - scheduling
    - oracle
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: scheduling
      port: 8080
      tools:
        - name: construction_delay_analysis_pipeline
          description: "Orchestrate construction delay analysis pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Collects field progress data, compares against baseline schedule in Oracle, updates Snowflake analytics, refreshes dashboards, and alerts management.

naftiko: "0.5"
info:
  label: "Construction Progress Monitoring"
  description: "Collects field progress data, compares against baseline schedule in Oracle, updates Snowflake analytics, refreshes dashboards, and alerts management."
  tags:
    - construction
    - oracle
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: construction
      port: 8080
      tools:
        - name: construction_progress_monitoring
          description: "Orchestrate construction progress monitoring workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Collects safety incident reports, validates against OSHA requirements, creates investigations in ServiceNow, updates dashboards, and alerts safety team.

naftiko: "0.5"
info:
  label: "Construction Site Safety Pipeline"
  description: "Collects safety incident reports, validates against OSHA requirements, creates investigations in ServiceNow, updates dashboards, and alerts safety team."
  tags:
    - safety
    - servicenow
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: construction_site_safety_pipeline
          description: "Orchestrate construction site safety pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Processes contractor timesheets by retrieving hours from Oracle EBS, validating against the project budget, creating an approval task in Jira, and notifying the project manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Contractor Timesheet Approval Workflow"
  description: "Processes contractor timesheets by retrieving hours from Oracle EBS, validating against the project budget, creating an approval task in Jira, and notifying the project manager via Microsoft Teams."
  tags:
    - construction
    - oracle-e-business-suite
    - jira
    - microsoft-teams
    - timesheet
capability:
  exposes:
    - type: mcp
      namespace: timesheet-management
      port: 8080
      tools:
        - name: process-contractor-timesheet
          description: "Retrieve timesheet data, validate against budget, create approval task, and notify PM."
          inputParameters:
            - name: contractor_id
              in: body
              type: string
              description: "The contractor identifier in Oracle EBS."
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: week_ending
              in: body
              type: string
              description: "The week ending date (YYYY-MM-DD)."
            - name: pm_email
              in: body
              type: string
              description: "The project manager email."
          steps:
            - name: get-timesheet
              type: call
              call: "oracle-ebs.get-timesheet"
              with:
                contractor_id: "{{contractor_id}}"
                project_number: "{{project_number}}"
                week_ending: "{{week_ending}}"
            - name: get-budget
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_number: "{{project_number}}"
            - name: create-approval-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CONSTR"
                summary: "Timesheet approval: {{get-timesheet.contractor_name}} - W/E {{week_ending}}"
                description: "Hours: {{get-timesheet.total_hours}}. Cost: ${{get-timesheet.total_cost}}. Budget remaining: ${{get-budget.travel_budget_remaining}}."
                issue_type: "Task"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pm_email}}"
                text: "Timesheet pending approval: {{get-timesheet.contractor_name}}, {{get-timesheet.total_hours}} hrs (${{get-timesheet.total_cost}}) for W/E {{week_ending}}. Jira: {{create-approval-task.key}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: timesheets
          path: "/timesheets?contractor={{contractor_id}}&project={{project_number}}&weekEnding={{week_ending}}"
          inputParameters:
            - name: contractor_id
              in: query
            - name: project_number
              in: query
            - name: week_ending
              in: query
          operations:
            - name: get-timesheet
              method: GET
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Collects contractor timesheets, validates against contracts in SAP, creates approval workflows in ServiceNow, and notifies project managers.

naftiko: "0.5"
info:
  label: "Contractor Timesheet Processing Pipeline"
  description: "Collects contractor timesheets, validates against contracts in SAP, creates approval workflows in ServiceNow, and notifies project managers."
  tags:
    - workforce
    - sap
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: workforce
      port: 8080
      tools:
        - name: contractor_timesheet_processing_pipeline
          description: "Orchestrate contractor timesheet processing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a purchase requisition from Coupa by ID, returning the status, requested amount, supplier, and approval status for procurement tracking.

naftiko: "0.5"
info:
  label: "Coupa Purchase Requisition Lookup"
  description: "Retrieves a purchase requisition from Coupa by ID, returning the status, requested amount, supplier, and approval status for procurement tracking."
  tags:
    - procurement
    - coupa
capability:
  exposes:
    - type: mcp
      namespace: procurement-coupa
      port: 8080
      tools:
        - name: get-requisition
          description: "Look up a Coupa purchase requisition by ID."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Coupa requisition identifier."
          call: "coupa.get-requisition"
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: total_amount
              type: string
              mapping: "$.total"
            - name: supplier_name
              type: string
              mapping: "$.supplier.name"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://aecom.coupahost.com/api"
      authentication:
        type: apiKey
        name: X-COUPA-API-KEY
        in: header
        value: "$secrets.coupa_api_key"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

Aggregates daily construction progress from Autodesk BIM 360 field data, updates the project cost tracker in Oracle EBS, generates a Power BI report refresh, and posts a summary to a Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Daily Construction Progress Reporter"
  description: "Aggregates daily construction progress from Autodesk BIM 360 field data, updates the project cost tracker in Oracle EBS, generates a Power BI report refresh, and posts a summary to a Microsoft Teams channel."
  tags:
    - construction
    - autodesk
    - oracle-e-business-suite
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: construction-reporting
      port: 8080
      tools:
        - name: generate-daily-report
          description: "Collect daily field data, update costs, refresh BI report, and post summary to the project Teams channel."
          inputParameters:
            - name: bim360_project_id
              in: body
              type: string
              description: "The BIM 360 project identifier."
            - name: oracle_project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "The Power BI dataset identifier."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID for posting."
          steps:
            - name: get-field-data
              type: call
              call: "autodesk.get-daily-log"
              with:
                project_id: "{{bim360_project_id}}"
            - name: update-costs
              type: call
              call: "oracle-ebs.update-project-costs"
              with:
                project_number: "{{oracle_project_number}}"
                labor_hours: "{{get-field-data.total_labor_hours}}"
                equipment_hours: "{{get-field-data.equipment_hours}}"
            - name: refresh-report
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "{{powerbi_dataset_id}}"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Daily Progress: {{get-field-data.percent_complete}}% complete. Labor: {{get-field-data.total_labor_hours}} hrs. Weather: {{get-field-data.weather_conditions}}. Issues: {{get-field-data.open_issues_count}}."
  consumes:
    - type: http
      namespace: autodesk
      baseUri: "https://developer.api.autodesk.com/bim360/docs/v1/projects"
      authentication:
        type: bearer
        token: "$secrets.autodesk_token"
      resources:
        - name: daily-logs
          path: "/{{project_id}}/daily-logs"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-daily-log
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: update-project-costs
              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: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Datadog monitor status for AECOM infrastructure.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status"
  description: "Retrieves Datadog monitor status for AECOM infrastructure."
  tags:
    - monitoring
    - datadog
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-monitor
          description: "Check monitor at AECOM."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The monitor_id to look up." 
          call: "datadog.get-monitor_id"
          with:
            monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog_monitor_status
              method: GET

Runs BIM clash detection, logs findings in Jira, tracks resolution progress, updates Confluence reports, and notifies design leads.

naftiko: "0.5"
info:
  label: "Design Clash Detection Pipeline"
  description: "Runs BIM clash detection, logs findings in Jira, tracks resolution progress, updates Confluence reports, and notifies design leads."
  tags:
    - engineering
    - jira
    - confluence
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: design_clash_detection_pipeline
          description: "Orchestrate design clash detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Assembles design package from Confluence, routes for client review in Jira, tracks comments, creates revisions, and notifies design leads.

naftiko: "0.5"
info:
  label: "Design Review Submission Pipeline"
  description: "Assembles design package from Confluence, routes for client review in Jira, tracks comments, creates revisions, and notifies design leads."
  tags:
    - engineering
    - confluence
    - jira
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: design_review_submission_pipeline
          description: "Orchestrate design review submission pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When an engineering design review is initiated, retrieves the drawing from Autodesk BIM 360, creates a Confluence review page, assigns review tasks in Jira, and sends calendar invites via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Design Review Workflow"
  description: "When an engineering design review is initiated, retrieves the drawing from Autodesk BIM 360, creates a Confluence review page, assigns review tasks in Jira, and sends calendar invites via Microsoft Outlook."
  tags:
    - engineering
    - autodesk
    - confluence
    - jira
    - microsoft-outlook
    - design-review
capability:
  exposes:
    - type: mcp
      namespace: design-review
      port: 8080
      tools:
        - name: initiate-design-review
          description: "Start a design review workflow by pulling the drawing, creating a Confluence page, assigning Jira tasks, and scheduling the review meeting."
          inputParameters:
            - name: bim360_project_id
              in: body
              type: string
              description: "The BIM 360 project identifier."
            - name: drawing_item_id
              in: body
              type: string
              description: "The BIM 360 drawing item ID."
            - name: reviewer_emails
              in: body
              type: string
              description: "Comma-separated list of reviewer email addresses."
            - name: review_date
              in: body
              type: string
              description: "The scheduled review date in YYYY-MM-DD format."
          steps:
            - name: get-drawing
              type: call
              call: "autodesk.get-item"
              with:
                project_id: "{{bim360_project_id}}"
                item_id: "{{drawing_item_id}}"
            - name: create-review-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "ENGR"
                title: "Design Review: {{get-drawing.name}} - {{review_date}}"
                body: "Drawing: {{get-drawing.name}} (Rev {{get-drawing.version}}). Download: {{get-drawing.download_url}}. Reviewers: {{reviewer_emails}}."
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENGR"
                summary: "Design Review: {{get-drawing.name}}"
                description: "Complete review by {{review_date}}. Confluence: {{create-review-page.url}}"
                issue_type: "Task"
            - name: send-invite
              type: call
              call: "outlook.create-event"
              with:
                subject: "Design Review: {{get-drawing.name}}"
                start_date: "{{review_date}}"
                attendees: "{{reviewer_emails}}"
                body: "Please review the design at {{create-review-page.url}}. Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: autodesk
      baseUri: "https://developer.api.autodesk.com/data/v1/projects"
      authentication:
        type: bearer
        token: "$secrets.autodesk_token"
      resources:
        - name: items
          path: "/{{project_id}}/items/{{item_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-item
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Searches Elasticsearch indexes for AECOM.

naftiko: "0.5"
info:
  label: "Elasticsearch Log Query"
  description: "Searches Elasticsearch indexes for AECOM."
  tags:
    - data
    - elasticsearch
    - search
capability:
  exposes:
    - type: mcp
      namespace: search
      port: 8080
      tools:
        - name: search-logs
          description: "Search ES logs at AECOM."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The query to look up." 
          call: "elasticsearch.get-query"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://aecom-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch_log_query
              method: GET

Retrieves employee training records from Workday, checks certification expirations, creates Jira tasks for overdue trainings, and sends reminders via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Employee Training Compliance Tracker"
  description: "Retrieves employee training records from Workday, checks certification expirations, creates Jira tasks for overdue trainings, and sends reminders via Microsoft Outlook."
  tags:
    - hr
    - workday
    - jira
    - microsoft-outlook
    - compliance
    - training
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Check an employee training compliance status, create tasks for overdue items, and send reminders."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker identifier."
            - name: certification_type
              in: body
              type: string
              description: "The certification type to check (e.g., OSHA-30, PE-License)."
          steps:
            - name: get-training-record
              type: call
              call: "workday.get-training-records"
              with:
                worker_id: "{{worker_id}}"
                certification: "{{certification_type}}"
            - name: create-renewal-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "HR"
                summary: "Training renewal: {{certification_type}} for {{get-training-record.employee_name}}"
                description: "Certification {{certification_type}} expires on {{get-training-record.expiry_date}}. Employee: {{get-training-record.employee_name}}."
                issue_type: "Task"
            - name: send-reminder
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{get-training-record.employee_email}}"
                subject: "Training Renewal Required: {{certification_type}}"
                body: "Your {{certification_type}} certification expires on {{get-training-record.expiry_date}}. Please complete renewal. Tracking: {{create-renewal-task.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/workers/{{worker_id}}/training?certification={{certification}}"
          inputParameters:
            - name: worker_id
              in: path
            - name: certification
              in: query
          operations:
            - name: get-training-records
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Routes AutoCAD drawings for review, tracks approvals in Jira, stores final versions in SharePoint, logs in ServiceNow, and notifies design team.

naftiko: "0.5"
info:
  label: "Engineering Drawing Approval Workflow"
  description: "Routes AutoCAD drawings for review, tracks approvals in Jira, stores final versions in SharePoint, logs in ServiceNow, and notifies design team."
  tags:
    - engineering
    - jira
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: engineering_drawing_approval_workflow
          description: "Orchestrate engineering drawing approval workflow workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Monitors RFI aging in Jira, escalates overdue items, notifies design leads, creates ServiceNow escalation tickets, and tracks resolution.

naftiko: "0.5"
info:
  label: "Engineering RFI Escalation Pipeline"
  description: "Monitors RFI aging in Jira, escalates overdue items, notifies design leads, creates ServiceNow escalation tickets, and tracks resolution."
  tags:
    - engineering
    - jira
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: engineering_rfi_escalation_pipeline
          description: "Orchestrate engineering rfi escalation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When an RFI is created in Autodesk BIM 360, logs a Jira issue for engineering review, uploads reference documents to SharePoint, and notifies the design lead in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Engineering RFI Orchestrator"
  description: "When an RFI is created in Autodesk BIM 360, logs a Jira issue for engineering review, uploads reference documents to SharePoint, and notifies the design lead in Microsoft Teams."
  tags:
    - engineering
    - autodesk
    - jira
    - sharepoint
    - microsoft-teams
    - rfi
capability:
  exposes:
    - type: mcp
      namespace: rfi-management
      port: 8080
      tools:
        - name: process-rfi
          description: "Given an RFI from BIM 360, create a Jira tracking issue, upload reference docs to SharePoint, and notify the design lead via Teams."
          inputParameters:
            - name: bim360_project_id
              in: body
              type: string
              description: "The BIM 360 project identifier."
            - name: rfi_id
              in: body
              type: string
              description: "The BIM 360 RFI identifier."
            - name: design_lead_email
              in: body
              type: string
              description: "The email of the design lead to notify."
          steps:
            - name: get-rfi
              type: call
              call: "autodesk.get-rfi"
              with:
                project_id: "{{bim360_project_id}}"
                rfi_id: "{{rfi_id}}"
            - name: create-jira-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENGR"
                summary: "RFI: {{get-rfi.title}}"
                description: "RFI from BIM 360: {{get-rfi.description}}. Due: {{get-rfi.due_date}}"
                issue_type: "Task"
            - name: upload-reference
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "engineering_rfi_site"
                folder_path: "RFIs/{{get-rfi.rfi_number}}"
                file_name: "{{get-rfi.attachment_name}}"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{design_lead_email}}"
                text: "New RFI requires review: {{get-rfi.title}} ({{get-rfi.rfi_number}}). Jira: {{create-jira-issue.key}}. Docs: {{upload-reference.url}}"
  consumes:
    - type: http
      namespace: autodesk
      baseUri: "https://developer.api.autodesk.com/bim360/rfis/v2/containers"
      authentication:
        type: bearer
        token: "$secrets.autodesk_token"
      resources:
        - name: rfis
          path: "/{{project_id}}/rfis/{{rfi_id}}"
          inputParameters:
            - name: project_id
              in: path
            - name: rfi_id
              in: path
          operations:
            - name: get-rfi
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: 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}}/{{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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

For a given project site, geocodes the address via Google Maps, runs an environmental data query against the EPA API, logs findings to Confluence, and creates a Jira task for the environmental team.

naftiko: "0.5"
info:
  label: "Environmental Compliance Assessment Orchestrator"
  description: "For a given project site, geocodes the address via Google Maps, runs an environmental data query against the EPA API, logs findings to Confluence, and creates a Jira task for the environmental team."
  tags:
    - environmental
    - google-maps
    - confluence
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: environmental-compliance
      port: 8080
      tools:
        - name: assess-site-compliance
          description: "Given a site address, geocode it, query EPA environmental data, document findings in Confluence, and create a Jira task for review."
          inputParameters:
            - name: site_address
              in: body
              type: string
              description: "The street address of the project site."
            - name: project_code
              in: body
              type: string
              description: "The internal AECOM project code."
          steps:
            - name: geocode-site
              type: call
              call: "googlemaps.geocode"
              with:
                address: "{{site_address}}"
            - name: query-epa
              type: call
              call: "epa.get-facility-info"
              with:
                latitude: "{{geocode-site.latitude}}"
                longitude: "{{geocode-site.longitude}}"
            - name: create-findings-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "ENV"
                title: "Environmental Assessment: {{project_code}} - {{site_address}}"
                body: "Site coordinates: {{geocode-site.latitude}}, {{geocode-site.longitude}}. EPA facilities within radius: {{query-epa.facility_count}}. Nearest regulated site: {{query-epa.nearest_facility_name}}."
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENV"
                summary: "Environmental review: {{project_code}}"
                description: "Review EPA findings for {{site_address}}. Confluence page: {{create-findings-page.url}}. Facilities found: {{query-epa.facility_count}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: googlemaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        name: key
        in: query
        value: "$secrets.google_maps_api_key"
      resources:
        - name: geocode
          path: "/geocode/json?address={{address}}"
          inputParameters:
            - name: address
              in: query
          operations:
            - name: geocode
              method: GET
    - type: http
      namespace: epa
      baseUri: "https://enviro.epa.gov/enviro/efservice"
      authentication:
        type: apiKey
        name: api_key
        in: query
        value: "$secrets.epa_api_key"
      resources:
        - name: facilities
          path: "/FACILITY_SEARCH/LATITUDE/{{latitude}}/LONGITUDE/{{longitude}}/JSON"
          inputParameters:
            - name: latitude
              in: path
            - name: longitude
              in: path
          operations:
            - name: get-facility-info
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.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

Collects environmental data, runs impact models in Snowflake, generates reports in Power BI, creates regulatory filings, and notifies EHS.

naftiko: "0.5"
info:
  label: "Environmental Impact Assessment Pipeline"
  description: "Collects environmental data, runs impact models in Snowflake, generates reports in Power BI, creates regulatory filings, and notifies EHS."
  tags:
    - environmental
    - snowflake
    - powerbi
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: environmental
      port: 8080
      tools:
        - name: environmental_impact_assessment_pipeline
          description: "Orchestrate environmental impact assessment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Schedules preventive maintenance for construction equipment by retrieving asset data from ServiceNow CMDB, creating a maintenance work order, assigning to a technician via Jira, and notifying the field supervisor via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Equipment Maintenance Scheduler"
  description: "Schedules preventive maintenance for construction equipment by retrieving asset data from ServiceNow CMDB, creating a maintenance work order, assigning to a technician via Jira, and notifying the field supervisor via Microsoft Teams."
  tags:
    - construction
    - servicenow
    - jira
    - microsoft-teams
    - maintenance
    - equipment
capability:
  exposes:
    - type: mcp
      namespace: equipment-maintenance
      port: 8080
      tools:
        - name: schedule-maintenance
          description: "Retrieve equipment data, create a maintenance work order, assign to a technician, and notify the supervisor."
          inputParameters:
            - name: asset_id
              in: body
              type: string
              description: "The ServiceNow CMDB asset identifier."
            - name: maintenance_type
              in: body
              type: string
              description: "The type of maintenance (preventive, corrective, inspection)."
            - name: supervisor_email
              in: body
              type: string
              description: "The field supervisor email."
          steps:
            - name: get-asset
              type: call
              call: "servicenow.get-asset"
              with:
                asset_id: "{{asset_id}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-work-order"
              with:
                asset_id: "{{asset_id}}"
                description: "{{maintenance_type}} maintenance for {{get-asset.name}} ({{get-asset.model}})"
                priority: "medium"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "MAINT"
                summary: "{{maintenance_type}}: {{get-asset.name}}"
                description: "Work Order: {{create-work-order.number}}. Asset: {{get-asset.name}} ({{get-asset.serial_number}}). Location: {{get-asset.location}}."
                issue_type: "Task"
            - name: notify-supervisor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{supervisor_email}}"
                text: "Maintenance scheduled: {{maintenance_type}} for {{get-asset.name}}. Work Order: {{create-work-order.number}}. Jira: {{create-task.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/cmdb_ci/{{asset_id}}"
          inputParameters:
            - name: asset_id
              in: path
          operations:
            - name: get-asset
              method: GET
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors equipment locations and usage from SAP, analyzes utilization in Snowflake, creates maintenance tasks in ServiceNow, and notifies ops.

naftiko: "0.5"
info:
  label: "Field Equipment Tracking Pipeline"
  description: "Monitors equipment locations and usage from SAP, analyzes utilization in Snowflake, creates maintenance tasks in ServiceNow, and notifies ops."
  tags:
    - equipment
    - sap
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: equipment
      port: 8080
      tools:
        - name: field_equipment_tracking_pipeline
          description: "Orchestrate field equipment tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Exports a Figma design file as an image, uploads it to SharePoint for engineering reference, and posts the link to a Slack channel.

naftiko: "0.5"
info:
  label: "Figma Design Asset Export"
  description: "Exports a Figma design file as an image, uploads it to SharePoint for engineering reference, and posts the link to a Slack channel."
  tags:
    - design
    - figma
    - sharepoint
    - slack
capability:
  exposes:
    - type: mcp
      namespace: design-assets
      port: 8080
      tools:
        - name: export-figma-design
          description: "Export a Figma file image, upload to SharePoint, and notify via Slack."
          inputParameters:
            - name: file_key
              in: body
              type: string
              description: "The Figma file key."
            - name: node_id
              in: body
              type: string
              description: "The specific node ID to export."
            - name: project_code
              in: body
              type: string
              description: "The AECOM project code."
          steps:
            - name: export-image
              type: call
              call: "figma.get-image"
              with:
                file_key: "{{file_key}}"
                node_id: "{{node_id}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "design_assets"
                folder_path: "Exports/{{project_code}}"
                file_name: "{{node_id}}.png"
            - name: notify-team
              type: call
              call: "slack.send-message"
              with:
                channel: "design-reviews"
                text: "Figma design exported for {{project_code}}. Image: {{export-image.image_url}}. SharePoint: {{upload-to-sharepoint.url}}"
  consumes:
    - type: http
      namespace: figma
      baseUri: "https://api.figma.com/v1"
      authentication:
        type: bearer
        token: "$secrets.figma_token"
      resources:
        - name: images
          path: "/images/{{file_key}}?ids={{node_id}}"
          inputParameters:
            - name: file_key
              in: path
            - name: node_id
              in: query
          operations:
            - name: get-image
              method: GET
    - 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}}/{{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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Tracks vehicle fleet from SAP, monitors fuel consumption, schedules maintenance in ServiceNow, analyzes utilization in Snowflake, and notifies fleet ops.

naftiko: "0.5"
info:
  label: "Fleet Management Pipeline"
  description: "Tracks vehicle fleet from SAP, monitors fuel consumption, schedules maintenance in ServiceNow, analyzes utilization in Snowflake, and notifies fleet ops."
  tags:
    - fleet
    - sap
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: fleet
      port: 8080
      tools:
        - name: fleet_management_pipeline
          description: "Orchestrate fleet management pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Ingests GIS survey data, processes in Snowflake, generates maps, stores in SharePoint, creates Jira review tasks, and notifies GIS team.

naftiko: "0.5"
info:
  label: "Geospatial Data Processing Pipeline"
  description: "Ingests GIS survey data, processes in Snowflake, generates maps, stores in SharePoint, creates Jira review tasks, and notifies GIS team."
  tags:
    - gis
    - snowflake
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: gis
      port: 8080
      tools:
        - name: geospatial_data_processing_pipeline
          description: "Orchestrate geospatial data processing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Collects spatial field data from an ArcGIS feature service, geocodes reference points via Google Maps, stores processed data in PostgreSQL, and publishes a summary to Confluence.

naftiko: "0.5"
info:
  label: "GIS Data Collection Pipeline"
  description: "Collects spatial field data from an ArcGIS feature service, geocodes reference points via Google Maps, stores processed data in PostgreSQL, and publishes a summary to Confluence."
  tags:
    - geospatial
    - google-maps
    - confluence
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: gis-data-collection
      port: 8080
      tools:
        - name: collect-gis-data
          description: "Retrieve spatial data from ArcGIS, geocode reference points, store results in PostgreSQL, and publish a summary."
          inputParameters:
            - name: feature_service_url
              in: body
              type: string
              description: "The ArcGIS feature service endpoint URL."
            - name: reference_address
              in: body
              type: string
              description: "A reference address to geocode for spatial context."
            - name: project_code
              in: body
              type: string
              description: "The AECOM project code."
          steps:
            - name: query-features
              type: call
              call: "arcgis.query-features"
              with:
                service_url: "{{feature_service_url}}"
            - name: geocode-reference
              type: call
              call: "googlemaps.geocode"
              with:
                address: "{{reference_address}}"
            - name: store-data
              type: call
              call: "postgresql.insert-spatial-data"
              with:
                project_code: "{{project_code}}"
                feature_count: "{{query-features.feature_count}}"
                ref_lat: "{{geocode-reference.latitude}}"
                ref_lng: "{{geocode-reference.longitude}}"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "GIS"
                title: "GIS Data Collection: {{project_code}}"
                body: "Features collected: {{query-features.feature_count}}. Reference point: {{geocode-reference.formatted_address}} ({{geocode-reference.latitude}}, {{geocode-reference.longitude}})."
  consumes:
    - type: http
      namespace: arcgis
      baseUri: "https://services.arcgis.com/aecom"
      authentication:
        type: bearer
        token: "$secrets.arcgis_token"
      resources:
        - name: features
          path: "/{{service_url}}/query?where=1=1&outFields=*&f=json"
          inputParameters:
            - name: service_url
              in: path
          operations:
            - name: query-features
              method: GET
    - type: http
      namespace: googlemaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        name: key
        in: query
        value: "$secrets.google_maps_api_key"
      resources:
        - name: geocode
          path: "/geocode/json?address={{address}}"
          inputParameters:
            - name: address
              in: query
          operations:
            - name: geocode
              method: GET
    - type: http
      namespace: postgresql
      baseUri: "https://aecom-gis-api.azurewebsites.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.gis_api_token"
      resources:
        - name: spatial-data
          path: "/spatial-data"
          operations:
            - name: insert-spatial-data
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves GitHub repository metadata for AECOM.

naftiko: "0.5"
info:
  label: "GitHub Repository Lookup"
  description: "Retrieves GitHub repository metadata for AECOM."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-repo
          description: "Look up repo at AECOM."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The repo_name to look up." 
          call: "github.get-repo_name"
          with:
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github_repository_lookup
              method: GET

Archives completed engineering drawings by moving them from active Google Drive folders to an archive folder, updating metadata, and logging the action in Confluence.

naftiko: "0.5"
info:
  label: "Google Drive Drawing Archive"
  description: "Archives completed engineering drawings by moving them from active Google Drive folders to an archive folder, updating metadata, and logging the action in Confluence."
  tags:
    - document-management
    - google-drive
    - confluence
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: drawing-archive
      port: 8080
      tools:
        - name: archive-drawing
          description: "Move a drawing to the archive folder in Google Drive and log the action in Confluence."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file identifier."
            - name: archive_folder_id
              in: body
              type: string
              description: "The destination archive folder ID."
            - name: project_code
              in: body
              type: string
              description: "The project code for the Confluence log."
          steps:
            - name: get-file
              type: call
              call: "googledrive.get-file"
              with:
                file_id: "{{file_id}}"
            - name: move-file
              type: call
              call: "googledrive.move-file"
              with:
                file_id: "{{file_id}}"
                new_parent: "{{archive_folder_id}}"
            - name: log-archive
              type: call
              call: "confluence.create-page"
              with:
                space_key: "ENGR"
                title: "Archived: {{get-file.name}}"
                body: "Drawing {{get-file.name}} archived from project {{project_code}} on {{move-file.modified_date}}. Original location: {{get-file.parents}}."
  consumes:
    - type: http
      namespace: googledrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET
            - name: move-file
              method: PATCH
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Geocodes a project site address using Google Maps API, returning latitude, longitude, and formatted address for use in GIS and environmental assessments.

naftiko: "0.5"
info:
  label: "Google Maps Geocoding Lookup"
  description: "Geocodes a project site address using Google Maps API, returning latitude, longitude, and formatted address for use in GIS and environmental assessments."
  tags:
    - geospatial
    - google-maps
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: geospatial
      port: 8080
      tools:
        - name: geocode-address
          description: "Geocode a project site address and return coordinates."
          inputParameters:
            - name: address
              in: body
              type: string
              description: "The street address of the project site."
          call: "googlemaps.geocode"
          with:
            address: "{{address}}"
          outputParameters:
            - name: latitude
              type: string
              mapping: "$.results[0].geometry.location.lat"
            - name: longitude
              type: string
              mapping: "$.results[0].geometry.location.lng"
            - name: formatted_address
              type: string
              mapping: "$.results[0].formatted_address"
  consumes:
    - type: http
      namespace: googlemaps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        name: key
        in: query
        value: "$secrets.google_maps_api_key"
      resources:
        - name: geocode
          path: "/geocode/json?address={{address}}"
          inputParameters:
            - name: address
              in: query
          operations:
            - name: geocode
              method: GET

When a Grafana alert fires for infrastructure monitoring, creates a ServiceNow incident and notifies the on-call engineer via Slack with alert details and dashboard link.

naftiko: "0.5"
info:
  label: "Grafana Alert Integration"
  description: "When a Grafana alert fires for infrastructure monitoring, creates a ServiceNow incident and notifies the on-call engineer via Slack with alert details and dashboard link."
  tags:
    - monitoring
    - grafana
    - servicenow
    - slack
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: alert-management
      port: 8080
      tools:
        - name: process-grafana-alert
          description: "Process a Grafana alert by creating a ServiceNow incident and notifying the on-call engineer."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Grafana alert rule identifier."
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
            - name: oncall_channel
              in: body
              type: string
              description: "The Slack on-call channel name."
          steps:
            - name: get-alert
              type: call
              call: "grafana.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Grafana Alert: {{get-alert.name}}"
                category: "infrastructure_monitoring"
                priority: "{{get-alert.severity}}"
                description: "Alert: {{get-alert.name}}. State: {{get-alert.state}}. Dashboard: https://aecom-grafana.azurewebsites.net/d/{{dashboard_uid}}"
            - name: notify-oncall
              type: call
              call: "slack.send-message"
              with:
                channel: "{{oncall_channel}}"
                text: "ALERT [{{get-alert.severity}}]: {{get-alert.name}}. State: {{get-alert.state}}. ServiceNow: {{create-incident.number}}. Dashboard: https://aecom-grafana.azurewebsites.net/d/{{dashboard_uid}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://aecom-grafana.azurewebsites.net/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: alerts
          path: "/v1/provisioning/alert-rules/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Queries Grafana dashboard data for AECOM monitoring.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Query"
  description: "Queries Grafana dashboard data for AECOM monitoring."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-dashboard
          description: "Query dashboard at AECOM."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The dashboard_uid to look up." 
          call: "grafana.get-dashboard_uid"
          with:
            dashboard_uid: "{{dashboard_uid}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://aecom-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana_dashboard_query
              method: GET

When a qualified lead arrives in HubSpot, retrieves the contact details, creates a Salesforce opportunity, and notifies the business development team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce Opportunity Sync"
  description: "When a qualified lead arrives in HubSpot, retrieves the contact details, creates a Salesforce opportunity, and notifies the business development team via Microsoft Teams."
  tags:
    - business-development
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-management
      port: 8080
      tools:
        - name: sync-lead-to-opportunity
          description: "Pull a HubSpot contact, create a Salesforce opportunity, and notify BD via Teams."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
            - name: deal_amount
              in: body
              type: number
              description: "The estimated deal amount."
            - name: bd_channel_id
              in: body
              type: string
              description: "The Teams channel ID for business development."
          steps:
            - name: get-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{contact_id}}"
            - name: create-opportunity
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "{{get-contact.company}} - Infrastructure Project"
                amount: "{{deal_amount}}"
                stage: "Prospecting"
                contact_name: "{{get-contact.firstname}} {{get-contact.lastname}}"
            - name: notify-bd
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{bd_channel_id}}"
                text: "New opportunity from HubSpot lead: {{get-contact.company}} (${{deal_amount}}). Contact: {{get-contact.firstname}} {{get-contact.lastname}}. Salesforce: {{create-opportunity.url}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              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/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Collects inspection data, assesses condition ratings in Snowflake, prioritizes maintenance in Jira, updates asset registry, and notifies ops.

naftiko: "0.5"
info:
  label: "Infrastructure Asset Condition Pipeline"
  description: "Collects inspection data, assesses condition ratings in Snowflake, prioritizes maintenance in Jira, updates asset registry, and notifies ops."
  tags:
    - asset-management
    - snowflake
    - jira
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: asset-management
      port: 8080
      tools:
        - name: infrastructure_asset_condition_pipeline
          description: "Orchestrate infrastructure asset condition pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers a Terraform deployment through Azure DevOps, monitors the pipeline run, logs the result in ServiceNow as a change record, and notifies the DevOps team in Slack.

naftiko: "0.5"
info:
  label: "Infrastructure Terraform Deployment Pipeline"
  description: "Triggers a Terraform deployment through Azure DevOps, monitors the pipeline run, logs the result in ServiceNow as a change record, and notifies the DevOps team in Slack."
  tags:
    - infrastructure
    - azure-devops
    - servicenow
    - slack
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: infra-deployment
      port: 8080
      tools:
        - name: deploy-infrastructure
          description: "Trigger a Terraform deployment via Azure DevOps, log the change in ServiceNow, and notify the team."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline definition ID."
            - name: environment
              in: body
              type: string
              description: "Target environment (dev, staging, production)."
            - name: change_description
              in: body
              type: string
              description: "Description of the infrastructure change."
          steps:
            - name: trigger-pipeline
              type: call
              call: "azuredevops.queue-build"
              with:
                definition_id: "{{pipeline_id}}"
                parameters: "{\"environment\": \"{{environment}}\"}"
            - name: create-change-record
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Terraform deployment: {{change_description}}"
                category: "infrastructure"
                environment: "{{environment}}"
                build_id: "{{trigger-pipeline.build_id}}"
            - name: notify-devops
              type: call
              call: "slack.send-message"
              with:
                channel: "infra-deployments"
                text: "Terraform deployment triggered for {{environment}}. Build: {{trigger-pipeline.build_number}}. Change: {{create-change-record.number}}. Description: {{change_description}}"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/aecom"
      authentication:
        type: basic
        username: "$secrets.azdo_user"
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/infrastructure/_apis/build/builds?api-version=7.0"
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Looks up a Jira issue by key and returns its current status, assignee, priority, and linked epic for engineering task tracking.

naftiko: "0.5"
info:
  label: "Jira Engineering Issue Status"
  description: "Looks up a Jira issue by key and returns its current status, assignee, priority, and linked epic for engineering task tracking."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: issue-tracking
      port: 8080
      tools:
        - name: get-issue-status
          description: "Retrieve a Jira issue by key and return its status, assignee, priority, and epic link."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g. INFRA-1234)."
          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: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.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

Retrieves Jira issue status for AECOM engineering teams.

naftiko: "0.5"
info:
  label: "Jira Issue Status"
  description: "Retrieves Jira issue status for AECOM engineering teams."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-issue
          description: "Look up Jira issue at AECOM."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The issue_key to look up." 
          call: "jira.get-issue_key"
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira_issue_status
              method: GET

Consolidates JV financial data from Oracle, allocates costs in Snowflake, generates partner reports in Power BI, and notifies JV management.

naftiko: "0.5"
info:
  label: "Joint Venture Reporting Pipeline"
  description: "Consolidates JV financial data from Oracle, allocates costs in Snowflake, generates partner reports in Power BI, and notifies JV management."
  tags:
    - finance
    - oracle
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: joint_venture_reporting_pipeline
          description: "Orchestrate joint venture reporting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Creates purchase requisitions in SAP, tracks approvals, monitors delivery in Oracle, updates project schedule, and notifies procurement.

naftiko: "0.5"
info:
  label: "Material Procurement Pipeline"
  description: "Creates purchase requisitions in SAP, tracks approvals, monitors delivery in Oracle, updates project schedule, and notifies procurement."
  tags:
    - procurement
    - sap
    - oracle
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: material_procurement_pipeline
          description: "Orchestrate material procurement pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-oracle
              type: call
              call: "oracle.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves MATLAB simulation output from Amazon S3, creates a summary page in Confluence, uploads the raw data to SharePoint, and notifies the engineering team via Slack.

naftiko: "0.5"
info:
  label: "MATLAB Simulation Results Publisher"
  description: "Retrieves MATLAB simulation output from Amazon S3, creates a summary page in Confluence, uploads the raw data to SharePoint, and notifies the engineering team via Slack."
  tags:
    - engineering
    - matlab
    - amazon-s3
    - confluence
    - sharepoint
    - slack
capability:
  exposes:
    - type: mcp
      namespace: simulation-publishing
      port: 8080
      tools:
        - name: publish-simulation-results
          description: "Retrieve MATLAB results from S3, create a Confluence summary, archive to SharePoint, and notify the team."
          inputParameters:
            - name: s3_bucket
              in: body
              type: string
              description: "The S3 bucket name."
            - name: s3_key
              in: body
              type: string
              description: "The S3 object key for the results file."
            - name: project_code
              in: body
              type: string
              description: "The AECOM project code."
          steps:
            - name: get-results
              type: call
              call: "s3.get-object"
              with:
                bucket: "{{s3_bucket}}"
                key: "{{s3_key}}"
            - name: create-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "ENGR"
                title: "Simulation Results: {{project_code}} - {{s3_key}}"
                body: "MATLAB simulation completed. File: {{s3_key}}. Size: {{get-results.content_length}}. Last modified: {{get-results.last_modified}}."
            - name: archive-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "engineering_archive"
                folder_path: "Simulations/{{project_code}}"
                file_name: "{{s3_key}}"
            - name: notify-team
              type: call
              call: "slack.send-message"
              with:
                channel: "engineering-simulations"
                text: "MATLAB simulation results published for {{project_code}}. Confluence: {{create-summary.url}}. Archive: {{archive-to-sharepoint.url}}"
  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
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              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}}/{{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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Generates a project cost report by pulling data from Oracle EBS, writing to a Google Sheets workbook, exporting as Excel, uploading to SharePoint, and emailing via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Microsoft Excel Cost Report Generator"
  description: "Generates a project cost report by pulling data from Oracle EBS, writing to a Google Sheets workbook, exporting as Excel, uploading to SharePoint, and emailing via Microsoft Outlook."
  tags:
    - finance
    - oracle-e-business-suite
    - google-sheets
    - sharepoint
    - microsoft-outlook
    - microsoft-excel
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: cost-reporting
      port: 8080
      tools:
        - name: generate-cost-report
          description: "Pull cost data from Oracle EBS, write to Google Sheets, upload to SharePoint, and email the report."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for the template."
            - name: recipient_email
              in: body
              type: string
              description: "The email address to send the report to."
          steps:
            - name: get-costs
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_number: "{{project_number}}"
            - name: update-sheet
              type: call
              call: "googlesheets.update-cells"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "CostReport!A2:E2"
                values: "[[\"{{project_number}}\", \"{{get-costs.budget_amount}}\", \"{{get-costs.actual_costs}}\", \"{{get-costs.committed_costs}}\", \"{{get-costs.variance_percent}}\"]]"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "finance_reports"
                folder_path: "CostReports/{{project_number}}"
                file_name: "cost_report_{{project_number}}.xlsx"
            - name: send-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{recipient_email}}"
                subject: "Cost Report: Project {{project_number}}"
                body: "Budget: ${{get-costs.budget_amount}}. Actuals: ${{get-costs.actual_costs}}. Variance: {{get-costs.variance_percent}}%. Report: {{upload-report.url}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-cells
              method: PUT
    - 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}}/{{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/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Synchronizes a Microsoft Planner task to Jira by reading the Planner task details, creating a corresponding Jira issue, and posting a link back to the Planner task via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Microsoft Planner Task Sync to Jira"
  description: "Synchronizes a Microsoft Planner task to Jira by reading the Planner task details, creating a corresponding Jira issue, and posting a link back to the Planner task via Microsoft Teams."
  tags:
    - project-management
    - microsoft-planner
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: task-sync
      port: 8080
      tools:
        - name: sync-planner-to-jira
          description: "Read a Planner task, create a Jira issue, and post the cross-reference link to Teams."
          inputParameters:
            - name: planner_task_id
              in: body
              type: string
              description: "The Microsoft Planner task identifier."
            - name: jira_project_key
              in: body
              type: string
              description: "The target Jira project key."
            - name: notify_email
              in: body
              type: string
              description: "The email to notify via Teams."
          steps:
            - name: get-planner-task
              type: call
              call: "planner.get-task"
              with:
                task_id: "{{planner_task_id}}"
            - name: create-jira-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                summary: "{{get-planner-task.title}}"
                description: "Synced from Planner. Due: {{get-planner-task.due_date}}. Assigned: {{get-planner-task.assignee}}."
                issue_type: "Task"
            - name: notify-user
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{notify_email}}"
                text: "Planner task '{{get-planner-task.title}}' synced to Jira as {{create-jira-issue.key}}."
  consumes:
    - type: http
      namespace: planner
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/tasks/{{task_id}}"
          inputParameters:
            - name: task_id
              in: path
          operations:
            - name: get-task
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Syncs project milestone data from Microsoft Project into a Notion database page, keeping the project wiki current for stakeholder access.

naftiko: "0.5"
info:
  label: "Notion Project Wiki Sync"
  description: "Syncs project milestone data from Microsoft Project into a Notion database page, keeping the project wiki current for stakeholder access."
  tags:
    - project-management
    - notion
    - microsoft-project
capability:
  exposes:
    - type: mcp
      namespace: wiki-sync
      port: 8080
      tools:
        - name: sync-milestones-to-notion
          description: "Pull milestones from Microsoft Project and update a Notion database page."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Microsoft Project GUID."
            - name: notion_database_id
              in: body
              type: string
              description: "The Notion database identifier."
          steps:
            - name: get-milestones
              type: call
              call: "msproject.get-tasks"
              with:
                project_id: "{{project_id}}"
                filter: "milestone"
            - name: update-notion
              type: call
              call: "notion.create-page"
              with:
                database_id: "{{notion_database_id}}"
                title: "Project Milestones Update"
                properties: "{\"Next Milestone\": \"{{get-milestones.next_milestone_name}}\", \"Due Date\": \"{{get-milestones.next_milestone_date}}\", \"Percent Complete\": \"{{get-milestones.overall_percent}}\"}"
  consumes:
    - type: http
      namespace: msproject
      baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "('{{project_id}}')/Tasks?$filter={{filter}}"
          inputParameters:
            - name: project_id
              in: path
            - name: filter
              in: query
          operations:
            - name: get-tasks
              method: GET
    - type: http
      namespace: notion
      baseUri: "https://api.notion.com/v1"
      authentication:
        type: bearer
        token: "$secrets.notion_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST

Retrieves Okta user profile for AECOM identity management.

naftiko: "0.5"
info:
  label: "Okta User Profile Lookup"
  description: "Retrieves Okta user profile for AECOM identity management."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Look up user at AECOM."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user_email to look up." 
          call: "okta.get-user_email"
          with:
            user_email: "{{user_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://aecom.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta_user_profile_lookup
              method: GET

Retrieves a document from SharePoint, sends the content to OpenAI for summarization, posts the summary to a Confluence page, and notifies the requestor via Slack.

naftiko: "0.5"
info:
  label: "OpenAI Document Summarizer"
  description: "Retrieves a document from SharePoint, sends the content to OpenAI for summarization, posts the summary to a Confluence page, and notifies the requestor via Slack."
  tags:
    - artificial-intelligence
    - openai
    - sharepoint
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ai-document-processing
      port: 8080
      tools:
        - name: summarize-document
          description: "Retrieve a document from SharePoint, summarize via OpenAI, publish to Confluence, and notify."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site identifier."
            - name: file_path
              in: body
              type: string
              description: "The path to the document."
            - name: requestor_email
              in: body
              type: string
              description: "The requestor Slack email."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-file-content"
              with:
                site_id: "{{site_id}}"
                file_path: "{{file_path}}"
            - name: summarize
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4"
                prompt: "Summarize the following engineering document in 3-5 bullet points: {{get-document.content}}"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "DOCS"
                title: "Summary: {{file_path}}"
                body: "{{summarize.text}}"
            - name: notify-requestor
              type: call
              call: "slack.send-message"
              with:
                channel: "document-summaries"
                text: "Document summarized: {{file_path}}. Summary: {{publish-summary.url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: file-content
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Retrieves project cost summary from Oracle E-Business Suite for a given project number, returning budget, actuals, and committed costs.

naftiko: "0.5"
info:
  label: "Oracle EBS Project Cost Lookup"
  description: "Retrieves project cost summary from Oracle E-Business Suite for a given project number, returning budget, actuals, and committed costs."
  tags:
    - finance
    - oracle
    - oracle-e-business-suite
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: project-finance
      port: 8080
      tools:
        - name: get-project-costs
          description: "Look up project cost data from Oracle EBS by project number."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle project number."
          call: "oracle-ebs.get-project-costs"
          with:
            project_number: "{{project_number}}"
          outputParameters:
            - name: budget_amount
              type: string
              mapping: "$.BudgetAmount"
            - name: actual_costs
              type: string
              mapping: "$.ActualCosts"
            - name: committed_costs
              type: string
              mapping: "$.CommittedCosts"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET

Retrieves PagerDuty incident details for AECOM on-call teams.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Details"
  description: "Retrieves PagerDuty incident details for AECOM on-call teams."
  tags:
    - devops
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: get-incident
          description: "Look up incident at AECOM."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The incident_id to look up." 
          call: "pagerduty.get-incident_id"
          with:
            incident_id: "{{incident_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty_incident_details
              method: GET

Orchestrates a permit application workflow by compiling project data from Oracle EBS, generating the application document in Google Docs, uploading to SharePoint, and tracking in Jira.

naftiko: "0.5"
info:
  label: "Permit Application Orchestrator"
  description: "Orchestrates a permit application workflow by compiling project data from Oracle EBS, generating the application document in Google Docs, uploading to SharePoint, and tracking in Jira."
  tags:
    - compliance
    - oracle-e-business-suite
    - google-docs
    - sharepoint
    - jira
    - permits
capability:
  exposes:
    - type: mcp
      namespace: permit-management
      port: 8080
      tools:
        - name: prepare-permit-application
          description: "Compile project data, generate application document, upload to SharePoint, and create a Jira tracking issue."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: permit_type
              in: body
              type: string
              description: "The type of permit (e.g., environmental, building, land-use)."
            - name: site_address
              in: body
              type: string
              description: "The project site address."
          steps:
            - name: get-project-data
              type: call
              call: "oracle-ebs.get-project"
              with:
                project_number: "{{project_number}}"
            - name: create-application
              type: call
              call: "googledocs.create-document"
              with:
                title: "Permit Application: {{permit_type}} - {{get-project-data.project_name}}"
                body: "Project: {{get-project-data.project_name}}. Address: {{site_address}}. Type: {{permit_type}}. Client: {{get-project-data.client_name}}."
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "permits_site"
                folder_path: "Applications/{{project_number}}"
                file_name: "{{permit_type}}_application.docx"
            - name: create-tracking-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PERMIT"
                summary: "{{permit_type}} permit: {{get-project-data.project_name}}"
                description: "Permit application prepared. Document: {{upload-to-sharepoint.url}}. Address: {{site_address}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: projects
          path: "/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: googledocs
      baseUri: "https://docs.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_docs_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: create-document
              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}}/{{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://aecom.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

Tracks permit applications and approvals, monitors deadlines in Jira, creates escalations in ServiceNow, and notifies project compliance team.

naftiko: "0.5"
info:
  label: "Permit Tracking Orchestrator"
  description: "Tracks permit applications and approvals, monitors deadlines in Jira, creates escalations in ServiceNow, and notifies project compliance team."
  tags:
    - permits
    - jira
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: permits
      port: 8080
      tools:
        - name: permit_tracking_orchestrator
          description: "Orchestrate permit tracking orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers Power BI dataset refresh for AECOM reporting.

naftiko: "0.5"
info:
  label: "Power BI Refresh Trigger"
  description: "Triggers Power BI dataset refresh for AECOM reporting."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: trigger-refresh
          description: "Trigger refresh at AECOM."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The dataset_id to look up." 
          call: "powerbi.get-dataset_id"
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: power_bi_refresh_trigger
              method: GET

Retrieves budget and actual costs from Oracle EBS, compares variances, updates a Google Sheets tracker, and alerts the project controller via Microsoft Outlook if variance exceeds threshold.

naftiko: "0.5"
info:
  label: "Project Budget Variance Reporter"
  description: "Retrieves budget and actual costs from Oracle EBS, compares variances, updates a Google Sheets tracker, and alerts the project controller via Microsoft Outlook if variance exceeds threshold."
  tags:
    - finance
    - oracle-e-business-suite
    - google-sheets
    - microsoft-outlook
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: budget-variance
      port: 8080
      tools:
        - name: check-budget-variance
          description: "Compare budget vs actuals from Oracle EBS, update the Google Sheets tracker, and alert the controller if variance exceeds threshold."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
            - name: variance_threshold
              in: body
              type: number
              description: "The variance percentage threshold to trigger an alert."
            - name: controller_email
              in: body
              type: string
              description: "The project controller email."
          steps:
            - name: get-costs
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_number: "{{project_number}}"
            - name: update-tracker
              type: call
              call: "googlesheets.update-cells"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Budget!A2:D2"
                values: "[[\"{{project_number}}\", \"{{get-costs.budget_amount}}\", \"{{get-costs.actual_costs}}\", \"{{get-costs.variance_percent}}\"]]"
            - name: send-alert
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{controller_email}}"
                subject: "Budget Variance Alert: Project {{project_number}}"
                body: "Project {{project_number}} has a budget variance of {{get-costs.variance_percent}}%. Budget: ${{get-costs.budget_amount}}. Actuals: ${{get-costs.actual_costs}}. Committed: ${{get-costs.committed_costs}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-cells
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Validates closeout requirements in Jira, confirms financial settlement in Oracle, archives documents, logs in ServiceNow, and notifies team.

naftiko: "0.5"
info:
  label: "Project Closeout Checklist Pipeline"
  description: "Validates closeout requirements in Jira, confirms financial settlement in Oracle, archives documents, logs in ServiceNow, and notifies team."
  tags:
    - closeout
    - jira
    - oracle
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: closeout
      port: 8080
      tools:
        - name: project_closeout_checklist_pipeline
          description: "Orchestrate project closeout checklist pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-oracle
              type: call
              call: "oracle.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Orchestrates project closeout by archiving project documents in Box, closing the Oracle EBS project, updating the Salesforce opportunity to Closed Won, notifying stakeholders via Microsoft Teams, and creating a Confluence lessons-learned page.

naftiko: "0.5"
info:
  label: "Project Closeout Orchestrator"
  description: "Orchestrates project closeout by archiving project documents in Box, closing the Oracle EBS project, updating the Salesforce opportunity to Closed Won, notifying stakeholders via Microsoft Teams, and creating a Confluence lessons-learned page."
  tags:
    - project-management
    - box
    - oracle-e-business-suite
    - salesforce
    - microsoft-teams
    - confluence
    - project-closeout
capability:
  exposes:
    - type: mcp
      namespace: project-closeout
      port: 8080
      tools:
        - name: close-project
          description: "Execute the project closeout workflow across document archival, financial close, CRM update, notification, and knowledge capture."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
            - name: box_folder_id
              in: body
              type: string
              description: "The Box folder ID for archival."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel for notification."
          steps:
            - name: archive-docs
              type: call
              call: "box.lock-folder"
              with:
                folder_id: "{{box_folder_id}}"
                lock_type: "archive"
            - name: close-oracle-project
              type: call
              call: "oracle-ebs.close-project"
              with:
                project_number: "{{project_number}}"
            - name: update-salesforce
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                stage: "Closed Won"
            - name: create-lessons-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "PM"
                title: "Lessons Learned: Project {{project_number}}"
                body: "Project {{project_number}} closed on {{close-oracle-project.close_date}}. Final cost: ${{close-oracle-project.final_cost}}. Template for team retrospective."
            - name: notify-stakeholders
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Project {{project_number}} closed. Documents archived. Lessons learned: {{create-lessons-page.url}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: lock-folder
              method: PUT
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: projects
          path: "/{{project_number}}/close"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: close-project
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.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: update-opportunity
              method: PATCH
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Aggregates updates from Jira, ServiceNow, and Confluence, generates weekly digest in Power BI, and distributes to project stakeholders.

naftiko: "0.5"
info:
  label: "Project Communication Digest"
  description: "Aggregates updates from Jira, ServiceNow, and Confluence, generates weekly digest in Power BI, and distributes to project stakeholders."
  tags:
    - communications
    - jira
    - servicenow
    - confluence
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: communications
      port: 8080
      tools:
        - name: project_communication_digest
          description: "Orchestrate project communication digest workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST

Monitors project costs in Oracle EBS, detects overruns in Snowflake, creates alerts in Jira, updates Power BI dashboards, and notifies project managers.

naftiko: "0.5"
info:
  label: "Project Cost Overrun Detector"
  description: "Monitors project costs in Oracle EBS, detects overruns in Snowflake, creates alerts in Jira, updates Power BI dashboards, and notifies project managers."
  tags:
    - project-management
    - oracle
    - snowflake
    - jira
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: project_cost_overrun_detector
          description: "Orchestrate project cost overrun detector workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Manages document revisions in SharePoint, tracks review status in Jira, ensures compliance, logs transmittals in ServiceNow, and notifies teams.

naftiko: "0.5"
info:
  label: "Project Document Control Pipeline"
  description: "Manages document revisions in SharePoint, tracks review status in Jira, ensures compliance, logs transmittals in ServiceNow, and notifies teams."
  tags:
    - document-control
    - jira
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: document-control
      port: 8080
      tools:
        - name: project_document_control_pipeline
          description: "Orchestrate project document control pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Calculates earned value metrics from Oracle project actuals, compares against baseline, generates EVM reports in Power BI, and notifies project controls.

naftiko: "0.5"
info:
  label: "Project Earned Value Analysis"
  description: "Calculates earned value metrics from Oracle project actuals, compares against baseline, generates EVM reports in Power BI, and notifies project controls."
  tags:
    - project-controls
    - earned-value
    - oracle
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: project-controls
      port: 8080
      tools:
        - name: project_earned_value_analysis
          description: "Orchestrate project earned value analysis workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Extracts actuals from Oracle, runs forecast models in Snowflake, updates Power BI projections, creates variance alerts, and notifies finance.

naftiko: "0.5"
info:
  label: "Project Financial Forecasting Pipeline"
  description: "Extracts actuals from Oracle, runs forecast models in Snowflake, updates Power BI projections, creates variance alerts, and notifies finance."
  tags:
    - finance
    - oracle
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: project_financial_forecasting_pipeline
          description: "Orchestrate project financial forecasting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Analyzes resource needs from Jira, checks availability in Workday, creates staffing requests, updates project plans, and notifies managers.

naftiko: "0.5"
info:
  label: "Project Resource Planning Pipeline"
  description: "Analyzes resource needs from Jira, checks availability in Workday, creates staffing requests, updates project plans, and notifies managers."
  tags:
    - resource-planning
    - jira
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: resource-planning
      port: 8080
      tools:
        - name: project_resource_planning_pipeline
          description: "Orchestrate project resource planning pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-workday
              type: call
              call: "workday.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Collects risks from Jira, scores in Snowflake, updates risk matrix in Power BI, creates mitigation tasks, and notifies project leadership.

naftiko: "0.5"
info:
  label: "Project Risk Register Pipeline"
  description: "Collects risks from Jira, scores in Snowflake, updates risk matrix in Power BI, creates mitigation tasks, and notifies project leadership."
  tags:
    - risk
    - jira
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: risk
      port: 8080
      tools:
        - name: project_risk_register_pipeline
          description: "Orchestrate project risk register pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Retrieves the current schedule status of an infrastructure project from Microsoft Project, returning milestone dates, percent complete, and critical path items.

naftiko: "0.5"
info:
  label: "Project Schedule Status Lookup"
  description: "Retrieves the current schedule status of an infrastructure project from Microsoft Project, returning milestone dates, percent complete, and critical path items."
  tags:
    - project-management
    - microsoft-project
capability:
  exposes:
    - type: mcp
      namespace: project-scheduling
      port: 8080
      tools:
        - name: get-project-schedule
          description: "Look up a Microsoft Project schedule by project ID and return milestone summary, percent complete, and next critical milestone."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Microsoft Project Online project GUID."
          call: "msproject.get-project"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: project_name
              type: string
              mapping: "$.d.ProjectName"
            - name: percent_complete
              type: string
              mapping: "$.d.PercentComplete"
            - name: finish_date
              type: string
              mapping: "$.d.FinishDate"
  consumes:
    - type: http
      namespace: msproject
      baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: projects
          path: "('{{project_id}}')"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET

When a project needs additional staff, retrieves project details from Oracle EBS, searches Workday for available engineers, creates an Asana task for HR coordination, and notifies the resource manager via Slack.

naftiko: "0.5"
info:
  label: "Project Staffing Request Pipeline"
  description: "When a project needs additional staff, retrieves project details from Oracle EBS, searches Workday for available engineers, creates an Asana task for HR coordination, and notifies the resource manager via Slack."
  tags:
    - hr
    - workday
    - oracle-e-business-suite
    - asana
    - slack
    - resource-management
capability:
  exposes:
    - type: mcp
      namespace: resource-staffing
      port: 8080
      tools:
        - name: request-project-staff
          description: "Orchestrate a staffing request by pulling project data, searching for available engineers in Workday, creating an HR task, and notifying the resource manager."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: role_title
              in: body
              type: string
              description: "The required role title (e.g., Senior Structural Engineer)."
            - name: resource_manager_email
              in: body
              type: string
              description: "The Slack email of the resource manager."
          steps:
            - name: get-project
              type: call
              call: "oracle-ebs.get-project"
              with:
                project_number: "{{project_number}}"
            - name: search-engineers
              type: call
              call: "workday.search-workers"
              with:
                job_title: "{{role_title}}"
                availability: "true"
            - name: create-hr-task
              type: call
              call: "asana.create-task"
              with:
                project_gid: "staffing_requests"
                name: "Staff request: {{role_title}} for {{get-project.project_name}}"
                notes: "Project: {{get-project.project_name}} ({{project_number}}). Role: {{role_title}}. Available candidates: {{search-engineers.count}}."
            - name: notify-manager
              type: call
              call: "slack.send-message"
              with:
                channel: "resource-management"
                text: "Staffing request for {{role_title}} on {{get-project.project_name}}. {{search-engineers.count}} candidates available. Asana task: {{create-hr-task.url}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: projects
          path: "/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers?jobTitle={{job_title}}&available={{availability}}"
          inputParameters:
            - name: job_title
              in: query
            - name: availability
              in: query
          operations:
            - name: search-workers
              method: GET
    - type: http
      namespace: asana
      baseUri: "https://app.asana.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.asana_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Generates a project proposal by pulling opportunity data from Salesforce, retrieving past project references from Confluence, creating a draft in Google Docs, and notifying the proposal lead via Slack.

naftiko: "0.5"
info:
  label: "Proposal Generation Workflow"
  description: "Generates a project proposal by pulling opportunity data from Salesforce, retrieving past project references from Confluence, creating a draft in Google Docs, and notifying the proposal lead via Slack."
  tags:
    - business-development
    - salesforce
    - confluence
    - google-docs
    - slack
    - proposal
capability:
  exposes:
    - type: mcp
      namespace: proposal-management
      port: 8080
      tools:
        - name: generate-proposal
          description: "Orchestrate proposal generation by pulling CRM data, past project references, creating a draft document, and notifying the proposal lead."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
            - name: reference_space_key
              in: body
              type: string
              description: "The Confluence space key containing project references."
            - name: proposal_lead_email
              in: body
              type: string
              description: "The proposal lead email for Slack notification."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: search-references
              type: call
              call: "confluence.search-content"
              with:
                space_key: "{{reference_space_key}}"
                query: "{{get-opportunity.account_name}} {{get-opportunity.project_type}}"
            - name: create-draft
              type: call
              call: "googledocs.create-document"
              with:
                title: "Proposal: {{get-opportunity.name}}"
                body: "Client: {{get-opportunity.account_name}}. Value: ${{get-opportunity.amount}}. Scope: {{get-opportunity.description}}. References: {{search-references.results_summary}}."
            - name: notify-lead
              type: call
              call: "slack.send-message"
              with:
                channel: "proposals"
                text: "Proposal draft created for {{get-opportunity.name}} (${{get-opportunity.amount}}). Doc: {{create-draft.url}}. {{search-references.total_results}} reference projects found."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.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-opportunity
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql=space={{space_key}}+and+text~\"{{query}}\""
          inputParameters:
            - name: space_key
              in: query
            - name: query
              in: query
          operations:
            - name: search-content
              method: GET
    - type: http
      namespace: googledocs
      baseUri: "https://docs.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_docs_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Schedules inspections from Jira, collects results, validates against specifications, creates NCRs in ServiceNow, and notifies quality team.

naftiko: "0.5"
info:
  label: "Quality Inspection Orchestrator"
  description: "Schedules inspections from Jira, collects results, validates against specifications, creates NCRs in ServiceNow, and notifies quality team."
  tags:
    - quality
    - jira
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: quality_inspection_orchestrator
          description: "Orchestrate quality inspection orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a construction quality inspection is completed in the field, creates a ServiceNow record, updates the Jira quality tracking board, uploads inspection photos to Box, and notifies the QA manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Quality Inspection Workflow"
  description: "When a construction quality inspection is completed in the field, creates a ServiceNow record, updates the Jira quality tracking board, uploads inspection photos to Box, and notifies the QA manager via Microsoft Teams."
  tags:
    - construction
    - quality-assurance
    - servicenow
    - jira
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-management
      port: 8080
      tools:
        - name: process-quality-inspection
          description: "Record a quality inspection in ServiceNow, update Jira tracking, upload photos, and notify the QA manager."
          inputParameters:
            - name: inspection_type
              in: body
              type: string
              description: "The type of inspection (e.g., concrete, structural, electrical)."
            - name: result
              in: body
              type: string
              description: "Inspection result (pass, fail, conditional)."
            - name: project_number
              in: body
              type: string
              description: "The project number."
            - name: qa_manager_email
              in: body
              type: string
              description: "The QA manager email."
          steps:
            - name: create-snow-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "quality_inspection"
                inspection_type: "{{inspection_type}}"
                result: "{{result}}"
                project: "{{project_number}}"
            - name: update-jira
              type: call
              call: "jira.create-issue"
              with:
                project_key: "QA"
                summary: "Inspection: {{inspection_type}} - {{result}}"
                description: "Project: {{project_number}}. Result: {{result}}. ServiceNow: {{create-snow-record.number}}."
                issue_type: "Task"
            - name: create-photo-folder
              type: call
              call: "box.create-folder"
              with:
                parent_id: "inspection_photos"
                name: "{{create-snow-record.number}}_{{inspection_type}}"
            - name: notify-qa
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{qa_manager_email}}"
                text: "Quality inspection [{{result}}]: {{inspection_type}} on project {{project_number}}. ServiceNow: {{create-snow-record.number}}. Jira: {{update-jira.key}}. Photos: {{create-photo-folder.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aecom.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: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Tracks regulatory submittals in Jira, monitors deadlines, creates escalations, logs status in ServiceNow, and notifies regulatory team.

naftiko: "0.5"
info:
  label: "Regulatory Submittal Tracking Pipeline"
  description: "Tracks regulatory submittals in Jira, monitors deadlines, creates escalations, logs status in ServiceNow, and notifies regulatory team."
  tags:
    - regulatory
    - jira
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: regulatory
      port: 8080
      tools:
        - name: regulatory_submittal_tracking_pipeline
          description: "Orchestrate regulatory submittal tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a safety incident is reported on site, creates a ServiceNow incident, logs the event in Oracle EBS, uploads documentation to SharePoint, and notifies the safety officer and project manager via Slack.

naftiko: "0.5"
info:
  label: "Safety Incident Reporting Pipeline"
  description: "When a safety incident is reported on site, creates a ServiceNow incident, logs the event in Oracle EBS, uploads documentation to SharePoint, and notifies the safety officer and project manager via Slack."
  tags:
    - safety
    - servicenow
    - oracle-e-business-suite
    - sharepoint
    - slack
    - construction
capability:
  exposes:
    - type: mcp
      namespace: safety-management
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Process a safety incident by creating a ServiceNow ticket, logging in Oracle, uploading docs, and notifying key personnel."
          inputParameters:
            - name: incident_description
              in: body
              type: string
              description: "Description of the safety incident."
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: severity
              in: body
              type: string
              description: "Incident severity (critical, high, medium, low)."
            - name: safety_officer_email
              in: body
              type: string
              description: "The Slack email of the safety officer."
          steps:
            - name: create-snow-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety Incident: {{incident_description}}"
                category: "safety"
                priority: "{{severity}}"
                assigned_group: "EHS_Safety"
            - name: log-oracle-event
              type: call
              call: "oracle-ebs.create-safety-event"
              with:
                project_number: "{{project_number}}"
                description: "{{incident_description}}"
                severity: "{{severity}}"
            - name: create-doc-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "safety_records"
                folder_path: "Incidents/{{create-snow-incident.number}}"
            - name: notify-safety-team
              type: call
              call: "slack.send-message"
              with:
                channel: "safety-alerts"
                text: "SAFETY INCIDENT [{{severity}}]: {{incident_description}}. Project: {{project_number}}. ServiceNow: {{create-snow-incident.number}}. Docs: {{create-doc-folder.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.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: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: safety-events
          path: "/safety-events"
          operations:
            - name: create-safety-event
              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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Monitors training completion from Workday, checks certifications, creates escalation tasks in ServiceNow, and notifies safety management.

naftiko: "0.5"
info:
  label: "Safety Training Compliance Tracker"
  description: "Monitors training completion from Workday, checks certifications, creates escalation tasks in ServiceNow, and notifies safety management."
  tags:
    - safety
    - workday
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: safety_training_compliance_tracker
          description: "Orchestrate safety training compliance tracker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves Salesforce account details for AECOM sales teams.

naftiko: "0.5"
info:
  label: "Salesforce Account Info"
  description: "Retrieves Salesforce account details for AECOM sales teams."
  tags:
    - crm
    - salesforce
    - accounts
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up account at AECOM."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The account_id to look up." 
          call: "salesforce.get-account_id"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce_account_info
              method: GET

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for business development tracking of infrastructure projects.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for business development tracking of infrastructure projects."
  tags:
    - business-development
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Retrieve a Salesforce opportunity by ID for project pursuit tracking."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity record ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
            - name: account_name
              type: string
              mapping: "$.Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.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-opportunity
              method: GET

Looks up a SAP Concur expense report by report ID and returns the approval status, total amount, and submission date for project travel expense tracking.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Status"
  description: "Looks up a SAP Concur expense report by report ID and returns the approval status, total amount, and submission date for project travel expense tracking."
  tags:
    - finance
    - sap-concur
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: get-expense-report
          description: "Retrieve the status of a SAP Concur expense report by report ID."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Concur expense report identifier."
          call: "concur.get-expense-report"
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: approval_status
              type: string
              mapping: "$.ApprovalStatusName"
            - name: total_amount
              type: string
              mapping: "$.Total"
            - name: submit_date
              type: string
              mapping: "$.SubmitDate"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0/expense"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET

When a SAP purchase order is created for construction materials, retrieves the PO details, looks up the approver in Workday, and sends an approval request via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Approval Pipeline"
  description: "When a SAP purchase order is created for construction materials, retrieves the PO details, looks up the approver in Workday, and sends an approval request via Microsoft Teams."
  tags:
    - procurement
    - sap
    - workday
    - microsoft-teams
    - construction
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: route-po-approval
          description: "Retrieve a SAP PO, resolve the approver from Workday, and send an approval notification via Teams."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: requestor_id
              in: body
              type: string
              description: "The Workday worker ID of the requestor."
          steps:
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: get-requestor
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{requestor_id}}"
            - name: get-approver
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-requestor.manager_id}}"
            - name: send-approval-request
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-approver.work_email}}"
                text: "PO Approval Required: PO {{po_number}} for ${{get-po.total_value}} from vendor {{get-po.vendor}}. Requested by {{get-requestor.full_name}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-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
    - 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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the details of a ServiceNow incident by number, returning current state, priority, assigned group, and short description for infrastructure IT support.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves the details of a ServiceNow incident by number, returning current state, priority, assigned group, and short description for infrastructure IT support."
  tags:
    - it-support
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-service-management
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number and return its details."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g. INC0012345)."
          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://aecom.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

Checks ServiceNow incident status for AECOM IT operations.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Check"
  description: "Checks ServiceNow incident status for AECOM IT operations."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up incident at AECOM."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The incident_id to look up." 
          call: "servicenow.get-incident_id"
          with:
            incident_id: "{{incident_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow_incident_status_che
              method: GET

Retrieves a document from a SharePoint project library by site and file path, returning the download URL, last modified date, and author.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves a document from a SharePoint project library by site and file path, returning the download URL, last modified date, and author."
  tags:
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: document-management
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a document from SharePoint by site ID and file path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site identifier."
            - name: file_path
              in: body
              type: string
              description: "The relative path to the file within the document library."
          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

Plans site mobilization resources in Oracle, provisions equipment in SAP, creates logistics tasks in ServiceNow, and notifies project team.

naftiko: "0.5"
info:
  label: "Site Mobilization Orchestrator"
  description: "Plans site mobilization resources in Oracle, provisions equipment in SAP, creates logistics tasks in ServiceNow, and notifies project team."
  tags:
    - construction
    - oracle
    - sap
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: construction
      port: 8080
      tools:
        - name: site_mobilization_orchestrator
          description: "Orchestrate site mobilization orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-oracle
              type: call
              call: "oracle.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-sap
              type: call
              call: "sap.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://aecom.oraclecloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: oracle-op
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Sends a message to a Slack channel for AECOM notifications.

naftiko: "0.5"
info:
  label: "Slack Channel Post"
  description: "Sends a message to a Slack channel for AECOM notifications."
  tags:
    - collaboration
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: send-message
          description: "Post to Slack at AECOM."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The channel to look up." 
          call: "slack.get-channel"
          with:
            channel: "{{channel}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack_channel_post
              method: GET

Creates a new Slack channel for a project, invites key team members retrieved from Workday, and posts an initial message with project links from SharePoint and Jira.

naftiko: "0.5"
info:
  label: "Slack Project Channel Setup"
  description: "Creates a new Slack channel for a project, invites key team members retrieved from Workday, and posts an initial message with project links from SharePoint and Jira."
  tags:
    - collaboration
    - slack
    - workday
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-collaboration
      port: 8080
      tools:
        - name: setup-project-channel
          description: "Create a Slack project channel, invite team members from Workday, and post initial project links."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The project name for the channel."
            - name: project_lead_id
              in: body
              type: string
              description: "The Workday worker ID of the project lead."
            - name: sharepoint_url
              in: body
              type: string
              description: "The SharePoint project site URL."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key."
          steps:
            - name: get-lead
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{project_lead_id}}"
            - name: create-channel
              type: call
              call: "slack.create-channel"
              with:
                name: "proj-{{project_name}}"
            - name: invite-lead
              type: call
              call: "slack.invite-to-channel"
              with:
                channel_id: "{{create-channel.channel_id}}"
                user_email: "{{get-lead.work_email}}"
            - name: post-welcome
              type: call
              call: "slack.send-message"
              with:
                channel: "{{create-channel.channel_id}}"
                text: "Welcome to {{project_name}}! Lead: {{get-lead.full_name}}. SharePoint: {{sharepoint_url}}. Jira: https://aecom.atlassian.net/browse/{{jira_project_key}}"
  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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST
        - name: invitations
          path: "/conversations.invite"
          operations:
            - name: invite-to-channel
              method: POST
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Executes SQL queries against AECOM Snowflake warehouse.

naftiko: "0.5"
info:
  label: "Snowflake Query Executor"
  description: "Executes SQL queries against AECOM Snowflake warehouse."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Run query at AECOM."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The sql_query to look up." 
          call: "snowflake.get-sql_query"
          with:
            sql_query: "{{sql_query}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake_query_executor
              method: GET

Exports a Sparx Enterprise Architect model package as a document, uploads it to SharePoint, and logs the export event in Jira.

naftiko: "0.5"
info:
  label: "Sparx Enterprise Architect Model Export"
  description: "Exports a Sparx Enterprise Architect model package as a document, uploads it to SharePoint, and logs the export event in Jira."
  tags:
    - engineering
    - sparx-enterprise-architect
    - sharepoint
    - jira
    - systems-engineering
capability:
  exposes:
    - type: mcp
      namespace: model-management
      port: 8080
      tools:
        - name: export-ea-model
          description: "Export a Sparx EA model, upload to SharePoint, and log in Jira."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The Sparx EA model identifier."
            - name: package_guid
              in: body
              type: string
              description: "The package GUID to export."
            - name: project_code
              in: body
              type: string
              description: "The AECOM project code."
          steps:
            - name: export-model
              type: call
              call: "sparxea.export-package"
              with:
                model_id: "{{model_id}}"
                package_guid: "{{package_guid}}"
            - name: upload-export
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "engineering_models"
                folder_path: "Exports/{{project_code}}"
                file_name: "{{export-model.file_name}}"
            - name: log-export
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENGR"
                summary: "Model export: {{export-model.package_name}}"
                description: "Package {{package_guid}} exported. File: {{upload-export.url}}. Version: {{export-model.version}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: sparxea
      baseUri: "https://aecom-ea.azurewebsites.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sparxea_token"
      resources:
        - name: packages
          path: "/models/{{model_id}}/packages/{{package_guid}}/export"
          inputParameters:
            - name: model_id
              in: path
            - name: package_guid
              in: path
          operations:
            - name: export-package
              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}}/{{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://aecom.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

Searches Splunk indexes for log entries at AECOM.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk indexes for log entries at AECOM."
  tags:
    - devops
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: logging
      port: 8080
      tools:
        - name: search-logs
          description: "Search Splunk logs for AECOM."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The query to look up." 
          call: "splunk.get-query"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://aecom-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk_log_search
              method: GET

Validates subcontractor certifications from SAP, checks insurance status, creates compliance records in ServiceNow, and notifies procurement.

naftiko: "0.5"
info:
  label: "Subcontractor Compliance Monitor"
  description: "Validates subcontractor certifications from SAP, checks insurance status, creates compliance records in ServiceNow, and notifies procurement."
  tags:
    - compliance
    - sap
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: subcontractor_compliance_monitor
          description: "Orchestrate subcontractor compliance monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Onboards a new subcontractor by verifying insurance in Salesforce, creating a vendor record in Oracle EBS, provisioning access in Azure Active Directory, and notifying the contracts team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Subcontractor Onboarding Pipeline"
  description: "Onboards a new subcontractor by verifying insurance in Salesforce, creating a vendor record in Oracle EBS, provisioning access in Azure Active Directory, and notifying the contracts team via Microsoft Teams."
  tags:
    - procurement
    - salesforce
    - oracle-e-business-suite
    - azure-active-directory
    - microsoft-teams
    - subcontractor
capability:
  exposes:
    - type: mcp
      namespace: subcontractor-onboarding
      port: 8080
      tools:
        - name: onboard-subcontractor
          description: "Onboard a subcontractor by verifying insurance, creating vendor record, provisioning access, and notifying the contracts team."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "The subcontractor company name."
            - name: salesforce_account_id
              in: body
              type: string
              description: "The Salesforce account ID for the subcontractor."
            - name: contact_email
              in: body
              type: string
              description: "The primary contact email."
          steps:
            - name: verify-insurance
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: create-vendor
              type: call
              call: "oracle-ebs.create-vendor"
              with:
                vendor_name: "{{company_name}}"
                contact_email: "{{contact_email}}"
                insurance_expiry: "{{verify-insurance.insurance_expiry_date}}"
            - name: provision-access
              type: call
              call: "azuread.create-guest-user"
              with:
                email: "{{contact_email}}"
                display_name: "{{company_name}} - External"
            - name: notify-contracts
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "contracts-team@aecom.com"
                text: "Subcontractor onboarded: {{company_name}}. Vendor ID: {{create-vendor.vendor_id}}. Insurance expires: {{verify-insurance.insurance_expiry_date}}. Guest access provisioned for {{contact_email}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: vendors
          path: "/vendors"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/invitations"
          operations:
            - name: create-guest-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Collects energy consumption data from building management systems, calculates carbon footprint metrics, stores results in Azure Databricks, and publishes a sustainability report to Confluence.

naftiko: "0.5"
info:
  label: "Sustainability Metrics Collector"
  description: "Collects energy consumption data from building management systems, calculates carbon footprint metrics, stores results in Azure Databricks, and publishes a sustainability report to Confluence."
  tags:
    - sustainability
    - azure-databricks
    - confluence
    - environmental
    - energy-management
capability:
  exposes:
    - type: mcp
      namespace: sustainability-reporting
      port: 8080
      tools:
        - name: collect-sustainability-metrics
          description: "Gather energy data, compute carbon metrics, store in Databricks, and publish report."
          inputParameters:
            - name: building_id
              in: body
              type: string
              description: "The building management system identifier."
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period (e.g., 2026-Q1)."
            - name: project_code
              in: body
              type: string
              description: "The AECOM project code."
          steps:
            - name: get-energy-data
              type: call
              call: "bms-api.get-consumption"
              with:
                building_id: "{{building_id}}"
                period: "{{reporting_period}}"
            - name: store-metrics
              type: call
              call: "databricks.run-notebook"
              with:
                notebook_path: "/sustainability/carbon_calculator"
                parameters: "{\"energy_kwh\": \"{{get-energy-data.total_kwh}}\", \"building_id\": \"{{building_id}}\"}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "SUSTAIN"
                title: "Sustainability Report: {{project_code}} - {{reporting_period}}"
                body: "Building: {{building_id}}. Energy: {{get-energy-data.total_kwh}} kWh. Carbon: {{store-metrics.carbon_tonnes}} tonnes CO2e. Period: {{reporting_period}}."
  consumes:
    - type: http
      namespace: bms-api
      baseUri: "https://aecom-bms.azurewebsites.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.bms_api_token"
      resources:
        - name: consumption
          path: "/buildings/{{building_id}}/consumption?period={{period}}"
          inputParameters:
            - name: building_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-consumption
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://adb-aecom.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/submit"
          operations:
            - name: run-notebook
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://aecom.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Collects sustainability metrics from field operations, aggregates in Snowflake, generates ESG reports in Power BI, and notifies sustainability team.

naftiko: "0.5"
info:
  label: "Sustainability Reporting Pipeline"
  description: "Collects sustainability metrics from field operations, aggregates in Snowflake, generates ESG reports in Power BI, and notifies sustainability team."
  tags:
    - sustainability
    - snowflake
    - powerbi
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: sustainability_reporting_pipeline
          description: "Orchestrate sustainability reporting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves the status and URL of a Tableau project performance dashboard, returning the view name, last refresh time, and embed URL for sharing.

naftiko: "0.5"
info:
  label: "Tableau Project Dashboard Lookup"
  description: "Retrieves the status and URL of a Tableau project performance dashboard, returning the view name, last refresh time, and embed URL for sharing."
  tags:
    - analytics
    - tableau
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics-dashboards
      port: 8080
      tools:
        - name: get-tableau-view
          description: "Retrieve a Tableau dashboard view by site and view ID."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The Tableau site identifier."
            - name: view_id
              in: body
              type: string
              description: "The Tableau view identifier."
          call: "tableau.get-view"
          with:
            site_id: "{{site_id}}"
            view_id: "{{view_id}}"
          outputParameters:
            - name: view_name
              type: string
              mapping: "$.view.name"
            - name: content_url
              type: string
              mapping: "$.view.contentUrl"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://aecom-tableau.online.tableau.com/api/3.21/sites"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: views
          path: "/{{site_id}}/views/{{view_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: view_id
              in: path
          operations:
            - name: get-view
              method: GET

Reconciles project travel expenses by retrieving reports from SAP Concur, matching against Oracle EBS project budgets, flagging discrepancies in a Jira task, and summarizing in a Microsoft Teams message.

naftiko: "0.5"
info:
  label: "Travel Expense Reconciliation Orchestrator"
  description: "Reconciles project travel expenses by retrieving reports from SAP Concur, matching against Oracle EBS project budgets, flagging discrepancies in a Jira task, and summarizing in a Microsoft Teams message."
  tags:
    - finance
    - sap-concur
    - oracle-e-business-suite
    - jira
    - microsoft-teams
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: expense-reconciliation
      port: 8080
      tools:
        - name: reconcile-travel-expenses
          description: "Pull Concur expenses, compare with Oracle EBS budgets, flag discrepancies, and notify the finance team."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: finance_channel
              in: body
              type: string
              description: "The Teams channel ID for finance notifications."
          steps:
            - name: get-expense
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: get-budget
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_number: "{{project_number}}"
            - name: create-discrepancy-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                summary: "Expense reconciliation: Report {{report_id}} vs Project {{project_number}}"
                description: "Expense total: ${{get-expense.total_amount}}. Project travel budget remaining: ${{get-budget.travel_budget_remaining}}. Status: {{get-expense.approval_status}}."
                issue_type: "Task"
            - name: notify-finance
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{finance_channel}}"
                text: "Expense reconciliation complete for Project {{project_number}}. Report {{report_id}}: ${{get-expense.total_amount}}. Jira: {{create-discrepancy-task.key}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0/expense"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.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/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes vendor invoices from SAP, matches against POs, creates payment batches, logs in ServiceNow, and notifies accounts payable.

naftiko: "0.5"
info:
  label: "Vendor Payment Processing Pipeline"
  description: "Processes vendor invoices from SAP, matches against POs, creates payment batches, logs in ServiceNow, and notifies accounts payable."
  tags:
    - finance
    - sap
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: vendor_payment_processing_pipeline
          description: "Orchestrate vendor payment processing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-sap
              type: call
              call: "sap.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-snowflake
              type: call
              call: "snowflake.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aecom-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aecom.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aecom.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a Microsoft Visio network diagram file from SharePoint and returns its metadata including version, author, and download URL for infrastructure network documentation.

naftiko: "0.5"
info:
  label: "Visio Network Diagram Export"
  description: "Retrieves a Microsoft Visio network diagram file from SharePoint and returns its metadata including version, author, and download URL for infrastructure network documentation."
  tags:
    - engineering
    - microsoft-visio
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: diagram-management
      port: 8080
      tools:
        - name: get-visio-diagram
          description: "Retrieve a Visio diagram from SharePoint by site and file path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site identifier."
            - name: file_path
              in: body
              type: string
              description: "The path to the Visio file in the document library."
          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_by
              type: string
              mapping: "$.lastModifiedBy.user.displayName"
  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

Compiles a weekly project status report by pulling schedule data from Microsoft Project, cost data from Oracle EBS, open issues from Jira, and distributing the report via Microsoft Teams and Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Weekly Status Report Generator"
  description: "Compiles a weekly project status report by pulling schedule data from Microsoft Project, cost data from Oracle EBS, open issues from Jira, and distributing the report via Microsoft Teams and Microsoft Outlook."
  tags:
    - project-management
    - microsoft-project
    - oracle-e-business-suite
    - jira
    - microsoft-teams
    - microsoft-outlook
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: status-reporting
      port: 8080
      tools:
        - name: generate-weekly-status
          description: "Aggregate schedule, cost, and issue data into a weekly status report and distribute to stakeholders."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Microsoft Project GUID."
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key."
            - name: stakeholder_emails
              in: body
              type: string
              description: "Comma-separated stakeholder emails."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel ID."
          steps:
            - name: get-schedule
              type: call
              call: "msproject.get-project"
              with:
                project_id: "{{project_id}}"
            - name: get-costs
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_number: "{{project_number}}"
            - name: get-open-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "project={{jira_project_key}} AND status!=Done"
            - name: post-to-teams
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Weekly Status: Schedule {{get-schedule.percent_complete}}% complete. Budget: ${{get-costs.budget_amount}}, Actuals: ${{get-costs.actual_costs}}. Open issues: {{get-open-issues.total}}."
            - name: email-stakeholders
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{stakeholder_emails}}"
                subject: "Weekly Status Report: Project {{project_number}}"
                body: "Schedule: {{get-schedule.percent_complete}}% complete, finish {{get-schedule.finish_date}}. Budget variance: {{get-costs.variance_percent}}%. Open Jira issues: {{get-open-issues.total}}."
  consumes:
    - type: http
      namespace: msproject
      baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: projects
          path: "('{{project_id}}')"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: project-costs
          path: "/costs/{{project_number}}"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://aecom.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves employee profile from Workday at AECOM.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile from Workday at AECOM."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up Workday employee at AECOM."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee_id to look up." 
          call: "workday.get-employee_id"
          with:
            employee_id: "{{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday_employee_lookup
              method: GET