General Electric Capabilities

Naftiko 0.5 capability definitions for General Electric - 103 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Retrieves the payroll summary for a specified pay period from ADP.

naftiko: "0.5"
info:
  label: "ADP Payroll Summary Lookup"
  description: "Retrieves the payroll summary for a specified pay period from ADP."
  tags:
    - hr
    - payroll
    - adp
capability:
  exposes:
    - type: mcp
      namespace: payroll-summary
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Given a pay period ID, return the payroll totals including gross pay, deductions, and net pay. Use when payroll administrators need period summaries."
          inputParameters:
            - name: pay_period_id
              in: body
              type: string
              description: "The ADP pay period identifier."
          call: "adp-api.get-summary"
          with:
            pay_period_id: "{{pay_period_id}}"
          outputParameters:
            - name: gross_pay
              type: number
              mapping: "$.summary.gross_pay"
            - name: total_deductions
              type: number
              mapping: "$.summary.deductions"
            - name: net_pay
              type: number
              mapping: "$.summary.net_pay"
  consumes:
    - type: http
      namespace: adp-api
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/pay-periods/{{pay_period_id}}/summary"
          inputParameters:
            - name: pay_period_id
              in: path
          operations:
            - name: get-summary
              method: GET

Traces an aviation part through its lifecycle by querying SAP for procurement data, the quality inspection record, and the installation history, then logs findings in Confluence.

naftiko: "0.5"
info:
  label: "Aviation Parts Traceability Chain"
  description: "Traces an aviation part through its lifecycle by querying SAP for procurement data, the quality inspection record, and the installation history, then logs findings in Confluence."
  tags:
    - aviation
    - quality-management
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: parts-trace
      port: 8080
      tools:
        - name: trace-aviation-part
          description: "Given a part serial number, trace its full lifecycle from procurement to installation. Use when quality engineers need to conduct part traceability audits."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The aviation part serial number."
          steps:
            - name: get-procurement
              type: call
              call: "sap-api.get-part-procurement"
              with:
                serial_number: "{{serial_number}}"
            - name: get-inspection
              type: call
              call: "sap-qm.get-part-inspection"
              with:
                serial_number: "{{serial_number}}"
            - name: get-installation
              type: call
              call: "sap-pm.get-installation-record"
              with:
                serial_number: "{{serial_number}}"
            - name: log-trace
              type: call
              call: "confluence-api.create-page"
              with:
                space: "AVIATION-QA"
                title: "Traceability: {{serial_number}}"
                body: "Supplier: {{get-procurement.supplier}}. PO: {{get-procurement.po_number}}. Inspection: {{get-inspection.status}}. Installed on: {{get-installation.equipment_id}} ({{get-installation.install_date}})."
  consumes:
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: parts-procurement
          path: "/serialNumbers/{{serial_number}}/procurement"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-part-procurement
              method: GET
    - type: http
      namespace: sap-qm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: inspections
          path: "/serialNumbers/{{serial_number}}/inspection"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-part-inspection
              method: GET
    - type: http
      namespace: sap-pm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: installations
          path: "/serialNumbers/{{serial_number}}/installation"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-installation-record
              method: GET
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Generates a monthly AWS cost optimization report by querying AWS Cost Explorer, identifying unused resources, and publishing findings to Confluence and Teams.

naftiko: "0.5"
info:
  label: "AWS Cost Optimization Report Generator"
  description: "Generates a monthly AWS cost optimization report by querying AWS Cost Explorer, identifying unused resources, and publishing findings to Confluence and Teams."
  tags:
    - cloud-operations
    - cost-management
    - aws
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: aws-cost-report
      port: 8080
      tools:
        - name: generate-cost-report
          description: "Given a billing month, analyze AWS spend and identify optimization opportunities. Use when cloud operations runs monthly cost reviews."
          inputParameters:
            - name: billing_month
              in: body
              type: string
              description: "The billing month in YYYY-MM format."
          steps:
            - name: get-costs
              type: call
              call: "aws-ce.get-cost-and-usage"
              with:
                month: "{{billing_month}}"
            - name: get-idle-resources
              type: call
              call: "aws-ce.get-rightsizing-recommendations"
              with:
                month: "{{billing_month}}"
            - name: publish-report
              type: call
              call: "confluence-api.create-page"
              with:
                space: "CLOUD-OPS"
                title: "AWS Cost Report — {{billing_month}}"
                body: "Total spend: ${{get-costs.total}}. Rightsizing savings: ${{get-idle-resources.estimated_savings}}."
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "cloud-finops"
                text: "AWS Cost Report for {{billing_month}} published. Total: ${{get-costs.total}}. Potential savings: ${{get-idle-resources.estimated_savings}}."
  consumes:
    - type: http
      namespace: aws-ce
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: aws_sigv4
        accessKey: "$secrets.aws_access_key"
      resources:
        - name: cost-usage
          path: "/"
          operations:
            - name: get-cost-and-usage
              method: POST
            - name: get-rightsizing-recommendations
              method: POST
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_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: messages
          path: "/teams/ge-cloud/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Audits Azure AD conditional access policies by listing all policies, checking for non-compliant configurations, and generating an audit record in ServiceNow.

naftiko: "0.5"
info:
  label: "Azure AD Conditional Access Policy Audit"
  description: "Audits Azure AD conditional access policies by listing all policies, checking for non-compliant configurations, and generating an audit record in ServiceNow."
  tags:
    - security
    - compliance
    - azure-ad
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ca-audit
      port: 8080
      tools:
        - name: audit-conditional-access
          description: "Given a policy scope, audit conditional access configurations and document findings. Use when security conducts periodic access policy reviews."
          inputParameters:
            - name: scope
              in: body
              type: string
              description: "The audit scope (e.g., all, high-risk, guest)."
          steps:
            - name: list-policies
              type: call
              call: "azure-ad.list-ca-policies"
              with:
                scope: "{{scope}}"
            - name: check-compliance
              type: call
              call: "azure-ad.evaluate-policy-compliance"
              with:
                policies: "{{list-policies.policy_ids}}"
            - name: create-audit
              type: call
              call: "servicenow.create-audit-record"
              with:
                type: "conditional_access_audit"
                scope: "{{scope}}"
                total_policies: "{{list-policies.count}}"
                non_compliant: "{{check-compliance.non_compliant_count}}"
                findings: "{{check-compliance.findings}}"
  consumes:
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: policies
          path: "/identity/conditionalAccess/policies"
          inputParameters:
            - name: scope
              in: query
          operations:
            - name: list-ca-policies
              method: GET
            - name: evaluate-policy-compliance
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audit
          path: "/table/u_compliance_audit"
          operations:
            - name: create-audit-record
              method: POST

Lists all members of privileged Azure AD groups for GE quarterly access reviews and writes results to a SharePoint audit list.

naftiko: "0.5"
info:
  label: "Azure AD Privileged Access Review"
  description: "Lists all members of privileged Azure AD groups for GE quarterly access reviews and writes results to a SharePoint audit list."
  tags:
    - identity
    - security
    - azure-ad
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-privileged-access-review
          description: "Given an Azure AD privileged group ID and SharePoint site and list IDs, retrieve all current group members and write them to the SharePoint access review list. Use quarterly for privileged access certification."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Azure AD group ID to audit."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "The SharePoint site ID to write results to."
            - name: sharepoint_list_id
              in: body
              type: string
              description: "The SharePoint list ID for the review records."
          steps:
            - name: list-members
              type: call
              call: "azure-ad-review.list-group-members"
              with:
                group_id: "{{group_id}}"
            - name: write-audit-record
              type: call
              call: "sharepoint-review.create-list-item"
              with:
                site_id: "{{sharepoint_site_id}}"
                list_id: "{{sharepoint_list_id}}"
                members: "{{list-members.value}}"
  consumes:
    - type: http
      namespace: azure-ad-review
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: sharepoint-review
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_id}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_id
              in: path
          operations:
            - name: create-list-item
              method: POST

Retrieves Azure AD user access details for GE including group memberships, role assignments, and last sign-in timestamp.

naftiko: "0.5"
info:
  label: "Azure AD User Access Review"
  description: "Retrieves Azure AD user access details for GE including group memberships, role assignments, and last sign-in timestamp."
  tags:
    - identity
    - security
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-access
          description: "Given a user principal name, retrieve group memberships, directory roles, and last sign-in."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "Azure AD user principal name."
          call: "azuread.get-user"
          with:
            upn: "{{user_upn}}"
          outputParameters:
            - name: group_count
              type: number
              mapping: "$.memberOf.length"
            - name: last_sign_in
              type: string
              mapping: "$.signInActivity.lastSignInDateTime"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}?$expand=memberOf&$select=displayName,signInActivity"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET

Queries Azure Cost Management for subscription spend anomalies and posts an alert to the GE FinOps Microsoft Teams channel when thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly Alert Handler"
  description: "Queries Azure Cost Management for subscription spend anomalies and posts an alert to the GE FinOps Microsoft Teams channel when thresholds are exceeded."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and a spend threshold, query Azure Cost Management for current period spend and post an alert to the FinOps Teams channel if the threshold is exceeded. Use when responding to Azure cost anomaly notifications."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to audit."
            - name: threshold_usd
              in: body
              type: number
              description: "Spend threshold in USD; alert fires when current spend exceeds this."
          steps:
            - name: get-spend
              type: call
              call: "azure-cost-mgmt.query-usage"
              with:
                subscription_id: "{{subscription_id}}"
            - name: alert-finops
              type: call
              call: "msteams-cost.send-message"
              with:
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure Cost Alert — Subscription {{subscription_id}} spend {{get-spend.total_cost}} {{get-spend.currency}} has crossed the ${{threshold_usd}} threshold. Review billing dashboard."
  consumes:
    - type: http
      namespace: azure-cost-mgmt
      baseUri: "https://management.azure.com/subscriptions"
      authentication:
        type: bearer
        token: "$secrets.azure_management_token"
      resources:
        - name: cost-query
          path: "/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: query-usage
              method: POST
    - type: http
      namespace: msteams-cost
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the latest build status for a specified Azure DevOps pipeline.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Check"
  description: "Retrieves the latest build status for a specified Azure DevOps pipeline."
  tags:
    - ci-cd
    - devops
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: build-status
      port: 8080
      tools:
        - name: check-build
          description: "Given a pipeline ID and project name, return the latest build result and timestamp. Use when release managers need to verify build readiness."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The pipeline definition ID."
          call: "azdo-api.get-build"
          with:
            project: "{{project}}"
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: build_number
              type: string
              mapping: "$.value[0].buildNumber"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: finish_time
              type: string
              mapping: "$.value[0].finishTime"
  consumes:
    - type: http
      namespace: azdo-api
      baseUri: "https://dev.azure.com/ge-digital"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds"
          inputParameters:
            - name: project
              in: path
            - name: pipeline_id
              in: query
          operations:
            - name: get-build
              method: GET

Executes a KQL query against an Azure Log Analytics workspace and returns results.

naftiko: "0.5"
info:
  label: "Azure Log Analytics Query Runner"
  description: "Executes a KQL query against an Azure Log Analytics workspace and returns results."
  tags:
    - monitoring
    - log-analytics
    - azure-log-analytics
capability:
  exposes:
    - type: mcp
      namespace: log-query
      port: 8080
      tools:
        - name: run-query
          description: "Given a workspace ID and KQL query string, execute the query and return results. Use when platform engineers need to investigate log patterns."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Azure Log Analytics workspace ID."
            - name: query
              in: body
              type: string
              description: "The KQL query to execute."
          call: "loganalytics-api.execute-query"
          with:
            workspace_id: "{{workspace_id}}"
            query: "{{query}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.tables[0].rows.length"
            - name: columns
              type: string
              mapping: "$.tables[0].columns"
  consumes:
    - type: http
      namespace: loganalytics-api
      baseUri: "https://api.loganalytics.io/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_log_token"
      resources:
        - name: query
          path: "/workspaces/{{workspace_id}}/query"
          inputParameters:
            - name: workspace_id
              in: path
            - name: query
              in: body
          operations:
            - name: execute-query
              method: POST

Deploys a trained machine learning model by registering it in Azure ML, deploying to an AKS endpoint, running validation tests, and notifying the data science team.

naftiko: "0.5"
info:
  label: "Azure Machine Learning Model Deployment Pipeline"
  description: "Deploys a trained machine learning model by registering it in Azure ML, deploying to an AKS endpoint, running validation tests, and notifying the data science team."
  tags:
    - machine-learning
    - deployment
    - azure-machine-learning
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ml-deploy
      port: 8080
      tools:
        - name: deploy-ml-model
          description: "Given a model name and version, deploy it to production and validate. Use when data scientists approve a model for production deployment."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The Azure ML model name."
            - name: model_version
              in: body
              type: string
              description: "The model version to deploy."
          steps:
            - name: register-model
              type: call
              call: "azureml-api.register-model"
              with:
                model_name: "{{model_name}}"
                version: "{{model_version}}"
            - name: deploy-endpoint
              type: call
              call: "azureml-api.create-deployment"
              with:
                model_id: "{{register-model.model_id}}"
                endpoint_name: "{{model_name}}-prod"
            - name: run-validation
              type: call
              call: "azureml-api.test-endpoint"
              with:
                endpoint_name: "{{model_name}}-prod"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "data-science"
                text: "Model {{model_name}} v{{model_version}} deployed. Validation: {{run-validation.status}}. Latency: {{run-validation.avg_latency_ms}}ms."
  consumes:
    - type: http
      namespace: azureml-api
      baseUri: "https://ge-ml.api.azureml.ms/modelmanagement/v2.0"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: models
          path: "/models"
          operations:
            - name: register-model
              method: POST
        - name: deployments
          path: "/deployments"
          operations:
            - name: create-deployment
              method: POST
        - name: endpoints
          path: "/endpoints/{{endpoint_name}}/test"
          inputParameters:
            - name: endpoint_name
              in: path
          operations:
            - name: test-endpoint
              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/ge-data-science/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Searches Box for engineering files matching a query string within a specified folder.

naftiko: "0.5"
info:
  label: "Box Engineering File Search"
  description: "Searches Box for engineering files matching a query string within a specified folder."
  tags:
    - document-management
    - engineering
    - box
capability:
  exposes:
    - type: mcp
      namespace: file-search
      port: 8080
      tools:
        - name: search-files
          description: "Given a search query and folder ID, return matching files from Box. Use when engineers need to find CAD files or technical specs."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search query string."
            - name: folder_id
              in: body
              type: string
              description: "The Box folder ID to search within."
          call: "box-api.search"
          with:
            query: "{{query}}"
            folder_id: "{{folder_id}}"
          outputParameters:
            - name: total_count
              type: integer
              mapping: "$.total_count"
            - name: first_result_name
              type: string
              mapping: "$.entries[0].name"
            - name: first_result_id
              type: string
              mapping: "$.entries[0].id"
  consumes:
    - type: http
      namespace: box-api
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: query
              in: query
            - name: folder_id
              in: query
          operations:
            - name: search
              method: GET

Searches Confluence for an engineering runbook by title keyword and returns the page content.

naftiko: "0.5"
info:
  label: "Confluence Engineering Runbook Lookup"
  description: "Searches Confluence for an engineering runbook by title keyword and returns the page content."
  tags:
    - documentation
    - engineering
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: runbook-search
      port: 8080
      tools:
        - name: search-runbook
          description: "Given a keyword, search Confluence for matching engineering runbook pages. Use when on-call engineers need to find troubleshooting procedures."
          inputParameters:
            - name: keyword
              in: body
              type: string
              description: "The search keyword for the runbook title."
          call: "confluence-api.search-content"
          with:
            keyword: "{{keyword}}"
          outputParameters:
            - name: page_id
              type: string
              mapping: "$.results[0].id"
            - name: title
              type: string
              mapping: "$.results[0].title"
            - name: url
              type: string
              mapping: "$.results[0]._links.webui"
  consumes:
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: keyword
              in: query
          operations:
            - name: search-content
              method: GET

