Raytheon Capabilities

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

Sort
Expand

Compares Azure AD license assignments against Workday active employees, identifies orphaned licenses, and creates a ServiceNow optimization task.

naftiko: "0.5"
info:
  label: "Azure AD License Reconciliation Workflow"
  description: "Compares Azure AD license assignments against Workday active employees, identifies orphaned licenses, and creates a ServiceNow optimization task."
  tags:
    - identity
    - azure
    - workday
    - servicenow
    - license-management
capability:
  exposes:
    - type: mcp
      namespace: license-mgmt
      port: 8080
      tools:
        - name: reconcile-licenses
          description: "Reconcile Azure AD licenses against Workday headcount and create optimization task."
          inputParameters:
            - name: license_sku
              in: body
              type: string
              description: "Azure AD license SKU to audit."
          steps:
            - name: get-license-usage
              type: call
              call: "msgraph.get-license-details"
              with:
                sku: "{{license_sku}}"
            - name: get-headcount
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT count(*) as active_count FROM workday_employees WHERE status = 'Active'"
            - name: create-task
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "License reconciliation: {{license_sku}}"
                description: "Assigned: {{get-license-usage.consumed_units}}. Active employees: {{get-headcount.active_count}}."
                category: "license_optimization"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: licenses
          path: "/subscribedSkus?$filter=skuPartNumber eq '{{sku}}'"
          inputParameters:
            - name: sku
              in: query
          operations:
            - name: get-license-details
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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

Retrieves an Azure Active Directory user profile by UPN, returning display name, department, job title, and account status.

naftiko: "0.5"
info:
  label: "Azure AD User Lookup"
  description: "Retrieves an Azure Active Directory user profile by UPN, returning display name, department, job title, and account status."
  tags:
    - identity
    - azure
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-azure-ad-user
          description: "Look up an Azure AD user by user principal name. Returns display name, department, job title, and account enabled status."
          inputParameters:
            - name: upn
              in: body
              type: string
              description: "The user principal name (email) of the Azure AD user."
          call: "msgraph.get-user"
          with:
            upn: "{{upn}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: department
              type: string
              mapping: "$.department"
            - name: job_title
              type: string
              mapping: "$.jobTitle"
            - name: account_enabled
              type: boolean
              mapping: "$.accountEnabled"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET

Detects expiring Azure Key Vault secrets, rotates them, updates Terraform variables, and creates a ServiceNow change record.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Rotation Orchestrator"
  description: "Detects expiring Azure Key Vault secrets, rotates them, updates Terraform variables, and creates a ServiceNow change record."
  tags:
    - security
    - azure
    - terraform
    - servicenow
    - secret-management
capability:
  exposes:
    - type: mcp
      namespace: secret-mgmt
      port: 8080
      tools:
        - name: rotate-expiring-secrets
          description: "Rotate expiring Key Vault secrets, update Terraform vars, and log change."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "Azure Key Vault name."
            - name: secret_name
              in: body
              type: string
              description: "Name of the secret to rotate."
          steps:
            - name: get-secret
              type: call
              call: "azure.get-secret"
              with:
                vault: "{{vault_name}}"
                secret: "{{secret_name}}"
            - name: rotate-secret
              type: call
              call: "azure.create-secret-version"
              with:
                vault: "{{vault_name}}"
                secret: "{{secret_name}}"
            - name: update-terraform
              type: call
              call: "terraform.update-variable"
              with:
                workspace: "{{vault_name}}-config"
                key: "{{secret_name}}"
                value: "{{rotate-secret.new_version}}"
            - name: log-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Secret rotation: {{secret_name}} in {{vault_name}}"
                category: "security"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://{{vault_name}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret}}?api-version=7.4"
          inputParameters:
            - name: secret
              in: path
          operations:
            - name: get-secret
              method: GET
            - name: create-secret-version
              method: PUT
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: variables
          path: "/workspaces/{{workspace}}/vars"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: update-variable
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves the current month cost summary for an Azure resource group, returning total cost, forecast, and top cost contributors.

naftiko: "0.5"
info:
  label: "Azure Resource Group Cost Lookup"
  description: "Retrieves the current month cost summary for an Azure resource group, returning total cost, forecast, and top cost contributors."
  tags:
    - cloud
    - azure
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: get-resource-group-cost
          description: "Look up Azure resource group cost for the current billing period. Returns total cost, currency, and forecast."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group name."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID."
          call: "azure.get-cost-summary"
          with:
            resource_group: "{{resource_group}}"
            subscription_id: "{{subscription_id}}"
          outputParameters:
            - name: total_cost
              type: string
              mapping: "$.properties.rows[0][0]"
            - name: currency
              type: string
              mapping: "$.properties.columns[0].type"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-cost-summary
              method: POST

Creates a ServiceNow change request for Azure VM patching, triggers the Terraform apply, and validates health via Datadog after completion.

naftiko: "0.5"
info:
  label: "Azure VM Patching Orchestrator"
  description: "Creates a ServiceNow change request for Azure VM patching, triggers the Terraform apply, and validates health via Datadog after completion."
  tags:
    - cloud
    - azure
    - terraform
    - servicenow
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: orchestrate-vm-patch
          description: "Orchestrate Azure VM patching with change management and health validation."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform workspace for patching."
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor to validate post-patch."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Azure VM patching: {{workspace_name}}"
                category: "maintenance"
            - name: apply-patch
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "{{workspace_name}}"
                message: "Patch deployment - CR {{create-change.number}}"
            - name: validate
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: trigger-run
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Processes a request for classified system access by verifying clearance in Workday, provisioning Okta group membership, creating a ServiceNow request, and notifying the security office via Teams.

naftiko: "0.5"
info:
  label: "Classified System Access Request Orchestrator"
  description: "Processes a request for classified system access by verifying clearance in Workday, provisioning Okta group membership, creating a ServiceNow request, and notifying the security office via Teams."
  tags:
    - security
    - workday
    - okta
    - servicenow
    - microsoft-teams
    - clearance
capability:
  exposes:
    - type: mcp
      namespace: classified-access
      port: 8080
      tools:
        - name: request-classified-access
          description: "Orchestrate classified system access provisioning. Verifies clearance, assigns Okta groups, opens ServiceNow ticket, and notifies security team."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: system_name
              in: body
              type: string
              description: "Name of the classified system to access."
            - name: justification
              in: body
              type: string
              description: "Business justification for access."
          steps:
            - name: verify-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: provision-okta
              type: call
              call: "okta.add-user-to-group"
              with:
                user_id: "{{verify-employee.work_email}}"
                group_name: "{{system_name}}-access"
            - name: create-request
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Classified access: {{system_name}} for {{verify-employee.full_name}}"
                justification: "{{justification}}"
                category: "security_access"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel: "security-operations"
                message: "Access request {{create-request.number}} created for {{verify-employee.full_name}} to {{system_name}}."
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: group-membership
          path: "/groups/{{group_name}}/users/{{user_id}}"
          inputParameters:
            - name: group_name
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-security/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Pulls Azure cost data, compares against Snowflake budget forecasts, creates a Jira ticket for overspend, and sends a Power BI dashboard link to the finance team via Teams.

naftiko: "0.5"
info:
  label: "Cloud Infrastructure Cost Review Orchestrator"
  description: "Pulls Azure cost data, compares against Snowflake budget forecasts, creates a Jira ticket for overspend, and sends a Power BI dashboard link to the finance team via Teams."
  tags:
    - finops
    - azure
    - snowflake
    - jira
    - microsoft-teams
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: review-cloud-costs
          description: "Review cloud infrastructure costs. Pulls Azure spend, compares to Snowflake forecast, creates Jira ticket for variance, and notifies finance via Teams."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
            - name: finance_channel
              in: body
              type: string
              description: "Teams channel for finance notifications."
          steps:
            - name: get-costs
              type: call
              call: "azure.get-cost-summary"
              with:
                subscription_id: "{{subscription_id}}"
                resource_group: "{{resource_group}}"
            - name: get-forecast
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT budget_amount FROM cloud_budgets WHERE resource_group = '{{resource_group}}'"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Cloud cost review: {{resource_group}} - actual {{get-costs.total_cost}}"
                issue_type: "Task"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel: "{{finance_channel}}"
                message: "Cloud cost review for {{resource_group}}: Actual {{get-costs.total_cost}} vs forecast {{get-forecast.budget_amount}}. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-cost-summary
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-finance/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Confluence page by ID or title, returning content body, last modified date, and author for knowledge management.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence page by ID or title, returning content body, last modified date, and author for knowledge management."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-confluence-page
          description: "Look up a Confluence page by page ID. Returns title, body content, last modifier, and modification date."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: last_modified
              type: string
              mapping: "$.version.when"
            - name: author
              type: string
              mapping: "$.version.by.displayName"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage,version"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Identifies Confluence SOP pages due for review, creates Jira review tasks for document owners, and sends reminders via Teams.

naftiko: "0.5"
info:
  label: "Confluence SOP Review Cycle Orchestrator"
  description: "Identifies Confluence SOP pages due for review, creates Jira review tasks for document owners, and sends reminders via Teams."
  tags:
    - knowledge-management
    - confluence
    - jira
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: document-mgmt
      port: 8080
      tools:
        - name: initiate-sop-review
          description: "Initiate SOP review cycle: find stale Confluence pages, create Jira tasks, and notify owners."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "Confluence space key."
            - name: max_age_days
              in: body
              type: integer
              description: "Maximum days since last update before review is required."
          steps:
            - name: find-stale-pages
              type: call
              call: "confluence.search-pages"
              with:
                cql: "space = {{space_key}} AND label = sop AND lastModified < now('-{{max_age_days}}d')"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project: "COMPLIANCE"
                summary: "SOP review required: {{find-stale-pages.count}} pages in {{space_key}}"
                description: "Pages not updated in {{max_age_days}} days require review."
                issue_type: "Task"
            - name: notify-owners
              type: call
              call: "msteams.send-message"
              with:
                channel: "compliance-reviews"
                message: "SOP review cycle initiated for space {{space_key}}. {{find-stale-pages.count}} pages due. Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql={{cql}}"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-pages
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-compliance/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Provisions a defense contractor with limited-duration access by creating an Azure AD guest account, assigning Okta groups, and opening a ServiceNow tracking ticket.

naftiko: "0.5"
info:
  label: "Contractor Access Provisioning Workflow"
  description: "Provisions a defense contractor with limited-duration access by creating an Azure AD guest account, assigning Okta groups, and opening a ServiceNow tracking ticket."
  tags:
    - security
    - identity
    - azure
    - okta
    - servicenow
    - contractor
capability:
  exposes:
    - type: mcp
      namespace: contractor-access
      port: 8080
      tools:
        - name: provision-contractor
          description: "Provision a defense contractor with temporary system access. Creates Azure AD guest account, assigns Okta groups, and opens a ServiceNow tracking ticket."
          inputParameters:
            - name: contractor_name
              in: body
              type: string
              description: "Full name of the contractor."
            - name: contractor_email
              in: body
              type: string
              description: "Contractor's corporate email."
            - name: project_name
              in: body
              type: string
              description: "Defense project the contractor will support."
            - name: end_date
              in: body
              type: string
              description: "Access expiration date in YYYY-MM-DD format."
          steps:
            - name: create-guest
              type: call
              call: "msgraph.invite-user"
              with:
                invitedUserEmailAddress: "{{contractor_email}}"
                invitedUserDisplayName: "{{contractor_name}}"
                sendInvitationMessage: true
            - name: assign-okta-group
              type: call
              call: "okta.add-user-to-group"
              with:
                user_id: "{{contractor_email}}"
                group_name: "{{project_name}}-contractors"
            - name: open-ticket
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Contractor access: {{contractor_name}} for {{project_name}}"
                end_date: "{{end_date}}"
                category: "contractor_provisioning"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: invitations
          path: "/invitations"
          operations:
            - name: invite-user
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: group-membership
          path: "/groups/{{group_name}}/users/{{user_id}}"
          inputParameters:
            - name: group_name
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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

Checks CrowdStrike for non-compliant endpoints, assigns remediation policies, creates a ServiceNow task, and alerts the IT security team via Teams.

naftiko: "0.5"
info:
  label: "CrowdStrike Device Compliance Remediation"
  description: "Checks CrowdStrike for non-compliant endpoints, assigns remediation policies, creates a ServiceNow task, and alerts the IT security team via Teams."
  tags:
    - security
    - crowdstrike
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: endpoint-compliance
      port: 8080
      tools:
        - name: remediate-noncompliant-device
          description: "Remediate a non-compliant CrowdStrike endpoint: assign policy, create ServiceNow task, and alert security."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "CrowdStrike device ID."
            - name: policy_id
              in: body
              type: string
              description: "Compliance policy ID to assign."
          steps:
            - name: get-device
              type: call
              call: "crowdstrike.get-device"
              with:
                device_id: "{{device_id}}"
            - name: assign-policy
              type: call
              call: "crowdstrike.assign-policy"
              with:
                device_id: "{{device_id}}"
                policy_id: "{{policy_id}}"
            - name: create-task
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Endpoint compliance remediation: {{get-device.hostname}}"
                category: "security_compliance"
            - name: alert-security
              type: call
              call: "msteams.send-message"
              with:
                channel: "it-security"
                message: "Non-compliant device {{get-device.hostname}} remediated. Policy {{policy_id}} applied. ServiceNow: {{create-task.number}}"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: devices
          path: "/devices/entities/devices/v2?ids={{device_id}}"
          inputParameters:
            - name: device_id
              in: query
          operations:
            - name: get-device
              method: GET
        - name: policies
          path: "/policy/entities/device-control-policies/v1"
          operations:
            - name: assign-policy
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-security/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Queries a CrowdStrike Falcon endpoint by device ID and returns agent version, policy assignment, and last-seen timestamp.