When a Salesforce case is escalated, retrieves the account health score, creates a P1 incident in ServiceNow, assigns the account executive from Workday, and alerts leadership via Teams.

naftiko: "0.5"
info:
  label: "Customer Escalation Response Chain"
  description: "When a Salesforce case is escalated, retrieves the account health score, creates a P1 incident in ServiceNow, assigns the account executive from Workday, and alerts leadership via Teams."
  tags:
    - customer-service
    - sales
    - salesforce
    - servicenow
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: escalation-chain
      port: 8080
      tools:
        - name: handle-customer-escalation
          description: "Given a Salesforce case ID, coordinate the escalation response across all systems. Use when a customer case is escalated to critical priority."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: "salesforce-api.get-case"
              with:
                case_id: "{{case_id}}"
            - name: get-account-health
              type: call
              call: "salesforce-api.get-account-health"
              with:
                account_id: "{{get-case.account_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                priority: "1"
                short_description: "Customer escalation: {{get-case.subject}}"
                customer: "{{get-case.account_name}}"
            - name: get-ae
              type: call
              call: "workday-api.get-account-executive"
              with:
                account_id: "{{get-case.account_id}}"
            - name: alert-leadership
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "customer-escalations"
                text: "ESCALATION: {{get-case.account_name}} — {{get-case.subject}}. Health score: {{get-account-health.score}}. AE: {{get-ae.name}}. P1 ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
        - name: accounts
          path: "/sobjects/Account/{{account_id}}/health"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-health
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.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: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: ae
          path: "/ge/accountExecutives"
          inputParameters:
            - name: account_id
              in: query
          operations:
            - name: get-account-executive
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-leadership/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Datadog APM for the p99 latency of a specified service over the last hour.

naftiko: "0.5"
info:
  label: "Datadog APM Service Latency Check"
  description: "Queries Datadog APM for the p99 latency of a specified service over the last hour."
  tags:
    - monitoring
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: apm-latency
      port: 8080
      tools:
        - name: check-latency
          description: "Given a Datadog service name, return the p99 latency metric for the past hour. Use when SREs need to assess service performance."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog APM service name."
          call: "datadog-apm.get-latency"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: p99_latency_ms
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: datadog-apm
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-latency
              method: GET

Queries Datadog for microservice health metrics across GE's cloud platforms including latency, error rate, and throughput.

naftiko: "0.5"
info:
  label: "Datadog Microservice Health Check"
  description: "Queries Datadog for microservice health metrics across GE's cloud platforms including latency, error rate, and throughput."
  tags:
    - monitoring
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a service name, retrieve latency, error rate, and request throughput from GE's Datadog."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Service name."
          call: "datadog.query-metrics"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: avg_latency_ms
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: error_rate_pct
              type: number
              mapping: "$.series[1].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET

When a Datadog SLO breaches its error budget, creates a Jira incident ticket, pulls the on-call from PagerDuty, and posts an alert to the SRE Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Breach to Jira Escalation"
  description: "When a Datadog SLO breaches its error budget, creates a Jira incident ticket, pulls the on-call from PagerDuty, and posts an alert to the SRE Teams channel."
  tags:
    - sre
    - monitoring
    - datadog
    - jira
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-breach
      port: 8080
      tools:
        - name: handle-slo-breach
          description: "Given a Datadog SLO ID and breach percentage, create an incident and escalate to the on-call engineer. Use when SLO error budgets are exhausted."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "The Datadog SLO identifier."
            - name: breach_pct
              in: body
              type: number
              description: "The percentage of error budget consumed."
          steps:
            - name: get-slo-details
              type: call
              call: "datadog-api.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: get-oncall
              type: call
              call: "pagerduty-api.get-oncall"
              with:
                service_id: "{{get-slo-details.service_id}}"
            - name: create-incident
              type: call
              call: "jira-api.create-issue"
              with:
                project: "SRE"
                issue_type: "Bug"
                summary: "SLO breach: {{get-slo-details.name}} — {{breach_pct}}% budget consumed"
                assignee: "{{get-oncall.user_id}}"
                priority: "High"
            - name: notify-sre
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "sre-alerts"
                text: "SLO BREACH: {{get-slo-details.name}} at {{breach_pct}}% error budget. On-call: {{get-oncall.user_name}}. Jira: {{create-incident.key}}."
  consumes:
    - type: http
      namespace: datadog-api
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: pagerduty-api
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: service_id
              in: query
          operations:
            - name: get-oncall
              method: GET
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-sre/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Dynatrace detects high CPU utilization on infrastructure hosts, triggers an Azure auto-scale action and notifies the platform team via Teams.

naftiko: "0.5"
info:
  label: "Dynatrace Infrastructure Scaling Trigger"
  description: "When Dynatrace detects high CPU utilization on infrastructure hosts, triggers an Azure auto-scale action and notifies the platform team via Teams."
  tags:
    - monitoring
    - infrastructure
    - dynatrace
    - azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-scaling
      port: 8080
      tools:
        - name: trigger-auto-scale
          description: "Given a Dynatrace host group ID and CPU threshold, initiate scaling and notify the team. Use when infrastructure monitoring detects sustained high utilization."
          inputParameters:
            - name: host_group_id
              in: body
              type: string
              description: "The Dynatrace host group identifier."
            - name: cpu_threshold
              in: body
              type: number
              description: "The CPU utilization threshold percentage."
          steps:
            - name: get-host-metrics
              type: call
              call: "dynatrace-api.get-host-group-metrics"
              with:
                host_group_id: "{{host_group_id}}"
            - name: scale-up
              type: call
              call: "azure-api.trigger-vmss-scale"
              with:
                vmss_name: "{{get-host-metrics.vmss_name}}"
                target_count: "{{get-host-metrics.recommended_count}}"
            - name: notify-platform
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "platform-ops"
                text: "Auto-scale triggered for {{get-host-metrics.vmss_name}}. CPU was {{get-host-metrics.avg_cpu}}%. Scaling to {{get-host-metrics.recommended_count}} instances."
  consumes:
    - type: http
      namespace: dynatrace-api
      baseUri: "https://ge-digital.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query"
          inputParameters:
            - name: host_group_id
              in: query
          operations:
            - name: get-host-group-metrics
              method: GET
    - type: http
      namespace: azure-api
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: vmss
          path: "/subscriptions/ge-sub/resourceGroups/ge-infra/providers/Microsoft.Compute/virtualMachineScaleSets/{{vmss_name}}/scale"
          inputParameters:
            - name: vmss_name
              in: path
          operations:
            - name: trigger-vmss-scale
              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/ge-platform/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a termination is confirmed in Workday, disables the Azure AD account, opens a ServiceNow offboarding ticket, and notifies IT Security via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When a termination is confirmed in Workday, disables the Azure AD account, opens a ServiceNow offboarding ticket, and notifies IT Security via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - azure-ad
    - servicenow
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, disable the Azure AD account, open a ServiceNow offboarding ticket, and alert IT Security via Teams. Use immediately upon confirmed GE employee separation."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: disable-ad-account
              type: call
              call: "azure-ad-off.disable-user"
              with:
                user_id: "{{get-worker.azure_object_id}}"
            - name: open-offboard-ticket
              type: call
              call: "servicenow-off.create-incident"
              with:
                category: "hr_offboarding"
                short_description: "Offboarding: {{get-worker.full_name}} — last day {{termination_date}}"
                assignment_group: "IT_Security"
  consumes:
    - type: http
      namespace: workday-off
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/ge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad-off
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow-off
      baseUri: "https://ge.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