naftiko: "0.5"
info:
  label: "CrowdStrike Endpoint Status Lookup"
  description: "Queries a CrowdStrike Falcon endpoint by device ID and returns agent version, policy assignment, and last-seen timestamp."
  tags:
    - security
    - crowdstrike
    - endpoint
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-endpoint-status
          description: "Look up a CrowdStrike Falcon endpoint by device ID. Returns hostname, agent version, last seen time, and assigned prevention policy."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The CrowdStrike device ID."
          call: "crowdstrike.get-device"
          with:
            device_id: "{{device_id}}"
          outputParameters:
            - name: hostname
              type: string
              mapping: "$.resources[0].hostname"
            - name: agent_version
              type: string
              mapping: "$.resources[0].agent_version"
            - name: last_seen
              type: string
              mapping: "$.resources[0].last_seen"
            - name: policy_name
              type: string
              mapping: "$.resources[0].device_policies.prevention.policy_name"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: devices
          path: "/devices/entities/devices/v2?ids={{device_id}}"
          inputParameters:
            - name: device_id
              in: query
          operations:
            - name: get-device
              method: GET

Pulls threat intelligence indicators from CrowdStrike, runs a Splunk search for matching events, and creates a ServiceNow security incident if matches are found.

naftiko: "0.5"
info:
  label: "CrowdStrike Threat Intel to Splunk Search"
  description: "Pulls threat intelligence indicators from CrowdStrike, runs a Splunk search for matching events, and creates a ServiceNow security incident if matches are found."
  tags:
    - security
    - crowdstrike
    - splunk
    - servicenow
    - threat-intelligence
capability:
  exposes:
    - type: mcp
      namespace: threat-intel
      port: 8080
      tools:
        - name: hunt-threat-indicators
          description: "Hunt for CrowdStrike threat indicators in Splunk logs and create incident if found."
          inputParameters:
            - name: indicator_type
              in: body
              type: string
              description: "Type of indicator (domain, ip, hash)."
            - name: indicator_value
              in: body
              type: string
              description: "The indicator value to hunt."
          steps:
            - name: get-intel
              type: call
              call: "crowdstrike.get-indicator"
              with:
                type: "{{indicator_type}}"
                value: "{{indicator_value}}"
            - name: search-logs
              type: call
              call: "splunk.run-search"
              with:
                search: "index=main {{indicator_value}} | stats count by src_ip, dest_ip"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Threat hunt match: {{indicator_type}}={{indicator_value}}"
                priority: "2"
                category: "security_incident"
                description: "Splunk matched {{search-logs.result_count}} events for {{indicator_value}}."
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: indicators
          path: "/iocs/entities/indicators/v1?type={{type}}&value={{value}}"
          inputParameters:
            - name: type
              in: query
            - name: value
              in: query
          operations:
            - name: get-indicator
              method: GET
    - type: http
      namespace: splunk
      baseUri: "https://splunk.rtx.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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 Datadog alert fires, retrieves monitor details, creates a Jira incident ticket, and posts a notification to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Alert to Jira Incident Bridge"
  description: "When a Datadog alert fires, retrieves monitor details, creates a Jira incident ticket, and posts a notification to the engineering Teams channel."
  tags:
    - monitoring
    - datadog
    - jira
    - microsoft-teams
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: bridge-alert-to-jira
          description: "Bridge a Datadog alert to a Jira incident ticket and notify engineering via Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for the incident."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "jira.create-issue"
              with:
                project: "{{project_key}}"
                summary: "Datadog alert: {{get-monitor.name}}"
                description: "Monitor {{monitor_id}} in state {{get-monitor.state}}. Type: {{get-monitor.type}}"
                issue_type: "Bug"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "engineering-alerts"
                message: "Datadog alert {{get-monitor.name}} created Jira {{create-incident.key}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-eng/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a critical Datadog monitor fires for production defense systems, automatically creates a ServiceNow P2 incident with full alert metadata.

naftiko: "0.5"
info:
  label: "Datadog Alert to ServiceNow Incident Bridge"
  description: "When a critical Datadog monitor fires for production defense systems, automatically creates a ServiceNow P2 incident with full alert metadata."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: alert-incident-bridge
      port: 8080
      tools:
        - name: bridge-alert-to-incident
          description: "Given a Datadog monitor ID and severity, create a ServiceNow incident pre-populated with monitor name, query, and alert severity for defense production systems."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: alert_severity
              in: body
              type: string
              description: "Severity of the alert: critical, warning, or no_data."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-from-alert"
              with:
                short_description: "Datadog alert: {{get-monitor.name}}"
                description: "Monitor: {{get-monitor.name}}\nSeverity: {{alert_severity}}\nQuery: {{get-monitor.query}}"
                urgency: "2"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-from-alert
              method: POST

When Datadog APM detects latency degradation, retrieves trace data, creates a Jira performance ticket, and alerts engineering via Teams.

naftiko: "0.5"
info:
  label: "Datadog APM Latency Alert to Engineering"
  description: "When Datadog APM detects latency degradation, retrieves trace data, creates a Jira performance ticket, and alerts engineering via Teams."
  tags:
    - monitoring
    - datadog
    - jira
    - microsoft-teams
    - performance
capability:
  exposes:
    - type: mcp
      namespace: performance-ops
      port: 8080
      tools:
        - name: handle-latency-alert
          description: "Handle APM latency alert: get trace data, create Jira ticket, and notify engineering."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Datadog service name."
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "PERF"
                summary: "Latency degradation: {{service_name}}"
                description: "Monitor {{monitor_id}} state: {{get-monitor.state}}. Service: {{service_name}}"
                issue_type: "Bug"
                priority: "High"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "engineering-performance"
                message: "Latency alert for {{service_name}}. Monitor state: {{get-monitor.state}}. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-eng/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Datadog metrics for embedded avionics software services and automatically creates a ServiceNow P1 incident when system health SLOs are breached.

naftiko: "0.5"
info:
  label: "Datadog Avionics System Monitoring Alert"
  description: "Monitors Datadog metrics for embedded avionics software services and automatically creates a ServiceNow P1 incident when system health SLOs are breached."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - incident-response
    - defense
capability:
  exposes:
    - type: mcp
      namespace: systems-monitoring
      port: 8080
      tools:
        - name: check-avionics-system-health
          description: "Given a Datadog service name and SLO ID for an avionics system, check SLO compliance and create a ServiceNow P1 incident if the error budget is exhausted."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name for the avionics system."
            - name: slo_id
              in: body
              type: string
              description: "The Datadog SLO ID to evaluate."
          steps:
            - name: get-slo
              type: call
              call: "datadog.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-p1-incident"
              with:
                short_description: "SLO breach: {{service_name}}"
                description: "SLO {{slo_id}} compliance: {{get-slo.compliance}}. Error budget remaining: {{get-slo.error_budget_remaining}}."
                urgency: "1"
                impact: "1"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-p1-incident
              method: POST

Detects cloud infrastructure cost anomalies in Datadog and opens a ServiceNow investigation while alerting the FinOps team in Teams.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Cost Anomaly Response"
  description: "Detects cloud infrastructure cost anomalies in Datadog and opens a ServiceNow investigation while alerting the FinOps team in Teams."
  tags:
    - cloud
    - finops
    - datadog
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given a Datadog cost metric query and threshold, detect anomalous cloud spending and create a ServiceNow investigation ticket with spend details."
          inputParameters:
            - name: metric_query
              in: body
              type: string
              description: "Datadog metric query string for cloud infrastructure cost."
            - name: threshold_usd
              in: body
              type: number
              description: "Spend threshold in USD above which an anomaly is flagged."
          steps:
            - name: query-spend
              type: call
              call: "datadog.query-metrics"
              with:
                query: "{{metric_query}}"
            - name: create-investigation
              type: call
              call: "servicenow.create-cost-ticket"
              with:
                short_description: "Cloud cost anomaly: spend exceeds ${{threshold_usd}}"
                description: "Current spend: {{query-spend.value}}. Threshold: {{threshold_usd}}."
            - name: alert-finops
              type: call
              call: "msteams.post-finops-alert"
              with:
                channel_id: "finops-team"
                message: "Cost anomaly: {{query-spend.value}} exceeds threshold ${{threshold_usd}}. ServiceNow: {{create-investigation.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics-query
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-cost-ticket
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-finops-alert
              method: POST

Queries Datadog for the current health status of a monitored service, returning monitor state, uptime percentage, and active alerts.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a monitored service, returning monitor state, uptime percentage, and active alerts."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Check Datadog service health by monitor ID. Returns current state, uptime, and active alert count."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.overall_state"
            - name: name
              type: string
              mapping: "$.name"
            - name: type
              type: string
              mapping: "$.type"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Looks up a SAP S/4HANA purchase order associated with a defense program contract code, returning structured status, vendor, and program cost data.

naftiko: "0.5"
info:
  label: "Defense Contract Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order associated with a defense program contract code, returning structured status, vendor, and program cost data."
  tags:
    - finance
    - procurement
    - sap
    - erp
    - defense
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-program-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number for a defense program. Returns header status, vendor name, total contract value, and program cost center."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to retrieve."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: cost_center
              type: string
              mapping: "$.d.WBSElement"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-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 for cost center budget utilization, checks threshold in Snowflake analytics, and sends a Teams alert to the program manager when spending exceeds 85% of planned budget.

naftiko: "0.5"
info:
  label: "Defense Program Budget Alert Workflow"
  description: "Queries SAP for cost center budget utilization, checks threshold in Snowflake analytics, and sends a Teams alert to the program manager when spending exceeds 85% of planned budget."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
    - defense
    - budget
capability:
  exposes:
    - type: mcp
      namespace: finance-alerts
      port: 8080
      tools:
        - name: check-budget-threshold
          description: "Check defense program budget utilization and alert if over threshold. Pulls SAP actuals, compares to Snowflake forecasts, and notifies via Teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID for the program."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
            - name: manager_email
              in: body
              type: string
              description: "Program manager email for notification."
          steps:
            - name: get-budget
              type: call
              call: "sap.get-budget"
              with:
                cost_center: "{{cost_center}}"
                fiscal_year: "{{fiscal_year}}"
            - name: get-forecast
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT forecast_amount FROM program_forecasts WHERE cost_center = '{{cost_center}}' AND fiscal_year = '{{fiscal_year}}'"
            - name: send-alert
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{manager_email}}"
                message: "Budget alert for cost center {{cost_center}}: Actual spend {{get-budget.actual_amount}} against plan {{get-budget.planned_amount}}. Forecast: {{get-forecast.forecast_amount}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_CSTCTRBUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

When an employee departure is confirmed in Workday, revokes Microsoft 365 and Okta access, closes open ServiceNow tickets, and initiates the security clearance return process.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Clearance Revocation"
  description: "When an employee departure is confirmed in Workday, revokes Microsoft 365 and Okta access, closes open ServiceNow tickets, and initiates the security clearance return process."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-graph
    - servicenow
    - security
    - defense
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, revoke Microsoft 365 access, suspend Okta account, close open ServiceNow tickets, and log the clearance return in ServiceNow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Employee termination date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: revoke-m365
              type: call
              call: "msgraph.disable-user"
              with:
                user_id: "{{get-employee.azure_object_id}}"
            - name: suspend-okta
              type: call
              call: "okta.suspend-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: log-departure
              type: call
              call: "servicenow.create-offboarding-record"
              with:
                short_description: "Employee departure: {{get-employee.full_name}}"
                description: "Termination date: {{termination_date}}. All access revoked."
                category: "hr_offboarding"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-offboarding-record
              method: POST

When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - microsoft-graph
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 new-hire onboarding sequence across ServiceNow, Microsoft Graph, and Microsoft Teams."
          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: "Employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_to: "IT_Onboarding"
            - name: provision-account
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-employee.full_name}}"
                mail: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-employee.work_email}}"
                message: "Welcome to RTX, {{get-employee.first_name}}! Your IT ticket is {{create-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Audits GitHub repositories for branch protection compliance, remediates violations by applying standard policies, and reports results to the DevSecOps team.

naftiko: "0.5"
info:
  label: "GitHub Branch Policy Enforcement Orchestrator"
  description: "Audits GitHub repositories for branch protection compliance, remediates violations by applying standard policies, and reports results to the DevSecOps team."
  tags:
    - devops
    - security
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devsecops-policy
      port: 8080
      tools:
        - name: enforce-branch-policies
          description: "Audit and enforce branch protection policies across repositories."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
          steps:
            - name: get-protection
              type: call
              call: "github.get-branch-protection"
              with:
                repo: "{{repo}}"
            - name: apply-policy
              type: call
              call: "github.set-branch-protection"
              with:
                repo: "{{repo}}"
                required_reviews: 2
                enforce_admins: true
            - name: log-enforcement
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_policy_enforcement"
                repository: "{{repo}}"
                action: "branch_protection_applied"
            - name: notify-devsecops
              type: call
              call: "msteams.send-message"
              with:
                channel: "devsecops"
                message: "Branch protection enforced on {{repo}}. Previous state: {{get-protection.required_reviews}} reviews. Now: 2 reviews required."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/main/protection"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-branch-protection
              method: GET
            - name: set-branch-protection
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-devsecops/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a GitHub Actions pipeline fails on a protected engineering branch, creates a Jira bug, posts a Datadog deployment event, and alerts the engineering team in Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "When a GitHub Actions pipeline fails on a protected engineering branch, creates a Jira bug, posts a Datadog deployment event, and alerts the engineering team in Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure, create a Jira bug with full context, record a Datadog deployment failure event, and alert the engineering Teams channel."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository name in owner/repo format."
            - name: branch
              in: body
              type: string
              description: "The branch name where the pipeline failed."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions run ID for the failed pipeline."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the pipeline."
          steps:
            - name: get-run
              type: call
              call: "github.get-workflow-run"
              with:
                repository: "{{repository}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}}"
                description: "Run ID: {{run_id}}\nCommit: {{commit_sha}}\nURL: {{get-run.html_url}}"
            - name: record-event
              type: call
              call: "datadog.create-event"
              with:
                title: "CI failure: {{repository}} {{branch}}"
                text: "Commit {{commit_sha}} caused pipeline failure. Jira: {{create-bug.key}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: "msteams.post-message"
              with:
                channel_id: "engineering-alerts"
                message: "CI Failure in {{repository}} on {{branch}}. Jira: {{create-bug.key}}. Run: {{get-run.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repository}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repository
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves open Dependabot alerts from GitHub, creates Jira tasks for critical vulnerabilities, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot to Jira Task Bridge"
  description: "Retrieves open Dependabot alerts from GitHub, creates Jira tasks for critical vulnerabilities, and notifies the security team via Teams."
  tags:
    - devops
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devsecops
      port: 8080
      tools:
        - name: bridge-dependabot-to-jira
          description: "Bridge GitHub Dependabot alerts to Jira tasks and notify security team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: severity
              in: body
              type: string
              description: "Minimum severity to process (critical, high)."
          steps:
            - name: get-alerts
              type: call
              call: "github.get-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "{{severity}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SECURITY"
                summary: "Dependabot: {{get-alerts.count}} {{severity}} alerts in {{repo}}"
                description: "Review and remediate {{severity}} dependency vulnerabilities in {{repo}}."
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "security-alerts"
                message: "{{get-alerts.count}} {{severity}} Dependabot alerts in {{repo}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts?severity={{severity}}&state=open"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: get-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-security/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a pull request is opened, runs a GitHub security scan, checks CrowdStrike for known indicators, and posts a review summary comment on the PR.

naftiko: "0.5"
info:
  label: "GitHub PR Security Review Orchestrator"
  description: "When a pull request is opened, runs a GitHub security scan, checks CrowdStrike for known indicators, and posts a review summary comment on the PR."
  tags:
    - devops
    - security
    - github
    - crowdstrike
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: devsecops
      port: 8080
      tools:
        - name: security-review-pr
          description: "Run a security review on a GitHub pull request. Checks code scanning alerts, queries CrowdStrike for related IOCs, and posts a summary comment."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number."
          steps:
            - name: get-pr
              type: call
              call: "github.get-pull-request"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: get-alerts
              type: call
              call: "github.get-code-scanning-alerts"
              with:
                repo: "{{repo}}"
                ref: "{{get-pr.head_ref}}"
            - name: check-iocs
              type: call
              call: "crowdstrike.search-indicators"
              with:
                query: "{{get-pr.head_ref}}"
            - name: post-comment
              type: call
              call: "github.create-pr-comment"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                body: "Security review complete. Code scanning alerts: {{get-alerts.count}}. IOC matches: {{check-iocs.count}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
        - name: code-scanning
          path: "/repos/{{repo}}/code-scanning/alerts?ref={{ref}}"
          inputParameters:
            - name: repo
              in: path
            - name: ref
              in: query
          operations:
            - name: get-code-scanning-alerts
              method: GET
        - 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
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: indicators
          path: "/iocs/combined/indicator/v1?filter={{query}}"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-indicators
              method: GET

When a new GitHub release is tagged in an engineering repository, fetches release details and posts a formatted announcement to the program engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release Notes Publisher"
  description: "When a new GitHub release is tagged in an engineering repository, fetches release details and posts a formatted announcement to the program engineering Teams channel."
  tags:
    - devops
    - engineering
    - github
    - microsoft-teams
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: publish-release-notes
          description: "Given a GitHub repository and release tag, fetch release metadata and post a formatted release announcement to the program engineering Teams channel."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: release_tag
              in: body
              type: string
              description: "The release tag name (e.g., v3.2.1)."
          steps:
            - name: get-release
              type: call
              call: "github.get-release"
              with:
                repository: "{{repository}}"
                tag: "{{release_tag}}"
            - name: post-announcement
              type: call
              call: "msteams.post-release"
              with:
                channel_id: "program-engineering"
                message: "Release {{release_tag}} published for {{repository}}: {{get-release.name}}. {{get-release.body}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{repository}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repository
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-release
              method: POST

When a GitHub release is published, creates a ServiceNow change request, triggers a Terraform deployment, and posts release notes to the Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release to Deployment Pipeline"
  description: "When a GitHub release is published, creates a ServiceNow change request, triggers a Terraform deployment, and posts release notes to the Teams channel."
  tags:
    - devops
    - github
    - servicenow
    - terraform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-pipeline
      port: 8080
      tools:
        - name: deploy-release
          description: "Deploy a GitHub release: create change request, trigger Terraform, and notify team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: tag
              in: body
              type: string
              description: "Release tag name."
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace for deployment."
          steps:
            - name: get-release
              type: call
              call: "github.get-release"
              with:
                repo: "{{repo}}"
                tag: "{{tag}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Deploy {{repo}} {{tag}}"
                description: "{{get-release.body}}"
                category: "deployment"
            - name: deploy
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "{{workspace}}"
                message: "Release {{tag}} - CR {{create-change.number}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "deployments"
                message: "Deploying {{repo}} {{tag}}. CR: {{create-change.number}}. Notes: {{get-release.body}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{repo}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: trigger-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-platform/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Checks a GitHub repository for branch protection, required reviews, and secret scanning status to ensure compliance with defense software policies.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Check"
  description: "Checks a GitHub repository for branch protection, required reviews, and secret scanning status to ensure compliance with defense software policies."
  tags:
    - devops
    - github
    - compliance
    - security
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: check-repo-compliance
          description: "Verify GitHub repository compliance settings including branch protection rules, required review counts, and secret scanning enablement."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name in org/repo format."
          call: "github.get-branch-protection"
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: branch_protection_enabled
              type: boolean
              mapping: "$.required_status_checks.strict"
            - name: required_reviews
              type: integer
              mapping: "$.required_pull_request_reviews.required_approving_review_count"
            - name: enforce_admins
              type: boolean
              mapping: "$.enforce_admins.enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/main/protection"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-branch-protection
              method: GET

When a GitHub Dependabot security alert is raised in an engineering repository, creates a Jira security ticket and notifies the RTX cybersecurity team in Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When a GitHub Dependabot security alert is raised in an engineering repository, creates a Jira security ticket and notifies the RTX cybersecurity team in Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: vuln-triage
      port: 8080
      tools:
        - name: triage-dependabot-alert
          description: "Given a GitHub Dependabot alert number and repository, create a Jira security ticket with CVE details and notify the cybersecurity team in Teams."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: alert_number
              in: body
              type: integer
              description: "The Dependabot alert number."
          steps:
            - name: get-alert
              type: call
              call: "github.get-dependabot-alert"
              with:
                repository: "{{repository}}"
                alert_number: "{{alert_number}}"
            - name: create-sec-ticket
              type: call
              call: "jira.create-security-ticket"
              with:
                project_key: "CYBER"
                issuetype: "Security"
                summary: "[Vuln] {{get-alert.dependency_name}} in {{repository}}"
                description: "CVE: {{get-alert.cve_id}}\nSeverity: {{get-alert.severity}}\nPackage: {{get-alert.dependency_name}}"
            - name: notify-cybersec
              type: call
              call: "msteams.post-vuln-notice"
              with:
                channel_id: "cybersecurity-team"
                message: "Vulnerability {{get-alert.cve_id}} ({{get-alert.severity}}) in {{repository}}. Jira: {{create-sec-ticket.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repository}}/dependabot/alerts/{{alert_number}}"
          inputParameters:
            - name: repository
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.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-security-ticket
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-vuln-notice
              method: POST

When a ServiceNow incident is flagged as recurring, creates a problem record, links related incidents from Splunk correlation, and notifies the engineering team via Jira.

naftiko: "0.5"
info:
  label: "Incident to Problem Escalation Workflow"
  description: "When a ServiceNow incident is flagged as recurring, creates a problem record, links related incidents from Splunk correlation, and notifies the engineering team via Jira."
  tags:
    - itsm
    - servicenow
    - splunk
    - jira
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm-escalation
      port: 8080
      tools:
        - name: escalate-to-problem
          description: "Escalate a recurring ServiceNow incident to a problem record. Correlates related events in Splunk and creates a Jira engineering task."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
            - name: correlation_query
              in: body
              type: string
              description: "Splunk search query to find related events."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: search-related
              type: call
              call: "splunk.run-search"
              with:
                search: "{{correlation_query}}"
            - name: create-problem
              type: call
              call: "servicenow.create-problem"
              with:
                short_description: "Recurring issue: {{get-incident.short_description}}"
                related_incidents: "{{incident_number}}"
                correlation_count: "{{search-related.result_count}}"
            - name: create-jira-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PLATFORM"
                summary: "Investigate recurring: {{get-incident.short_description}}"
                description: "Problem {{create-problem.number}} created. {{search-related.result_count}} correlated events found."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.rtx.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://rtx.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

Queries Jira for ungroomed backlog items, generates a summary in Confluence, and sends a digest to the product team via Teams.

naftiko: "0.5"
info:
  label: "Jira Backlog Grooming Summary Generator"
  description: "Queries Jira for ungroomed backlog items, generates a summary in Confluence, and sends a digest to the product team via Teams."
  tags:
    - devops
    - jira
    - confluence
    - microsoft-teams
    - agile
capability:
  exposes:
    - type: mcp
      namespace: agile-ops
      port: 8080
      tools:
        - name: generate-grooming-summary
          description: "Generate backlog grooming summary from Jira, publish to Confluence, and notify product team."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: space_key
              in: body
              type: string
              description: "Confluence space key."
          steps:
            - name: get-backlog
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND status = Backlog AND labels not in (groomed) ORDER BY priority DESC"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                space: "{{space_key}}"
                title: "Backlog Grooming Summary - {{project_key}}"
                body: "Ungroomed items: {{get-backlog.total}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "product-team"
                message: "Backlog grooming summary for {{project_key}}: {{get-backlog.total}} ungroomed items. Review: {{create-page.url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          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: channels
          path: "/teams/rtx-product/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Identifies blocked Jira issues across defense program projects, generates a dependency map in Confluence, and alerts program leads via Teams.

naftiko: "0.5"
info:
  label: "Jira Cross-Project Dependency Tracker"
  description: "Identifies blocked Jira issues across defense program projects, generates a dependency map in Confluence, and alerts program leads via Teams."
  tags:
    - devops
    - jira
    - confluence
    - microsoft-teams
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: program-mgmt
      port: 8080
      tools:
        - name: track-cross-dependencies
          description: "Track cross-project dependencies: find blocked issues, publish Confluence report, and notify leads."
          inputParameters:
            - name: project_keys
              in: body
              type: string
              description: "Comma-separated Jira project keys."
            - name: space_key
              in: body
              type: string
              description: "Confluence space for the dependency report."
          steps:
            - name: get-blocked
              type: call
              call: "jira.search-issues"
              with:
                jql: "project in ({{project_keys}}) AND status = Blocked ORDER BY priority DESC"
            - name: create-report
              type: call
              call: "confluence.create-page"
              with:
                space: "{{space_key}}"
                title: "Cross-Project Dependencies Report"
                body: "Blocked issues across projects: {{get-blocked.total}}"
            - name: notify-leads
              type: call
              call: "msteams.send-message"
              with:
                channel: "program-leads"
                message: "Cross-project dependency report: {{get-blocked.total}} blocked issues across {{project_keys}}. Report: {{create-report.url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          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: channels
          path: "/teams/rtx-programs/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Generates a weekly Jira backlog digest showing unestimated and long-blocked engineering issues, posted to the lead systems engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Engineering Backlog Health Digest"
  description: "Generates a weekly Jira backlog digest showing unestimated and long-blocked engineering issues, posted to the lead systems engineering Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - backlog-management
capability:
  exposes:
    - type: mcp
      namespace: engineering-backlog
      port: 8080
      tools:
        - name: digest-engineering-backlog
          description: "Given a Jira project key, fetch unestimated and long-stalled engineering issues and post a backlog health digest to the lead systems engineering Teams channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for the engineering team."
            - name: channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the engineering team."
          steps:
            - name: query-backlog
              type: call
              call: "jira.query-backlog-issues"
              with:
                project_key: "{{project_key}}"
            - name: post-digest
              type: call
              call: "msteams.post-backlog-report"
              with:
                channel_id: "{{channel_id}}"
                message: "Engineering backlog digest for {{project_key}}: {{query-backlog.unestimated_count}} unestimated, {{query-backlog.blocked_count}} blocked issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-search
          path: "/search"
          operations:
            - name: query-backlog-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-backlog-report
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, priority, and story points for engineering tracking.

naftiko: "0.5"
info:
  label: "Jira Issue Detail Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, priority, and story points for engineering tracking."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, priority, and story points."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., RADAR-1234)."
          call: "jira.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"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

At the end of each sprint, fetches completed Jira issues for the systems engineering team, calculates velocity, and posts a summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "At the end of each sprint, fetches completed Jira issues for the systems engineering team, calculates velocity, and posts a summary to the engineering Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: engineering-velocity
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira project key and sprint ID, retrieve completed issues, compute story point velocity, and post a sprint report to the systems engineering Teams channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key (e.g., AVIONICS, RADAR, SW)."
            - name: sprint_id
              in: body
              type: integer
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira.get-sprint-issues"
              with:
                sprint_id: "{{sprint_id}}"
                project_key: "{{project_key}}"
            - name: post-velocity
              type: call
              call: "msteams.post-sprint-report"
              with:
                channel_id: "systems-engineering"
                message: "Sprint {{sprint_id}} complete for {{project_key}}. Velocity: {{get-sprint-issues.story_points}} pts across {{get-sprint-issues.issue_count}} issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/search"
          operations:
            - name: get-sprint-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-sprint-report
              method: POST

Gathers completed Jira issues for a release version, generates a Confluence release notes page, and sends a Teams notification to stakeholders.

naftiko: "0.5"
info:
  label: "Jira to Confluence Release Documentation"
  description: "Gathers completed Jira issues for a release version, generates a Confluence release notes page, and sends a Teams notification to stakeholders."
  tags:
    - devops
    - jira
    - confluence
    - microsoft-teams
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: generate-release-docs
          description: "Generate Confluence release notes from completed Jira issues and notify stakeholders via Teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: version
              in: body
              type: string
              description: "Release version name."
            - name: space_key
              in: body
              type: string
              description: "Confluence space key for the release notes."
          steps:
            - name: get-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND fixVersion = '{{version}}' AND status = Done"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                space: "{{space_key}}"
                title: "Release Notes - {{version}}"
                body: "Issues completed: {{get-issues.total}}. See Jira for details."
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel: "release-notifications"
                message: "Release notes for {{version}} published: {{create-page.url}}. {{get-issues.total}} issues completed."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql={{jql}}"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          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: channels
          path: "/teams/rtx-releases/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Pulls candidate pipeline data from LinkedIn Recruiter, creates a Workday job requisition, and posts a summary to the hiring manager's Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Recruiting Pipeline to Workday Sync"
  description: "Pulls candidate pipeline data from LinkedIn Recruiter, creates a Workday job requisition, and posts a summary to the hiring manager's Teams channel."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: sync-recruiting-pipeline
          description: "Sync LinkedIn recruiting pipeline to Workday and notify hiring manager."
          inputParameters:
            - name: job_posting_id
              in: body
              type: string
              description: "LinkedIn job posting ID."
            - name: hiring_manager_email
              in: body
              type: string
              description: "Hiring manager email."
          steps:
            - name: get-pipeline
              type: call
              call: "linkedin.get-job-pipeline"
              with:
                posting_id: "{{job_posting_id}}"
            - name: create-requisition
              type: call
              call: "workday.create-requisition"
              with:
                title: "{{get-pipeline.job_title}}"
                department: "{{get-pipeline.department}}"
                applicant_count: "{{get-pipeline.total_applicants}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{hiring_manager_email}}"
                message: "Recruiting update for {{get-pipeline.job_title}}: {{get-pipeline.total_applicants}} applicants. Workday requisition: {{create-requisition.requisition_id}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings/{{posting_id}}"
          inputParameters:
            - name: posting_id
              in: path
          operations:
            - name: get-job-pipeline
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/rtx/jobRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Searches LinkedIn for candidates matching defense engineering requisitions, imports matches into Workday Recruiting, and notifies the engineering recruiter in Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Sourcing for Engineering Roles"
  description: "Searches LinkedIn for candidates matching defense engineering requisitions, imports matches into Workday Recruiting, and notifies the engineering recruiter in Teams."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: source-engineering-candidates
          description: "Given a Workday job requisition ID for a defense engineering role, search LinkedIn for matching candidates and notify the recruiter in Teams with match count."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: recruiter_email
              in: body
              type: string
              description: "Email of the recruiting team member to notify."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: search-candidates
              type: call
              call: "linkedin.search-people"
              with:
                keywords: "{{get-requisition.title}}"
                location: "{{get-requisition.location}}"
            - name: notify-recruiter
              type: call
              call: "msteams.send-recruiting-update"
              with:
                recipient: "{{recruiter_email}}"
                message: "Found {{search-candidates.count}} LinkedIn candidates for {{get-requisition.title}} (requisition {{requisition_id}})."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/rtx/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: people-search
          path: "/people"
          operations:
            - name: search-people
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-recruiting-update
              method: POST

Retrieves recent messages from a Microsoft Teams channel for situational awareness and communication audit.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Lookup"
  description: "Retrieves recent messages from a Microsoft Teams channel for situational awareness and communication audit."
  tags:
    - collaboration
    - microsoft-teams
    - communication
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: get-channel-messages
          description: "Retrieve recent messages from a Microsoft Teams channel by team and channel ID."
          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."
          call: "msteams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.value[*].body.content"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Launches an Okta access certification campaign, queries Workday for manager hierarchies, and creates a Jira task to track certification completion.

naftiko: "0.5"
info:
  label: "Okta Access Certification Campaign Orchestrator"
  description: "Launches an Okta access certification campaign, queries Workday for manager hierarchies, and creates a Jira task to track certification completion."
  tags:
    - security
    - okta
    - workday
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-governance
      port: 8080
      tools:
        - name: launch-certification
          description: "Launch access certification campaign with Okta and Workday integration."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "Name of the certification campaign."
            - name: department
              in: body
              type: string
              description: "Department to certify."
          steps:
            - name: get-users
              type: call
              call: "okta.list-department-users"
              with:
                department: "{{department}}"
            - name: get-managers
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT DISTINCT manager_email FROM workday_employees WHERE department = '{{department}}' AND status = 'Active'"
            - name: create-tracking-task
              type: call
              call: "jira.create-issue"
              with:
                project: "COMPLIANCE"
                summary: "Access certification: {{campaign_name}} - {{department}}"
                description: "Users to certify: {{get-users.count}}. Reviewers: {{get-managers.count}}"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users?filter=profile.department eq \"{{department}}\""
          inputParameters:
            - name: department
              in: query
          operations:
            - name: list-department-users
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://rtx.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 an employee's security clearance is revoked in Workday, immediately suspends their Okta account, revokes classified application access, and logs the action in ServiceNow.

naftiko: "0.5"
info:
  label: "Okta Security Clearance Access Deprovisioning"
  description: "When an employee's security clearance is revoked in Workday, immediately suspends their Okta account, revokes classified application access, and logs the action in ServiceNow."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
    - compliance
    - defense
capability:
  exposes:
    - type: mcp
      namespace: clearance-deprovisioning
      port: 8080
      tools:
        - name: deprovision-clearance-access
          description: "Given a Workday employee ID whose security clearance has been revoked, immediately suspend the Okta account, remove all classified app groups, and log the action in ServiceNow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee losing clearance."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: suspend-okta-account
              type: call
              call: "okta.suspend-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: log-revocation
              type: call
              call: "servicenow.create-compliance-record"
              with:
                short_description: "Security clearance revoked: {{get-employee.full_name}}"
                description: "Employee {{employee_id}} clearance revoked. Okta account suspended immediately."
                category: "security_compliance"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-compliance-record
              method: POST

When Okta detects a suspicious login, retrieves user details, checks CrowdStrike for endpoint status, suspends the user session, and creates a ServiceNow security incident.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Response Workflow"
  description: "When Okta detects a suspicious login, retrieves user details, checks CrowdStrike for endpoint status, suspends the user session, and creates a ServiceNow security incident."
  tags:
    - security
    - okta
    - crowdstrike
    - servicenow
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: respond-suspicious-login
          description: "Respond to a suspicious Okta login by verifying endpoint health, suspending user session, and logging a security incident."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The Okta user ID."
            - name: event_id
              in: body
              type: string
              description: "The Okta system log event ID."
          steps:
            - name: get-user
              type: call
              call: "okta.get-user"
              with:
                user_id: "{{user_id}}"
            - name: check-endpoint
              type: call
              call: "crowdstrike.find-device"
              with:
                hostname: "{{get-user.last_login_device}}"
            - name: suspend-session
              type: call
              call: "okta.clear-user-sessions"
              with:
                user_id: "{{user_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Suspicious login: {{get-user.display_name}} ({{get-user.email}})"
                priority: "2"
                category: "security_incident"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user
              method: GET
        - name: sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: clear-user-sessions
              method: DELETE
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: device-search
          path: "/devices/queries/devices/v1?filter=hostname:'{{hostname}}'"
          inputParameters:
            - name: hostname
              in: query
          operations:
            - name: find-device
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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

Retrieves the list of Okta groups assigned to a user, for access review and compliance auditing purposes.

naftiko: "0.5"
info:
  label: "Okta User Group Membership Lookup"
  description: "Retrieves the list of Okta groups assigned to a user, for access review and compliance auditing purposes."
  tags:
    - security
    - okta
    - identity
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-groups
          description: "Look up all Okta group memberships for a given user ID. Returns group names and IDs for access review."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The Okta user ID or login email."
          call: "okta.get-user-groups"
          with:
            user_id: "{{user_id}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$.groups[*].profile.name"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user-groups
              method: GET

Retrieves a specific firewall security rule from Palo Alto Networks Panorama by rule name, returning source zones, destination zones, and action.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Rule Lookup"
  description: "Retrieves a specific firewall security rule from Palo Alto Networks Panorama by rule name, returning source zones, destination zones, and action."
  tags:
    - security
    - palo-alto-networks
    - firewall
    - network
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto Networks firewall security rule by name. Returns source zone, destination zone, application, and action."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The name of the firewall security rule."
          call: "paloalto.get-security-rule"
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: source_zone
              type: array
              mapping: "$.result.entry.from.member"
            - name: destination_zone
              type: array
              mapping: "$.result.entry.to.member"
            - name: action
              type: string
              mapping: "$.result.entry.action"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.rtx.com/restapi/v10.2"
      authentication:
        type: bearer
        token: "$secrets.paloalto_token"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: query
          operations:
            - name: get-security-rule
              method: GET

When a Palo Alto Networks Threat Prevention alert fires for a zero-day vulnerability, creates a ServiceNow critical security incident and notifies the CISO team in Teams.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Zero-Day Vulnerability Response"
  description: "When a Palo Alto Networks Threat Prevention alert fires for a zero-day vulnerability, creates a ServiceNow critical security incident and notifies the CISO team in Teams."
  tags:
    - security
    - network
    - palo-alto-networks
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: threat-response
      port: 8080
      tools:
        - name: respond-to-zero-day-alert
          description: "Given a Palo Alto Networks threat alert ID, fetch full threat details, create a critical ServiceNow security incident, and notify the CISO leadership team in Teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Palo Alto Networks threat alert ID."
          steps:
            - name: get-threat-detail
              type: call
              call: "paloalto.get-threat-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-security-incident"
              with:
                short_description: "Zero-day threat: {{get-threat-detail.threat_name}}"
                description: "Threat ID: {{alert_id}}\nSeverity: {{get-threat-detail.severity}}\nAffected host: {{get-threat-detail.src_ip}}\nThreat type: {{get-threat-detail.threat_type}}"
                urgency: "1"
            - name: notify-ciso
              type: call
              call: "msteams.post-ciso-alert"
              with:
                channel_id: "ciso-leadership"
                message: "CRITICAL: Zero-day threat {{get-threat-detail.threat_name}} detected. ServiceNow: {{create-security-incident.number}}. Immediate action required."
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://rtx-panorama.paloaltonetworks.com/restapi/v10.1"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: threat-alerts
          path: "/Objects/ThreatAlerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-threat-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: security-incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-security-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-ciso-alert
              method: POST

Submits a Palo Alto firewall policy change request, creates a ServiceNow change record, and notifies the network security team for approval via Teams.

naftiko: "0.5"
info:
  label: "Palo Alto Policy Change Approval Workflow"
  description: "Submits a Palo Alto firewall policy change request, creates a ServiceNow change record, and notifies the network security team for approval via Teams."
  tags:
    - security
    - network
    - palo-alto-networks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: request-firewall-change
          description: "Submit firewall policy change: create ServiceNow change request and notify network security for approval."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "Firewall rule name to change."
            - name: change_description
              in: body
              type: string
              description: "Description of the policy change."
            - name: requestor_email
              in: body
              type: string
              description: "Requestor email."
          steps:
            - name: get-current-rule
              type: call
              call: "paloalto.get-security-rule"
              with:
                rule_name: "{{rule_name}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Firewall policy change: {{rule_name}}"
                description: "{{change_description}}. Current action: {{get-current-rule.action}}"
                category: "network"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "network-security-approvals"
                message: "Firewall change request {{create-change.number}} for rule '{{rule_name}}'. Requestor: {{requestor_email}}. {{change_description}}"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.rtx.com/restapi/v10.2"
      authentication:
        type: bearer
        token: "$secrets.paloalto_token"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: query
          operations:
            - name: get-security-rule
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-netsec/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves current headcount by division and clearance-level cost center from Workday for workforce planning and government-reporting purposes.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot by Division"
  description: "Retrieves current headcount by division and clearance-level cost center from Workday for workforce planning and government-reporting purposes."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-by-division
          description: "Returns a list of active employees grouped by division and cost center from Workday. Use for defense headcount planning, DCAA reporting, and budget allocation."
          call: "workday.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
  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-export
          path: "/rtx/workers"
          operations:
            - name: headcount-export
              method: GET

Checks the refresh status of a Power BI dataset, returning last refresh time, status, and any error messages.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the refresh status of a Power BI dataset, returning last refresh time, status, and any error messages."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Check the refresh status of a Power BI dataset by dataset ID. Returns last refresh time, status, and error if any."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh-history"
          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: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Triggers a Power BI dataset refresh for program performance dashboards and notifies the program management office in Teams when complete.

naftiko: "0.5"
info:
  label: "Power BI Defense Program Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for program performance dashboards and notifies the program management office in Teams when complete."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - defense
capability:
  exposes:
    - type: mcp
      namespace: program-analytics
      port: 8080
      tools:
        - name: refresh-program-dashboard
          description: "Given a Power BI workspace and dataset ID for a defense program dashboard, trigger a data refresh and notify the program management office in Teams."
          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 for the program dashboard."
            - name: program_name
              in: body
              type: string
              description: "The defense program name for the notification message."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.trigger-refresh"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-pmo
              type: call
              call: "msteams.post-refresh-notice"
              with:
                channel_id: "program-management-office"
                message: "Power BI dashboard for {{program_name}} (dataset {{dataset_id}}) has been refreshed."
  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: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-refresh-notice
              method: POST

Detects a Power BI dataset refresh failure, creates a Jira ticket for the data engineering team, and sends a Teams notification.

naftiko: "0.5"
info:
  label: "Power BI Refresh Failure to Jira Escalation"
  description: "Detects a Power BI dataset refresh failure, creates a Jira ticket for the data engineering team, and sends a Teams notification."
  tags:
    - analytics
    - power-bi
    - jira
    - microsoft-teams
    - data-engineering
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: escalate-refresh-failure
          description: "Escalate a Power BI refresh failure to Jira and notify data engineering."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: dataset_name
              in: body
              type: string
              description: "Human-readable dataset name."
          steps:
            - name: get-refresh
              type: call
              call: "powerbi.get-refresh-history"
              with:
                dataset_id: "{{dataset_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                summary: "Power BI refresh failed: {{dataset_name}}"
                description: "Dataset {{dataset_id}} refresh failed. Status: {{get-refresh.status}}"
                issue_type: "Bug"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "data-engineering"
                message: "Power BI dataset '{{dataset_name}}' refresh failed. Jira: {{create-ticket.key}}"
  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: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-data/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Detects expiring government contracts in Salesforce, pulls spend data from Snowflake, and creates a Jira task for the contracts team with renewal details.

naftiko: "0.5"
info:
  label: "Salesforce Contract Renewal Alert Workflow"
  description: "Detects expiring government contracts in Salesforce, pulls spend data from Snowflake, and creates a Jira task for the contracts team with renewal details."
  tags:
    - sales
    - salesforce
    - snowflake
    - jira
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: alert-contract-renewal
          description: "Alert on expiring Salesforce contract: pull Snowflake spend data and create Jira renewal task."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                id: "{{opportunity_id}}"
            - name: get-spend
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT total_spend, last_invoice_date FROM contract_spend WHERE opportunity_id = '{{opportunity_id}}'"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "CONTRACTS"
                summary: "Renewal: {{get-opportunity.name}} expiring {{get-opportunity.close_date}}"
                description: "Total spend: {{get-spend.total_spend}}. Amount: {{get-opportunity.amount}}"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://rtx.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://rtx.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

Generates a weekly digest of open Salesforce government and defense customer opportunities grouped by program office, posted to the business development Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Government Account Pipeline Digest"
  description: "Generates a weekly digest of open Salesforce government and defense customer opportunities grouped by program office, posted to the business development Teams channel."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - reporting
    - defense
capability:
  exposes:
    - type: mcp
      namespace: bizdev-reporting
      port: 8080
      tools:
        - name: digest-government-pipeline
          description: "Fetch open Salesforce opportunities for government accounts, group by program office, and post a pipeline summary to the business development Teams channel."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the business development team."
          steps:
            - name: get-gov-opportunities
              type: call
              call: "salesforce.query-gov-opportunities"
              with:
                account_type: "Government"
            - name: post-digest
              type: call
              call: "msteams.post-pipeline-report"
              with:
                channel_id: "{{channel_id}}"
                message: "Government pipeline digest: {{get-gov-opportunities.total_value}} across {{get-gov-opportunities.count}} open opportunities."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://rtx.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-gov-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-pipeline-report
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for government contract pipeline tracking.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for government contract pipeline tracking."
  tags:
    - sales
    - salesforce
    - crm
    - defense
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns opportunity name, stage, amount, close date, and account."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            id: "{{opportunity_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://rtx.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Analyzes closed Salesforce opportunities, queries Snowflake for historical win rates, and generates a Confluence analysis report for the capture team.

naftiko: "0.5"
info:
  label: "Salesforce Win/Loss Analysis Orchestrator"
  description: "Analyzes closed Salesforce opportunities, queries Snowflake for historical win rates, and generates a Confluence analysis report for the capture team."
  tags:
    - sales
    - salesforce
    - snowflake
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-analytics
      port: 8080
      tools:
        - name: analyze-win-loss
          description: "Analyze Salesforce win/loss data, query Snowflake trends, publish Confluence report, and notify capture team."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Fiscal quarter (e.g., Q1-2026)."
            - name: space_key
              in: body
              type: string
              description: "Confluence space key."
          steps:
            - name: get-closed-opps
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT stage, count(*) as count, sum(amount) as total FROM salesforce_opportunities WHERE close_quarter = '{{quarter}}' GROUP BY stage"
            - name: create-report
              type: call
              call: "confluence.create-page"
              with:
                space: "{{space_key}}"
                title: "Win/Loss Analysis - {{quarter}}"
                body: "Quarter {{quarter}} pipeline analysis results."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "capture-team"
                message: "Win/loss analysis for {{quarter}} published: {{create-report.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://rtx.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          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: channels
          path: "/teams/rtx-sales/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Checks SAP Ariba for contracts nearing expiration, queries Snowflake for utilization data, and sends renewal reminders to contract owners via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiration Notification"
  description: "Checks SAP Ariba for contracts nearing expiration, queries Snowflake for utilization data, and sends renewal reminders to contract owners via Teams."
  tags:
    - procurement
    - sap-ariba
    - snowflake
    - microsoft-teams
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: contract-mgmt
      port: 8080
      tools:
        - name: notify-expiring-contracts
          description: "Notify contract owners about expiring Ariba contracts with utilization data."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "SAP Ariba contract ID."
            - name: owner_email
              in: body
              type: string
              description: "Contract owner email."
          steps:
            - name: get-contract
              type: call
              call: "ariba.get-contract"
              with:
                contract_id: "{{contract_id}}"
            - name: get-utilization
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT total_spend, utilization_pct FROM contract_utilization WHERE contract_id = '{{contract_id}}'"
            - name: notify-owner
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{owner_email}}"
                message: "Contract {{contract_id}} ({{get-contract.title}}) expires {{get-contract.end_date}}. Utilization: {{get-utilization.utilization_pct}}%. Total spend: {{get-utilization.total_spend}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Onboards a new defense supplier into SAP Ariba by creating the supplier profile, validating government registration data, and notifying the procurement team in Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Defense Supplier Onboarding"
  description: "Onboards a new defense supplier into SAP Ariba by creating the supplier profile, validating government registration data, and notifying the procurement team in Teams."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - supplier-management
    - defense
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-defense-supplier
          description: "Given supplier name, CAGE code, and contact details, create a supplier profile in SAP Ariba and notify the defense procurement team in Teams."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the supplier."
            - name: cage_code
              in: body
              type: string
              description: "Commercial and Government Entity (CAGE) code for the supplier."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
          steps:
            - name: create-supplier
              type: call
              call: "ariba.create-supplier"
              with:
                name: "{{supplier_name}}"
                cage_code: "{{cage_code}}"
                contact_email: "{{contact_email}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-supplier-notice"
              with:
                channel_id: "defense-procurement"
                message: "New defense supplier onboarded: {{supplier_name}} (CAGE: {{cage_code}}). Ariba ID: {{create-supplier.supplier_id}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: apikey
        key: "APIKey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-supplier-notice
              method: POST

Retrieves open supplier invoices from SAP Ariba and matches them against SAP S/4HANA purchase orders, flagging discrepancies for finance review.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Reconciliation Against Purchase Orders"
  description: "Retrieves open supplier invoices from SAP Ariba and matches them against SAP S/4HANA purchase orders, flagging discrepancies for finance review."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - invoice-processing
capability:
  exposes:
    - type: mcp
      namespace: invoice-reconciliation
      port: 8080
      tools:
        - name: reconcile-invoices
          description: "Given a supplier ID and date range, fetch open invoices from SAP Ariba and match each against its SAP S/4HANA purchase order to identify discrepancies."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: from_date
              in: body
              type: string
              description: "Start date for invoice query in YYYY-MM-DD format."
            - name: to_date
              in: body
              type: string
              description: "End date for invoice query in YYYY-MM-DD format."
          steps:
            - name: get-invoices
              type: call
              call: "ariba.get-invoices"
              with:
                supplier_id: "{{supplier_id}}"
                from_date: "{{from_date}}"
                to_date: "{{to_date}}"
            - name: get-po
              type: call
              call: "sap.get-po-for-invoice"
              with:
                po_number: "{{get-invoices.po_number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: apikey
        key: "APIKey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: invoices
          path: "/invoices"
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://rtx-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-for-invoice
              method: GET

When a new RFQ is created in SAP Ariba, retrieves vendor contact details, sends a notification email via Microsoft Graph, and updates the Salesforce opportunity record.

naftiko: "0.5"
info:
  label: "SAP Ariba RFQ to Vendor Notification"
  description: "When a new RFQ is created in SAP Ariba, retrieves vendor contact details, sends a notification email via Microsoft Graph, and updates the Salesforce opportunity record."
  tags:
    - procurement
    - sap-ariba
    - microsoft-graph
    - salesforce
    - defense
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: notify-vendor-rfq
          description: "Notify vendors about a new RFQ. Pulls Ariba event details, sends email via Graph, and updates Salesforce opportunity."
          inputParameters:
            - name: rfq_id
              in: body
              type: string
              description: "The SAP Ariba RFQ document ID."
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-rfq
              type: call
              call: "ariba.get-rfq"
              with:
                rfq_id: "{{rfq_id}}"
            - name: send-notification
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{get-rfq.vendor_email}}"
                subject: "New RFQ: {{get-rfq.title}}"
                body: "You have been invited to respond to RFQ {{rfq_id}}: {{get-rfq.title}}. Due date: {{get-rfq.due_date}}."
            - name: update-opportunity
              type: call
              call: "salesforce.update-opportunity"
              with:
                id: "{{opportunity_id}}"
                stage: "RFQ Issued"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: rfqs
          path: "/rfqs/{{rfq_id}}"
          inputParameters:
            - name: rfq_id
              in: path
          operations:
            - name: get-rfq
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://rtx.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

Retrieves a supplier profile from SAP Ariba, queries Snowflake for past performance data, and creates a ServiceNow risk assessment record.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Risk Assessment Orchestrator"
  description: "Retrieves a supplier profile from SAP Ariba, queries Snowflake for past performance data, and creates a ServiceNow risk assessment record."
  tags:
    - procurement
    - sap-ariba
    - snowflake
    - servicenow
    - risk-management
capability:
  exposes:
    - type: mcp
      namespace: supplier-risk
      port: 8080
      tools:
        - name: assess-supplier-risk
          description: "Assess supplier risk by pulling Ariba profile, Snowflake performance metrics, and logging in ServiceNow."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP Ariba vendor ID."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: get-performance
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT avg_delivery_days, defect_rate, total_orders FROM supplier_performance WHERE vendor_id = '{{vendor_id}}'"
            - name: create-assessment
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_supplier_risk"
                vendor_name: "{{get-supplier.company_name}}"
                delivery_performance: "{{get-performance.avg_delivery_days}}"
                defect_rate: "{{get-performance.defect_rate}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves a travel request from SAP Concur, validates the cost center budget in SAP, and sends the approval request to the manager via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Request Approval Orchestrator"
  description: "Retrieves a travel request from SAP Concur, validates the cost center budget in SAP, and sends the approval request to the manager via Teams."
  tags:
    - travel
    - sap-concur
    - sap
    - microsoft-teams
    - expense
capability:
  exposes:
    - type: mcp
      namespace: travel-mgmt
      port: 8080
      tools:
        - name: route-travel-approval
          description: "Route travel request for approval: validate budget and notify manager."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "SAP Concur travel request ID."
          steps:
            - name: get-request
              type: call
              call: "concur.get-travel-request"
              with:
                request_id: "{{request_id}}"
            - name: check-budget
              type: call
              call: "sap.get-budget"
              with:
                cost_center: "{{get-request.cost_center}}"
                fiscal_year: "2026"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-request.approver_email}}"
                message: "Travel request {{request_id}} from {{get-request.traveler_name}}: {{get-request.destination}}, {{get-request.total_cost}} {{get-request.currency}}. Budget remaining: {{check-budget.remaining}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: travel-requests
          path: "/travelrequest/requests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-travel-request
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_CSTCTRBUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-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: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