When a new hire is created in Workday, opens a ServiceNow IT onboarding ticket, provisions an Azure AD account, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow IT onboarding ticket, provisions an Azure AD account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - azure-ad
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Azure AD, and Microsoft Teams. Use when a new GE hire is confirmed and IT provisioning must begin."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ad-account
              type: call
              call: "azure-ad.create-user"
              with:
                display_name: "{{get-employee.full_name}}"
                department: "{{get-employee.department}}"
            - name: open-it-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                category: "hr_onboarding"
                short_description: "New hire IT setup: {{get-employee.full_name}} — start {{start_date}}"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to GE, {{get-employee.first_name}}! Your IT ticket is {{open-it-ticket.number}}. Your start date is {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/ge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

When a GitHub Actions workflow fails on a main branch, opens a Jira bug and posts an alert to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Failure Handler"
  description: "When a GitHub Actions workflow fails on a main branch, opens a Jira bug and posts an alert to the engineering Microsoft Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-github-failure
          description: "Given a GitHub workflow run failure event, create a Jira Bug issue and post an engineering alert to Microsoft Teams. Use when a GitHub Actions workflow fails on the main or release branch."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions run ID."
            - name: branch
              in: body
              type: string
              description: "The branch the workflow ran on."
            - name: run_url
              in: body
              type: string
              description: "Direct URL to the failed workflow run."
          steps:
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI] {{repo}} / {{branch}} — {{workflow_name}} failed"
                description: "GitHub Actions run {{run_id}} failed on {{branch}}.\nRepo: {{repo}}\nWorkflow: {{workflow_name}}\nRun URL: {{run_url}}"
            - name: notify-engineering
              type: call
              call: "msteams-cicd.send-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "CI Failure: {{repo}} ({{branch}}) — {{workflow_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://ge.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-cicd
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a GitHub pull request is merged, triggers a Terraform Cloud run, monitors the apply status, and posts the deployment result to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub PR Merge to Deployment Pipeline"
  description: "When a GitHub pull request is merged, triggers a Terraform Cloud run, monitors the apply status, and posts the deployment result to the engineering Teams channel."
  tags:
    - ci-cd
    - infrastructure
    - github
    - terraform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pr-deploy
      port: 8080
      tools:
        - name: handle-pr-merge-deploy
          description: "Given a GitHub repository and PR number, trigger the infrastructure deployment pipeline and notify the team. Use when merged PRs should auto-deploy infrastructure changes."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number."
          steps:
            - name: get-pr-details
              type: call
              call: "github-api.get-pull-request"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: trigger-terraform
              type: call
              call: "terraform-api.create-run"
              with:
                workspace_id: "ge-infra-prod"
                message: "Auto-deploy from PR #{{pr_number}}: {{get-pr-details.title}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "platform-engineering"
                text: "Deployment triggered for PR #{{pr_number}} ({{get-pr-details.title}}). Terraform run: {{trigger-terraform.run_id}}. Status: {{trigger-terraform.status}}."
  consumes:
    - type: http
      namespace: github-api
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
    - type: http
      namespace: terraform-api
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-digital/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggered on a GitHub pull request, fetches the latest code scanning alerts for the repository and posts a security summary to the PR as a comment.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Security Scan Gate"
  description: "Triggered on a GitHub pull request, fetches the latest code scanning alerts for the repository and posts a security summary to the PR as a comment."
  tags:
    - devops
    - security
    - github
    - code-scanning
capability:
  exposes:
    - type: mcp
      namespace: security-gate
      port: 8080
      tools:
        - name: post-security-scan-summary
          description: "Given a GitHub repository and pull request number, fetch all open code scanning alerts and post a summary comment on the PR. Use as a pre-merge security gate in GE engineering workflows."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number to comment on."
          steps:
            - name: get-alerts
              type: call
              call: "github-security.list-code-scanning-alerts"
              with:
                repo: "{{repo}}"
                state: "open"
            - name: post-pr-comment
              type: call
              call: "github-pr.create-pr-comment"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                body: "Security Scan Summary: {{get-alerts.total_count}} open alert(s) found. Review before merging."
  consumes:
    - type: http
      namespace: github-security
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: state
              in: query
          operations:
            - name: list-code-scanning-alerts
              method: GET
    - type: http
      namespace: github-pr
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-comments
          path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST

Fetches merged pull requests since the last GitHub release for a GE repository and posts a structured release summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release Notes Generator"
  description: "Fetches merged pull requests since the last GitHub release for a GE repository and posts a structured release summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - github
    - microsoft-teams
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: generate-release-notes
          description: "Given a GitHub repository and base/head tag, fetch all merged PRs in the range and post a release notes summary to the engineering Teams channel. Use when preparing a production release."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: base_tag
              in: body
              type: string
              description: "The base release tag to compare from (e.g., v2.0.0)."
            - name: head_tag
              in: body
              type: string
              description: "The head tag or branch to compare to (e.g., v2.1.0)."
          steps:
            - name: compare-releases
              type: call
              call: "github-releases.compare-commits"
              with:
                repo: "{{repo}}"
                base: "{{base_tag}}"
                head: "{{head_tag}}"
            - name: post-release-notes
              type: call
              call: "msteams-release.send-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Release Notes for {{repo}} ({{base_tag}} → {{head_tag}}): {{compare-releases.total_commits}} commits, {{compare-releases.files_changed}} files changed. Review PRs before deployment."
  consumes:
    - type: http
      namespace: github-releases
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: commit-comparison
          path: "/repos/{{repo}}/compare/{{base}}...{{head}}"
          inputParameters:
            - name: repo
              in: path
            - name: base
              in: path
            - name: head
              in: path
          operations:
            - name: compare-commits
              method: GET
    - type: http
      namespace: msteams-release
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches all critical Dependabot security alerts across GE GitHub repositories and creates Jira issues for each unresolved critical vulnerability.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Alert Triage"
  description: "Fetches all critical Dependabot security alerts across GE GitHub repositories and creates Jira issues for each unresolved critical vulnerability."
  tags:
    - security
    - devops
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: security-triage
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given a GitHub repository, fetch all open critical Dependabot alerts and create a Jira security issue for each. Use during security triage cycles or in response to vulnerability disclosure events."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for security issues (e.g., SEC)."
          steps:
            - name: get-alerts
              type: call
              call: "github-vuln.list-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "critical"
                state: "open"
            - name: create-jira-issue
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Security"
                summary: "Critical Dependabot alerts in {{repo}}: {{get-alerts.total_count}} unresolved"
                description: "Repository: {{repo}}\nOpen critical alerts: {{get-alerts.total_count}}\nReview at: https://github.com/{{repo}}/security/dependabot"
  consumes:
    - type: http
      namespace: github-vuln
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira-sec
      baseUri: "https://ge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When GitHub Advanced Security detects a critical vulnerability, enriches it with the CVE database, creates a Jira remediation ticket, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Scan to Remediation Workflow"
  description: "When GitHub Advanced Security detects a critical vulnerability, enriches it with the CVE database, creates a Jira remediation ticket, and notifies the security team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vuln-remediation
      port: 8080
      tools:
        - name: handle-critical-vulnerability
          description: "Given a GitHub repository and alert number, triage the vulnerability and create remediation tasks. Use when Dependabot or CodeQL finds a critical security issue."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: alert_number
              in: body
              type: integer
              description: "The security alert number."
          steps:
            - name: get-alert
              type: call
              call: "github-api.get-security-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-remediation
              type: call
              call: "jira-api.create-issue"
              with:
                project: "SEC"
                issue_type: "Bug"
                summary: "CVE {{get-alert.cve_id}}: {{get-alert.summary}} in {{repo}}"
                priority: "Critical"
                description: "Severity: {{get-alert.severity}}. Package: {{get-alert.package}}. Fix version: {{get-alert.patched_version}}."
            - name: notify-security
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "security-alerts"
                text: "CRITICAL VULN: {{get-alert.cve_id}} in {{repo}}. Package: {{get-alert.package}}. Jira: {{create-remediation.key}}."
  consumes:
    - type: http
      namespace: github-api
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: alerts
          path: "/repos/{{repo}}/dependabot/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-security-alert
              method: GET
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-security/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls campaign performance data from Google Analytics, calculates ROI against spend from SAP, refreshes the Power BI marketing dashboard, and sends the summary to Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Campaign ROI to Power BI"
  description: "Pulls campaign performance data from Google Analytics, calculates ROI against spend from SAP, refreshes the Power BI marketing dashboard, and sends the summary to Teams."
  tags:
    - marketing
    - analytics
    - google-analytics
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: campaign-roi
      port: 8080
      tools:
        - name: generate-campaign-roi
          description: "Given a campaign ID and date range, calculate marketing ROI and update dashboards. Use when marketing needs to assess campaign effectiveness."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Google Analytics campaign ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-ga-data
              type: call
              call: "ga-api.get-campaign-report"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: get-spend
              type: call
              call: "sap-co.get-marketing-spend"
              with:
                campaign_id: "{{campaign_id}}"
                period_start: "{{start_date}}"
                period_end: "{{end_date}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi-api.refresh-dataset"
              with:
                dataset_id: "marketing-roi"
            - name: send-summary
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "marketing-analytics"
                text: "Campaign {{campaign_id}} ROI: Revenue ${{get-ga-data.revenue}}, Spend ${{get-spend.total}}. Conversions: {{get-ga-data.conversions}}."
  consumes:
    - type: http
      namespace: ga-api
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/ge-property/runReport"
          operations:
            - name: get-campaign-report
              method: POST
    - type: http
      namespace: sap-co
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: cost-objects
          path: "/marketingCostObjects/{{campaign_id}}/spend"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-marketing-spend
              method: GET
    - type: http
      namespace: powerbi-api
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-marketing/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a HubSpot form submission generates a marketing qualified lead, enriches it via ZoomInfo, creates a Salesforce lead, and notifies the sales team.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Lead to Salesforce Sync"
  description: "When a HubSpot form submission generates a marketing qualified lead, enriches it via ZoomInfo, creates a Salesforce lead, and notifies the sales team."
  tags:
    - marketing
    - lead-management
    - hubspot
    - zoominfo
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-sync
      port: 8080
      tools:
        - name: sync-marketing-lead
          description: "Given a HubSpot contact ID, enrich and sync the lead to Salesforce. Use when marketing qualified leads need to be handed off to sales."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: "hubspot-api.get-contact"
              with:
                contact_id: "{{contact_id}}"
            - name: enrich-lead
              type: call
              call: "zoominfo-api.enrich-contact"
              with:
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
            - name: create-lead
              type: call
              call: "salesforce-api.create-lead"
              with:
                first_name: "{{get-contact.first_name}}"
                last_name: "{{get-contact.last_name}}"
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
                title: "{{enrich-lead.title}}"
            - name: notify-sales
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "sales-leads"
                text: "New MQL: {{get-contact.first_name}} {{get-contact.last_name}} from {{get-contact.company}}. SFDC lead: {{create-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot-api
      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: zoominfo-api
      baseUri: "https://api.zoominfo.com/lookup/v1"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/contact/enrich"
          operations:
            - name: enrich-contact
              method: POST
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              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/ge-sales/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves engineering backlog status from GE's Jira instance including open issue counts, velocity, and sprint progress.

naftiko: "0.5"
info:
  label: "Jira Engineering Backlog Status"
  description: "Retrieves engineering backlog status from GE's Jira instance including open issue counts, velocity, and sprint progress."
  tags:
    - engineering
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-backlog-status
          description: "Given a Jira project key, retrieve open issues, sprint velocity, and progress metrics."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
          call: "jira.search-issues"
          with:
            project_key: "{{project_key}}"
          outputParameters:
            - name: total_open
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://ge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql=project={{project_key}} AND status!=Done"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: search-issues
              method: GET

Retrieves the current status and assignee of a Jira issue by key.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves the current status and assignee of a Jira issue by key."
  tags:
    - project-management
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: issue-lookup
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, return the issue summary, status, and assignee. Use when project managers need a quick status check on a ticket."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., GE-1234)."
          call: "jira-api.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Validates release readiness by checking Jira for open blockers, verifying test coverage in Azure DevOps, and posting the release gate status to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Release Readiness Gate"
  description: "Validates release readiness by checking Jira for open blockers, verifying test coverage in Azure DevOps, and posting the release gate status to the engineering Teams channel."
  tags:
    - release-management
    - ci-cd
    - jira
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-gate
      port: 8080
      tools:
        - name: check-release-readiness
          description: "Given a Jira release version, validate all quality gates before approving the release. Use when release managers need to assess go/no-go for a deployment."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Jira project key."
            - name: version
              in: body
              type: string
              description: "The Jira fix version."
          steps:
            - name: check-blockers
              type: call
              call: "jira-api.search-issues"
              with:
                jql: "project={{project}} AND fixVersion={{version}} AND type=Bug AND priority=Blocker AND status!=Done"
            - name: check-tests
              type: call
              call: "azdo-api.get-test-results"
              with:
                project: "{{project}}"
                build_tag: "{{version}}"
            - name: post-gate-status
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "release-management"
                text: "Release Gate for {{project}} v{{version}}: Open blockers: {{check-blockers.total}}. Test pass rate: {{check-tests.pass_rate}}%. Gate: {{check-blockers.total == 0 ? 'GO' : 'NO-GO'}}."
  consumes:
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: azdo-api
      baseUri: "https://dev.azure.com/ge-digital"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_pat"
      resources:
        - name: test-results
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
            - name: build_tag
              in: query
          operations:
            - name: get-test-results
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Fetches all open Jira issues in the current sprint for a GE engineering project and posts a backlog health summary to the team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Backlog Status Digest"
  description: "Fetches all open Jira issues in the current sprint for a GE engineering project and posts a backlog health summary to the team's Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: jira-reporting
      port: 8080
      tools:
        - name: digest-sprint-backlog
          description: "Given a Jira project key and Teams channel, fetch all open sprint issues grouped by status and post a backlog health summary. Use for daily stand-up preparation or sprint review briefings."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key (e.g., ENG, GEVRNV)."
            - name: channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to post the digest to."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-sprint.search-issues"
              with:
                jql: "project={{project_key}} AND sprint in openSprints() ORDER BY status ASC"
            - name: post-digest
              type: call
              call: "msteams-jira.send-message"
              with:
                channel_id: "{{channel_id}}"
                text: "Sprint Backlog ({{project_key}}): {{get-sprint-issues.total}} open issues — To Do: {{get-sprint-issues.todo_count}}, In Progress: {{get-sprint-issues.inprogress_count}}, In Review: {{get-sprint-issues.review_count}}."
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://ge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams-jira
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates a weekly talent engagement digest by pulling LinkedIn recruiter analytics, matching against open Workday requisitions, and posting the summary to the recruiting Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Engagement Digest"
  description: "Generates a weekly talent engagement digest by pulling LinkedIn recruiter analytics, matching against open Workday requisitions, and posting the summary to the recruiting Teams channel."
  tags:
    - recruiting
    - talent-acquisition
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-digest
      port: 8080
      tools:
        - name: generate-talent-digest
          description: "Given a date range, compile LinkedIn sourcing metrics and match to open positions. Use when talent acquisition needs weekly pipeline visibility."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "The start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "The end date in YYYY-MM-DD format."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: "linkedin-api.get-recruiter-analytics"
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: get-open-reqs
              type: call
              call: "workday-api.list-open-requisitions"
              with:
                status: "open"
            - name: post-digest
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "recruiting-updates"
                text: "Weekly Talent Digest ({{start_date}} to {{end_date}}): {{get-linkedin-metrics.inmails_sent}} InMails sent, {{get-linkedin-metrics.responses}} responses. Open reqs: {{get-open-reqs.count}}."
  consumes:
    - type: http
      namespace: linkedin-api
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/recruiterAnalytics"
          inputParameters:
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-recruiter-analytics
              method: GET
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/ge/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-open-requisitions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-recruiting/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a social media crisis is detected, pulls engagement data from Meta, creates a crisis management case in ServiceNow, and alerts the communications team via Teams.

naftiko: "0.5"
info:
  label: "Meta Social Media Crisis Response"
  description: "When a social media crisis is detected, pulls engagement data from Meta, creates a crisis management case in ServiceNow, and alerts the communications team via Teams."
  tags:
    - communications
    - crisis-management
    - meta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-crisis
      port: 8080
      tools:
        - name: handle-social-crisis
          description: "Given a Meta post ID with negative engagement spike, initiate the crisis response workflow. Use when social media monitoring detects a reputation-impacting incident."
          inputParameters:
            - name: post_id
              in: body
              type: string
              description: "The Meta post ID."
            - name: platform
              in: body
              type: string
              description: "The platform (facebook or instagram)."
          steps:
            - name: get-engagement
              type: call
              call: "meta-api.get-post-insights"
              with:
                post_id: "{{post_id}}"
                platform: "{{platform}}"
            - name: create-crisis-case
              type: call
              call: "servicenow.create-case"
              with:
                category: "crisis_management"
                priority: "1"
                short_description: "Social media crisis: {{platform}} post {{post_id}}"
            - name: alert-comms
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "crisis-management"
                text: "SOCIAL MEDIA ALERT: {{platform}} post {{post_id}} has {{get-engagement.negative_reactions}} negative reactions. Crisis case: {{create-crisis-case.number}}."
  consumes:
    - type: http
      namespace: meta-api
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: insights
          path: "/{{post_id}}/insights"
          inputParameters:
            - name: post_id
              in: path
          operations:
            - name: get-post-insights
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              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/ge-comms/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Microsoft Graph for current GE Microsoft 365 license assignments and consumption, used for IT cost allocation and compliance reporting.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Utilization Report"
  description: "Queries Microsoft Graph for current GE Microsoft 365 license assignments and consumption, used for IT cost allocation and compliance reporting."
  tags:
    - identity
    - microsoft-365
    - reporting
    - it-finance
capability:
  exposes:
    - type: mcp
      namespace: m365-licensing
      port: 8080
      tools:
        - name: get-license-utilization
          description: "Query Microsoft Graph for Microsoft 365 subscribed SKUs and their consumed unit counts. Use for monthly IT license chargeback, compliance audits, and renewal planning."
          call: "msgraph-lic.get-subscribed-skus"
          outputParameters:
            - name: skus
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msgraph-lic
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: subscribed-skus
          path: "/subscribedSkus"
          operations:
            - name: get-subscribed-skus
              method: GET

Posts a formatted message to a specified Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Poster"
  description: "Posts a formatted message to a specified Microsoft Teams channel."
  tags:
    - communications
    - collaboration
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: teams-poster
      port: 8080
      tools:
        - name: post-message
          description: "Given a team ID, channel ID, and message text, post the message to the Teams channel. Use when automated workflows need to notify a team channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The Teams channel ID."
            - name: message
              in: body
              type: string
              description: "The message text to post."
          call: "msteams-api.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            message: "{{message}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
            - name: created_at
              type: string
              mapping: "$.createdDateTime"
  consumes:
    - type: http
      namespace: msteams-api
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new hire is confirmed in Workday, checks their role requirements, creates a ServiceNow equipment request, and tracks delivery via SAP logistics.

naftiko: "0.5"
info:
  label: "New Hire IT Equipment Provisioning"
  description: "When a new hire is confirmed in Workday, checks their role requirements, creates a ServiceNow equipment request, and tracks delivery via SAP logistics."
  tags:
    - hr
    - it-operations
    - workday
    - servicenow
    - sap
capability:
  exposes:
    - type: mcp
      namespace: equip-provision
      port: 8080
      tools:
        - name: provision-equipment
          description: "Given a Workday employee ID, determine their equipment needs and initiate provisioning. Use when IT needs to prepare hardware for incoming employees."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday-api.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-request
              type: call
              call: "servicenow.create-request"
              with:
                category: "hardware"
                short_description: "Equipment for {{get-employee.full_name}} starting {{start_date}}"
                role: "{{get-employee.job_title}}"
                location: "{{get-employee.location}}"
            - name: create-delivery-order
              type: call
              call: "sap-logistics.create-delivery"
              with:
                destination: "{{get-employee.location}}"
                items: "standard-{{get-employee.job_profile}}"
                delivery_date: "{{start_date}}"
  consumes:
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/ge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: sap-logistics
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: deliveries
          path: "/deliveryOrders"
          operations:
            - name: create-delivery
              method: POST

Queries New Relic for the current error rate percentage of a specified application.

naftiko: "0.5"
info:
  label: "New Relic Application Error Rate"
  description: "Queries New Relic for the current error rate percentage of a specified application."
  tags:
    - monitoring
    - observability
    - new-relic
capability:
  exposes:
    - type: mcp
      namespace: error-rate
      port: 8080
      tools:
        - name: get-error-rate
          description: "Given a New Relic application ID, return the current error rate and throughput. Use when SREs need to assess application health."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic-api.get-error-rate"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: error_rate
              type: number
              mapping: "$.application.error_rate"
            - name: throughput
              type: number
              mapping: "$.application.throughput"
  consumes:
    - type: http
      namespace: newrelic-api
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-error-rate
              method: GET

Launches an access certification campaign by pulling active assignments from Okta, comparing against Workday org data, and creating review tasks in ServiceNow for managers.

naftiko: "0.5"
info:
  label: "Okta User Access Certification Campaign"
  description: "Launches an access certification campaign by pulling active assignments from Okta, comparing against Workday org data, and creating review tasks in ServiceNow for managers."
  tags:
    - security
    - identity-management
    - okta
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-cert
      port: 8080
      tools:
        - name: launch-certification
          description: "Given a department and application scope, create access review tasks for managers. Use when security launches quarterly user access certifications."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to certify."
            - name: app_scope
              in: body
              type: string
              description: "The application scope (e.g., all, critical, privileged)."
          steps:
            - name: get-assignments
              type: call
              call: "okta-api.list-app-assignments"
              with:
                department: "{{department}}"
                scope: "{{app_scope}}"
            - name: get-org-data
              type: call
              call: "workday-api.get-department-roster"
              with:
                department: "{{department}}"
            - name: create-review-tasks
              type: call
              call: "servicenow.create-certification-tasks"
              with:
                department: "{{department}}"
                assignment_count: "{{get-assignments.count}}"
                active_employees: "{{get-org-data.headcount}}"
  consumes:
    - type: http
      namespace: okta-api
      baseUri: "https://ge.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: assignments
          path: "/apps/assignments"
          inputParameters:
            - name: department
              in: query
            - name: scope
              in: query
          operations:
            - name: list-app-assignments
              method: GET
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: departments
          path: "/ge/departments/{{department}}/roster"
          inputParameters:
            - name: department
              in: path
          operations:
            - name: get-department-roster
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: certifications
          path: "/table/u_access_certification"
          operations:
            - name: create-certification-tasks
              method: POST

Generates an accounts receivable aging report from Oracle EBS, identifies overdue accounts, creates collection tasks in Salesforce, and notifies the finance team via Teams.

naftiko: "0.5"
info:
  label: "Oracle AR Aging Report to Collections Workflow"
  description: "Generates an accounts receivable aging report from Oracle EBS, identifies overdue accounts, creates collection tasks in Salesforce, and notifies the finance team via Teams."
  tags:
    - finance
    - accounts-receivable
    - oracle
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ar-collections
      port: 8080
      tools:
        - name: run-ar-collections
          description: "Given an aging threshold in days, identify overdue invoices and initiate collections. Use when finance runs weekly collections reviews."
          inputParameters:
            - name: aging_days
              in: body
              type: integer
              description: "The minimum number of days overdue to include."
            - name: business_unit
              in: body
              type: string
              description: "The Oracle business unit."
          steps:
            - name: get-aging-report
              type: call
              call: "oracle-ebs.get-ar-aging"
              with:
                aging_days: "{{aging_days}}"
                business_unit: "{{business_unit}}"
            - name: create-collection-tasks
              type: call
              call: "salesforce-api.create-tasks"
              with:
                subject: "Collections follow-up: {{business_unit}} >{{aging_days}} days"
                accounts: "{{get-aging-report.overdue_accounts}}"
            - name: notify-finance
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "finance-collections"
                text: "AR Aging Report ({{business_unit}}, >{{aging_days}} days): {{get-aging-report.overdue_count}} accounts, ${{get-aging-report.total_outstanding}} outstanding."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: receivables
          path: "/receivables/aging"
          inputParameters:
            - name: aging_days
              in: query
            - name: business_unit
              in: query
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-tasks
              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/ge-finance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the outstanding accounts payable balance for a supplier from Oracle E-Business Suite.

naftiko: "0.5"
info:
  label: "Oracle EBS Supplier Balance Lookup"
  description: "Retrieves the outstanding accounts payable balance for a supplier from Oracle E-Business Suite."
  tags:
    - finance
    - accounts-payable
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: supplier-balance
      port: 8080
      tools:
        - name: get-balance
          description: "Given a supplier ID, return the outstanding balance and last payment date. Use when AP analysts need to verify supplier payment status."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The Oracle EBS supplier ID."
          call: "oracle-ebs.get-supplier-balance"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: outstanding_balance
              type: number
              mapping: "$.balance.amount"
            - name: currency
              type: string
              mapping: "$.balance.currency"
            - name: last_payment_date
              type: string
              mapping: "$.balance.last_payment"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}/balance"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-balance
              method: GET

Orchestrates the monthly period close by running Oracle EBS reconciliation reports, validating totals against SAP, and creating a sign-off task in ServiceNow.

naftiko: "0.5"
info:
  label: "Oracle Period Close Reconciliation Workflow"
  description: "Orchestrates the monthly period close by running Oracle EBS reconciliation reports, validating totals against SAP, and creating a sign-off task in ServiceNow."
  tags:
    - finance
    - accounting
    - oracle
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: run-period-close
          description: "Given a fiscal period, execute the reconciliation workflow and prepare sign-off documentation. Use when finance runs the monthly close cycle."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period (e.g., 2026-03)."
            - name: ledger_id
              in: body
              type: string
              description: "The Oracle general ledger ID."
          steps:
            - name: get-oracle-totals
              type: call
              call: "oracle-ebs.get-period-totals"
              with:
                period: "{{fiscal_period}}"
                ledger_id: "{{ledger_id}}"
            - name: get-sap-totals
              type: call
              call: "sap-fi.get-period-totals"
              with:
                period: "{{fiscal_period}}"
            - name: create-signoff
              type: call
              call: "servicenow.create-task"
              with:
                category: "finance_close"
                short_description: "Period close {{fiscal_period}}: Oracle total ${{get-oracle-totals.balance}}, SAP total ${{get-sap-totals.balance}}"
                assignment_group: "Finance_Controllers"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: ledger
          path: "/ledgers/{{ledger_id}}/periods/{{period}}/totals"
          inputParameters:
            - name: period
              in: path
            - name: ledger_id
              in: path
          operations:
            - name: get-period-totals
              method: GET
    - type: http
      namespace: sap-fi
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: period-totals
          path: "/generalLedger/periods/{{period}}/totals"
          inputParameters:
            - name: period
              in: path
          operations:
            - name: get-period-totals
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves the current on-call engineer for a specified PagerDuty escalation policy.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a specified PagerDuty escalation policy."
  tags:
    - incident-management
    - on-call
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-oncall
          description: "Given an escalation policy ID, return the currently on-call engineer name and contact. Use when incident coordinators need to reach the responsible engineer."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID."
          call: "pagerduty-api.get-oncall"
          with:
            policy_id: "{{policy_id}}"
          outputParameters:
            - name: engineer_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty-api
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: policy_id
              in: query
          operations:
            - name: get-oncall
              method: GET

Retrieves the latest GE Aviation fleet analytics dashboard refresh status from Power BI including engine utilization and maintenance forecast data.

naftiko: "0.5"
info:
  label: "Power BI Aviation Fleet Dashboard"
  description: "Retrieves the latest GE Aviation fleet analytics dashboard refresh status from Power BI including engine utilization and maintenance forecast data."
  tags:
    - analytics
    - aviation
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-aviation-dashboard
          description: "Given a Power BI dataset ID, retrieve the last refresh status for GE's aviation fleet dashboard."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: "powerbi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers an on-demand refresh of a GE Power BI dataset to ensure executive and operations dashboards reflect the latest data.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Trigger"
  description: "Triggers an on-demand refresh of a GE Power BI dataset to ensure executive and operations dashboards reflect the latest data."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: trigger-dataset-refresh
          description: "Given a Power BI workspace ID and dataset ID, trigger an on-demand dataset refresh. Use when GE operational or financial data must be updated outside the scheduled refresh window."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          call: "powerbi.refresh-dataset"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Triggers a Power BI dataset refresh and then posts a dashboard link to the GE executive leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Digest"
  description: "Triggers a Power BI dataset refresh and then posts a dashboard link to the GE executive leadership Microsoft Teams channel."
  tags:
    - reporting
    - power-bi
    - microsoft-teams
    - executive
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: publish-exec-dashboard
          description: "Given Power BI workspace and dataset IDs, trigger a dataset refresh and post a direct dashboard link to the executive Teams channel. Use before weekly leadership briefings or board reporting cycles."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
            - name: dashboard_url
              in: body
              type: string
              description: "The Power BI dashboard URL to share with leadership."
          steps:
            - name: refresh-dataset
              type: call
              call: "powerbi-exec.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: post-dashboard-link
              type: call
              call: "msteams-exec.send-message"
              with:
                channel_id: "$secrets.teams_exec_channel_id"
                text: "Executive dashboard refreshed and ready. View here: {{dashboard_url}} (Refresh ID: {{refresh-dataset.requestId}})"
  consumes:
    - type: http
      namespace: powerbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-exec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates a gas turbine efficiency report by pulling sensor data from Snowflake, refreshing the Power BI dataset, and distributing the report link to plant managers via Teams.

naftiko: "0.5"
info:
  label: "Power BI Gas Turbine Efficiency Report"
  description: "Generates a gas turbine efficiency report by pulling sensor data from Snowflake, refreshing the Power BI dataset, and distributing the report link to plant managers via Teams."
  tags:
    - energy
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: turbine-efficiency
      port: 8080
      tools:
        - name: generate-efficiency-report
          description: "Given a turbine fleet ID and time window, compile efficiency metrics and distribute. Use when plant managers need weekly turbine efficiency summaries."
          inputParameters:
            - name: fleet_id
              in: body
              type: string
              description: "The turbine fleet identifier."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., last-7-days)."
          steps:
            - name: query-metrics
              type: call
              call: "snowflake-api.query-fleet-efficiency"
              with:
                fleet_id: "{{fleet_id}}"
                period: "{{period}}"
            - name: refresh-report
              type: call
              call: "powerbi-api.refresh-dataset"
              with:
                dataset_id: "turbine-efficiency-{{fleet_id}}"
            - name: distribute-report
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "plant-managers"
                text: "Turbine Efficiency Report for fleet {{fleet_id}} ({{period}}): Avg efficiency {{query-metrics.avg_efficiency}}%, heat rate {{query-metrics.avg_heat_rate}} BTU/kWh. Dashboard updated."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-fleet-efficiency
              method: POST
    - type: http
      namespace: powerbi-api
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-energy/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Generates a daily operations report by pulling turbine performance from Snowflake, maintenance tickets from ServiceNow, and publishing the report to Power BI and Teams.

naftiko: "0.5"
info:
  label: "Power Plant Daily Ops Report Generator"
  description: "Generates a daily operations report by pulling turbine performance from Snowflake, maintenance tickets from ServiceNow, and publishing the report to Power BI and Teams."
  tags:
    - energy
    - operations
    - snowflake
    - servicenow
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: daily-ops-report
      port: 8080
      tools:
        - name: generate-daily-report
          description: "Given a plant ID and report date, aggregate turbine metrics, maintenance status, and distribute the report. Use when plant operations managers need their daily summary."
          inputParameters:
            - name: plant_id
              in: body
              type: string
              description: "The power plant identifier."
            - name: report_date
              in: body
              type: string
              description: "The report date in YYYY-MM-DD format."
          steps:
            - name: get-turbine-metrics
              type: call
              call: "snowflake-api.query-plant-metrics"
              with:
                plant_id: "{{plant_id}}"
                date: "{{report_date}}"
            - name: get-open-tickets
              type: call
              call: "servicenow.query-plant-tickets"
              with:
                plant_id: "{{plant_id}}"
                state: "open"
            - name: refresh-dashboard
              type: call
              call: "powerbi-api.refresh-dataset"
              with:
                dataset_id: "plant-ops-{{plant_id}}"
            - name: send-summary
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "plant-ops-{{plant_id}}"
                text: "Daily Ops Report for {{plant_id}} on {{report_date}}: Avg efficiency {{get-turbine-metrics.avg_efficiency}}%. Open tickets: {{get-open-tickets.count}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-plant-metrics
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: plant_id
              in: query
            - name: state
              in: query
          operations:
            - name: query-plant-tickets
              method: GET
    - type: http
      namespace: powerbi-api
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-energy/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Orchestrates a quarterly compliance audit by pulling access reviews from Azure AD, license data from Microsoft 365, and generating an audit report in ServiceNow.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Audit Orchestrator"
  description: "Orchestrates a quarterly compliance audit by pulling access reviews from Azure AD, license data from Microsoft 365, and generating an audit report in ServiceNow."
  tags:
    - compliance
    - audit
    - azure-ad
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-audit
      port: 8080
      tools:
        - name: run-quarterly-audit
          description: "Given a quarter identifier, execute access reviews, license audits, and generate the compliance report. Use when compliance officers need to run scheduled quarterly audits."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "The quarter identifier (e.g., 2026-Q1)."
            - name: department
              in: body
              type: string
              description: "The department to audit."
          steps:
            - name: pull-access-reviews
              type: call
              call: "azure-ad.list-access-reviews"
              with:
                department: "{{department}}"
            - name: pull-license-data
              type: call
              call: "m365-api.get-license-usage"
              with:
                department: "{{department}}"
            - name: create-audit-report
              type: call
              call: "servicenow.create-audit-record"
              with:
                quarter: "{{quarter}}"
                department: "{{department}}"
                access_review_count: "{{pull-access-reviews.review_count}}"
                license_utilization: "{{pull-license-data.utilization_pct}}"
  consumes:
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: access-reviews
          path: "/identityGovernance/accessReviews/definitions"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: list-access-reviews
              method: GET
    - type: http
      namespace: m365-api
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: licenses
          path: "/reports/getOffice365ActiveUserDetail"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-license-usage
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audit-records
          path: "/table/u_compliance_audit"
          operations:
            - name: create-audit-record
              method: POST

Enriches a Salesforce account record with updated company data by patching key fields and logging the update activity.

naftiko: "0.5"
info:
  label: "Salesforce Account Enrichment"
  description: "Enriches a Salesforce account record with updated company data by patching key fields and logging the update activity."
  tags:
    - crm
    - sales
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-enrichment
      port: 8080
      tools:
        - name: enrich-account
          description: "Given a Salesforce account ID and updated company attributes, patch the account record with new data. Use when sales operations updates account profiles from external data sources."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID (18-character SFDC ID)."
            - name: industry
              in: body
              type: string
              description: "Updated industry classification."
            - name: annual_revenue
              in: body
              type: number
              description: "Updated annual revenue estimate in USD."
            - name: employee_count
              in: body
              type: integer
              description: "Updated employee count for the account."
          call: "salesforce-enrich.update-account"
          with:
            account_id: "{{account_id}}"
            industry: "{{industry}}"
            annual_revenue: "{{annual_revenue}}"
            employee_count: "{{employee_count}}"
          outputParameters:
            - name: updated_id
              type: string
              mapping: "$.id"
            - name: success
              type: boolean
              mapping: "$.success"
  consumes:
    - type: http
      namespace: salesforce-enrich
      baseUri: "https://ge.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: update-account
              method: PATCH

Performs a health check on contracts nearing renewal by pulling usage metrics from Snowflake, customer satisfaction from Salesforce, and generating a renewal brief in Confluence.

naftiko: "0.5"
info:
  label: "Salesforce Contract Renewal Health Check"
  description: "Performs a health check on contracts nearing renewal by pulling usage metrics from Snowflake, customer satisfaction from Salesforce, and generating a renewal brief in Confluence."
  tags:
    - sales
    - customer-success
    - salesforce
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: renewal-health
      port: 8080
      tools:
        - name: check-renewal-health
          description: "Given a Salesforce account ID, compile renewal readiness metrics. Use when account managers prepare for upcoming contract renewals."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          steps:
            - name: get-account
              type: call
              call: "salesforce-api.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-usage
              type: call
              call: "snowflake-api.query-account-usage"
              with:
                account_id: "{{account_id}}"
            - name: get-satisfaction
              type: call
              call: "salesforce-api.get-nps-score"
              with:
                account_id: "{{account_id}}"
            - name: create-brief
              type: call
              call: "confluence-api.create-page"
              with:
                space: "SALES"
                title: "Renewal Brief: {{get-account.name}}"
                body: "Usage trend: {{get-usage.trend}}. NPS: {{get-satisfaction.nps}}. Contract value: ${{get-account.contract_value}}. Renewal date: {{get-account.renewal_date}}."
  consumes:
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.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
            - name: get-nps-score
              method: GET
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-account-usage
              method: POST
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves customer account details from GE's Salesforce including account tier, installed base, and primary contact.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Lookup"
  description: "Retrieves customer account details from GE's Salesforce including account tier, installed base, and primary contact."
  tags:
    - sales
    - customer-management
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: get-customer-account
          description: "Given a Salesforce account ID, retrieve account name, tier, installed base count, and primary contact."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: tier
              type: string
              mapping: "$.Account_Tier__c"
            - name: installed_base
              type: number
              mapping: "$.Installed_Base_Count__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://ge.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

When a Salesforce opportunity is marked Closed-Won, opens a ServiceNow customer onboarding ticket and sends a welcome email via Microsoft 365.

naftiko: "0.5"
info:
  label: "Salesforce Customer Onboarding Trigger"
  description: "When a Salesforce opportunity is marked Closed-Won, opens a ServiceNow customer onboarding ticket and sends a welcome email via Microsoft 365."
  tags:
    - crm
    - sales
    - salesforce
    - servicenow
    - customer-onboarding
capability:
  exposes:
    - type: mcp
      namespace: customer-onboarding
      port: 8080
      tools:
        - name: trigger-customer-onboarding
          description: "Given a Salesforce opportunity ID, retrieve account details, open a ServiceNow customer onboarding ticket, and send a welcome message to the account owner via Microsoft Teams. Use when a new GE customer deal is closed and implementation must start."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID that was closed-won."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-onboard.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-onboard-ticket
              type: call
              call: "servicenow-onboard.create-incident"
              with:
                category: "customer_onboarding"
                short_description: "New customer onboarding: {{get-opportunity.account_name}}"
                description: "Opportunity: {{opportunity_id}}\nValue: ${{get-opportunity.amount}}\nClose date: {{get-opportunity.close_date}}"
            - name: notify-account-owner
              type: call
              call: "msteams-onboard.send-message"
              with:
                recipient_upn: "{{get-opportunity.owner_email}}"
                text: "Opportunity {{opportunity_id}} ({{get-opportunity.account_name}}) is Closed-Won! Onboarding ticket: {{create-onboard-ticket.number}}. Implementation begins."
  consumes:
    - type: http
      namespace: salesforce-onboard
      baseUri: "https://ge.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: servicenow-onboard
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-onboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Fetches all open Salesforce opportunities above a dollar threshold for a given sales region and posts a pipeline summary to the sales team Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Sync"
  description: "Fetches all open Salesforce opportunities above a dollar threshold for a given sales region and posts a pipeline summary to the sales team Microsoft Teams channel."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: crm-pipeline
      port: 8080
      tools:
        - name: digest-opportunity-pipeline
          description: "Given a sales region and minimum deal value, query Salesforce for open opportunities and post a pipeline summary to the sales Teams channel. Use for weekly pipeline reviews and executive sales briefings."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The sales region to filter opportunities by (e.g., North America, EMEA)."
            - name: min_amount
              in: body
              type: number
              description: "Minimum opportunity amount in USD to include in the summary."
          steps:
            - name: get-opportunities
              type: call
              call: "salesforce.query-opportunities"
              with:
                region: "{{region}}"
                min_amount: "{{min_amount}}"
            - name: post-summary
              type: call
              call: "msteams-sales.send-message"
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "Sales Pipeline ({{region}}, >${{min_amount}}): {{get-opportunities.total_count}} open opportunities totaling ${{get-opportunities.total_value}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Salesforce opportunity is marked as won, creates a sales order in SAP S/4HANA and syncs the customer record, then notifies the account team.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Won to SAP Order"
  description: "When a Salesforce opportunity is marked as won, creates a sales order in SAP S/4HANA and syncs the customer record, then notifies the account team."
  tags:
    - sales
    - erp
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: opp-to-order
      port: 8080
      tools:
        - name: process-won-opportunity
          description: "Given a Salesforce opportunity ID, create the corresponding SAP sales order and update the team. Use when sales closes a deal and order fulfillment must begin."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-api.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-order
              type: call
              call: "sap-sd.create-sales-order"
              with:
                customer_number: "{{get-opportunity.account_sap_id}}"
                material: "{{get-opportunity.product_code}}"
                quantity: "{{get-opportunity.quantity}}"
                amount: "{{get-opportunity.amount}}"
            - name: notify-account-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "sales-wins"
                text: "Opportunity {{get-opportunity.name}} closed won! SAP order {{create-sap-order.order_number}} created for ${{get-opportunity.amount}}."
  consumes:
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.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: sap-sd
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: sales-orders
          path: "/salesOrders"
          operations:
            - name: create-sales-order
              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/ge-sales/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Automatically creates renewal opportunities in Salesforce for expiring service contracts by checking SAP contract dates, creating the opportunity, and alerting the account team.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Opportunity Creator"
  description: "Automatically creates renewal opportunities in Salesforce for expiring service contracts by checking SAP contract dates, creating the opportunity, and alerting the account team."
  tags:
    - sales
    - renewals
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: renewal-creator
      port: 8080
      tools:
        - name: create-renewal-opportunity
          description: "Given a contract ID nearing expiration, create the renewal opportunity and notify the account team. Use when contracts approach their renewal window."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP service contract ID."
          steps:
            - name: get-contract
              type: call
              call: "sap-sd.get-service-contract"
              with:
                contract_id: "{{contract_id}}"
            - name: create-opportunity
              type: call
              call: "salesforce-api.create-opportunity"
              with:
                account_id: "{{get-contract.account_sfdc_id}}"
                name: "Renewal: {{get-contract.description}}"
                amount: "{{get-contract.annual_value}}"
                close_date: "{{get-contract.expiry_date}}"
                stage: "Qualification"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "sales-renewals"
                text: "Renewal opportunity created: {{get-contract.description}} (${{get-contract.annual_value}}). Expires: {{get-contract.expiry_date}}. SFDC: {{create-opportunity.id}}."
  consumes:
    - type: http
      namespace: sap-sd
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: contracts
          path: "/serviceContracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-service-contract
              method: GET
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.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: messages
          path: "/teams/ge-sales/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Salesforce service case requires field service, creates a SAP field service order, assigns a technician from Workday, and sends dispatch details via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Service Case to SAP Field Dispatch"
  description: "When a Salesforce service case requires field service, creates a SAP field service order, assigns a technician from Workday, and sends dispatch details via Teams."
  tags:
    - field-service
    - customer-service
    - salesforce
    - sap
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-dispatch
      port: 8080
      tools:
        - name: dispatch-field-service
          description: "Given a Salesforce case ID requiring on-site support, create the field service work order and dispatch a technician. Use when remote troubleshooting fails and on-site visit is needed."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: "salesforce-api.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-work-order
              type: call
              call: "sap-pm.create-field-order"
              with:
                customer: "{{get-case.account_name}}"
                location: "{{get-case.site_address}}"
                description: "{{get-case.subject}}"
            - name: find-technician
              type: call
              call: "workday-api.get-available-technician"
              with:
                region: "{{get-case.region}}"
                skill: "{{get-case.product_family}}"
            - name: send-dispatch
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{find-technician.email}}"
                text: "Field dispatch: {{get-case.account_name}} at {{get-case.site_address}}. Issue: {{get-case.subject}}. SAP order: {{create-work-order.order_number}}."
  consumes:
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: sap-pm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: field-orders
          path: "/fieldServiceOrders"
          operations:
            - name: create-field-order
              method: POST
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: technicians
          path: "/ge/technicians"
          inputParameters:
            - name: region
              in: query
            - name: skill
              in: query
          operations:
            - name: get-available-technician
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