When a defense program milestone is reached, retrieves the contract from SAP, creates a billing document, and notifies the program manager via Teams.

naftiko: "0.5"
info:
  label: "SAP Contract Milestone Billing Workflow"
  description: "When a defense program milestone is reached, retrieves the contract from SAP, creates a billing document, and notifies the program manager via Teams."
  tags:
    - finance
    - sap
    - billing
    - microsoft-teams
    - defense
capability:
  exposes:
    - type: mcp
      namespace: contract-billing
      port: 8080
      tools:
        - name: process-milestone-billing
          description: "Process milestone billing: retrieve SAP contract, create billing document, and notify program manager."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "SAP sales contract number."
            - name: milestone_id
              in: body
              type: string
              description: "Milestone identifier."
            - name: manager_email
              in: body
              type: string
              description: "Program manager email."
          steps:
            - name: get-contract
              type: call
              call: "sap.get-contract"
              with:
                contract_number: "{{contract_number}}"
            - name: create-billing
              type: call
              call: "sap.create-billing-document"
              with:
                contract: "{{contract_number}}"
                milestone: "{{milestone_id}}"
                amount: "{{get-contract.milestone_amount}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{manager_email}}"
                message: "Milestone billing processed for contract {{contract_number}}, milestone {{milestone_id}}. Billing doc: {{create-billing.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contracts
          path: "/API_SALES_CONTRACT_SRV/A_SalesContract('{{contract_number}}')"
          inputParameters:
            - name: contract_number
              in: path
          operations:
            - name: get-contract
              method: GET
        - name: billing
          path: "/API_BILLING_DOCUMENT_SRV/A_BillingDocument"
          operations:
            - name: create-billing-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves budget vs. actuals for a given SAP cost center and fiscal period, returning planned amount, committed amount, and remaining budget.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Lookup"
  description: "Retrieves budget vs. actuals for a given SAP cost center and fiscal period, returning planned amount, committed amount, and remaining budget."
  tags:
    - finance
    - sap
    - budget
    - defense
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-cost-center-budget
          description: "Look up SAP cost center budget by cost center ID and fiscal year. Returns planned budget, actual spend, commitments, and remaining funds."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center ID."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
          call: "sap.get-budget"
          with:
            cost_center: "{{cost_center}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: planned_amount
              type: string
              mapping: "$.d.PlannedAmount"
            - name: actual_amount
              type: string
              mapping: "$.d.ActualAmount"
            - name: committed_amount
              type: string
              mapping: "$.d.CommittedAmount"
            - name: remaining
              type: string
              mapping: "$.d.RemainingBudget"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_CSTCTRBUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-budget
              method: GET