When an expense report is approved in SAP Concur, extracts line items, creates a journal entry in Oracle EBS, and sends a confirmation to the submitter via Outlook.

naftiko: "0.5"
info:
  label: "SAP Concur Expense to Oracle Journal Entry"
  description: "When an expense report is approved in SAP Concur, extracts line items, creates a journal entry in Oracle EBS, and sends a confirmation to the submitter via Outlook."
  tags:
    - finance
    - expense-management
    - sap-concur
    - oracle
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: expense-journal
      port: 8080
      tools:
        - name: process-approved-expense
          description: "Given a Concur expense report ID, create the corresponding Oracle journal entry and confirm. Use when approved expenses need to be posted to the general ledger."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur-api.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: create-journal
              type: call
              call: "oracle-ebs.create-journal-entry"
              with:
                amount: "{{get-report.total_amount}}"
                cost_center: "{{get-report.cost_center}}"
                description: "Expense report {{report_id}} — {{get-report.employee_name}}"
            - name: send-confirmation
              type: call
              call: "outlook-api.send-email"
              with:
                to: "{{get-report.employee_email}}"
                subject: "Expense Report {{report_id}} Posted"
                body: "Your expense report for ${{get-report.total_amount}} has been posted. Journal entry: {{create-journal.entry_id}}."
  consumes:
    - type: http
      namespace: concur-api
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: journals
          path: "/journalEntries"
          operations:
            - name: create-journal-entry
              method: POST
    - type: http
      namespace: outlook-api
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-email
              method: POST

Converts demand forecasts from Snowflake into SAP planned orders, checks material availability, and creates production schedules, then notifies plant managers.

naftiko: "0.5"
info:
  label: "SAP Demand Planning to Production Scheduling"
  description: "Converts demand forecasts from Snowflake into SAP planned orders, checks material availability, and creates production schedules, then notifies plant managers."
  tags:
    - supply-chain
    - production-planning
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: demand-to-production
      port: 8080
      tools:
        - name: convert-demand-to-schedule
          description: "Given a planning period and product group, translate demand into production schedules. Use when supply chain planning converts weekly demand forecasts into production runs."
          inputParameters:
            - name: planning_period
              in: body
              type: string
              description: "The planning period (e.g., 2026-W14)."
            - name: product_group
              in: body
              type: string
              description: "The SAP product group."
          steps:
            - name: get-forecast
              type: call
              call: "snowflake-api.query-demand-forecast"
              with:
                period: "{{planning_period}}"
                product_group: "{{product_group}}"
            - name: check-material
              type: call
              call: "sap-mm.check-availability"
              with:
                materials: "{{get-forecast.material_list}}"
                plant: "{{get-forecast.primary_plant}}"
            - name: create-planned-orders
              type: call
              call: "sap-pp.create-planned-orders"
              with:
                product_group: "{{product_group}}"
                quantities: "{{get-forecast.quantities}}"
                plant: "{{get-forecast.primary_plant}}"
            - name: notify-plant
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "production-planning"
                text: "Production schedule for {{product_group}} ({{planning_period}}): {{create-planned-orders.order_count}} planned orders. Material availability: {{check-material.available_pct}}%."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-demand-forecast
              method: POST
    - type: http
      namespace: sap-mm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: availability
          path: "/materialAvailability/check"
          operations:
            - name: check-availability
              method: POST
    - type: http
      namespace: sap-pp
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: planned-orders
          path: "/plannedOrders"
          operations:
            - name: create-planned-orders
              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/ge-supply-chain/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Generates an environmental compliance report by pulling emissions data from Snowflake, cross-referencing SAP plant operations, and publishing to Confluence for regulatory submission.

naftiko: "0.5"
info:
  label: "SAP Environmental Compliance Report"
  description: "Generates an environmental compliance report by pulling emissions data from Snowflake, cross-referencing SAP plant operations, and publishing to Confluence for regulatory submission."
  tags:
    - sustainability
    - compliance
    - snowflake
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: env-compliance
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Given a reporting period and plant ID, compile emissions data and generate the compliance report. Use when environmental engineers prepare regulatory submissions."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., 2026-Q1)."
            - name: plant_id
              in: body
              type: string
              description: "The SAP plant code."
          steps:
            - name: get-emissions
              type: call
              call: "snowflake-api.query-emissions-data"
              with:
                period: "{{period}}"
                plant_id: "{{plant_id}}"
            - name: get-plant-ops
              type: call
              call: "sap-api.get-plant-operations"
              with:
                plant_id: "{{plant_id}}"
                period: "{{period}}"
            - name: publish-report
              type: call
              call: "confluence-api.create-page"
              with:
                space: "ENV-COMPLIANCE"
                title: "Environmental Report — {{plant_id}} — {{period}}"
                body: "CO2 emissions: {{get-emissions.co2_tons}} tons. NOx: {{get-emissions.nox_tons}} tons. Production hours: {{get-plant-ops.operating_hours}}."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-emissions-data
              method: POST
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: plants
          path: "/plants/{{plant_id}}/operations"
          inputParameters:
            - name: plant_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-plant-operations
              method: GET
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When goods are received in SAP, triggers a quality inspection lot, assigns the inspector from Workday, and creates a Jira task for tracking.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Quality Inspection Trigger"
  description: "When goods are received in SAP, triggers a quality inspection lot, assigns the inspector from Workday, and creates a Jira task for tracking."
  tags:
    - supply-chain
    - quality-management
    - sap
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: gr-inspection
      port: 8080
      tools:
        - name: trigger-gr-inspection
          description: "Given a goods receipt document number, create the inspection lot and assign inspectors. Use when inbound materials require mandatory quality checks."
          inputParameters:
            - name: gr_document
              in: body
              type: string
              description: "The SAP goods receipt document number."
          steps:
            - name: get-gr-details
              type: call
              call: "sap-api.get-goods-receipt"
              with:
                document_number: "{{gr_document}}"
            - name: create-lot
              type: call
              call: "sap-qm.create-inspection-lot"
              with:
                material: "{{get-gr-details.material_number}}"
                batch: "{{get-gr-details.batch}}"
                plant: "{{get-gr-details.plant}}"
            - name: get-inspector
              type: call
              call: "workday-api.get-quality-inspector"
              with:
                plant: "{{get-gr-details.plant}}"
            - name: create-task
              type: call
              call: "jira-api.create-issue"
              with:
                project: "QA"
                issue_type: "Task"
                summary: "Inspect lot {{create-lot.lot_number}} for material {{get-gr-details.material_number}}"
                assignee: "{{get-inspector.employee_id}}"
  consumes:
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: goods-receipts
          path: "/goodsReceipts/{{document_number}}"
          inputParameters:
            - name: document_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
    - type: http
      namespace: sap-qm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: inspection-lots
          path: "/inspectionLots"
          operations:
            - name: create-inspection-lot
              method: POST
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: inspectors
          path: "/ge/qualityInspectors"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: get-quality-inspector
              method: GET
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Reconciles intercompany billing by comparing SAP company code entries, flagging discrepancies, and creating resolution tasks in ServiceNow for the accounting team.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing by comparing SAP company code entries, flagging discrepancies, and creating resolution tasks in ServiceNow for the accounting team."
  tags:
    - finance
    - intercompany
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ic-reconciliation
      port: 8080
      tools:
        - name: reconcile-intercompany
          description: "Given two SAP company codes and a fiscal period, compare intercompany transactions and flag mismatches. Use when finance performs monthly intercompany reconciliation."
          inputParameters:
            - name: company_code_1
              in: body
              type: string
              description: "The first SAP company code."
            - name: company_code_2
              in: body
              type: string
              description: "The second SAP company code."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period (e.g., 2026-03)."
          steps:
            - name: get-cc1-entries
              type: call
              call: "sap-fi.get-ic-entries"
              with:
                company_code: "{{company_code_1}}"
                partner_code: "{{company_code_2}}"
                period: "{{fiscal_period}}"
            - name: get-cc2-entries
              type: call
              call: "sap-fi.get-ic-entries"
              with:
                company_code: "{{company_code_2}}"
                partner_code: "{{company_code_1}}"
                period: "{{fiscal_period}}"
            - name: create-resolution-task
              type: call
              call: "servicenow.create-task"
              with:
                category: "ic_reconciliation"
                short_description: "IC recon {{company_code_1}}<>{{company_code_2}} for {{fiscal_period}}: CC1=${{get-cc1-entries.total}}, CC2=${{get-cc2-entries.total}}"
                assignment_group: "IC_Accounting"
            - name: notify-finance
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "finance-ic"
                text: "IC Recon {{company_code_1}}<>{{company_code_2}} ({{fiscal_period}}): CC1 total ${{get-cc1-entries.total}}, CC2 total ${{get-cc2-entries.total}}. Difference: ${{get-cc1-entries.difference}}."
  consumes:
    - type: http
      namespace: sap-fi
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: ic-entries
          path: "/generalLedger/intercompany"
          inputParameters:
            - name: company_code
              in: query
            - name: partner_code
              in: query
            - name: period
              in: query
          operations:
            - name: get-ic-entries
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-finance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves current inventory levels for a specified material number from SAP warehouse management.

naftiko: "0.5"
info:
  label: "SAP Inventory Level Lookup"
  description: "Retrieves current inventory levels for a specified material number from SAP warehouse management."
  tags:
    - erp
    - supply-chain
    - sap
capability:
  exposes:
    - type: mcp
      namespace: inventory-lookup
      port: 8080
      tools:
        - name: lookup-inventory
          description: "Given a SAP material number and plant code, return the current stock quantity and storage location. Use when supply chain planners need real-time inventory visibility."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
          call: "sap-inventory.get-stock"
          with:
            material_number: "{{material_number}}"
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: quantity
              type: number
              mapping: "$.available_stock"
            - name: storage_location
              type: string
              mapping: "$.storage_loc"
  consumes:
    - type: http
      namespace: sap-inventory
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: stock
          path: "/material/{{material_number}}/plant/{{plant_code}}/stock"
          inputParameters:
            - name: material_number
              in: path
            - name: plant_code
              in: path
          operations:
            - name: get-stock
              method: GET