Monitors SAP delivery schedules for defense programs, checks for overdue deliveries, and alerts the supply chain team via Teams with a Jira follow-up task.

naftiko: "0.5"
info:
  label: "SAP Delivery Schedule Monitor and Alert"
  description: "Monitors SAP delivery schedules for defense programs, checks for overdue deliveries, and alerts the supply chain team via Teams with a Jira follow-up task."
  tags:
    - logistics
    - sap
    - jira
    - microsoft-teams
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: monitor-delivery-schedule
          description: "Monitor SAP delivery schedule and alert on overdue items."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
          steps:
            - name: get-schedule
              type: call
              call: "sap.get-delivery-schedule"
              with:
                po_number: "{{po_number}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "SUPPLY"
                summary: "Overdue delivery: PO {{po_number}}"
                description: "Scheduled date: {{get-schedule.delivery_date}}. Vendor: {{get-schedule.vendor}}"
                issue_type: "Task"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "supply-chain-alerts"
                message: "Delivery overdue for PO {{po_number}}. Vendor: {{get-schedule.vendor}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_INBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_InbDeliveryHeader?$filter=PurchaseOrder eq '{{po_number}}'"
          inputParameters:
            - name: po_number
              in: query
          operations:
            - name: get-delivery-schedule
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-supply/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a goods receipt document from SAP by material document number, returning posting date, material, quantity, and movement type.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Lookup"
  description: "Retrieves a goods receipt document from SAP by material document number, returning posting date, material, quantity, and movement type."
  tags:
    - logistics
    - sap
    - warehouse
    - defense