Submits a supplier invoice to SAP S/4HANA accounts payable, links it to the corresponding PO, and notifies the approving manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Invoice Submission and Approval Routing"
  description: "Submits a supplier invoice to SAP S/4HANA accounts payable, links it to the corresponding PO, and notifies the approving manager via Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ap-processing
      port: 8080
      tools:
        - name: submit-invoice
          description: "Given invoice details and a linked SAP PO number, create the invoice in SAP S/4HANA and send an approval request to the finance manager via Microsoft Teams. Use during accounts-payable processing."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP PO number the invoice is billed against."
            - name: invoice_number
              in: body
              type: string
              description: "The supplier invoice number."
            - name: amount
              in: body
              type: number
              description: "Invoice total in the PO currency."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the finance approver."
          steps:
            - name: create-invoice
              type: call
              call: "sap-ap.create-supplier-invoice"
              with:
                po_number: "{{po_number}}"
                invoice_number: "{{invoice_number}}"
                amount: "{{amount}}"
            - name: notify-approver
              type: call
              call: "msteams-ap.send-message"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Invoice {{invoice_number}} for SAP PO {{po_number}} (${{amount}}) submitted. Invoice ID: {{create-invoice.invoice_id}}. Please review and approve in SAP."
  consumes:
    - type: http
      namespace: sap-ap
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: create-supplier-invoice
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Validates an incoming supplier invoice by performing a three-way match against the SAP purchase order, goods receipt, and invoice amount, then routes discrepancies to AP for review.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Validator"
  description: "Validates an incoming supplier invoice by performing a three-way match against the SAP purchase order, goods receipt, and invoice amount, then routes discrepancies to AP for review."
  tags:
    - finance
    - accounts-payable
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: invoice-match
      port: 8080
      tools:
        - name: validate-invoice-match
          description: "Given an invoice document number, perform three-way matching and flag discrepancies. Use when AP automation needs to validate supplier invoices before payment."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: "sap-fi.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: "sap-mm.get-purchase-order"
              with:
                po_number: "{{get-invoice.po_reference}}"
            - name: get-gr
              type: call
              call: "sap-mm.get-goods-receipt-by-po"
              with:
                po_number: "{{get-invoice.po_reference}}"
            - name: create-discrepancy-ticket
              type: call
              call: "servicenow.create-task"
              with:
                category: "ap_review"
                short_description: "Invoice {{invoice_number}} three-way match: PO ${{get-po.amount}}, GR qty {{get-gr.received_qty}}, Invoice ${{get-invoice.amount}}"
                assignment_group: "Accounts_Payable"
  consumes:
    - type: http
      namespace: sap-fi
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: invoices
          path: "/supplierInvoices/{{invoice_number}}"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-mm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
        - name: goods-receipts
          path: "/goodsReceipts"
          inputParameters:
            - name: po_number
              in: query
          operations:
            - name: get-goods-receipt-by-po
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves material master record details from GE's SAP S/4HANA system including description, unit of measure, and material group.

naftiko: "0.5"
info:
  label: "SAP Material Master Data Lookup"
  description: "Retrieves material master record details from GE's SAP S/4HANA system including description, unit of measure, and material group."
  tags:
    - erp
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material-master
          description: "Given a SAP material number, retrieve the material description, base unit of measure, and material group from GE's SAP system."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: "sap-s4.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

When SAP detects a material shortage, checks inventory levels, identifies affected production orders, and sends an alert to the supply chain Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "SAP Material Shortage Alert to Teams"
  description: "When SAP detects a material shortage, checks inventory levels, identifies affected production orders, and sends an alert to the supply chain Microsoft Teams channel."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: shortage-alert
      port: 8080
      tools:
        - name: trigger-shortage-alert
          description: "Given a SAP material number with a shortage alert, look up inventory, find impacted production orders, and notify the supply chain team via Microsoft Teams. Use when MRP runs detect material shortfalls."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number with a detected shortage."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
          steps:
            - name: check-inventory
              type: call
              call: "sap-inventory.get-stock"
              with:
                material_number: "{{material_number}}"
                plant_code: "{{plant_code}}"
            - name: get-affected-orders
              type: call
              call: "sap-pp.get-dependent-orders"
              with:
                material_number: "{{material_number}}"
                plant_code: "{{plant_code}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "supply-chain-alerts"
                text: "Material shortage: {{material_number}} at plant {{plant_code}}. Current stock: {{check-inventory.available_stock}}. Affected orders: {{get-affected-orders.order_count}}."
  consumes:
    - type: http
      namespace: sap-inventory
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: stock
          path: "/material/{{material_number}}/plant/{{plant_code}}/stock"
          inputParameters:
            - name: material_number
              in: path
            - name: plant_code
              in: path
          operations:
            - name: get-stock
              method: GET
    - type: http
      namespace: sap-pp
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: dependent-orders
          path: "/material/{{material_number}}/dependentOrders"
          inputParameters:
            - name: material_number
              in: path
            - name: plant_code
              in: query
          operations:
            - name: get-dependent-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-supply-chain/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Creates a SAP Plant Maintenance work order for equipment at a GE Vernova or GE Aerospace facility and notifies the maintenance technician via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Creator"
  description: "Creates a SAP Plant Maintenance work order for equipment at a GE Vernova or GE Aerospace facility and notifies the maintenance technician via Microsoft Teams."
  tags:
    - manufacturing
    - plant-maintenance
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-work-order
          description: "Given equipment ID, plant code, maintenance type, and description, create a SAP PM work order and notify the assigned technician in Microsoft Teams. Use when scheduling preventive or corrective maintenance tasks at GE facilities."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment number requiring maintenance."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code where the equipment is located."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance: PM (preventive) or CM (corrective)."
            - name: description
              in: body
              type: string
              description: "Description of the maintenance task required."
            - name: technician_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the assigned maintenance technician."
          steps:
            - name: create-wo
              type: call
              call: "sap-pm.create-work-order"
              with:
                equipment_id: "{{equipment_id}}"
                plant_code: "{{plant_code}}"
                maintenance_type: "{{maintenance_type}}"
                description: "{{description}}"
            - name: notify-technician
              type: call
              call: "msteams-pm.send-message"
              with:
                recipient_upn: "{{technician_upn}}"
                text: "New maintenance work order {{create-wo.work_order_number}} created for equipment {{equipment_id}} at plant {{plant_code}}. Type: {{maintenance_type}}. Description: {{description}}."
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_0001"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams-pm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Coordinates a planned plant shutdown by creating maintenance orders in SAP, notifying affected teams via Teams, and creating a tracking project in Jira.

naftiko: "0.5"
info:
  label: "SAP Plant Shutdown Coordination"
  description: "Coordinates a planned plant shutdown by creating maintenance orders in SAP, notifying affected teams via Teams, and creating a tracking project in Jira."
  tags:
    - maintenance
    - operations
    - sap
    - microsoft-teams
    - jira
capability:
  exposes:
    - type: mcp
      namespace: shutdown-coord
      port: 8080
      tools:
        - name: coordinate-plant-shutdown
          description: "Given a plant ID and shutdown window, create all necessary maintenance orders and coordinate team notifications. Use when operations plans a scheduled plant outage."
          inputParameters:
            - name: plant_id
              in: body
              type: string
              description: "The SAP plant code."
            - name: start_date
              in: body
              type: string
              description: "Shutdown start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Shutdown end date in YYYY-MM-DD format."
          steps:
            - name: get-equipment-list
              type: call
              call: "sap-pm.get-plant-equipment"
              with:
                plant_id: "{{plant_id}}"
            - name: create-maintenance-orders
              type: call
              call: "sap-pm.batch-create-orders"
              with:
                plant_id: "{{plant_id}}"
                order_type: "PM02"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: create-project
              type: call
              call: "jira-api.create-issue"
              with:
                project: "OPS"
                issue_type: "Epic"
                summary: "Plant {{plant_id}} shutdown: {{start_date}} to {{end_date}}"
                description: "Equipment count: {{get-equipment-list.count}}. Maintenance orders: {{create-maintenance-orders.order_count}}."
            - name: notify-teams
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "plant-ops-{{plant_id}}"
                text: "Planned shutdown for plant {{plant_id}}: {{start_date}} to {{end_date}}. {{create-maintenance-orders.order_count}} maintenance orders created. Jira epic: {{create-project.key}}."
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: equipment
          path: "/plants/{{plant_id}}/equipment"
          inputParameters:
            - name: plant_id
              in: path
          operations:
            - name: get-plant-equipment
              method: GET
        - name: orders
          path: "/maintenanceOrders/batch"
          operations:
            - name: batch-create-orders
              method: POST
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-energy/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Schedules preventive maintenance for industrial equipment by checking asset runtime from Snowflake, creating a SAP maintenance order, and assigning the technician from Workday.

naftiko: "0.5"
info:
  label: "SAP Preventive Maintenance Scheduler"
  description: "Schedules preventive maintenance for industrial equipment by checking asset runtime from Snowflake, creating a SAP maintenance order, and assigning the technician from Workday."
  tags:
    - maintenance
    - industrial-iot
    - snowflake
    - sap
    - workday
capability:
  exposes:
    - type: mcp
      namespace: pm-scheduler
      port: 8080
      tools:
        - name: schedule-preventive-maintenance
          description: "Given an equipment ID, check runtime hours and schedule the next preventive maintenance window. Use when equipment approaches its PM interval threshold."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment ID."
            - name: pm_interval_hours
              in: body
              type: integer
              description: "The preventive maintenance interval in operating hours."
          steps:
            - name: get-runtime
              type: call
              call: "snowflake-api.query-equipment-runtime"
              with:
                equipment_id: "{{equipment_id}}"
            - name: create-pm-order
              type: call
              call: "sap-pm.create-maintenance-order"
              with:
                equipment_id: "{{equipment_id}}"
                order_type: "PM01"
                description: "Scheduled PM at {{get-runtime.total_hours}} hours"
            - name: assign-technician
              type: call
              call: "workday-api.get-available-technician"
              with:
                plant: "{{get-runtime.plant_code}}"
                skill: "{{get-runtime.equipment_type}}"
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-equipment-runtime
              method: POST
    - type: http
      namespace: sap-pm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: maintenance-orders
          path: "/maintenanceOrders"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: technicians
          path: "/ge/technicians"
          inputParameters:
            - name: plant
              in: query
            - name: skill
              in: query
          operations:
            - name: get-available-technician
              method: GET

Retrieves a supplier's delivery performance and quality metrics from SAP for use in vendor review meetings and procurement decision-making.

naftiko: "0.5"
info:
  label: "SAP Procurement Supplier Performance Lookup"
  description: "Retrieves a supplier's delivery performance and quality metrics from SAP for use in vendor review meetings and procurement decision-making."
  tags:
    - finance
    - procurement
    - sap
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: supplier-mgmt
      port: 8080
      tools:
        - name: get-supplier-performance
          description: "Given a SAP supplier number, return on-time delivery rate, rejection rate, and total order count for the current fiscal year. Use in vendor review meetings and supplier qualification workflows."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP vendor/supplier number."
          call: "sap-vendor.get-supplier-stats"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: on_time_delivery_rate
              type: number
              mapping: "$.d.OnTimeDeliveryPct"
            - name: rejection_rate
              type: number
              mapping: "$.d.RejectionRatePct"
            - name: total_orders
              type: number
              mapping: "$.d.TotalOrders"
  consumes:
    - type: http
      namespace: sap-vendor
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_0001"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-performance
          path: "/A_Supplier('{{supplier_id}}')/to_SupplierCompany"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-stats
              method: GET

Retrieves the current status and completion percentage of a SAP production order.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves the current status and completion percentage of a SAP production order."
  tags:
    - manufacturing
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: production-order
      port: 8080
      tools:
        - name: get-order-status
          description: "Given a production order number, return the order status and quantities. Use when production planners need to track manufacturing progress."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap-pp.get-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.order.system_status"
            - name: planned_qty
              type: number
              mapping: "$.order.planned_quantity"
            - name: confirmed_qty
              type: number
              mapping: "$.order.confirmed_quantity"
  consumes:
    - type: http
      namespace: sap-pp
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: production-orders
          path: "/productionOrders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET

When a purchase requisition is created in SAP, validates the budget in Oracle, routes to the appropriate approver in Workday, and sends a notification via Teams.

naftiko: "0.5"
info:
  label: "SAP Purchase Requisition to Approval Chain"
  description: "When a purchase requisition is created in SAP, validates the budget in Oracle, routes to the appropriate approver in Workday, and sends a notification via Teams."
  tags:
    - procurement
    - finance
    - sap
    - oracle
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pr-approval
      port: 8080
      tools:
        - name: route-purchase-requisition
          description: "Given a SAP purchase requisition number, validate budget availability, identify the approver, and notify them. Use when procurement creates high-value purchase requisitions."
          inputParameters:
            - name: pr_number
              in: body
              type: string
              description: "The SAP purchase requisition number."
          steps:
            - name: get-pr-details
              type: call
              call: "sap-api.get-purchase-req"
              with:
                pr_number: "{{pr_number}}"
            - name: check-budget
              type: call
              call: "oracle-ebs.check-budget"
              with:
                cost_center: "{{get-pr-details.cost_center}}"
                amount: "{{get-pr-details.total_value}}"
            - name: get-approver
              type: call
              call: "workday-api.get-cost-center-owner"
              with:
                cost_center: "{{get-pr-details.cost_center}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-approver.email}}"
                text: "PR {{pr_number}} requires approval: {{get-pr-details.description}} for ${{get-pr-details.total_value}}. Budget status: {{check-budget.status}}."
  consumes:
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-reqs
          path: "/purchaseRequisitions/{{pr_number}}"
          inputParameters:
            - name: pr_number
              in: path
          operations:
            - name: get-purchase-req
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: budgets
          path: "/budgets/check"
          operations:
            - name: check-budget
              method: POST
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: org
          path: "/ge/costCenters/{{cost_center}}/owner"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-owner
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Retrieves the inspection lot status for a manufacturing batch from SAP QM.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Status"
  description: "Retrieves the inspection lot status for a manufacturing batch from SAP QM."
  tags:
    - quality-management
    - manufacturing
    - sap
capability:
  exposes:
    - type: mcp
      namespace: quality-inspection
      port: 8080
      tools:
        - name: get-inspection-status
          description: "Given an inspection lot number, return the inspection status and usage decision. Use when quality engineers need to verify batch disposition."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: "sap-qm.get-lot-status"
          with:
            inspection_lot: "{{inspection_lot}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.lot.status"
            - name: usage_decision
              type: string
              mapping: "$.lot.usage_decision"
            - name: defect_count
              type: integer
              mapping: "$.lot.defect_count"
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: inspection-lots
          path: "/qualityInspectionLots/{{inspection_lot}}"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: get-lot-status
              method: GET

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

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up a GE SAP S/4HANA purchase order by number and returns header status, vendor name, total value, and currency."
  tags:
    - finance
    - erp
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP S/4HANA PO number, return the status, vendor name, total value, and currency. Use when auditing procurement spend or resolving supplier payment queries."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          call: "sap-s4.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: number
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://ge-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

Queries SAP S/4HANA for procurement and G&A spend by cost center for a given fiscal period, returning actuals for finance reporting.

naftiko: "0.5"
info:
  label: "SAP Spend Analytics by Cost Center"
  description: "Queries SAP S/4HANA for procurement and G&A spend by cost center for a given fiscal period, returning actuals for finance reporting."
  tags:
    - finance
    - erp
    - sap
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-analytics
      port: 8080
      tools:
        - name: get-spend-by-cost-center
          description: "Given a fiscal year, fiscal period, and optional cost center, return total spend actuals from SAP S/4HANA. Use for budget variance analysis, financial close, and executive finance reporting."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The SAP fiscal year (e.g., 2025)."
            - name: period
              in: body
              type: string
              description: "The fiscal period number (1-12)."
            - name: cost_center
              in: body
              type: string
              description: "Optional SAP cost center code to filter results."
          call: "sap-cca.get-cost-center-actuals"
          with:
            fiscal_year: "{{fiscal_year}}"
            period: "{{period}}"
            cost_center: "{{cost_center}}"
          outputParameters:
            - name: total_actuals
              type: number
              mapping: "$.d.results[0].AmountInCoCodeCurrency"
            - name: currency
              type: string
              mapping: "$.d.results[0].CompanyCodeCurrency"
  consumes:
    - type: http
      namespace: sap-cca
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/FAC_COSTCENTER_0001"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActuals"
          inputParameters:
            - name: fiscal_year
              in: query
            - name: period
              in: query
            - name: cost_center
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET

Tracks an outbound shipment by pulling shipping details from SAP TM, checking carrier status, and updating the Salesforce service case with delivery ETA.