capability:
  exposes:
    - type: mcp
      namespace: erp-logistics
      port: 8080
      tools:
        - name: get-goods-receipt
          description: "Look up a SAP goods receipt by material document number. Returns posting date, material, quantity, and plant."
          inputParameters:
            - name: document_number
              in: body
              type: string
              description: "The SAP material document number."
          call: "sap.get-goods-receipt"
          with:
            doc_number: "{{document_number}}"
          outputParameters:
            - name: posting_date
              type: string
              mapping: "$.d.PostingDate"
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: quantity
              type: string
              mapping: "$.d.QuantityInEntryUnit"
            - name: plant
              type: string
              mapping: "$.d.Plant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader('{{doc_number}}')"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET

When a goods receipt is posted in SAP, creates a quality inspection lot, notifies the QA team via Teams, and logs the inspection in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Quality Inspection Trigger"
  description: "When a goods receipt is posted in SAP, creates a quality inspection lot, notifies the QA team via Teams, and logs the inspection in ServiceNow."
  tags:
    - logistics
    - sap
    - quality
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: quality-mgmt
      port: 8080
      tools:
        - name: trigger-quality-inspection
          description: "Trigger quality inspection from goods receipt: create SAP inspection lot and notify QA."
          inputParameters:
            - name: material_doc
              in: body
              type: string
              description: "SAP material document number from goods receipt."
          steps:
            - name: get-receipt
              type: call
              call: "sap.get-goods-receipt"
              with:
                doc_number: "{{material_doc}}"
            - name: create-inspection
              type: call
              call: "sap.create-inspection-lot"
              with:
                material: "{{get-receipt.material}}"
                plant: "{{get-receipt.plant}}"
                quantity: "{{get-receipt.quantity}}"
            - name: log-inspection
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_quality_inspection"
                material_doc: "{{material_doc}}"
                inspection_lot: "{{create-inspection.lot_number}}"
            - name: notify-qa
              type: call
              call: "msteams.send-message"
              with:
                channel: "quality-assurance"
                message: "Quality inspection {{create-inspection.lot_number}} created for material {{get-receipt.material}}, quantity {{get-receipt.quantity}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/API_MATERIAL_DOCUMENT_SRV/A_MaterialDocumentHeader('{{doc_number}}')"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
        - name: inspection-lots
          path: "/API_INSPECTIONLOT_SRV/A_InspectionLot"
          operations:
            - name: create-inspection-lot
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-qa/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Processes an intercompany stock transfer between Raytheon divisions, creates transfer orders in SAP, and logs the transaction in Snowflake for audit.

naftiko: "0.5"
info:
  label: "SAP Intercompany Transfer Orchestrator"
  description: "Processes an intercompany stock transfer between Raytheon divisions, creates transfer orders in SAP, and logs the transaction in Snowflake for audit."
  tags:
    - logistics
    - sap
    - snowflake
    - microsoft-teams
    - intercompany
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: process-intercompany-transfer
          description: "Process intercompany transfer: create SAP transfer order, log in Snowflake, and notify."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: source_plant
              in: body
              type: string
              description: "Source plant code."
            - name: target_plant
              in: body
              type: string
              description: "Target plant code."
            - name: quantity
              in: body
              type: string
              description: "Transfer quantity."
          steps:
            - name: create-transfer
              type: call
              call: "sap.create-stock-transfer"
              with:
                material: "{{material_number}}"
                source: "{{source_plant}}"
                target: "{{target_plant}}"
                quantity: "{{quantity}}"
            - name: log-transfer
              type: call
              call: "snowflake.run-query"
              with:
                statement: "INSERT INTO transfer_audit (material, source_plant, target_plant, quantity, transfer_doc) VALUES ('{{material_number}}', '{{source_plant}}', '{{target_plant}}', '{{quantity}}', '{{create-transfer.document_number}}')"
            - name: notify-logistics
              type: call
              call: "msteams.send-message"
              with:
                channel: "logistics-ops"
                message: "Intercompany transfer {{create-transfer.document_number}}: {{quantity}} units of {{material_number}} from {{source_plant}} to {{target_plant}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_STOCK_TRANSFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfers
          path: "/A_StockTransfer"
          operations:
            - name: create-stock-transfer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-logistics/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Performs a three-way match by comparing a supplier invoice against the SAP purchase order and goods receipt, then posts the result or flags discrepancies in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Orchestrator"
  description: "Performs a three-way match by comparing a supplier invoice against the SAP purchase order and goods receipt, then posts the result or flags discrepancies in ServiceNow."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
    - invoice
capability:
  exposes:
    - type: mcp
      namespace: accounts-payable
      port: 8080
      tools:
        - name: three-way-match
          description: "Perform three-way match on a supplier invoice: compare invoice amount against PO value and goods receipt quantity. Flag discrepancies in ServiceNow."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The supplier invoice number."
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: gr_document
              in: body
              type: string
              description: "The goods receipt material document number."
          steps:
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: get-goods-receipt
              type: call
              call: "sap.get-goods-receipt"
              with:
                doc_number: "{{gr_document}}"
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: log-result
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_invoice_match"
                po_amount: "{{get-po.total_value}}"
                gr_quantity: "{{get-goods-receipt.quantity}}"
                invoice_amount: "{{get-invoice.amount}}"
                status: "matched"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/MM_PUR_PO_MAINT_V2_SRV/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
        - name: material-documents
          path: "/API_MATERIAL_DOCUMENT_SRV/A_MaterialDocumentHeader('{{doc_number}}')"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
        - name: invoices
          path: "/API_SUPPLIERINVOICE_PROCESS_SRV/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group for defense procurement.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group for defense procurement."
  tags:
    - procurement
    - sap
    - materials
    - defense
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material
          description: "Look up SAP material master by material number. Returns description, base unit of measure, material group, and plant data."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-material"
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: unit_of_measure
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-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}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material
              method: GET

Triggers SAP S/4HANA period-close for government program cost objects at month end, exports cost summaries, and notifies the program finance team in Teams.

naftiko: "0.5"
info:
  label: "SAP Period-Close for Government Programs"
  description: "Triggers SAP S/4HANA period-close for government program cost objects at month end, exports cost summaries, and notifies the program finance team in Teams."
  tags:
    - finance
    - erp
    - sap
    - microsoft-teams
    - period-close
    - defense
capability:
  exposes:
    - type: mcp
      namespace: program-finance-close
      port: 8080
      tools:
        - name: run-program-period-close
          description: "Given a government program company code and fiscal period, trigger SAP S/4HANA period-close for all program cost objects and notify the finance team in Teams."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code for the government program entity."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format."
          steps:
            - name: trigger-close
              type: call
              call: "sap.trigger-period-close"
              with:
                company_code: "{{company_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: notify-finance
              type: call
              call: "msteams.post-close-notification"
              with:
                channel_id: "program-finance"
                message: "SAP period close for {{fiscal_period}} (company {{company_code}}) initiated. Job ID: {{trigger-close.job_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close
          path: "/A_CompanyCode('{{company_code}}')/to_PeriodClose"
          inputParameters:
            - name: company_code
              in: path
          operations:
            - name: trigger-period-close
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-close-notification
              method: POST

Retrieves a new SAP purchase requisition, identifies the approver from Workday, and sends an approval request via Teams with requisition details.

naftiko: "0.5"
info:
  label: "SAP Purchase Requisition to Approval Workflow"
  description: "Retrieves a new SAP purchase requisition, identifies the approver from Workday, and sends an approval request via Teams with requisition details."
  tags:
    - procurement
    - sap
    - workday
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: route-pr-approval
          description: "Route SAP purchase requisition for approval. Get PR details, lookup approver in Workday, and send Teams approval request."
          inputParameters:
            - name: pr_number
              in: body
              type: string
              description: "SAP purchase requisition number."
          steps:
            - name: get-pr
              type: call
              call: "sap.get-purchase-requisition"
              with:
                pr_number: "{{pr_number}}"
            - name: get-approver
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-pr.requestor_id}}"
            - name: send-approval
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-approver.manager_email}}"
                message: "PR {{pr_number}} requires approval. Amount: {{get-pr.total_amount}} {{get-pr.currency}}. Requestor: {{get-approver.full_name}}. Material: {{get-pr.material_description}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: requisitions
          path: "/A_PurchaseRequisitionHeader('{{pr_number}}')"
          inputParameters:
            - name: pr_number
              in: path
          operations:
            - name: get-purchase-requisition
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Synchronizes new or updated vendor records from SAP S/4HANA to SAP Ariba to ensure defense procurement catalog consistency across both systems.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Sync to Ariba"
  description: "Synchronizes new or updated vendor records from SAP S/4HANA to SAP Ariba to ensure defense procurement catalog consistency across both systems."
  tags:
    - procurement
    - finance
    - sap
    - sap-ariba
    - data-sync
capability:
  exposes:
    - type: mcp
      namespace: vendor-sync
      port: 8080
      tools:
        - name: sync-vendor-to-ariba
          description: "Given a SAP vendor account number, fetch the vendor master record from SAP S/4HANA and upsert the corresponding supplier in SAP Ariba."
          inputParameters:
            - name: vendor_account
              in: body
              type: string
              description: "The SAP vendor account number."
          steps:
            - name: get-vendor
              type: call
              call: "sap.get-vendor"
              with:
                vendor_account: "{{vendor_account}}"
            - name: upsert-supplier
              type: call
              call: "ariba.upsert-supplier"
              with:
                supplier_id: "{{get-vendor.vendor_account}}"
                name: "{{get-vendor.name}}"
                country: "{{get-vendor.country}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_account}}')"
          inputParameters:
            - name: vendor_account
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: apikey
        key: "APIKey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: upsert-supplier
              method: PUT

When a clearance verification is requested, queries Workday for employee data, checks Okta group assignments for classified system access, and logs the verification result in ServiceNow.

naftiko: "0.5"
info:
  label: "Security Clearance Verification Workflow"
  description: "When a clearance verification is requested, queries Workday for employee data, checks Okta group assignments for classified system access, and logs the verification result in ServiceNow."
  tags:
    - security
    - hr
    - workday
    - okta
    - servicenow
    - clearance
capability:
  exposes:
    - type: mcp
      namespace: security-clearance
      port: 8080
      tools:
        - name: verify-clearance-access
          description: "Verify that an employee's security clearance matches their current system access. Checks Workday clearance level against Okta group memberships and logs findings in ServiceNow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: clearance_level
              in: body
              type: string
              description: "Expected clearance level (e.g., Secret, Top Secret/SCI)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: get-okta-groups
              type: call
              call: "okta.get-user-groups"
              with:
                user_id: "{{get-employee.work_email}}"
            - name: log-verification
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_clearance_audit"
                employee_name: "{{get-employee.full_name}}"
                clearance_level: "{{clearance_level}}"
                groups_found: "{{get-okta-groups.groups}}"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user-groups
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Opens a ServiceNow change request for planned changes to classified information systems, routes it through the security review board, and notifies stakeholders in Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for Classified Systems"
  description: "Opens a ServiceNow change request for planned changes to classified information systems, routes it through the security review board, and notifies stakeholders in Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - security
    - defense
capability:
  exposes:
    - type: mcp
      namespace: classified-change-mgmt
      port: 8080
      tools:
        - name: open-classified-change-request
          description: "Given change details and classification level, create a ServiceNow change request for a classified system update and notify the security review board in Teams."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the proposed change."
            - name: classification_level
              in: body
              type: string
              description: "Classification level: UNCLASSIFIED, CUI, SECRET, or TOP_SECRET."
            - name: scheduled_start
              in: body
              type: string
              description: "Planned start datetime in ISO 8601 format."
            - name: scheduled_end
              in: body
              type: string
              description: "Planned end datetime in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "{{short_description}}"
                classification: "{{classification_level}}"
                start_date: "{{scheduled_start}}"
                end_date: "{{scheduled_end}}"
            - name: notify-security-board
              type: call
              call: "msteams.notify-srb"
              with:
                channel_id: "security-review-board"
                message: "New classified change request {{create-change.number}}: {{short_description}} | Classification: {{classification_level}} | Window: {{scheduled_start}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: notify-srb
              method: POST

Looks up a ServiceNow incident by number and returns its current state, priority, assigned group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Looks up a ServiceNow incident by number and returns its current state, priority, assigned group, and resolution notes."
  tags:
    - itsm
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Look up a ServiceNow incident by incident number. Returns state, priority, assignment group, and short description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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

When a ServiceNow incident is resolved, generates a knowledge article draft, publishes it, and shares the link with the support team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Auto-Publisher"
  description: "When a ServiceNow incident is resolved, generates a knowledge article draft, publishes it, and shares the link with the support team via Teams."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge-mgmt
      port: 8080
      tools:
        - name: auto-publish-knowledge
          description: "Auto-publish knowledge article from resolved incident and share with team."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The resolved ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-article
              type: call
              call: "servicenow.create-knowledge-article"
              with:
                title: "Resolution: {{get-incident.short_description}}"
                body: "{{get-incident.close_notes}}"
                category: "{{get-incident.category}}"
            - name: share-article
              type: call
              call: "msteams.send-message"
              with:
                channel: "service-desk"
                message: "New KB article published from {{incident_number}}: {{create-article.title}}. Link: {{create-article.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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
        - name: knowledge
          path: "/table/kb_knowledge"
          operations:
            - name: create-knowledge-article
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-support/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a P1 incident is declared, retrieves incident details from ServiceNow, creates a Teams bridge channel, and posts status updates to stakeholders.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Communication Orchestrator"
  description: "When a P1 incident is declared, retrieves incident details from ServiceNow, creates a Teams bridge channel, and posts status updates to stakeholders."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - incident-management
    - communication
capability:
  exposes:
    - type: mcp
      namespace: major-incident
      port: 8080
      tools:
        - name: manage-major-incident-comms
          description: "Manage major incident communications: pull ServiceNow details, create Teams bridge, and notify stakeholders."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
            - name: stakeholder_channel
              in: body
              type: string
              description: "Teams channel for stakeholder updates."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-bridge
              type: call
              call: "msteams.create-channel"
              with:
                team: "incident-response"
                name: "Bridge-{{incident_number}}"
                description: "{{get-incident.short_description}}"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel: "{{stakeholder_channel}}"
                message: "Major Incident {{incident_number}}: {{get-incident.short_description}}. Priority: {{get-incident.priority}}. Bridge: {{create-bridge.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team}}/channels"
          inputParameters:
            - name: team
              in: path
          operations:
            - name: create-channel
              method: POST
        - name: channel-messages
          path: "/teams/rtx-stakeholders/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a ServiceNow P1 incident breaches its SLA, escalates by creating a Jira Engineering ticket and notifying the executive escalation Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Escalation to Jira"
  description: "When a ServiceNow P1 incident breaches its SLA, escalates by creating a Jira Engineering ticket and notifying the executive escalation Teams channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - jira
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-p1-incident
          description: "Given a ServiceNow incident number that has breached its P1 SLA, create a Jira Engineering ticket and notify the executive escalation Teams channel."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: create-escalation
              type: call
              call: "jira.create-escalation-ticket"
              with:
                project_key: "ENG"
                issuetype: "Incident"
                summary: "[P1 Escalation] {{get-incident.short_description}}"
                description: "ServiceNow: {{incident_number}}\nImpact: {{get-incident.impact}}\nOpened: {{get-incident.opened_at}}"
            - name: alert-leadership
              type: call
              call: "msteams.post-escalation"
              with:
                channel_id: "executive-escalations"
                message: "P1 SLA breach: {{incident_number}}. Jira: {{create-escalation.key}}. {{get-incident.short_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://rtx.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-escalation-ticket
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-escalation
              method: POST

Runs a Snowflake data quality check, logs failures in ServiceNow, and notifies the data engineering team via Teams with details about failed checks.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert Workflow"
  description: "Runs a Snowflake data quality check, logs failures in ServiceNow, and notifies the data engineering team via Teams with details about failed checks."
  tags:
    - data
    - snowflake
    - servicenow
    - microsoft-teams
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: check-data-quality
          description: "Run Snowflake data quality checks, log failures in ServiceNow, and alert data engineering team."
          inputParameters:
            - name: check_name
              in: body
              type: string
              description: "Name of the data quality check."
            - name: query
              in: body
              type: string
              description: "Snowflake SQL query for the data quality check."
            - name: team_channel
              in: body
              type: string
              description: "Teams channel for alerts."
          steps:
            - name: run-check
              type: call
              call: "snowflake.run-query"
              with:
                statement: "{{query}}"
            - name: log-result
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_data_quality_log"
                check_name: "{{check_name}}"
                result_count: "{{run-check.rowCount}}"
                status: "completed"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "{{team_channel}}"
                message: "Data quality check '{{check_name}}' complete. Rows flagged: {{run-check.rowCount}}. ServiceNow: {{log-result.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-data/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Detects a Snowflake ETL pipeline failure, creates a Jira ticket for data engineering, retries the pipeline, and notifies the team via Teams.

naftiko: "0.5"
info:
  label: "Snowflake ETL Failure Recovery Workflow"
  description: "Detects a Snowflake ETL pipeline failure, creates a Jira ticket for data engineering, retries the pipeline, and notifies the team via Teams."
  tags:
    - data
    - snowflake
    - jira
    - microsoft-teams
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: recover-etl-failure
          description: "Recover from Snowflake ETL failure: create Jira ticket, retry pipeline, and notify team."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task name that failed."
            - name: database
              in: body
              type: string
              description: "Snowflake database name."
          steps:
            - name: get-task-status
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}')) ORDER BY SCHEDULED_TIME DESC LIMIT 1"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                summary: "ETL failure: {{task_name}} in {{database}}"
                description: "Task failed. Check Snowflake task history for details."
                issue_type: "Bug"
            - name: retry-task
              type: call
              call: "snowflake.run-query"
              with:
                statement: "EXECUTE TASK {{database}}.PUBLIC.{{task_name}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "data-engineering"
                message: "ETL failure recovery for {{task_name}}. Retry initiated. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://rtx.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-data/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for program-level cost actuals versus planned budget and publishes a monthly program cost report to the finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Program Cost Reporting"
  description: "Queries Snowflake for program-level cost actuals versus planned budget and publishes a monthly program cost report to the finance Microsoft Teams channel."
  tags:
    - finance
    - data
    - analytics
    - snowflake
    - microsoft-teams
    - reporting
    - defense
capability:
  exposes:
    - type: mcp
      namespace: program-finance-reporting
      port: 8080
      tools:
        - name: publish-program-cost-report
          description: "Given a program code and fiscal period, query Snowflake for actuals vs. budget data and post a formatted cost report to the program finance Teams channel."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The defense program code (e.g., F135, SPY-6)."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format."
            - name: channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the program finance team."
          steps:
            - name: query-cost-data
              type: call
              call: "snowflake.get-program-costs"
              with:
                program_code: "{{program_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: post-report
              type: call
              call: "msteams.post-cost-report"
              with:
                channel_id: "{{channel_id}}"
                message: "Program {{program_code}} cost report for {{fiscal_period}}: Actuals {{query-cost-data.actuals}} vs Budget {{query-cost-data.budget}} ({{query-cost-data.variance_pct}}% variance)."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: program-costs
          path: "/queries/results"
          operations:
            - name: get-program-costs
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-cost-report
              method: POST

Checks the execution status of a Snowflake query by query ID, returning state, duration, and error message if applicable.

naftiko: "0.5"
info:
  label: "Snowflake Query Execution Status"
  description: "Checks the execution status of a Snowflake query by query ID, returning state, duration, and error message if applicable."
  tags:
    - data
    - snowflake
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-platform
      port: 8080
      tools:
        - name: get-query-status
          description: "Check status of a running or completed Snowflake query by query ID. Returns execution state, duration, rows produced, and any error details."
          inputParameters:
            - name: query_id
              in: body
              type: string
              description: "The Snowflake query ID."
          call: "snowflake.get-query-status"
          with:
            query_id: "{{query_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.queries[0].status"
            - name: duration_ms
              type: integer
              mapping: "$.data.queries[0].totalDuration"
            - name: rows_produced
              type: integer
              mapping: "$.data.queries[0].rowsProduced"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements/{{query_id}}"
          inputParameters:
            - name: query_id
              in: path
          operations:
            - name: get-query-status
              method: GET

Runs a Splunk compliance search, exports results to Snowflake, generates a Power BI dashboard refresh, and emails the compliance report via Microsoft Graph.

naftiko: "0.5"
info:
  label: "Splunk Compliance Report Generator"
  description: "Runs a Splunk compliance search, exports results to Snowflake, generates a Power BI dashboard refresh, and emails the compliance report via Microsoft Graph."
  tags:
    - compliance
    - splunk
    - snowflake
    - power-bi
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Generate compliance report: run Splunk search, export to Snowflake, refresh Power BI, and email report."
          inputParameters:
            - name: search_name
              in: body
              type: string
              description: "Splunk saved search name for compliance."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: recipient_email
              in: body
              type: string
              description: "Compliance officer email."
          steps:
            - name: run-search
              type: call
              call: "splunk.run-saved-search"
              with:
                search_name: "{{search_name}}"
            - name: export-data
              type: call
              call: "snowflake.run-query"
              with:
                statement: "INSERT INTO compliance_reports (search_name, result_count, run_date) VALUES ('{{search_name}}', '{{run-search.result_count}}', CURRENT_TIMESTAMP())"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "{{dataset_id}}"
            - name: send-report
              type: call
              call: "msgraph.send-mail"
              with:
                to: "{{recipient_email}}"
                subject: "Compliance Report: {{search_name}}"
                body: "Compliance search complete. Results: {{run-search.result_count}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.rtx.com:8089/servicesNS/admin/search"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: saved-searches
          path: "/saved/searches/{{search_name}}/dispatch"
          inputParameters:
            - name: search_name
              in: path
          operations:
            - name: run-saved-search
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - 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"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves the latest results from a Splunk saved search by name, for security event review and compliance reporting.

naftiko: "0.5"
info:
  label: "Splunk Saved Search Results Lookup"
  description: "Retrieves the latest results from a Splunk saved search by name, for security event review and compliance reporting."
  tags:
    - security
    - splunk
    - siem
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: siem
      port: 8080
      tools:
        - name: get-saved-search-results
          description: "Retrieve latest results from a Splunk saved search by name. Returns event count and result summary."
          inputParameters:
            - name: search_name
              in: body
              type: string
              description: "The Splunk saved search name."
          call: "splunk.get-saved-search"
          with:
            search_name: "{{search_name}}"
          outputParameters:
            - name: result_count
              type: integer
              mapping: "$.entry[0].content.resultCount"
            - name: last_run
              type: string
              mapping: "$.entry[0].content.dispatch.latestTime"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.rtx.com:8089/servicesNS/admin/search"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: saved-searches
          path: "/saved/searches/{{search_name}}/history"
          inputParameters:
            - name: search_name
              in: path
          operations:
            - name: get-saved-search
              method: GET

When Splunk detects a suspicious event, queries CrowdStrike for the affected endpoint, isolates the device, and creates a ServiceNow security incident.

naftiko: "0.5"
info:
  label: "Splunk SIEM Alert to CrowdStrike Isolation"
  description: "When Splunk detects a suspicious event, queries CrowdStrike for the affected endpoint, isolates the device, and creates a ServiceNow security incident."
  tags:
    - security
    - splunk
    - crowdstrike
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: security-response
      port: 8080
      tools:
        - name: isolate-compromised-endpoint
          description: "Respond to a Splunk SIEM alert by identifying the affected endpoint in CrowdStrike, isolating it, and logging a security incident in ServiceNow."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "The hostname from the Splunk alert."
            - name: alert_name
              in: body
              type: string
              description: "The Splunk alert name."
          steps:
            - name: find-device
              type: call
              call: "crowdstrike.find-device"
              with:
                hostname: "{{hostname}}"
            - name: isolate-device
              type: call
              call: "crowdstrike.isolate-host"
              with:
                device_id: "{{find-device.device_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security isolation: {{hostname}} - {{alert_name}}"
                priority: "1"
                category: "security_incident"
                device_id: "{{find-device.device_id}}"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: device-search
          path: "/devices/queries/devices/v1?filter=hostname:'{{hostname}}'"
          inputParameters:
            - name: hostname
              in: query
          operations:
            - name: find-device
              method: GET
        - name: host-actions
          path: "/devices/entities/devices-actions/v2?action_name=contain"
          operations:
            - name: isolate-host
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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

Checks Terraform workspace for configuration drift, creates a ServiceNow change request if drift is found, and triggers a plan run to remediate.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection and Remediation"
  description: "Checks Terraform workspace for configuration drift, creates a ServiceNow change request if drift is found, and triggers a plan run to remediate."
  tags:
    - devops
    - terraform
    - servicenow
    - infrastructure
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: detect-and-remediate-drift
          description: "Detect Terraform drift, create change request, and trigger remediation plan."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name."
          steps:
            - name: check-workspace
              type: call
              call: "terraform.get-workspace"
              with:
                workspace: "{{workspace_name}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Terraform drift detected: {{workspace_name}}"
                category: "infrastructure"
                risk: "moderate"
            - name: trigger-plan
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "{{workspace_name}}"
                message: "Drift remediation - CR {{create-change.number}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/rtx/workspaces/{{workspace}}"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: get-workspace
              method: GET
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: trigger-run
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves the current status of a Terraform Cloud workspace, returning last run state, resource count, and drift detection status.

naftiko: "0.5"
info:
  label: "Terraform Workspace Status Lookup"
  description: "Retrieves the current status of a Terraform Cloud workspace, returning last run state, resource count, and drift detection status."
  tags:
    - devops
    - terraform
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: get-workspace-status
          description: "Look up a Terraform Cloud workspace by name. Returns last run status, resource count, and current state version."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "The Terraform Cloud workspace name."
          call: "terraform.get-workspace"
          with:
            workspace: "{{workspace_name}}"
          outputParameters:
            - name: last_run_status
              type: string
              mapping: "$.data.attributes.latest-run.status"
            - name: resource_count
              type: integer
              mapping: "$.data.attributes.resource-count"
            - name: locked
              type: boolean
              mapping: "$.data.attributes.locked"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/rtx/workspaces/{{workspace}}"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: get-workspace
              method: GET