naftiko: "0.5"
info:
  label: "SAP Transportation Shipment Tracking"
  description: "Tracks an outbound shipment by pulling shipping details from SAP TM, checking carrier status, and updating the Salesforce service case with delivery ETA."
  tags:
    - logistics
    - supply-chain
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: shipment-tracking
      port: 8080
      tools:
        - name: track-shipment
          description: "Given a SAP shipment number, retrieve the latest status and update the customer case. Use when customers inquire about shipment delivery dates."
          inputParameters:
            - name: shipment_number
              in: body
              type: string
              description: "The SAP transportation shipment number."
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID to update."
          steps:
            - name: get-shipment
              type: call
              call: "sap-tm.get-shipment"
              with:
                shipment_number: "{{shipment_number}}"
            - name: get-carrier-status
              type: call
              call: "sap-tm.get-carrier-tracking"
              with:
                tracking_id: "{{get-shipment.carrier_tracking_id}}"
            - name: update-case
              type: call
              call: "salesforce-api.update-case"
              with:
                case_id: "{{case_id}}"
                comment: "Shipment {{shipment_number}} status: {{get-carrier-status.status}}. ETA: {{get-carrier-status.eta}}."
  consumes:
    - type: http
      namespace: sap-tm
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: shipments
          path: "/transportationShipments/{{shipment_number}}"
          inputParameters:
            - name: shipment_number
              in: path
          operations:
            - name: get-shipment
              method: GET
        - name: tracking
          path: "/carrierTracking/{{tracking_id}}"
          inputParameters:
            - name: tracking_id
              in: path
          operations:
            - name: get-carrier-tracking
              method: GET
    - type: http
      namespace: salesforce-api
      baseUri: "https://ge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: update-case
              method: PATCH

Retrieves vendor master record from GE's SAP system including vendor name, payment terms, and account group.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master record from GE's SAP system including vendor name, payment terms, and account group."
  tags:
    - procurement
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, retrieve vendor name, payment terms, and account group."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor number."
          call: "sap-s4.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://ge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Processes a customer warranty claim by validating the product serial number in SAP, checking the warranty period, and creating a return authorization and ServiceNow case.

naftiko: "0.5"
info:
  label: "SAP Warranty Claim Processing"
  description: "Processes a customer warranty claim by validating the product serial number in SAP, checking the warranty period, and creating a return authorization and ServiceNow case."
  tags:
    - customer-service
    - warranty
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: warranty-claim
      port: 8080
      tools:
        - name: process-warranty-claim
          description: "Given a product serial number and defect description, validate warranty coverage and initiate the return process. Use when customers submit warranty claims."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The product serial number."
            - name: defect_description
              in: body
              type: string
              description: "Description of the reported defect."
          steps:
            - name: validate-product
              type: call
              call: "sap-api.get-serial-number"
              with:
                serial_number: "{{serial_number}}"
            - name: check-warranty
              type: call
              call: "sap-api.check-warranty-coverage"
              with:
                serial_number: "{{serial_number}}"
            - name: create-return
              type: call
              call: "sap-sd.create-return-order"
              with:
                serial_number: "{{serial_number}}"
                reason: "{{defect_description}}"
                warranty_valid: "{{check-warranty.is_valid}}"
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                category: "warranty"
                short_description: "Warranty claim: {{serial_number}} — {{defect_description}}"
                return_order: "{{create-return.order_number}}"
  consumes:
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: serial-numbers
          path: "/serialNumbers/{{serial_number}}"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-serial-number
              method: GET
            - name: check-warranty-coverage
              method: GET
    - type: http
      namespace: sap-sd
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: return-orders
          path: "/returnOrders"
          operations:
            - name: create-return-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Retrieves details of an IT asset from the ServiceNow CMDB by asset tag.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Lookup"
  description: "Retrieves details of an IT asset from the ServiceNow CMDB by asset tag."
  tags:
    - it-operations
    - cmdb
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: asset-lookup
      port: 8080
      tools:
        - name: get-asset
          description: "Given an asset tag, return the asset record including model, location, and assigned user from ServiceNow CMDB. Use when IT support needs to verify hardware details."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The asset tag identifier."
          call: "servicenow-cmdb.get-asset"
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: asset_name
              type: string
              mapping: "$.result.name"
            - name: model
              type: string
              mapping: "$.result.model_id.display_value"
            - name: location
              type: string
              mapping: "$.result.location.display_value"
  consumes:
    - type: http
      namespace: servicenow-cmdb
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/alm_hardware"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-asset
              method: GET

Routes a ServiceNow change request through the approval chain by validating the change window, checking for conflicting changes, and notifying approvers via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Chain"
  description: "Routes a ServiceNow change request through the approval chain by validating the change window, checking for conflicting changes, and notifying approvers via Teams."
  tags:
    - change-management
    - it-operations
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-approval
      port: 8080
      tools:
        - name: route-change-approval
          description: "Given a ServiceNow change request number, validate and route for approval. Use when change management needs to process standard and normal change requests."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: get-change
              type: call
              call: "servicenow.get-change-request"
              with:
                change_number: "{{change_number}}"
            - name: check-conflicts
              type: call
              call: "servicenow.check-change-conflicts"
              with:
                start_time: "{{get-change.start_date}}"
                end_time: "{{get-change.end_date}}"
                ci: "{{get-change.cmdb_ci}}"
            - name: notify-cab
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "change-advisory-board"
                text: "Change {{change_number}}: {{get-change.short_description}}. Window: {{get-change.start_date}} to {{get-change.end_date}}. Conflicts: {{check-conflicts.conflict_count}}. Risk: {{get-change.risk_level}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: get-change-request
              method: GET
        - name: conflicts
          path: "/table/change_request"
          inputParameters:
            - name: start_time
              in: query
            - name: end_time
              in: query
            - name: ci
              in: query
          operations:
            - name: check-change-conflicts
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-it/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Creates a ServiceNow change request for a planned GE infrastructure change with risk level routing to the appropriate approval group.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for Infrastructure"
  description: "Creates a ServiceNow change request for a planned GE infrastructure change with risk level routing to the appropriate approval group."
  tags:
    - itsm
    - change-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: create-change-request
          description: "Given change details, risk level, and implementation window, create a ServiceNow change request. Use when planning infrastructure, application, or configuration changes in the GE IT environment."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the change."
            - name: risk
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: start_date
              in: body
              type: string
              description: "Planned implementation start in ISO 8601 format."
            - name: end_date
              in: body
              type: string
              description: "Planned implementation end in ISO 8601 format."
          call: "servicenow-chg.create-change"
          with:
            short_description: "{{short_description}}"
            risk: "{{risk}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: change_number
              type: string
              mapping: "$.result.number"
            - name: state
              type: string
              mapping: "$.result.state"
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves incident status details from GE's ServiceNow instance including priority, assignment group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves incident status details from GE's ServiceNow instance including priority, assignment group, and resolution notes."
  tags:
    - it-operations
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, retrieve the priority, status, assignment group, and resolution notes."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assignment_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

On a P1 incident in ServiceNow, escalates priority, assigns the on-call engineer group, and broadcasts an alert in the GE IT operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Response Orchestrator"
  description: "On a P1 incident in ServiceNow, escalates priority, assigns the on-call engineer group, and broadcasts an alert in the GE IT operations Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-incident-response
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow incident number and escalation context, update priority to P1, reassign to the critical on-call group, and broadcast an alert to the IT operations Teams channel. Use when an incident is confirmed as business-critical."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number to escalate (e.g., INC0001234)."
            - name: escalation_reason
              in: body
              type: string
              description: "Plain-text reason for the P1 escalation."
          steps:
            - name: escalate-incident
              type: call
              call: "servicenow-ir.patch-incident"
              with:
                number: "{{incident_number}}"
                priority: "1"
                assignment_group: "GE_IT_Critical_OnCall"
                work_notes: "P1 escalation: {{escalation_reason}}"
            - name: alert-teams
              type: call
              call: "msteams-ir.send-message"
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT ESCALATED: {{incident_number}} — {{escalation_reason}}. Assigned to GE IT Critical On-Call. All hands respond."
  consumes:
    - type: http
      namespace: servicenow-ir
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: patch-incident
              method: PATCH
    - type: http
      namespace: msteams-ir
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a document from a specified SharePoint site library by file name.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves a document from a specified SharePoint site library by file name."
  tags:
    - document-management
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-retrieval
      port: 8080
      tools:
        - name: get-document
          description: "Given a SharePoint site ID and file name, return the document metadata and download URL. Use when engineers need to retrieve technical documents."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_name
              in: body
              type: string
              description: "The document file name."
          call: "sharepoint-api.get-file"
          with:
            site_id: "{{site_id}}"
            file_name: "{{file_name}}"
          outputParameters:
            - name: file_id
              type: string
              mapping: "$.id"
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: modified_date
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint-api
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root:/{{file_name}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_name
              in: path
          operations:
            - name: get-file
              method: GET

Runs automated data quality checks on Snowflake tables, logs failures to ServiceNow, and notifies the data engineering team via Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Check Pipeline"
  description: "Runs automated data quality checks on Snowflake tables, logs failures to ServiceNow, and notifies the data engineering team via Teams."
  tags:
    - data-engineering
    - data-quality
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dq-pipeline
      port: 8080
      tools:
        - name: run-data-quality-checks
          description: "Given a Snowflake schema and table pattern, execute data quality validations and report failures. Use when data engineering runs daily data quality monitoring."
          inputParameters:
            - name: schema
              in: body
              type: string
              description: "The Snowflake schema name."
            - name: table_pattern
              in: body
              type: string
              description: "The table name pattern to check."
          steps:
            - name: run-checks
              type: call
              call: "snowflake-api.execute-dq-suite"
              with:
                schema: "{{schema}}"
                table_pattern: "{{table_pattern}}"
            - name: log-failures
              type: call
              call: "servicenow.create-incident"
              with:
                category: "data_quality"
                short_description: "DQ failures in {{schema}}: {{run-checks.failure_count}} checks failed"
                assignment_group: "Data_Engineering"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "data-quality"
                text: "Data Quality Report for {{schema}}: {{run-checks.total_checks}} checks run, {{run-checks.pass_count}} passed, {{run-checks.failure_count}} failed."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-dq-suite
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-data/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for energy consumption data across GE power plants for a specified date range.

naftiko: "0.5"
info:
  label: "Snowflake Energy Consumption Query"
  description: "Queries Snowflake for energy consumption data across GE power plants for a specified date range."
  tags:
    - analytics
    - energy
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: energy-analytics
      port: 8080
      tools:
        - name: query-consumption
          description: "Given a start and end date, return aggregated energy consumption metrics from Snowflake. Use when energy analysts need consumption reports."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "snowflake-api.run-query"
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: total_mwh
              type: number
              mapping: "$.data[0].total_mwh"
            - name: plant_count
              type: integer
              mapping: "$.data[0].plant_count"
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          inputParameters:
            - name: start_date
              in: body
            - name: end_date
              in: body
          operations:
            - name: run-query
              method: POST

Queries GE's Snowflake data warehouse for gas turbine performance metrics including heat rate, availability, and output efficiency.

naftiko: "0.5"
info:
  label: "Snowflake Turbine Performance Analytics"
  description: "Queries GE's Snowflake data warehouse for gas turbine performance metrics including heat rate, availability, and output efficiency."
  tags:
    - power-generation
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-turbine-analytics
          description: "Given a turbine serial number and date range, retrieve performance metrics from GE's Snowflake analytics warehouse."
          inputParameters:
            - name: turbine_serial
              in: body
              type: string
              description: "GE turbine serial number."
            - name: period
              in: body
              type: string
              description: "Reporting period."
          call: "snowflake.query-turbine"
          with:
            serial: "{{turbine_serial}}"
            period: "{{period}}"
          outputParameters:
            - name: heat_rate
              type: number
              mapping: "$.data[0].HEAT_RATE_BTU"
            - name: availability_pct
              type: number
              mapping: "$.data[0].AVAILABILITY_PCT"
            - name: output_mw
              type: number
              mapping: "$.data[0].OUTPUT_MW"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://ge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-turbine
              method: POST

When SolarWinds detects a network device alert, enriches the alert with device details, creates a ServiceNow incident, and notifies the network operations team via Teams.

naftiko: "0.5"
info:
  label: "SolarWinds Network Alert to ServiceNow Ticket"
  description: "When SolarWinds detects a network device alert, enriches the alert with device details, creates a ServiceNow incident, and notifies the network operations team via Teams."
  tags:
    - network-operations
    - monitoring
    - solarwinds
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-alert
      port: 8080
      tools:
        - name: handle-network-alert
          description: "Given a SolarWinds alert ID, process the network alert and create incident tickets. Use when network monitoring detects device failures or performance degradation."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The SolarWinds alert ID."
          steps:
            - name: get-alert
              type: call
              call: "solarwinds-api.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-device
              type: call
              call: "solarwinds-api.get-node"
              with:
                node_id: "{{get-alert.node_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                category: "network"
                priority: "{{get-alert.severity}}"
                short_description: "Network alert: {{get-device.caption}} — {{get-alert.message}}"
                assignment_group: "Network_Operations"
            - name: notify-noc
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "noc-alerts"
                text: "Network Alert: {{get-device.caption}} ({{get-device.ip_address}}). Issue: {{get-alert.message}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: solarwinds-api
      baseUri: "https://ge-solarwinds.ge.com:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: alerts
          path: "/Query"
          operations:
            - name: get-alert
              method: POST
        - name: nodes
          path: "/Query"
          operations:
            - name: get-node
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-noc/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a data extract refresh for a specified Tableau workbook on Tableau Server.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Extract Refresh"
  description: "Triggers a data extract refresh for a specified Tableau workbook on Tableau Server."
  tags:
    - analytics
    - business-intelligence
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: extract-refresh
      port: 8080
      tools:
        - name: trigger-refresh
          description: "Given a Tableau workbook ID, trigger an extract refresh and return the job status. Use when analysts need to ensure dashboards reflect the latest data."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          call: "tableau-api.refresh-extract"
          with:
            workbook_id: "{{workbook_id}}"
          outputParameters:
            - name: job_id
              type: string
              mapping: "$.job.id"
            - name: status
              type: string
              mapping: "$.job.status"
  consumes:
    - type: http
      namespace: tableau-api
      baseUri: "https://ge-tableau.ge.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/default/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Validates data migration from Teradata to Snowflake by comparing row counts and checksums, then logs results in ServiceNow and notifies the data team via Teams.

naftiko: "0.5"
info:
  label: "Teradata Data Warehouse Migration Validator"
  description: "Validates data migration from Teradata to Snowflake by comparing row counts and checksums, then logs results in ServiceNow and notifies the data team via Teams."
  tags:
    - data-engineering
    - migration
    - teradata
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: migration-validator
      port: 8080
      tools:
        - name: validate-migration
          description: "Given a table name, compare source Teradata and target Snowflake data for consistency. Use when data engineers need to verify migration completeness."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "The table name to validate."
            - name: schema
              in: body
              type: string
              description: "The schema name."
          steps:
            - name: get-teradata-stats
              type: call
              call: "teradata-api.get-table-stats"
              with:
                table_name: "{{table_name}}"
                schema: "{{schema}}"
            - name: get-snowflake-stats
              type: call
              call: "snowflake-api.get-table-stats"
              with:
                table_name: "{{table_name}}"
                schema: "{{schema}}"
            - name: log-result
              type: call
              call: "servicenow.create-task"
              with:
                category: "data_migration"
                short_description: "Migration validation: {{schema}}.{{table_name}} — Teradata rows: {{get-teradata-stats.row_count}}, Snowflake rows: {{get-snowflake-stats.row_count}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "data-migration"
                text: "Migration check for {{schema}}.{{table_name}}: Teradata={{get-teradata-stats.row_count}} rows, Snowflake={{get-snowflake-stats.row_count}} rows."
  consumes:
    - type: http
      namespace: teradata-api
      baseUri: "https://ge-teradata.ge.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.teradata_user"
        password: "$secrets.teradata_password"
      resources:
        - name: tables
          path: "/databases/{{schema}}/tables/{{table_name}}/stats"
          inputParameters:
            - name: table_name
              in: path
            - name: schema
              in: path
          operations:
            - name: get-table-stats
              method: GET
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: get-table-stats
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-data/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a Terraform Cloud plan-and-apply run for a GE infrastructure workspace after an approved change request.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Run"
  description: "Triggers a Terraform Cloud plan-and-apply run for a GE infrastructure workspace after an approved change request."
  tags:
    - cloud
    - infrastructure
    - terraform
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and run message, trigger a new plan-and-apply run. Use when deploying approved GE infrastructure changes."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID (e.g., ws-xxxxxxxxxxxxxxxx)."
            - name: message
              in: body
              type: string
              description: "Human-readable message describing the reason for this run."
          call: "terraform-cloud.create-run"
          with:
            workspace_id: "{{workspace_id}}"
            message: "{{message}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.data.id"
            - name: status
              type: string
              mapping: "$.data.attributes.status"
  consumes:
    - type: http
      namespace: terraform-cloud
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST

When Datadog detects a turbine sensor anomaly, queries Snowflake for historical patterns, creates a ServiceNow maintenance ticket, and notifies the field engineering team via Teams.

naftiko: "0.5"
info:
  label: "Turbine Anomaly Detection and Maintenance Ticket"
  description: "When Datadog detects a turbine sensor anomaly, queries Snowflake for historical patterns, creates a ServiceNow maintenance ticket, and notifies the field engineering team via Teams."
  tags:
    - industrial-iot
    - maintenance
    - datadog
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: turbine-anomaly
      port: 8080
      tools:
        - name: handle-turbine-anomaly
          description: "Given a turbine ID and anomaly type, correlate with historical data, open a maintenance work order, and alert field engineers. Use when IoT sensors detect out-of-range turbine readings."
          inputParameters:
            - name: turbine_id
              in: body
              type: string
              description: "The turbine asset identifier."
            - name: anomaly_type
              in: body
              type: string
              description: "The type of anomaly detected (e.g., vibration, temperature)."
          steps:
            - name: get-history
              type: call
              call: "snowflake-api.query-turbine-history"
              with:
                turbine_id: "{{turbine_id}}"
                anomaly_type: "{{anomaly_type}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-work-order"
              with:
                asset_id: "{{turbine_id}}"
                short_description: "Turbine {{turbine_id}} — {{anomaly_type}} anomaly detected"
                priority: "2"
                assignment_group: "Field_Engineering"
            - name: notify-engineers
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "field-engineering"
                text: "Anomaly on turbine {{turbine_id}}: {{anomaly_type}}. Historical occurrences: {{get-history.occurrence_count}}. ServiceNow ticket: {{create-ticket.number}}."
  consumes:
    - type: http
      namespace: snowflake-api
      baseUri: "https://ge-energy.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-turbine-history
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-energy/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new vendor is added to SAP, runs a risk assessment by enriching vendor data via ZoomInfo, creates a risk review in Jira, and stores the assessment in Confluence.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Workflow"
  description: "When a new vendor is added to SAP, runs a risk assessment by enriching vendor data via ZoomInfo, creates a risk review in Jira, and stores the assessment in Confluence."
  tags:
    - procurement
    - risk-management
    - sap
    - zoominfo
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Given a SAP vendor ID, enrich the vendor profile, create a risk review task, and document findings. Use when procurement onboards a new supplier."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor master ID."
          steps:
            - name: get-vendor
              type: call
              call: "sap-api.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: enrich-vendor
              type: call
              call: "zoominfo-api.enrich-company"
              with:
                company_name: "{{get-vendor.vendor_name}}"
                country: "{{get-vendor.country}}"
            - name: create-review
              type: call
              call: "jira-api.create-issue"
              with:
                project: "PROC"
                issue_type: "Task"
                summary: "Vendor risk review: {{get-vendor.vendor_name}}"
                description: "Revenue: {{enrich-vendor.revenue}}. Employee count: {{enrich-vendor.employee_count}}."
            - name: save-assessment
              type: call
              call: "confluence-api.create-page"
              with:
                space: "PROCUREMENT"
                title: "Risk Assessment — {{get-vendor.vendor_name}}"
                body: "Vendor: {{get-vendor.vendor_name}}. Risk score: {{enrich-vendor.risk_score}}. Jira: {{create-review.key}}."
  consumes:
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: zoominfo-api
      baseUri: "https://api.zoominfo.com/lookup/v1"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company/enrich"
          operations:
            - name: enrich-company
              method: POST
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: confluence-api
      baseUri: "https://ge-engineering.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Orchestrates the annual compensation review by pulling market data from Workday, comparing against budget from Oracle, generating recommendations, and distributing via Teams.

naftiko: "0.5"
info:
  label: "Workday Annual Compensation Review Orchestrator"
  description: "Orchestrates the annual compensation review by pulling market data from Workday, comparing against budget from Oracle, generating recommendations, and distributing via Teams."
  tags:
    - hr
    - compensation
    - workday
    - oracle
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: comp-review
      port: 8080
      tools:
        - name: run-compensation-review
          description: "Given a department and review cycle, compile compensation analytics and distribute recommendations. Use when HR initiates the annual merit review process."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to review."
            - name: review_cycle
              in: body
              type: string
              description: "The review cycle identifier (e.g., 2026-annual)."
          steps:
            - name: get-comp-data
              type: call
              call: "workday-api.get-department-comp"
              with:
                department: "{{department}}"
            - name: get-budget
              type: call
              call: "oracle-ebs.get-merit-budget"
              with:
                department: "{{department}}"
                cycle: "{{review_cycle}}"
            - name: notify-managers
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "hr-comp-review"
                text: "Compensation review data ready for {{department}}. Headcount: {{get-comp-data.headcount}}. Avg compa-ratio: {{get-comp-data.avg_compa_ratio}}. Merit budget: ${{get-budget.total_budget}}."
  consumes:
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/ge/departments/{{department}}/compensation"
          inputParameters:
            - name: department
              in: path
          operations:
            - name: get-department-comp
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ge-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: budgets
          path: "/meritBudgets/{{department}}"
          inputParameters:
            - name: department
              in: path
            - name: cycle
              in: query
          operations:
            - name: get-merit-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/ge-hr/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the compensation band details for a specified job profile in Workday.

naftiko: "0.5"
info:
  label: "Workday Compensation Band Lookup"
  description: "Retrieves the compensation band details for a specified job profile in Workday."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: comp-lookup
      port: 8080
      tools:
        - name: get-comp-band
          description: "Given a job profile ID, return the salary range minimum, midpoint, and maximum. Use when HR business partners need to validate compensation offers."
          inputParameters:
            - name: job_profile_id
              in: body
              type: string
              description: "The Workday job profile ID."
          call: "workday-comp.get-band"
          with:
            job_profile_id: "{{job_profile_id}}"
          outputParameters:
            - name: min_salary
              type: number
              mapping: "$.band.minimum"
            - name: mid_salary
              type: number
              mapping: "$.band.midpoint"
            - name: max_salary
              type: number
              mapping: "$.band.maximum"
  consumes:
    - type: http
      namespace: workday-comp
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/ge/jobProfiles/{{job_profile_id}}/compensationBand"
          inputParameters:
            - name: job_profile_id
              in: path
          operations:
            - name: get-band
              method: GET

Retrieves employee benefits enrollment details from GE's Workday HCM including health plan, 401k contribution, and life insurance coverage.

naftiko: "0.5"
info:
  label: "Workday Employee Benefits Lookup"
  description: "Retrieves employee benefits enrollment details from GE's Workday HCM including health plan, 401k contribution, and life insurance coverage."
  tags:
    - hr
    - benefits
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-benefits
          description: "Given a Workday employee ID, retrieve current benefits enrollment details."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
          call: "workday.get-benefits"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: health_plan
              type: string
              mapping: "$.benefits.healthPlan.name"
            - name: retirement_pct
              type: number
              mapping: "$.benefits.retirementContributionPct"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/ge/workers/{{worker_id}}/benefits"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-benefits
              method: GET

Exports current GE headcount grouped by business unit and cost center from Workday for workforce planning and executive reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount and Org Structure Export"
  description: "Exports current GE headcount grouped by business unit and cost center from Workday for workforce planning and executive reporting."
  tags:
    - hr
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-business-unit
          description: "Returns a list of active GE employees grouped by business unit and cost center from Workday. Use for headcount planning, org design analysis, and HR executive dashboards."
          call: "workday-hcm.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers-export
          path: "/ge/workers"
          inputParameters:
            - name: format
              in: query
              value: "json"
          operations:
            - name: headcount-export
              method: GET

When a job requisition is approved in Workday, formats the job description and posts it to LinkedIn Jobs, then updates the requisition with the posting URL.

naftiko: "0.5"
info:
  label: "Workday Job Requisition to LinkedIn Posting"
  description: "When a job requisition is approved in Workday, formats the job description and posts it to LinkedIn Jobs, then updates the requisition with the posting URL."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: req-to-linkedin
      port: 8080
      tools:
        - name: post-requisition-to-linkedin
          description: "Given a Workday requisition ID, publish the job to LinkedIn and link the posting back. Use when approved requisitions need external job board visibility."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "workday-api.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin-api.create-job-posting"
              with:
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.description}}"
                location: "{{get-requisition.location}}"
                company_id: "ge-company"
            - name: update-requisition
              type: call
              call: "workday-api.update-requisition"
              with:
                requisition_id: "{{requisition_id}}"
                external_url: "{{post-to-linkedin.posting_url}}"
  consumes:
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/ge/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
            - name: update-requisition
              method: PATCH
    - type: http
      namespace: linkedin-api
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