Runs a defense vendor compliance check by pulling vendor data from SAP Ariba, querying Snowflake for contract history, and creating a ServiceNow audit task with findings.

naftiko: "0.5"
info:
  label: "Vendor Compliance Audit Orchestrator"
  description: "Runs a defense vendor compliance check by pulling vendor data from SAP Ariba, querying Snowflake for contract history, and creating a ServiceNow audit task with findings."
  tags:
    - procurement
    - compliance
    - sap-ariba
    - snowflake
    - servicenow
    - defense
capability:
  exposes:
    - type: mcp
      namespace: vendor-compliance
      port: 8080
      tools:
        - name: audit-vendor-compliance
          description: "Run a vendor compliance audit. Pulls Ariba vendor profile, Snowflake contract history, and creates ServiceNow audit record."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP Ariba vendor ID."
            - name: contract_id
              in: body
              type: string
              description: "The contract ID to audit."
          steps:
            - name: get-vendor
              type: call
              call: "ariba.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: get-contract-history
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT * FROM vendor_contracts WHERE vendor_id = '{{vendor_id}}' AND contract_id = '{{contract_id}}'"
            - name: create-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_vendor_audit"
                vendor_name: "{{get-vendor.company_name}}"
                contract_id: "{{contract_id}}"
                status: "pending_review"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

When a critical vulnerability is detected by CrowdStrike, creates a ServiceNow change request, triggers a Terraform patch deployment, and validates with Datadog health checks.

naftiko: "0.5"
info:
  label: "Vulnerability Patch Deployment Orchestrator"
  description: "When a critical vulnerability is detected by CrowdStrike, creates a ServiceNow change request, triggers a Terraform patch deployment, and validates with Datadog health checks."
  tags:
    - security
    - crowdstrike
    - servicenow
    - terraform
    - datadog
    - patching
capability:
  exposes:
    - type: mcp
      namespace: vulnerability-mgmt
      port: 8080
      tools:
        - name: deploy-vulnerability-patch
          description: "Orchestrate vulnerability patch deployment. Creates change request, triggers Terraform apply, and validates service health post-deployment."
          inputParameters:
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier for the vulnerability."
            - name: affected_workspace
              in: body
              type: string
              description: "Terraform workspace for the affected system."
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID for post-patch validation."
          steps:
            - name: get-threat-detail
              type: call
              call: "crowdstrike.get-vulnerability"
              with:
                cve_id: "{{cve_id}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Emergency patch for {{cve_id}}: {{get-threat-detail.description}}"
                category: "security_patch"
                risk: "{{get-threat-detail.severity}}"
            - name: trigger-deploy
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "{{affected_workspace}}"
                message: "Patch for {{cve_id}} - CR {{create-change.number}}"
            - name: validate-health
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: vulnerabilities
          path: "/spotlight/entities/vulnerabilities/v2?ids={{cve_id}}"
          inputParameters:
            - name: cve_id
              in: query
          operations:
            - name: get-vulnerability
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: trigger-run
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Verifies employee benefits enrollment in Workday, checks payroll deductions in SAP, and sends confirmation to the employee via Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Verification"
  description: "Verifies employee benefits enrollment in Workday, checks payroll deductions in SAP, and sends confirmation to the employee via Teams."
  tags:
    - hr
    - workday
    - sap
    - microsoft-teams
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: verify-benefits-enrollment
          description: "Verify benefits enrollment: check Workday enrollment, confirm SAP deductions, and send confirmation."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
          steps:
            - name: get-enrollment
              type: call
              call: "workday.get-benefits"
              with:
                worker_id: "{{employee_id}}"
            - name: check-deductions
              type: call
              call: "sap.get-payroll-deductions"
              with:
                employee_id: "{{employee_id}}"
            - name: send-confirmation
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-enrollment.work_email}}"
                message: "Benefits enrollment verified for {{get-enrollment.full_name}}. Plan: {{get-enrollment.plan_name}}. Monthly deduction: {{check-deductions.amount}}"
  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: "/rtx/workers/{{worker_id}}/benefits"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-benefits
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_PAYROLL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deductions
          path: "/A_PayrollDeduction?$filter=EmployeeID eq '{{employee_id}}'"
          inputParameters:
            - name: employee_id
              in: query
          operations:
            - name: get-payroll-deductions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Processes a compensation change request by retrieving employee data from Workday, checking budget availability in SAP, and sending approval notification via Teams.

naftiko: "0.5"
info:
  label: "Workday Compensation Change Approval Workflow"
  description: "Processes a compensation change request by retrieving employee data from Workday, checking budget availability in SAP, and sending approval notification via Teams."
  tags:
    - hr
    - workday
    - sap
    - microsoft-teams
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: process-comp-change
          description: "Process a compensation change: retrieve employee details, check cost center budget, and notify approver via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: new_amount
              in: body
              type: string
              description: "Proposed new compensation amount."
            - name: approver_email
              in: body
              type: string
              description: "Manager email for approval notification."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: check-budget
              type: call
              call: "sap.get-budget"
              with:
                cost_center: "{{get-employee.cost_center}}"
                fiscal_year: "2026"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{approver_email}}"
                message: "Compensation change request for {{get-employee.full_name}}: New amount {{new_amount}}. Budget remaining: {{check-budget.remaining}}."
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://rtx-s4.sap.com/sap/opu/odata/sap/API_CSTCTRBUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-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: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an employee record from Workday by worker ID, returning name, department, manager, and job title.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Retrieves an employee record from Workday by worker ID, returning name, department, manager, and job title."
  tags:
    - hr
    - workday
    - directory
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up a Workday employee by worker ID. Returns full name, department, manager, job title, and cost center."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.descriptor"
            - name: department
              type: string
              mapping: "$.worker.primaryPosition.department"
            - name: manager
              type: string
              mapping: "$.worker.primaryPosition.manager.descriptor"
            - name: job_title
              type: string
              mapping: "$.worker.primaryPosition.jobTitle"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Pulls current headcount from Workday, forecasts from Snowflake, generates a Power BI report refresh, and sends the dashboard link via Teams.

naftiko: "0.5"
info:
  label: "Workday Headcount Forecast Report Generator"
  description: "Pulls current headcount from Workday, forecasts from Snowflake, generates a Power BI report refresh, and sends the dashboard link via Teams."
  tags:
    - hr
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-analytics
      port: 8080
      tools:
        - name: generate-headcount-forecast
          description: "Generate headcount forecast: pull Workday data, query Snowflake, refresh Power BI, and notify leadership."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department for the forecast."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for headcount dashboard."
          steps:
            - name: get-headcount
              type: call
              call: "snowflake.run-query"
              with:
                statement: "SELECT department, count(*) as headcount, sum(CASE WHEN hire_date > DATEADD(month, -3, CURRENT_DATE()) THEN 1 ELSE 0 END) as new_hires FROM workday_employees WHERE department = '{{department}}' GROUP BY department"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel: "hr-leadership"
                message: "Headcount forecast for {{department}}: Current headcount {{get-headcount.headcount}}, New hires (90 days): {{get-headcount.new_hires}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://rtx.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - 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"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/rtx-hr/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Assigns mandatory training in Workday Learning based on role changes, tracks completion in ServiceNow, and sends reminders via Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Assignment Orchestrator"
  description: "Assigns mandatory training in Workday Learning based on role changes, tracks completion in ServiceNow, and sends reminders via Teams."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - training
capability:
  exposes:
    - type: mcp
      namespace: hr-learning
      port: 8080
      tools:
        - name: assign-mandatory-training
          description: "Assign mandatory training based on role change and set up tracking and reminders."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: course_id
              in: body
              type: string
              description: "Workday Learning course ID."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: assign-course
              type: call
              call: "workday.assign-learning"
              with:
                worker_id: "{{employee_id}}"
                course_id: "{{course_id}}"
            - name: create-tracking
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_training_tracker"
                employee: "{{get-employee.full_name}}"
                course: "{{course_id}}"
                status: "assigned"
            - name: send-reminder
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-employee.work_email}}"
                message: "Mandatory training assigned: {{course_id}}. Please complete within 30 days. Tracking: {{create-tracking.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
        - name: learning
          path: "/rtx/learning/assignments"
          operations:
            - name: assign-learning
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an employee's current leave balances and pending absence requests from Workday for HR business partners and program managers.

naftiko: "0.5"
info:
  label: "Workday Leave Balance Lookup"
  description: "Retrieves an employee's current leave balances and pending absence requests from Workday for HR business partners and program managers."
  tags:
    - hr
    - workday
    - leave-management
capability:
  exposes:
    - type: mcp
      namespace: hr-leave
      port: 8080
      tools:
        - name: get-leave-balance
          description: "Given a Workday employee ID, return current PTO, sick leave, and military leave balances along with any pending absence requests."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-leave-balance"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: pto_balance
              type: number
              mapping: "$.data.timeOffBalances.ptoBalance"
            - name: sick_balance
              type: number
              mapping: "$.data.timeOffBalances.sickBalance"
            - name: military_leave_balance
              type: number
              mapping: "$.data.timeOffBalances.militaryLeaveBalance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: leave-balances
          path: "/rtx/workers/{{worker_id}}/timeOffBalances"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-leave-balance
              method: GET

When an organizational change is detected in Workday, updates Okta group memberships, adjusts Azure AD attributes, and logs the change in ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Org Change to Okta Group Sync"
  description: "When an organizational change is detected in Workday, updates Okta group memberships, adjusts Azure AD attributes, and logs the change in ServiceNow."
  tags:
    - hr
    - identity
    - workday
    - okta
    - azure
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-identity
      port: 8080
      tools:
        - name: sync-org-change
          description: "Sync organizational changes from Workday to Okta groups, Azure AD, and ServiceNow."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: new_department
              in: body
              type: string
              description: "New department name."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-okta
              type: call
              call: "okta.update-user-profile"
              with:
                user_id: "{{get-employee.work_email}}"
                department: "{{new_department}}"
            - name: update-ad
              type: call
              call: "msgraph.update-user"
              with:
                upn: "{{get-employee.work_email}}"
                department: "{{new_department}}"
            - name: log-change
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_org_change_log"
                employee: "{{get-employee.full_name}}"
                old_department: "{{get-employee.department}}"
                new_department: "{{new_department}}"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-profile
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Initiates the annual performance review cycle in Workday for all active employees and sends kick-off notifications to managers in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launcher"
  description: "Initiates the annual performance review cycle in Workday for all active employees and sends kick-off notifications to managers in Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review cycle name and deadline, initiate the Workday performance review process for all active employees and notify people managers in Teams."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "The performance review cycle name (e.g., 2025 Annual Review)."
            - name: deadline
              in: body
              type: string
              description: "Review completion deadline in YYYY-MM-DD format."
          steps:
            - name: create-cycle
              type: call
              call: "workday.create-review-cycle"
              with:
                name: "{{cycle_name}}"
                deadline: "{{deadline}}"
            - name: notify-managers
              type: call
              call: "msteams.broadcast-kickoff"
              with:
                channel_id: "people-managers"
                message: "Performance review cycle '{{cycle_name}}' is now open. Deadline: {{deadline}}. Workday cycle ID: {{create-cycle.cycle_id}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/rtx/performanceReviews"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: broadcast-kickoff
              method: POST

When an employee's role changes in Workday affecting clearance requirements, updates Okta group memberships, adjusts Salesforce profile, and notifies the security team in Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change and Clearance Update"
  description: "When an employee's role changes in Workday affecting clearance requirements, updates Okta group memberships, adjusts Salesforce profile, and notifies the security team in Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - salesforce
    - microsoft-teams
    - defense
capability:
  exposes:
    - type: mcp
      namespace: role-change-clearance
      port: 8080
      tools:
        - name: propagate-clearance-role-change
          description: "Given a Workday employee ID and new role with clearance level, update Okta groups, revise Salesforce profile, and send a Teams notification to the security officer."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee."
            - name: new_role
              in: body
              type: string
              description: "The new job title or role name."
            - name: clearance_level
              in: body
              type: string
              description: "New clearance level: UNCLASSIFIED, SECRET, or TOP_SECRET."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-salesforce
              type: call
              call: "salesforce.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                title: "{{new_role}}"
            - name: notify-security
              type: call
              call: "msteams.post-clearance-notice"
              with:
                channel_id: "security-officer"
                message: "{{get-employee.full_name}} role changed to {{new_role}} with clearance {{clearance_level}}. Okta groups updated."
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://rtx.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: post-clearance-notice
              method: POST

When an employee is terminated in Workday, disables their Azure AD account, suspends Okta sessions, and creates a ServiceNow task for asset recovery.

naftiko: "0.5"
info:
  label: "Workday Termination to Access Revocation"
  description: "When an employee is terminated in Workday, disables their Azure AD account, suspends Okta sessions, and creates a ServiceNow task for asset recovery."
  tags:
    - hr
    - security
    - workday
    - azure
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: revoke-terminated-access
          description: "Revoke all system access for a terminated employee. Disables Azure AD, clears Okta sessions, and opens asset recovery ticket."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of terminated employee."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: disable-ad-account
              type: call
              call: "msgraph.disable-user"
              with:
                upn: "{{get-employee.work_email}}"
            - name: clear-okta-sessions
              type: call
              call: "okta.clear-user-sessions"
              with:
                user_id: "{{get-employee.work_email}}"
            - name: create-recovery-task
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Asset recovery: {{get-employee.full_name}}"
                category: "asset_recovery"
                assigned_to: "IT_Asset_Team"
  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: "/rtx/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://rtx.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: clear-user-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://rtx.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