Fetches approved open job requisitions from Workday Recruiting and publishes them to the GE LinkedIn company page.

naftiko: "0.5"
info:
  label: "Workday Open Requisition to LinkedIn Publisher"
  description: "Fetches approved open job requisitions from Workday Recruiting and publishes them to the GE LinkedIn company page."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: talent-publishing
      port: 8080
      tools:
        - name: publish-requisition-to-linkedin
          description: "Given a Workday requisition ID, retrieve the job details from Workday and publish the role to the GE LinkedIn company page. Use when a recruiter approves a role for external publication."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID to publish."
          steps:
            - name: get-requisition
              type: call
              call: "workday-jobs.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin-jobs.create-job-posting"
              with:
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
                company_id: "$secrets.linkedin_ge_company_id"
  consumes:
    - type: http
      namespace: workday-jobs
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/ge/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin-jobs
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST

When an organizational restructure is applied in Workday, updates cost center mappings in SAP, adjusts Azure AD group memberships, and creates a Jira change tracking epic.

naftiko: "0.5"
info:
  label: "Workday Org Restructure Propagation"
  description: "When an organizational restructure is applied in Workday, updates cost center mappings in SAP, adjusts Azure AD group memberships, and creates a Jira change tracking epic."
  tags:
    - hr
    - operations
    - workday
    - sap
    - azure-ad
    - jira
capability:
  exposes:
    - type: mcp
      namespace: org-restructure
      port: 8080
      tools:
        - name: propagate-org-change
          description: "Given a Workday supervisory org ID and effective date, propagate the restructure across downstream systems. Use when HR implements organizational changes."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The Workday supervisory organization ID."
            - name: effective_date
              in: body
              type: string
              description: "The effective date in YYYY-MM-DD format."
          steps:
            - name: get-org-change
              type: call
              call: "workday-api.get-org-details"
              with:
                org_id: "{{org_id}}"
            - name: update-sap-cc
              type: call
              call: "sap-api.update-cost-center"
              with:
                cost_center: "{{get-org-change.cost_center}}"
                new_manager: "{{get-org-change.new_manager_id}}"
                effective_date: "{{effective_date}}"
            - name: update-ad-groups
              type: call
              call: "azure-ad.update-group-members"
              with:
                group_id: "{{get-org-change.ad_group_id}}"
                members: "{{get-org-change.member_upns}}"
            - name: create-tracking
              type: call
              call: "jira-api.create-issue"
              with:
                project: "HR-OPS"
                issue_type: "Epic"
                summary: "Org restructure: {{get-org-change.org_name}} effective {{effective_date}}"
                description: "New manager: {{get-org-change.new_manager_name}}. Headcount: {{get-org-change.headcount}}."
  consumes:
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: orgs
          path: "/ge/supervisoryOrganizations/{{org_id}}"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: get-org-details
              method: GET
    - type: http
      namespace: sap-api
      baseUri: "https://ge-sap.s4hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: cost-centers
          path: "/costCenters/{{cost_center}}"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: update-cost-center
              method: PATCH
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: groups
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: update-group-members
              method: PATCH
    - type: http
      namespace: jira-api
      baseUri: "https://ge-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a Workday job change is approved, updates Azure AD group memberships to reflect the new role and sends the employee a Teams confirmation.

naftiko: "0.5"
info:
  label: "Workday Role Change Provisioner"
  description: "When a Workday job change is approved, updates Azure AD group memberships to reflect the new role and sends the employee a Teams confirmation."
  tags:
    - hr
    - identity
    - workday
    - azure-ad
    - microsoft-teams
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID, new role, and Azure AD group ID, update group membership and notify the employee via Teams. Use when an internal transfer, promotion, or role change is finalized in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job title or role name."
            - name: new_ad_group
              in: body
              type: string
              description: "The Azure AD group ID for the new role's access permissions."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: add-to-ad-group
              type: call
              call: "azure-ad-role.add-group-member"
              with:
                group_id: "{{new_ad_group}}"
                user_id: "{{get-worker.azure_object_id}}"
            - name: notify-employee
              type: call
              call: "msteams-role.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your role has been updated to {{new_role}}. Your system access has been provisioned accordingly."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/ge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/$ref"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, disables their Azure AD account, closes their ServiceNow access, and logs the action to the compliance audit trail.

naftiko: "0.5"
info:
  label: "Workday Termination to Access Revocation"
  description: "When an employee termination is processed in Workday, disables their Azure AD account, closes their ServiceNow access, and logs the action to the compliance audit trail."
  tags:
    - hr
    - security
    - workday
    - azure-ad
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: term-revocation
      port: 8080
      tools:
        - name: process-termination
          description: "Given a Workday worker ID and termination date, revoke all system access and create compliance records. Use when HR processes an employee separation."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: termination_date
              in: body
              type: string
              description: "The termination effective date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-api.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: disable-ad-account
              type: call
              call: "azure-ad.disable-user"
              with:
                user_principal_name: "{{get-worker.work_email}}"
            - name: close-access-requests
              type: call
              call: "servicenow.close-user-requests"
              with:
                user_email: "{{get-worker.work_email}}"
                reason: "Employee termination effective {{termination_date}}"
            - name: log-audit
              type: call
              call: "servicenow.create-audit-entry"
              with:
                action: "access_revocation"
                employee: "{{get-worker.full_name}}"
                date: "{{termination_date}}"
                ad_disabled: "true"
  consumes:
    - type: http
      namespace: workday-api
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/ge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://ge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          inputParameters:
            - name: user_email
              in: query
          operations:
            - name: close-user-requests
              method: PATCH
        - name: audit
          path: "/table/u_audit_log"
          operations:
            - name: create-audit-entry
              method: POST

Returns the approval status and date coverage for an employee time-off request from Workday.

naftiko: "0.5"
info:
  label: "Workday Time-Off Request Status Lookup"
  description: "Returns the approval status and date coverage for an employee time-off request from Workday."
  tags:
    - hr
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr-time
      port: 8080
      tools:
        - name: get-time-off-request
          description: "Given a Workday worker ID and time-off request ID, return the current approval status and covered date range. Use when employees or managers need to check leave approval status."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the employee."
            - name: request_id
              in: body
              type: string
              description: "The Workday time-off request ID."
          call: "workday-pto.get-time-off-request"
          with:
            worker_id: "{{worker_id}}"
            request_id: "{{request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.overallStatus"
            - name: start_date
              type: string
              mapping: "$.data.startDate"
            - name: end_date
              type: string
              mapping: "$.data.endDate"
  consumes:
    - type: http
      namespace: workday-pto
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off-requests
          path: "/ge/workers/{{worker_id}}/timeOffRequests/{{request_id}}"
          inputParameters:
            - name: worker_id
              in: path
            - name: request_id
              in: path
          operations:
            - name: get-time-off-request
              method: GET