Lockheed Martin Capabilities

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

Sort
Expand

Retrieves payroll processing status from ADP for a given pay period, returning completion status and error count for DCAA-compliant payroll verification.

naftiko: "0.5"
info:
  label: "ADP Payroll Status Lookup"
  description: "Retrieves payroll processing status from ADP for a given pay period, returning completion status and error count for DCAA-compliant payroll verification."
  tags:
    - payroll
    - adp
    - compliance
    - dcaa
    - finance
capability:
  exposes:
    - type: mcp
      namespace: payroll
      port: 8080
      tools:
        - name: get-payroll-status
          description: "Given a pay period date, return the payroll processing status, record count, and error count. Use for DCAA payroll compliance and audit preparation."
          inputParameters:
            - name: pay_period_date
              in: body
              type: string
              description: "The pay period end date in YYYY-MM-DD format."
          call: adp.get-payroll-status
          with:
            pay_period_date: "{{pay_period_date}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.payrollStatus"
            - name: record_count
              type: integer
              mapping: "$.totalRecords"
            - name: error_count
              type: integer
              mapping: "$.errorCount"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll-outputs?payPeriodEndDate={{pay_period_date}}"
          inputParameters:
            - name: pay_period_date
              in: path
          operations:
            - name: get-payroll-status
              method: GET

Uses Anthropic Claude to analyze program risk registers retrieved from SharePoint and generates a concise risk summary for program managers, highlighting top risks and recommended mitigations.

naftiko: "0.5"
info:
  label: "AI-Assisted Program Risk Assessment Summarization"
  description: "Uses Anthropic Claude to analyze program risk registers retrieved from SharePoint and generates a concise risk summary for program managers, highlighting top risks and recommended mitigations."
  tags:
    - ai
    - program-management
    - anthropic
    - sharepoint
    - risk-management
capability:
  exposes:
    - type: mcp
      namespace: ai-risk
      port: 8080
      tools:
        - name: summarize-program-risks
          description: "Given a SharePoint document URL for a program risk register, retrieve the document, send to Anthropic Claude for structured risk analysis (top risks, likelihood, impact, mitigations), and write the summary back to SharePoint. Use for quarterly program risk reviews and IPR preparation."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID for the program documentation."
            - name: document_path
              in: body
              type: string
              description: "Relative path to the risk register document in SharePoint."
          steps:
            - name: get-risk-register
              type: call
              call: sharepoint.get-document
              with:
                site_id: "{{site_id}}"
                path: "{{document_path}}"
            - name: analyze-risks
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                content: "Analyze this defense program risk register. Identify the top 5 risks by severity, assess likelihood and impact for each, and recommend specific mitigations. Format as a structured executive summary. Document: {{get-risk-register.content}}"
            - name: write-summary
              type: call
              call: sharepoint.create-file
              with:
                site_id: "{{site_id}}"
                filename: "risk-summary.md"
                content: "{{analyze-risks.text}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-document
              method: GET
            - name: create-file
              method: PUT
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST

Manages data lifecycle for classified S3 buckets in GovCloud, applies retention policies, audits access logs, creates a ServiceNow compliance ticket, and notifies the data governance team via Teams.

naftiko: "0.5"
info:
  label: "Amazon S3 Classified Data Lifecycle Manager"
  description: "Manages data lifecycle for classified S3 buckets in GovCloud, applies retention policies, audits access logs, creates a ServiceNow compliance ticket, and notifies the data governance team via Teams."
  tags:
    - cloud
    - amazon-web-services
    - servicenow
    - microsoft-teams
    - data-governance
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: trigger-s3-lifecycle
          description: "Given an S3 bucket name in GovCloud, audit access logs, apply retention policies, create a ServiceNow compliance ticket, and notify the data governance team."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The S3 bucket name in GovCloud."
          steps:
            - name: get-bucket-info
              type: call
              call: aws.get-bucket-info
              with:
                bucket_name: "{{bucket_name}}"
            - name: create-compliance-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "S3 lifecycle audit: {{bucket_name}}"
                category: "data_governance"
            - name: notify-governance
              type: call
              call: msteams.post-message
              with:
                channel_id: "data-governance"
                text: "S3 lifecycle audit: {{bucket_name}}. Objects: {{get-bucket-info.object_count}}. Ticket: {{create-compliance-ticket.number}}."
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://s3.us-gov-west-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_govcloud_token"
      resources:
        - name: buckets
          path: "/{{bucket_name}}?list-type=2"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-bucket-info
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When an Apache Airflow DAG fails, retrieves task failure details, creates a Jira bug for the data engineering team, retries the failed task, and notifies the team via Teams.

naftiko: "0.5"
info:
  label: "Apache Airflow ETL Failure Remediation"
  description: "When an Apache Airflow DAG fails, retrieves task failure details, creates a Jira bug for the data engineering team, retries the failed task, and notifies the team via Teams."
  tags:
    - data-engineering
    - apache-airflow
    - jira
    - microsoft-teams
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: trigger-dag-failure-remediation
          description: "Given an Airflow DAG ID and failed task ID, retrieve failure logs, create a Jira bug, retry the task, and notify the data engineering team."
          inputParameters:
            - name: dag_id
              in: body
              type: string
              description: "The Apache Airflow DAG ID."
            - name: task_id
              in: body
              type: string
              description: "The failed task ID within the DAG."
            - name: run_id
              in: body
              type: string
              description: "The DAG run ID."
          steps:
            - name: get-task-log
              type: call
              call: airflow.get-task-log
              with:
                dag_id: "{{dag_id}}"
                task_id: "{{task_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: "DATA"
                summary: "Airflow DAG failure: {{dag_id}}/{{task_id}}"
            - name: retry-task
              type: call
              call: airflow.retry-task
              with:
                dag_id: "{{dag_id}}"
                task_id: "{{task_id}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "data-engineering"
                text: "DAG {{dag_id}} task {{task_id}} failed. Retrying. Jira: {{create-bug.key}}."
  consumes:
    - type: http
      namespace: airflow
      baseUri: "https://airflow.lockheedmartin.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.airflow_token"
      resources:
        - name: task-logs
          path: "/dags/{{dag_id}}/dagRuns/{{run_id}}/taskInstances/{{task_id}}/logs"
          inputParameters:
            - name: dag_id
              in: path
            - name: run_id
              in: path
            - name: task_id
              in: path
          operations:
            - name: get-task-log
              method: GET
        - name: task-instances
          path: "/dags/{{dag_id}}/dagRuns/{{run_id}}/taskInstances/{{task_id}}"
          inputParameters:
            - name: dag_id
              in: path
            - name: run_id
              in: path
            - name: task_id
              in: path
          operations:
            - name: retry-task
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a non-compliant sign-in is detected in Azure AD, retrieves sign-in details, blocks the session, creates a ServiceNow security incident, and alerts the IAM team via Teams.

naftiko: "0.5"
info:
  label: "Azure AD Conditional Access Policy Enforcer"
  description: "When a non-compliant sign-in is detected in Azure AD, retrieves sign-in details, blocks the session, creates a ServiceNow security incident, and alerts the IAM team via Teams."
  tags:
    - identity
    - azure-active-directory
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: trigger-access-enforcement
          description: "Given an Azure AD sign-in event ID flagged as non-compliant, retrieve details, revoke sessions, create a ServiceNow security incident, and alert IAM."
          inputParameters:
            - name: sign_in_id
              in: body
              type: string
              description: "The Azure AD sign-in event ID."
            - name: user_upn
              in: body
              type: string
              description: "The user principal name of the affected user."
          steps:
            - name: get-signin
              type: call
              call: azuread.get-signin
              with:
                sign_in_id: "{{sign_in_id}}"
            - name: block-session
              type: call
              call: azuread.revoke-sessions
              with:
                user_upn: "{{user_upn}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Non-compliant sign-in: {{user_upn}} from {{get-signin.location}}"
                category: "security"
            - name: alert-iam
              type: call
              call: msteams.post-message
              with:
                channel_id: "iam-security"
                text: "Non-compliant sign-in blocked for {{user_upn}}. Location: {{get-signin.location}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sign-ins
          path: "/auditLogs/signIns/{{sign_in_id}}"
          inputParameters:
            - name: sign_in_id
              in: path
          operations:
            - name: get-signin
              method: GET
        - name: users
          path: "/users/{{user_upn}}/revokeSignInSessions"
          inputParameters:
            - name: user_upn
              in: path
          operations:
            - name: revoke-sessions
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Monitors Azure Data Factory pipeline runs for program data integrations, detects failures, creates a Jira incident, and notifies the data platform team via Teams.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Monitoring Orchestrator"
  description: "Monitors Azure Data Factory pipeline runs for program data integrations, detects failures, creates a Jira incident, and notifies the data platform team via Teams."
  tags:
    - data-engineering
    - azure-data-factory
    - jira
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: trigger-adf-monitoring
          description: "Given an Azure Data Factory name and pipeline name, check recent run status, create a Jira incident on failure, and notify the data platform team."
          inputParameters:
            - name: factory_name
              in: body
              type: string
              description: "The Azure Data Factory name."
            - name: pipeline_name
              in: body
              type: string
              description: "The pipeline name to monitor."
          steps:
            - name: get-pipeline-runs
              type: call
              call: adf.get-pipeline-runs
              with:
                factory_name: "{{factory_name}}"
                pipeline_name: "{{pipeline_name}}"
            - name: create-incident
              type: call
              call: jira.create-issue
              with:
                project: "DATAOPS"
                summary: "ADF pipeline failure: {{factory_name}}/{{pipeline_name}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "data-platform"
                text: "ADF pipeline {{pipeline_name}} status: {{get-pipeline-runs.status}}. Duration: {{get-pipeline-runs.duration}}. Jira: {{create-incident.key}}."
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: pipeline-runs
          path: "/subscriptions/{{sub_id}}/resourceGroups/{{rg}}/providers/Microsoft.DataFactory/factories/{{factory_name}}/pipelineruns"
          inputParameters:
            - name: factory_name
              in: path
          operations:
            - name: get-pipeline-runs
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the latest build status for an Azure DevOps pipeline, returning build result, duration, and triggered-by information for CI/CD monitoring on defense software projects.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Lookup"
  description: "Checks the latest build status for an Azure DevOps pipeline, returning build result, duration, and triggered-by information for CI/CD monitoring on defense software projects."
  tags:
    - devops
    - azure-devops
    - cicd
    - defense
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-build-status
          description: "Given an Azure DevOps project name and build definition ID, return the latest build status, result, start time, and duration. Use for CI/CD pipeline monitoring."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: definition_id
              in: body
              type: string
              description: "The build definition ID."
          call: azuredevops.get-build
          with:
            project: "{{project}}"
            definition_id: "{{definition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/lockheedmartin"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?definitions={{definition_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: definition_id
              in: path
          operations:
            - name: get-build
              method: GET

Monitors Azure Government Cloud subscriptions for cost anomalies, creates a ServiceNow ticket, and posts an alert to the cloud operations Teams channel.

naftiko: "0.5"
info:
  label: "Azure Government Cloud Cost Anomaly Alert"
  description: "Monitors Azure Government Cloud subscriptions for cost anomalies, creates a ServiceNow ticket, and posts an alert to the cloud operations Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - servicenow
    - microsoft-teams
    - government-cloud
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-gov-cloud-cost-anomaly
          description: "Given an Azure Government subscription ID and period, retrieve cost anomalies from Azure Cost Management, open a ServiceNow ticket, and alert the cloud operations Teams channel. Use for government cloud FinOps governance."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure Government Cloud subscription ID."
            - name: period_days
              in: body
              type: integer
              description: "Number of days to analyze for anomalies."
          steps:
            - name: get-anomalies
              type: call
              call: azure-gov.get-cost-anomalies
              with:
                subscription_id: "{{subscription_id}}"
                period_days: "{{period_days}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure Gov cost anomaly in subscription {{subscription_id}}"
                category: "cloud_cost"
                priority: "3"
            - name: post-alert
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_cloud_ops_channel_id"
                text: "Azure Gov Cost Anomaly: {{subscription_id}} | SNOW: {{create-ticket.number}} | Period: {{period_days}} days"
  consumes:
    - type: http
      namespace: azure-gov
      baseUri: "https://management.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: cost-anomalies
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/anomalies"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-anomalies
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up Azure Government resource tags by subscription and resource group to verify program allocation and cost center tagging for defense contracts.

naftiko: "0.5"
info:
  label: "Azure Government Resource Tag Lookup"
  description: "Looks up Azure Government resource tags by subscription and resource group to verify program allocation and cost center tagging for defense contracts."
  tags:
    - cloud
    - governance
    - azure
    - defense
    - tagging
capability:
  exposes:
    - type: mcp
      namespace: cloud-governance
      port: 8080
      tools:
        - name: get-resource-tags
          description: "Given an Azure subscription ID and resource group name, return all resource tags including cost center, program code, and classification level."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure Government subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Name of the Azure resource group."
          call: azure.get-resource-tags
          with:
            subscription_id: "{{subscription_id}}"
            resource_group: "{{resource_group}}"
          outputParameters:
            - name: tags
              type: object
              mapping: "$.tags"
            - name: location
              type: string
              mapping: "$.location"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: resource-groups
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-resource-tags
              method: GET

Rotates expiring secrets in Azure Key Vault, updates dependent application configurations in Azure DevOps, creates a ServiceNow change record, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Rotation Orchestrator"
  description: "Rotates expiring secrets in Azure Key Vault, updates dependent application configurations in Azure DevOps, creates a ServiceNow change record, and notifies the security team via Teams."
  tags:
    - security
    - azure
    - azure-devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: trigger-secret-rotation
          description: "Given an Azure Key Vault name and secret name nearing expiration, rotate the secret, update Azure DevOps variables, log a ServiceNow change, and notify security."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "The Azure Key Vault name."
            - name: secret_name
              in: body
              type: string
              description: "The secret name to rotate."
          steps:
            - name: rotate-secret
              type: call
              call: azure.rotate-secret
              with:
                vault_name: "{{vault_name}}"
                secret_name: "{{secret_name}}"
            - name: update-pipeline-vars
              type: call
              call: azuredevops.update-variable
              with:
                variable_group: "{{vault_name}}-secrets"
                variable_name: "{{secret_name}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Secret rotation: {{vault_name}}/{{secret_name}}"
                category: "security"
            - name: notify-security
              type: call
              call: msteams.post-message
              with:
                channel_id: "security-ops"
                text: "Secret rotated: {{vault_name}}/{{secret_name}}. Change: {{create-change.number}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://{{vault_name}}.vault.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: rotate-secret
              method: POST
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/lockheedmartin"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: variable-groups
          path: "/_apis/distributedtask/variablegroups"
          operations:
            - name: update-variable
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a document is uploaded to Box, classifies it based on content, applies retention policies, logs the classification in ServiceNow, and notifies the records management team via Teams.

naftiko: "0.5"
info:
  label: "Box Document Classification and Retention"
  description: "When a document is uploaded to Box, classifies it based on content, applies retention policies, logs the classification in ServiceNow, and notifies the records management team via Teams."
  tags:
    - document-management
    - box
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: document-management
      port: 8080
      tools:
        - name: trigger-doc-classification
          description: "Given a Box file ID, classify the document, apply retention policy, log in ServiceNow, and notify records management."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
          steps:
            - name: get-file
              type: call
              call: box.get-file
              with:
                file_id: "{{file_id}}"
            - name: apply-classification
              type: call
              call: box.apply-classification
              with:
                file_id: "{{file_id}}"
                classification: "defense_controlled"
            - name: log-classification
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Document classified: {{get-file.name}}"
                category: "records_management"
            - name: notify-records
              type: call
              call: msteams.post-message
              with:
                channel_id: "records-management"
                text: "Document {{get-file.name}} classified. Ticket: {{log-classification.number}}."
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET
            - name: apply-classification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks Cisco network device configurations against STIG compliance baselines, logs findings in ServiceNow, updates the compliance dashboard in Power BI, and notifies the network team via Teams.

naftiko: "0.5"
info:
  label: "Cisco Network Device Compliance Checker"
  description: "Checks Cisco network device configurations against STIG compliance baselines, logs findings in ServiceNow, updates the compliance dashboard in Power BI, and notifies the network team via Teams."
  tags:
    - network-security
    - cisco
    - servicenow
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: trigger-compliance-check
          description: "Given a Cisco device hostname, check STIG compliance, log findings in ServiceNow, refresh the Power BI compliance dashboard, and notify the network security team."
          inputParameters:
            - name: device_hostname
              in: body
              type: string
              description: "The Cisco device hostname."
            - name: stig_baseline
              in: body
              type: string
              description: "The STIG baseline version to check against."
          steps:
            - name: get-config
              type: call
              call: cisco.get-device-config
              with:
                hostname: "{{device_hostname}}"
            - name: log-findings
              type: call
              call: servicenow.create-incident
              with:
                short_description: "STIG compliance check: {{device_hostname}}"
                category: "compliance"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "network-compliance"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "network-security"
                text: "STIG compliance check for {{device_hostname}} complete. Baseline: {{stig_baseline}}. Ticket: {{log-findings.number}}."
  consumes:
    - type: http
      namespace: cisco
      baseUri: "https://dnac.lockheedmartin.com/dna/intent/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cisco_token"
      resources:
        - name: devices
          path: "/network-device?hostname={{hostname}}"
          inputParameters:
            - name: hostname
              in: path
          operations:
            - name: get-device-config
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a scheduled security scan completes on a classified network segment, retrieves scan results from Palo Alto, creates a ServiceNow security ticket, and posts findings to the Microsoft Teams SOC channel.

naftiko: "0.5"
info:
  label: "Classified Network Security Scan Orchestrator"
  description: "When a scheduled security scan completes on a classified network segment, retrieves scan results from Palo Alto, creates a ServiceNow security ticket, and posts findings to the Microsoft Teams SOC channel."
  tags:
    - security-operations
    - palo-alto-networks
    - servicenow
    - microsoft-teams
    - classified-networks
capability:
  exposes:
    - type: mcp
      namespace: security-operations
      port: 8080
      tools:
        - name: trigger-scan-review
          description: "Given a Palo Alto scan ID and network segment, orchestrate retrieval of scan findings, create a ServiceNow security incident, and notify the SOC team via Teams."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The Palo Alto security scan ID."
            - name: network_segment
              in: body
              type: string
              description: "The classified network segment identifier."
          steps:
            - name: get-scan-results
              type: call
              call: paloalto.get-scan
              with:
                scan_id: "{{scan_id}}"
            - name: create-security-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Security scan findings: {{network_segment}}"
                category: "security"
                urgency: "2"
            - name: notify-soc
              type: call
              call: msteams.post-message
              with:
                channel_id: "soc-alerts"
                text: "Scan {{scan_id}} on {{network_segment}} complete. Ticket: {{create-security-ticket.number}}. Findings: {{get-scan-results.finding_count}} issues."
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.lockheedmartin.com/restapi/v10.2"
      authentication:
        type: bearer
        token: "$secrets.paloalto_token"
      resources:
        - name: scans
          path: "/scans/{{scan_id}}"
          inputParameters:
            - name: scan_id
              in: path
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new cleared employee is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message with security briefing links.

naftiko: "0.5"
info:
  label: "Cleared Personnel Onboarding Orchestrator"
  description: "When a new cleared employee is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message with security briefing links."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
    - microsoft-365
    - security-clearance
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-cleared-onboarding
          description: "Given a Workday employee ID and start date for a cleared hire, orchestrate the full onboarding sequence: open a ServiceNow IT ticket, provision Microsoft 365, and send a Teams welcome message with mandatory security briefing links. Invoke when a new hire record is activated in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new cleared hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in YYYY-MM-DD format."
            - name: clearance_level
              in: body
              type: string
              description: "Security clearance level: SECRET, TOP_SECRET, or TS_SCI."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cleared hire onboarding: {{get-worker.full_name}} ({{clearance_level}})"
                category: "hr_onboarding"
                assigned_group: "IT_Security_Onboarding"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                userPrincipalName: "{{get-worker.work_email}}"
                mailNickname: "{{get-worker.preferred_name}}"
            - name: send-welcome
              type: call
              call: msteams.post-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Lockheed Martin, {{get-worker.first_name}}! IT ticket: {{create-snow-ticket.number}}. Complete mandatory security briefings before Day 1."
  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: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: post-message
              method: POST

Detects AWS CloudFormation stack drift for GovCloud workloads, creates a ServiceNow change to remediate, and alerts the cloud engineering team via Teams.

naftiko: "0.5"
info:
  label: "CloudFormation Stack Drift Detection Handler"
  description: "Detects AWS CloudFormation stack drift for GovCloud workloads, creates a ServiceNow change to remediate, and alerts the cloud engineering team via Teams."
  tags:
    - cloud
    - amazon-web-services
    - servicenow
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: trigger-drift-detection
          description: "Given an AWS CloudFormation stack name in GovCloud, detect drift, create a ServiceNow change for remediation, and notify the cloud engineering team."
          inputParameters:
            - name: stack_name
              in: body
              type: string
              description: "The CloudFormation stack name."
            - name: region
              in: body
              type: string
              description: "The AWS GovCloud region."
          steps:
            - name: detect-drift
              type: call
              call: aws.detect-stack-drift
              with:
                stack_name: "{{stack_name}}"
                region: "{{region}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "CloudFormation drift: {{stack_name}} in {{region}}"
                category: "cloud_infrastructure"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "cloud-engineering"
                text: "Stack drift detected: {{stack_name}} in {{region}}. Drifted resources: {{detect-drift.drifted_count}}. Change: {{create-change.number}}."
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://cloudformation.us-gov-west-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_govcloud_token"
      resources:
        - name: stacks
          path: "/?Action=DetectStackDrift&StackName={{stack_name}}"
          inputParameters:
            - name: stack_name
              in: path
          operations:
            - name: detect-stack-drift
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Aggregates Jira engineering review items, generates an Engineering Review Board agenda in Confluence, schedules the review meeting via Teams, and notifies board members.

naftiko: "0.5"
info:
  label: "Confluence Engineering Review Board Publisher"
  description: "Aggregates Jira engineering review items, generates an Engineering Review Board agenda in Confluence, schedules the review meeting via Teams, and notifies board members."
  tags:
    - engineering
    - jira
    - confluence
    - microsoft-teams
    - review-board
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: trigger-erb-meeting
          description: "Given a Jira filter ID for ERB items and a meeting date, aggregate review items, publish a Confluence agenda, and notify board members via Teams."
          inputParameters:
            - name: filter_id
              in: body
              type: string
              description: "The Jira filter ID for ERB review items."
            - name: meeting_date
              in: body
              type: string
              description: "Proposed meeting date in YYYY-MM-DD format."
          steps:
            - name: get-items
              type: call
              call: jira.get-filter-results
              with:
                filter_id: "{{filter_id}}"
            - name: create-agenda
              type: call
              call: confluence.create-page
              with:
                space_key: "ERB"
                title: "ERB Agenda - {{meeting_date}}"
                body: "Review items: {{get-items.total}}. See Jira filter for details."
            - name: notify-board
              type: call
              call: msteams.post-message
              with:
                channel_id: "erb-channel"
                text: "ERB meeting scheduled for {{meeting_date}}. {{get-items.total}} items to review. Agenda: {{create-agenda.url}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: filters
          path: "/filter/{{filter_id}}/search"
          inputParameters:
            - name: filter_id
              in: path
          operations:
            - name: get-filter-results
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Confluence wiki page by space key and title, returning page content used for program documentation, engineering standards, and technical procedures.

naftiko: "0.5"
info:
  label: "Confluence Program Wiki Page Lookup"
  description: "Retrieves a Confluence wiki page by space key and title, returning page content used for program documentation, engineering standards, and technical procedures."
  tags:
    - documentation
    - confluence
    - engineering
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: documentation
      port: 8080
      tools:
        - name: get-wiki-page
          description: "Given a Confluence space key and page title, return the page body content and last-modified metadata. Use for looking up program documentation and engineering procedures."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "The Confluence space key, e.g. AERO_ENG."
            - name: title
              in: body
              type: string
              description: "The page title to search for."
          call: confluence.get-page
          with:
            space_key: "{{space_key}}"
            title: "{{title}}"
          outputParameters:
            - name: page_id
              type: string
              mapping: "$.results[0].id"
            - name: body
              type: string
              mapping: "$.results[0].body.storage.value"
            - name: last_modified
              type: string
              mapping: "$.results[0].version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content?spaceKey={{space_key}}&title={{title}}"
          inputParameters:
            - name: space_key
              in: path
            - name: title
              in: path
          operations:
            - name: get-page
              method: GET

Queries Datadog logs by service name and time range, returning log entries for mission-critical system troubleshooting and security event investigation.

naftiko: "0.5"
info:
  label: "Datadog Log Query Lookup"
  description: "Queries Datadog logs by service name and time range, returning log entries for mission-critical system troubleshooting and security event investigation."
  tags:
    - observability
    - datadog
    - incident-management
    - security
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: query-logs
          description: "Given a Datadog log query string and time range, return matching log entries with timestamps, service, and message content. Use for incident investigation on mission-critical systems."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Datadog log query string, e.g. service:f35-avionics status:error."
            - name: from_ts
              in: body
              type: string
              description: "Start timestamp in ISO 8601 format."
            - name: to_ts
              in: body
              type: string
              description: "End timestamp in ISO 8601 format."
          call: datadog.query-logs
          with:
            query: "{{query}}"
            from: "{{from_ts}}"
            to: "{{to_ts}}"
          outputParameters:
            - name: logs
              type: array
              mapping: "$.data"
            - name: total_count
              type: integer
              mapping: "$.meta.page.total_count"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: logs
          path: "/logs/events/search"
          operations:
            - name: query-logs
              method: POST

On a Datadog critical alert for mission-critical Lockheed Martin systems (ERP, PLM, secure networks), creates a ServiceNow incident and alerts the security operations Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Mission-Critical System Monitoring Alert"
  description: "On a Datadog critical alert for mission-critical Lockheed Martin systems (ERP, PLM, secure networks), creates a ServiceNow incident and alerts the security operations Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - servicenow
    - microsoft-teams
    - security
capability:
  exposes:
    - type: mcp
      namespace: secops-monitoring
      port: 8080
      tools:
        - name: handle-critical-system-alert
          description: "Given a Datadog alert ID and system name, retrieve alert details, create a ServiceNow high-priority incident, and post to the security operations Teams channel. Use for monitoring ERP, classified system gateways, and production infrastructure."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog event or alert ID."
            - name: system_name
              in: body
              type: string
              description: "The name of the affected mission-critical system."
          steps:
            - name: get-event
              type: call
              call: datadog.get-event
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Critical system alert: {{system_name}}"
                category: "mission_critical"
                priority: "1"
            - name: alert-secops
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_secops_channel_id"
                text: "Critical Alert: {{system_name}} | Datadog: {{alert_id}} | SNOW: {{create-incident.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: events
          path: "/events/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When Datadog fires a critical alert for a mission system, retrieves alert details, creates a ServiceNow P1 incident, pages the on-call engineer, and posts to the incident Teams channel.

naftiko: "0.5"
info:
  label: "Datadog to ServiceNow Auto Incident Creator"
  description: "When Datadog fires a critical alert for a mission system, retrieves alert details, creates a ServiceNow P1 incident, pages the on-call engineer, and posts to the incident Teams channel."
  tags:
    - incident-management
    - datadog
    - servicenow
    - microsoft-teams
    - mission-systems
capability:
  exposes:
    - type: mcp
      namespace: incident-management
      port: 8080
      tools:
        - name: trigger-auto-incident
          description: "Given a Datadog alert ID for a critical mission system alert, create a ServiceNow P1 incident, page the on-call via Teams, and acknowledge the alert."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert ID."
            - name: service_name
              in: body
              type: string
              description: "The affected service name."
          steps:
            - name: get-alert
              type: call
              call: datadog.get-alert
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Critical: {{service_name}} - {{get-alert.title}}"
                impact: "1"
                urgency: "1"
            - name: page-oncall
              type: call
              call: msteams.post-message
              with:
                channel_id: "incident-response"
                text: "@oncall CRITICAL: {{service_name}} down. Alert: {{get-alert.title}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: alerts
          path: "/monitor/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a subcontractor invoice arrives in SAP Ariba, validates it against the associated SAP S/4HANA contract purchase order and routes discrepancies for program manager approval via Teams.

naftiko: "0.5"
info:
  label: "Defense Contract Invoice Validation"
  description: "When a subcontractor invoice arrives in SAP Ariba, validates it against the associated SAP S/4HANA contract purchase order and routes discrepancies for program manager approval via Teams."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - invoice
    - defense-contracts
capability:
  exposes:
    - type: mcp
      namespace: contract-finance
      port: 8080
      tools:
        - name: validate-subcontractor-invoice
          description: "Given an Ariba invoice ID and SAP PO number, retrieve invoice details from SAP Ariba, compare with the SAP contract PO, and notify the program manager via Teams if discrepancies exist. Use for defense subcontract invoice three-way match."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice ID."
            - name: po_number
              in: body
              type: string
              description: "The associated SAP contract purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: notify-pm
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_contracts_channel_id"
                text: "Invoice {{invoice_id}} discrepancy: Invoiced {{get-invoice.total_amount}} vs PO {{get-po.total_value}} on contract {{po_number}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: 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 service health status from Dynatrace for a monitored entity, returning health state, response time, and failure rate for mission-critical application monitoring.

naftiko: "0.5"
info:
  label: "Dynatrace Service Health Lookup"
  description: "Retrieves service health status from Dynatrace for a monitored entity, returning health state, response time, and failure rate for mission-critical application monitoring."
  tags:
    - observability
    - dynatrace
    - mission-systems
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Dynatrace entity ID for a service, return the current health state, response time, and failure rate. Use for real-time mission system health checks."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The Dynatrace monitored entity ID, e.g. SERVICE-ABC123."
          call: dynatrace.get-entity
          with:
            entity_id: "{{entity_id}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: health_state
              type: string
              mapping: "$.properties.healthState"
            - name: response_time
              type: number
              mapping: "$.properties.responseTime"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://lockheedmartin.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{entity_id}}"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-entity
              method: GET

When a Lockheed Martin employee separation is recorded in Workday, disables their Microsoft 365 account, revokes Okta sessions, suspends clearance access, and closes all ServiceNow tickets.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Clearance Suspension"
  description: "When a Lockheed Martin employee separation is recorded in Workday, disables their Microsoft 365 account, revokes Okta sessions, suspends clearance access, and closes all ServiceNow tickets."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - security-clearance
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID for a separating employee, disable Microsoft 365, revoke all Okta sessions, and close their ServiceNow tickets. Invoke immediately on confirmed separation events from Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the separating employee."
            - name: separation_date
              in: body
              type: string
              description: "The employee's last day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: disable-m365
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{get-worker.work_email}}"
            - name: revoke-okta
              type: call
              call: okta.clear-sessions
              with:
                login: "{{get-worker.work_email}}"
            - name: close-snow-tickets
              type: call
              call: servicenow.close-user-tickets
              with:
                assigned_to: "{{get-worker.work_email}}"
  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: "/lockheed-martin/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://lockheedmartin.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{login}}/sessions"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH

Performs health checks on F5 load balancer virtual servers, identifies degraded pools, creates a ServiceNow incident, and notifies the network team via Teams.

naftiko: "0.5"
info:
  label: "F5 Load Balancer Health Check Orchestrator"
  description: "Performs health checks on F5 load balancer virtual servers, identifies degraded pools, creates a ServiceNow incident, and notifies the network team via Teams."
  tags:
    - network-operations
    - f5-networks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-operations
      port: 8080
      tools:
        - name: trigger-lb-health-check
          description: "Given an F5 virtual server name, check pool member health, create a ServiceNow incident for degraded members, and notify the network team."
          inputParameters:
            - name: virtual_server
              in: body
              type: string
              description: "The F5 virtual server name."
          steps:
            - name: get-pool-status
              type: call
              call: f5.get-pool-members
              with:
                virtual_server: "{{virtual_server}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "F5 pool degradation: {{virtual_server}}"
                category: "network"
            - name: notify-netops
              type: call
              call: msteams.post-message
              with:
                channel_id: "network-ops"
                text: "F5 health check: {{virtual_server}}. Active: {{get-pool-status.active_count}}/{{get-pool-status.total_count}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: f5
      baseUri: "https://f5.lockheedmartin.com/mgmt/tm"
      authentication:
        type: basic
        username: "$secrets.f5_user"
        password: "$secrets.f5_password"
      resources:
        - name: pools
          path: "/ltm/virtual/{{virtual_server}}/pool/members"
          inputParameters:
            - name: virtual_server
              in: path
          operations:
            - name: get-pool-members
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Scans GitHub repositories for critical security vulnerabilities using GitHub Advanced Security, creates Jira security issues, and notifies the cybersecurity team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Advanced Security Vulnerability Triage"
  description: "Scans GitHub repositories for critical security vulnerabilities using GitHub Advanced Security, creates Jira security issues, and notifies the cybersecurity team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
    - cybersecurity
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: triage-code-vulnerabilities
          description: "Given a GitHub repository, retrieve critical and high-severity code scanning alerts from GitHub Advanced Security, create a Jira security issue, and alert the cybersecurity team in Teams. Use for weekly security posture reviews across defense software programs."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in owner/repo format, e.g. lockheed-martin/f35-avionics-sw."
            - name: program_code
              in: body
              type: string
              description: "The defense program code for Jira project routing, e.g. F35."
          steps:
            - name: get-alerts
              type: call
              call: github.get-code-scanning-alerts
              with:
                repo: "{{repo_name}}"
            - name: create-jira-security-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SECSCAN"
                issuetype: "Security"
                summary: "[{{program_code}}] Security findings: {{get-alerts.count}} in {{repo_name}}"
                description: "GitHub Advanced Security: {{get-alerts.count}} critical vulnerabilities detected in {{repo_name}} for program {{program_code}}."
            - name: notify-cybersec
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_cybersec_channel_id"
                text: "Security Alert [{{program_code}}]: {{repo_name}} has {{get-alerts.count}} critical findings. Jira: {{create-jira-security-issue.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheed-martin.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

On a GitHub Actions workflow failure in a protected engineering branch, creates a Jira bug and posts an alert to the aerospace engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure in a protected engineering branch, creates a Jira bug and posts an alert to the aerospace engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow run ID and repository that failed on a protected branch, create a Jira bug and alert the engineering Teams channel. Invoke when CI/CD workflows fail on main or release branches in defense software programs."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: workflow_run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "The branch where the failure occurred."
            - name: program_code
              in: body
              type: string
              description: "The defense program code associated with this repository, e.g. F35, LRSO."
          steps:
            - name: get-run-details
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo_name}}"
                run_id: "{{workflow_run_id}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "{{program_code}}"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch}} — Run {{workflow_run_id}}"
                description: "GitHub Actions failed on {{branch}}. Program: {{program_code}}. Run: {{workflow_run_id}}"
            - name: post-alert
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "CI Failure [{{program_code}}]: {{repo_name}} | Branch: {{branch}} | Jira: {{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheed-martin.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When GitHub Dependabot identifies a critical vulnerability, retrieves the advisory, creates a Jira remediation ticket, triggers an Azure DevOps security scan, and alerts the AppSec team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Vulnerability Remediation"
  description: "When GitHub Dependabot identifies a critical vulnerability, retrieves the advisory, creates a Jira remediation ticket, triggers an Azure DevOps security scan, and alerts the AppSec team via Teams."
  tags:
    - security
    - github
    - jira
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: trigger-vuln-remediation
          description: "Given a GitHub repository and Dependabot alert ID, fetch advisory details, create a Jira remediation ticket, trigger a security scan, and notify AppSec."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name."
            - name: alert_id
              in: body
              type: string
              description: "The Dependabot alert ID."
          steps:
            - name: get-advisory
              type: call
              call: github.get-dependabot-alert
              with:
                repo: "{{repo}}"
                alert_id: "{{alert_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: "APPSEC"
                summary: "Dependabot CVE: {{get-advisory.cve_id}} in {{repo}}"
                priority: "Critical"
            - name: trigger-scan
              type: call
              call: azuredevops.queue-build
              with:
                project: "{{repo}}"
                definition_name: "security-scan"
            - name: notify-appsec
              type: call
              call: msteams.post-message
              with:
                channel_id: "appsec-alerts"
                text: "Critical CVE {{get-advisory.cve_id}} in {{repo}}. Severity: {{get-advisory.severity}}. Jira: {{create-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/lockheed-martin/{{repo}}/dependabot/alerts/{{alert_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_id
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/lockheedmartin"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?api-version=7.0"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a GitHub pull request is merged on a defense software repo, triggers an Azure DevOps release pipeline, runs SonarQube quality gate, and posts results to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub to Azure DevOps Code Promotion"
  description: "When a GitHub pull request is merged on a defense software repo, triggers an Azure DevOps release pipeline, runs SonarQube quality gate, and posts results to the engineering Teams channel."
  tags:
    - devops
    - github
    - azure-devops
    - sonarqube
    - microsoft-teams
    - cicd
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: trigger-code-promotion
          description: "Given a GitHub repository and merged PR number, trigger the Azure DevOps release pipeline, check SonarQube quality gate, and notify the engineering team with results."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name."
            - name: pr_number
              in: body
              type: string
              description: "The merged pull request number."
          steps:
            - name: get-pr
              type: call
              call: github.get-pr
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: trigger-release
              type: call
              call: azuredevops.queue-build
              with:
                project: "{{repo}}"
                source_branch: "{{get-pr.merge_commit_sha}}"
            - name: check-quality
              type: call
              call: sonarqube.get-quality-gate
              with:
                project_key: "{{repo}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "engineering-releases"
                text: "PR #{{pr_number}} merged in {{repo}}. Release: {{trigger-release.build_number}}. Quality gate: {{check-quality.status}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/lockheed-martin/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pr
              method: GET
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/lockheedmartin"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?api-version=7.0"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.lockheedmartin.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pulls web traffic analytics from Google Analytics for defense program public-facing sites, generates a Confluence report, and sends a weekly digest to the marketing team via Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Defense Web Traffic Report"
  description: "Pulls web traffic analytics from Google Analytics for defense program public-facing sites, generates a Confluence report, and sends a weekly digest to the marketing team via Teams."
  tags:
    - marketing
    - google-analytics
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: trigger-traffic-report
          description: "Given a Google Analytics property ID and date range, pull traffic metrics, publish a Confluence report, and notify the marketing team via Teams."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-traffic
              type: call
              call: google-analytics.get-report
              with:
                property_id: "{{property_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: publish-report
              type: call
              call: confluence.create-page
              with:
                space_key: "MARKETING"
                title: "Web Traffic Report {{start_date}} to {{end_date}}"
                body: "Sessions: {{get-traffic.sessions}}. Users: {{get-traffic.users}}. Bounce rate: {{get-traffic.bounce_rate}}."
            - name: notify-marketing
              type: call
              call: msteams.post-message
              with:
                channel_id: "marketing-analytics"
                text: "Weekly traffic report published. Sessions: {{get-traffic.sessions}}. Report: {{publish-report.url}}."
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a Grafana alert fires from Prometheus metrics on mission systems, retrieves alert details, creates a Jira issue for the responsible team, and notifies the SRE channel via Teams.

naftiko: "0.5"
info:
  label: "Grafana Prometheus Alert to Jira Escalation"
  description: "When a Grafana alert fires from Prometheus metrics on mission systems, retrieves alert details, creates a Jira issue for the responsible team, and notifies the SRE channel via Teams."
  tags:
    - observability
    - grafana
    - jira
    - microsoft-teams
    - sre
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: trigger-grafana-escalation
          description: "Given a Grafana alert ID, retrieve Prometheus metric details, create a Jira issue for the owning team, and notify the SRE channel via Teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Grafana alert ID."
            - name: owning_team
              in: body
              type: string
              description: "The Jira project key for the owning team."
          steps:
            - name: get-alert
              type: call
              call: grafana.get-alert
              with:
                alert_id: "{{alert_id}}"
            - name: create-issue
              type: call
              call: jira.create-issue
              with:
                project: "{{owning_team}}"
                summary: "Grafana alert: {{get-alert.name}} - {{get-alert.state}}"
            - name: notify-sre
              type: call
              call: msteams.post-message
              with:
                channel_id: "sre-alerts"
                text: "Grafana alert {{get-alert.name}} fired. State: {{get-alert.state}}. Jira: {{create-issue.key}}."
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.lockheedmartin.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a Harness deployment pipeline for a defense application, creates a ServiceNow change request, monitors deployment health via Datadog, and notifies the release team via Teams.

naftiko: "0.5"
info:
  label: "Harness Deployment Pipeline Orchestrator"
  description: "Triggers a Harness deployment pipeline for a defense application, creates a ServiceNow change request, monitors deployment health via Datadog, and notifies the release team via Teams."
  tags:
    - devops
    - harness
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: trigger-harness-deployment
          description: "Given a Harness pipeline ID and target environment, trigger deployment, create a ServiceNow change, monitor via Datadog, and notify the release team."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Harness deployment pipeline ID."
            - name: environment
              in: body
              type: string
              description: "Target environment: staging, production, or govcloud."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Harness deployment: {{pipeline_id}} to {{environment}}"
                category: "deployment"
            - name: trigger-pipeline
              type: call
              call: harness.execute-pipeline
              with:
                pipeline_id: "{{pipeline_id}}"
                environment: "{{environment}}"
            - name: check-health
              type: call
              call: datadog.get-monitors
              with:
                tags: "env:{{environment}}"
            - name: notify-release
              type: call
              call: msteams.post-message
              with:
                channel_id: "release-management"
                text: "Deployment to {{environment}} initiated. Change: {{create-change.number}}. Health: {{check-health.overall_status}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: harness
      baseUri: "https://app.harness.io/gateway/pipeline/api"
      authentication:
        type: bearer
        token: "$secrets.harness_token"
      resources:
        - name: pipelines
          path: "/pipelines/execute/{{pipeline_id}}"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: execute-pipeline
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Syncs marketing-qualified leads from HubSpot to Salesforce, enriches with ZoomInfo company data, creates a Jira follow-up task, and notifies the sales team via Teams.

naftiko: "0.5"
info:
  label: "HubSpot to Salesforce Lead Sync Orchestrator"
  description: "Syncs marketing-qualified leads from HubSpot to Salesforce, enriches with ZoomInfo company data, creates a Jira follow-up task, and notifies the sales team via Teams."
  tags:
    - marketing
    - hubspot
    - salesforce
    - zoominfo
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: trigger-lead-sync
          description: "Given a HubSpot contact ID marked as MQL, sync to Salesforce, enrich with ZoomInfo, and notify the sales team."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: hubspot.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: enrich-data
              type: call
              call: zoominfo.enrich-company
              with:
                company_name: "{{get-contact.company}}"
            - name: create-lead
              type: call
              call: salesforce.create-lead
              with:
                first_name: "{{get-contact.first_name}}"
                last_name: "{{get-contact.last_name}}"
                company: "{{get-contact.company}}"
            - name: notify-sales
              type: call
              call: msteams.post-message
              with:
                channel_id: "sales-leads"
                text: "New MQL synced: {{get-contact.first_name}} {{get-contact.last_name}} at {{get-contact.company}}. SF Lead: {{create-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/search/company"
          operations:
            - name: enrich-company
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

On a PagerDuty critical alert for Lockheed Martin production systems, creates a ServiceNow P1 incident, pages the on-call team, and opens a Teams war room for rapid coordination.

naftiko: "0.5"
info:
  label: "IT P1 Incident Response and War Room"
  description: "On a PagerDuty critical alert for Lockheed Martin production systems, creates a ServiceNow P1 incident, pages the on-call team, and opens a Teams war room for rapid coordination."
  tags:
    - itsm
    - incident-response
    - pagerduty
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a PagerDuty alert ID and affected service, create a P1 ServiceNow incident, trigger an on-call PagerDuty escalation, and post a war-room message to the IT operations Teams channel. Invoke on critical production alerts."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The PagerDuty alert ID for the critical production event."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected system or service."
            - name: alert_summary
              in: body
              type: string
              description: "A brief description of the alert condition."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                priority: "1"
                short_description: "P1: {{alert_summary}} — {{service_name}}"
                category: "production_outage"
            - name: trigger-page
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1: {{alert_summary}}"
                service_id: "$secrets.pagerduty_service_id"
                body_details: "SNOW: {{create-snow-incident.number}}"
            - name: open-war-room
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT OPEN | {{service_name}} | {{alert_summary}} | SNOW: {{create-snow-incident.number}} | PD: {{trigger-page.incident_key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves detailed information about a Jira issue including status, assignee, priority, and linked program milestones for defense program tracking.

naftiko: "0.5"
info:
  label: "Jira Issue Details Lookup"
  description: "Retrieves detailed information about a Jira issue including status, assignee, priority, and linked program milestones for defense program tracking."
  tags:
    - project-management
    - jira
    - program-delivery
    - defense
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, return issue summary, status, assignee, priority, and custom fields for program milestone tracking. Use for program delivery status checks."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key, e.g. F35-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://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves sprint completion and delivery metrics from Jira for defense engineering program teams and posts a weekly delivery summary to the program management Teams channel.

naftiko: "0.5"
info:
  label: "Jira Program Delivery Sprint Report"
  description: "Retrieves sprint completion and delivery metrics from Jira for defense engineering program teams and posts a weekly delivery summary to the program management Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - reporting
    - program-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: program-delivery-reporting
      port: 8080
      tools:
        - name: publish-program-sprint-report
          description: "Given a Jira project key and sprint ID, retrieve sprint velocity metrics and post a program delivery summary to the program management Teams channel. Use for weekly delivery reviews and integrated program reviews (IPR)."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for the defense program, e.g. F35."
            - name: sprint_id
              in: body
              type: integer
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint
              type: call
              call: jira.get-sprint-report
              with:
                sprint_id: "{{sprint_id}}"
                project: "{{project_key}}"
            - name: post-report
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_programs_channel_id"
                text: "Sprint {{sprint_id}} [{{project_key}}]: {{get-sprint.completed_points}}/{{get-sprint.committed_points}} story points. Velocity: {{get-sprint.velocity}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lockheed-martin.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{sprint_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              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-message
              method: POST

Aggregates Jira sprint metrics for a defense program, generates a formatted status report, publishes to Confluence, and sends a summary digest to program leadership via Teams.

naftiko: "0.5"
info:
  label: "Jira to Confluence Program Status Publisher"
  description: "Aggregates Jira sprint metrics for a defense program, generates a formatted status report, publishes to Confluence, and sends a summary digest to program leadership via Teams."
  tags:
    - program-management
    - jira
    - confluence
    - microsoft-teams
    - defense
capability:
  exposes:
    - type: mcp
      namespace: program-management
      port: 8080
      tools:
        - name: publish-program-status
          description: "Given a Jira project key and sprint ID, aggregate sprint metrics, publish a formatted report to Confluence, and notify program leadership via Teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. F35."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                project_key: "{{project_key}}"
                sprint_id: "{{sprint_id}}"
            - name: publish-report
              type: call
              call: confluence.create-page
              with:
                space_key: "{{project_key}}"
                title: "Sprint Report {{sprint_id}} - {{project_key}}"
                body: "Completed: {{get-sprint-report.completed}}. Remaining: {{get-sprint-report.remaining}}. Velocity: {{get-sprint-report.velocity}}."
            - name: notify-leadership
              type: call
              call: msteams.post-message
              with:
                channel_id: "program-leadership"
                text: "Sprint {{sprint_id}} report for {{project_key}} published. Velocity: {{get-sprint-report.velocity}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/{{project_key}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: project_key
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Audits Microsoft 365 license assignments against Workday active employees, identifies unused licenses, creates a ServiceNow reclamation task, and notifies IT finance via Teams.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Optimization Orchestrator"
  description: "Audits Microsoft 365 license assignments against Workday active employees, identifies unused licenses, creates a ServiceNow reclamation task, and notifies IT finance via Teams."
  tags:
    - it-operations
    - microsoft-365
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-operations
      port: 8080
      tools:
        - name: trigger-license-audit
          description: "Given a Microsoft 365 license SKU, audit assignments against Workday active employees, identify unused licenses, create a ServiceNow reclamation task, and notify IT finance."
          inputParameters:
            - name: sku_id
              in: body
              type: string
              description: "The Microsoft 365 license SKU ID."
          steps:
            - name: get-assignments
              type: call
              call: msgraph.get-license-assignments
              with:
                sku_id: "{{sku_id}}"
            - name: get-active-workers
              type: call
              call: workday.get-active-workers
              with:
                business_unit: "all"
            - name: create-reclamation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "License optimization: {{sku_id}} - unused licenses identified"
                category: "license_management"
            - name: notify-it-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "it-finance"
                text: "License audit for {{sku_id}}: Assigned: {{get-assignments.total}}. Potential savings identified. Ticket: {{create-reclamation.number}}."
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: licenses
          path: "/subscribedSkus/{{sku_id}}"
          inputParameters:
            - name: sku_id
              in: path
          operations:
            - name: get-license-assignments
              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: "/lockheed-martin/workers"
          operations:
            - name: get-active-workers
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Synchronizes Microsoft Planner task boards with Jira program epics, creates missing Jira issues from Planner tasks, and posts a sync summary to the program Teams channel.

naftiko: "0.5"
info:
  label: "Microsoft Planner Program Task Sync"
  description: "Synchronizes Microsoft Planner task boards with Jira program epics, creates missing Jira issues from Planner tasks, and posts a sync summary to the program Teams channel."
  tags:
    - project-management
    - microsoft-planner
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: project-management
      port: 8080
      tools:
        - name: trigger-planner-sync
          description: "Given a Microsoft Planner plan ID and Jira project key, sync tasks to Jira issues, create missing items, and post a summary to the program channel."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "The Microsoft Planner plan ID."
            - name: jira_project
              in: body
              type: string
              description: "The Jira project key to sync with."
          steps:
            - name: get-planner-tasks
              type: call
              call: msgraph.get-planner-tasks
              with:
                plan_id: "{{plan_id}}"
            - name: create-jira-issues
              type: call
              call: jira.create-issue
              with:
                project: "{{jira_project}}"
                summary: "Synced from Planner: {{get-planner-tasks.new_count}} tasks"
            - name: notify-program
              type: call
              call: msteams.post-message
              with:
                channel_id: "program-tasks"
                text: "Planner-Jira sync complete. Total tasks: {{get-planner-tasks.total}}. New Jira issues: {{get-planner-tasks.new_count}}."
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: planner-tasks
          path: "/planner/plans/{{plan_id}}/tasks"
          inputParameters:
            - name: plan_id
              in: path
          operations:
            - name: get-planner-tasks
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Microsoft Sentinel security incident by ID, returning severity, status, tactics, and affected entities for security operations center investigations.

naftiko: "0.5"
info:
  label: "Microsoft Sentinel Incident Lookup"
  description: "Retrieves a Microsoft Sentinel security incident by ID, returning severity, status, tactics, and affected entities for security operations center investigations."
  tags:
    - security-operations
    - microsoft-sentinel
    - soc
    - threat-detection
capability:
  exposes:
    - type: mcp
      namespace: security-operations
      port: 8080
      tools:
        - name: get-sentinel-incident
          description: "Given a Microsoft Sentinel incident ID, return severity, status, title, tactics, and entities involved. Use for SOC investigation on classified and unclassified networks."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The Microsoft Sentinel incident ID."
          call: sentinel.get-incident
          with:
            incident_id: "{{incident_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.properties.title"
            - name: severity
              type: string
              mapping: "$.properties.severity"
            - name: status
              type: string
              mapping: "$.properties.status"
  consumes:
    - type: http
      namespace: sentinel
      baseUri: "https://management.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: incidents
          path: "/providers/Microsoft.SecurityInsights/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET

When Microsoft Sentinel detects a high-severity threat, retrieves incident details, suspends the affected Okta account, creates a ServiceNow P1 incident, and alerts the SOC team via Teams.

naftiko: "0.5"
info:
  label: "Microsoft Sentinel Threat Response Orchestrator"
  description: "When Microsoft Sentinel detects a high-severity threat, retrieves incident details, suspends the affected Okta account, creates a ServiceNow P1 incident, and alerts the SOC team via Teams."
  tags:
    - security-operations
    - microsoft-sentinel
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-operations
      port: 8080
      tools:
        - name: trigger-threat-response
          description: "Given a Sentinel incident ID with high severity, retrieve threat details, suspend affected Okta user, create a P1 ServiceNow incident, and alert the SOC via Teams."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The Microsoft Sentinel incident ID."
          steps:
            - name: get-incident
              type: call
              call: sentinel.get-incident
              with:
                incident_id: "{{incident_id}}"
            - name: suspend-user
              type: call
              call: okta.suspend-user
              with:
                user_id: "{{get-incident.affected_user}}"
            - name: create-p1
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Sentinel Threat: {{get-incident.title}}"
                impact: "1"
                urgency: "1"
            - name: alert-soc
              type: call
              call: msteams.post-message
              with:
                channel_id: "soc-critical"
                text: "CRITICAL THREAT: {{get-incident.title}}. Affected user suspended. P1 Ticket: {{create-p1.number}}."
  consumes:
    - type: http
      namespace: sentinel
      baseUri: "https://management.usgovcloudapi.net"
      authentication:
        type: bearer
        token: "$secrets.azure_gov_token"
      resources:
        - name: incidents
          path: "/providers/Microsoft.SecurityInsights/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves recent messages from a Microsoft Teams channel, used for monitoring program communication channels and extracting action items from engineering discussions.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Lookup"
  description: "Retrieves recent messages from a Microsoft Teams channel, used for monitoring program communication channels and extracting action items from engineering discussions."
  tags:
    - communications
    - microsoft-teams
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: communications
      port: 8080
      tools:
        - name: get-channel-messages
          description: "Given a Teams team ID and channel ID, return the most recent messages with sender, timestamp, and content. Use for program communication monitoring and action item extraction."
          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"
            - name: count
              type: integer
              mapping: "$.@odata.count"
  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

When NetApp storage capacity exceeds a threshold, retrieves volume details, creates a ServiceNow capacity request, updates the CMDB, and notifies the storage team via Teams.

naftiko: "0.5"
info:
  label: "NetApp Storage Capacity Alert Handler"
  description: "When NetApp storage capacity exceeds a threshold, retrieves volume details, creates a ServiceNow capacity request, updates the CMDB, and notifies the storage team via Teams."
  tags:
    - infrastructure
    - netapp
    - servicenow
    - microsoft-teams
    - storage
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: trigger-storage-alert
          description: "Given a NetApp volume name with capacity alert, retrieve volume metrics, create a ServiceNow request, and notify the storage team."
          inputParameters:
            - name: volume_name
              in: body
              type: string
              description: "The NetApp volume name."
            - name: threshold_pct
              in: body
              type: string
              description: "The capacity threshold percentage exceeded."
          steps:
            - name: get-volume
              type: call
              call: netapp.get-volume
              with:
                volume_name: "{{volume_name}}"
            - name: create-request
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Storage capacity alert: {{volume_name}} at {{threshold_pct}}%"
                category: "storage"
            - name: notify-storage
              type: call
              call: msteams.post-message
              with:
                channel_id: "storage-ops"
                text: "Storage alert: {{volume_name}} at {{threshold_pct}}% capacity. Used: {{get-volume.used_gb}}GB / {{get-volume.total_gb}}GB. Ticket: {{create-request.number}}."
  consumes:
    - type: http
      namespace: netapp
      baseUri: "https://netapp.lockheedmartin.com/api/storage"
      authentication:
        type: basic
        username: "$secrets.netapp_user"
        password: "$secrets.netapp_password"
      resources:
        - name: volumes
          path: "/volumes?name={{volume_name}}"
          inputParameters:
            - name: volume_name
              in: path
          operations:
            - name: get-volume
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves application health metrics from New Relic for a given application ID, returning Apdex score, error rate, and throughput for mission systems monitoring.

naftiko: "0.5"
info:
  label: "New Relic Application Health Lookup"
  description: "Retrieves application health metrics from New Relic for a given application ID, returning Apdex score, error rate, and throughput for mission systems monitoring."
  tags:
    - observability
    - new-relic
    - mission-systems
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-app-health
          description: "Given a New Relic application ID, return the current Apdex score, error rate, response time, and throughput. Use for mission-critical application health verification."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: newrelic.get-app
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: apdex_score
              type: number
              mapping: "$.application.application_summary.apdex_score"
            - name: error_rate
              type: number
              mapping: "$.application.application_summary.error_rate"
            - name: throughput
              type: number
              mapping: "$.application.application_summary.throughput"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

When a Lockheed Martin employee changes roles or programs in Workday, updates their Okta group memberships to match the new role's access entitlements, respecting clearance-level constraints.

naftiko: "0.5"
info:
  label: "Okta Cleared Personnel Access Provisioning"
  description: "When a Lockheed Martin employee changes roles or programs in Workday, updates their Okta group memberships to match the new role's access entitlements, respecting clearance-level constraints."
  tags:
    - identity
    - security
    - okta
    - workday
    - access-management
    - security-clearance
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: sync-cleared-role-access
          description: "Given a Workday employee ID and new job profile or program assignment, update Okta group memberships to reflect the new access level. Invoke on role change or program transfer events to enforce least-privilege access for cleared personnel."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job profile or program code, e.g. F35_SW_ENGINEER."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: get-okta-user
              type: call
              call: okta.get-user
              with:
                login: "{{get-worker.work_email}}"
            - name: update-access
              type: call
              call: okta.update-user-profile
              with:
                user_id: "{{get-okta-user.id}}"
                role: "{{new_role}}"
  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: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET
        - name: user-profile
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-profile
              method: POST

Initiates a privileged access review by pulling Okta admin group memberships, cross-referencing with Workday active employees, creating a Jira review task, and notifying the IAM team via Teams.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Review Orchestrator"
  description: "Initiates a privileged access review by pulling Okta admin group memberships, cross-referencing with Workday active employees, creating a Jira review task, and notifying the IAM team via Teams."
  tags:
    - identity
    - okta
    - workday
    - jira
    - microsoft-teams
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: trigger-access-review
          description: "Given an Okta admin group ID, pull all members, verify employment status in Workday, create a Jira access review task for discrepancies, and notify the IAM team."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Okta admin group ID to review."
            - name: review_period
              in: body
              type: string
              description: "Review period label, e.g. Q1-2026."
          steps:
            - name: get-group-members
              type: call
              call: okta.get-group-members
              with:
                group_id: "{{group_id}}"
            - name: verify-employment
              type: call
              call: workday.get-active-workers
              with:
                business_unit: "all"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project: "IAM"
                summary: "Privileged access review {{review_period}}: {{get-group-members.member_count}} members"
            - name: notify-iam
              type: call
              call: msteams.post-message
              with:
                channel_id: "iam-reviews"
                text: "Privileged access review initiated for {{review_period}}. Members: {{get-group-members.member_count}}. Jira: {{create-review-task.key}}."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-members
              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: "/lockheed-martin/workers"
          operations:
            - name: get-active-workers
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up an Okta user's group memberships to verify access entitlements for classified programs and DCSA compliance auditing.

naftiko: "0.5"
info:
  label: "Okta User Group Membership Lookup"
  description: "Looks up an Okta user's group memberships to verify access entitlements for classified programs and DCSA compliance auditing."
  tags:
    - identity
    - okta
    - security-clearance
    - compliance
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-groups
          description: "Given an Okta user ID or email, return all group memberships including program-specific security groups. Use for access reviews and DCSA compliance verification."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The Okta user ID or email address."
          call: okta.get-user-groups
          with:
            user_id: "{{user_id}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$"
            - name: group_count
              type: integer
              mapping: "$.length"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.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 project cost summary from Oracle E-Business Suite by project number, returning total costs, budget, and earned value for defense program financial oversight.

naftiko: "0.5"
info:
  label: "Oracle EBS Project Cost Lookup"
  description: "Retrieves project cost summary from Oracle E-Business Suite by project number, returning total costs, budget, and earned value for defense program financial oversight."
  tags:
    - finance
    - oracle
    - defense
    - earned-value
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-project-costs
          description: "Given an Oracle EBS project number, return total burdened cost, budget amount, and cost-to-date. Use for defense program Earned Value Management inquiries."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The Oracle EBS project number."
          call: oracleebs.get-project-costs
          with:
            project_number: "{{project_number}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.ProjectCost.TotalBurdenedCost"
            - name: budget
              type: number
              mapping: "$.ProjectCost.BudgetAmount"
            - name: earned_value
              type: number
              mapping: "$.ProjectCost.EarnedValue"
  consumes:
    - type: http
      namespace: oracleebs
      baseUri: "https://oracleebs.lockheedmartin.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: project-costs
          path: "/projects/{{project_number}}/costs"
          inputParameters:
            - name: project_number
              in: path
          operations:
            - name: get-project-costs
              method: GET

During period close, pulls financial data from Oracle EBS, loads into Snowflake staging, refreshes the Power BI close dashboard, and notifies the finance team via Teams.

naftiko: "0.5"
info:
  label: "Oracle EBS to Power BI Financial Close Reporter"
  description: "During period close, pulls financial data from Oracle EBS, loads into Snowflake staging, refreshes the Power BI close dashboard, and notifies the finance team via Teams."
  tags:
    - finance
    - oracle
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: trigger-close-report
          description: "Given a fiscal period, extract Oracle EBS financial data, stage in Snowflake, refresh Power BI dashboard, and notify the finance close team."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period, e.g. 2026-03."
            - name: ledger_name
              in: body
              type: string
              description: "The Oracle ledger name."
          steps:
            - name: extract-data
              type: call
              call: oracleebs.get-gl-balances
              with:
                period: "{{fiscal_period}}"
                ledger: "{{ledger_name}}"
            - name: load-snowflake
              type: call
              call: snowflake.run-query
              with:
                query: "CALL stage_gl_balances('{{fiscal_period}}', '{{ledger_name}}')"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "financial-close"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "finance-close"
                text: "Period {{fiscal_period}} close data loaded. GL balances: {{extract-data.balance_count}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: oracleebs
      baseUri: "https://oracleebs.lockheedmartin.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: gl-balances
          path: "/gl/balances?period={{period}}&ledger={{ledger}}"
          inputParameters:
            - name: period
              in: path
            - name: ledger
              in: path
          operations:
            - name: get-gl-balances
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.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: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves firewall security policy rules from Palo Alto Networks Panorama by rule name, returning source and destination zones, applications, and action for network security audits.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Rule Lookup"
  description: "Retrieves firewall security policy rules from Palo Alto Networks Panorama by rule name, returning source and destination zones, applications, and action for network security audits."
  tags:
    - network-security
    - palo-alto-networks
    - compliance
    - firewall
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Given a Palo Alto policy rule name, return source zones, destination zones, applications, and action. Use for network security compliance audits on classified networks."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The firewall security policy rule name."
          call: paloalto.get-rule
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: source_zone
              type: array
              mapping: "$.result.entry.from.member"
            - name: dest_zone
              type: array
              mapping: "$.result.entry.to.member"
            - name: application
              type: array
              mapping: "$.result.entry.application.member"
            - name: action
              type: string
              mapping: "$.result.entry.action"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.lockheedmartin.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: path
          operations:
            - name: get-rule
              method: GET

Refreshes a Power BI executive briefing dataset, exports it to PDF, uploads to SharePoint, and sends the briefing link to executives via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Executive Briefing Refresh and Distribute"
  description: "Refreshes a Power BI executive briefing dataset, exports it to PDF, uploads to SharePoint, and sends the briefing link to executives via Microsoft Teams."
  tags:
    - analytics
    - power-bi
    - sharepoint
    - microsoft-teams
    - executive-reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: trigger-exec-briefing
          description: "Given a Power BI dataset ID and report ID, refresh the dataset, export to PDF, upload to SharePoint, and distribute to executives via Teams."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: report_id
              in: body
              type: string
              description: "The Power BI report ID."
          steps:
            - name: refresh-dataset
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: export-pdf
              type: call
              call: powerbi.export-report
              with:
                report_id: "{{report_id}}"
                format: "PDF"
            - name: upload-sharepoint
              type: call
              call: sharepoint.upload-file
              with:
                site_id: "exec-briefings"
                file_name: "briefing-{{report_id}}.pdf"
            - name: notify-execs
              type: call
              call: msteams.post-message
              with:
                channel_id: "executive-briefings"
                text: "Executive briefing updated. View: {{upload-sharepoint.web_url}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
        - name: reports
          path: "/reports/{{report_id}}/ExportTo"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: export-report
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root:/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a Power BI dataset refresh for the Estimate at Completion (EAC) program finance dashboard and notifies program controllers via Teams on completion.

naftiko: "0.5"
info:
  label: "Power BI Program EAC Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the Estimate at Completion (EAC) program finance dashboard and notifies program controllers via Teams on completion."
  tags:
    - finance
    - analytics
    - power-bi
    - program-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: program-reporting
      port: 8080
      tools:
        - name: refresh-eac-dashboard
          description: "Trigger a Power BI dataset refresh for the EAC program finance workspace and notify program controllers in Teams. Use at the close of each accounting period or on demand for program review gates."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID for the EAC program finance dashboards."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-refresh
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-controllers
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "EAC dashboard dataset {{dataset_id}} refresh triggered. Refresh ID: {{trigger-refresh.refresh_id}}"
  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-message
              method: POST

Generates a weekly Earned Value Management report by pulling cost data from SAP, schedule data from Microsoft Project, and publishing the combined EVM report to Confluence and Power BI.

naftiko: "0.5"
info:
  label: "Program Earned Value Report Generator"
  description: "Generates a weekly Earned Value Management report by pulling cost data from SAP, schedule data from Microsoft Project, and publishing the combined EVM report to Confluence and Power BI."
  tags:
    - program-management
    - sap
    - microsoft-project
    - confluence
    - power-bi
    - earned-value
capability:
  exposes:
    - type: mcp
      namespace: program-management
      port: 8080
      tools:
        - name: generate-evm-report
          description: "Given a program code and reporting period, pull cost data from SAP, schedule data from MS Project, publish to Confluence, and refresh the Power BI dashboard."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The defense program code, e.g. F35-PROD."
            - name: period_end
              in: body
              type: string
              description: "Reporting period end date in YYYY-MM-DD format."
          steps:
            - name: get-sap-costs
              type: call
              call: sap.get-program-costs
              with:
                program_code: "{{program_code}}"
                period_end: "{{period_end}}"
            - name: get-schedule
              type: call
              call: msproject.get-schedule
              with:
                program_code: "{{program_code}}"
            - name: publish-confluence
              type: call
              call: confluence.create-page
              with:
                space_key: "EVM"
                title: "EVM Report {{program_code}} - {{period_end}}"
                body: "BCWP: {{get-sap-costs.earned_value}} | ACWP: {{get-sap-costs.actual_cost}} | Schedule Variance: {{get-schedule.variance}}"
            - name: refresh-powerbi
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "evm-{{program_code}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_PROJECT_COST"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/ProjectCosts(program='{{program_code}}')"
          inputParameters:
            - name: program_code
              in: path
          operations:
            - name: get-program-costs
              method: GET
    - type: http
      namespace: msproject
      baseUri: "https://project.lockheedmartin.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.msproject_token"
      resources:
        - name: schedules
          path: "/projects/{{program_code}}/schedule"
          inputParameters:
            - name: program_code
              in: path
          operations:
            - name: get-schedule
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When a Jira program milestone epic is completed, updates the corresponding Salesforce opportunity stage and notifies the business development team via Teams.

naftiko: "0.5"
info:
  label: "Program Milestone Jira to Salesforce Sync"
  description: "When a Jira program milestone epic is completed, updates the corresponding Salesforce opportunity stage and notifies the business development team via Teams."
  tags:
    - programs
    - crm
    - salesforce
    - jira
    - microsoft-teams
    - defense-contracts
capability:
  exposes:
    - type: mcp
      namespace: program-sync
      port: 8080
      tools:
        - name: sync-milestone-to-salesforce
          description: "Given a Jira epic ID representing a program delivery milestone, retrieve milestone completion status and update the associated Salesforce opportunity stage. Notify the BD team channel in Teams. Use when key program milestones close."
          inputParameters:
            - name: epic_key
              in: body
              type: string
              description: "The Jira epic key for the completed program milestone, e.g. F35-1024."
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID linked to this program."
          steps:
            - name: get-epic
              type: call
              call: jira.get-issue
              with:
                issue_key: "{{epic_key}}"
            - name: update-opportunity
              type: call
              call: salesforce.update-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                stage: "Milestone Delivered"
                milestone: "{{get-epic.summary}}"
            - name: notify-bd
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_bd_channel_id"
                text: "Program milestone complete: {{get-epic.summary}} | SF Opportunity updated: {{opportunity_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lockheed-martin.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lockheed-martin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: 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

Triggers a Qlik Sense app reload for defense program analytics, validates data freshness in Snowflake, and distributes a summary notification to program managers via Teams.

naftiko: "0.5"
info:
  label: "Qlik Sense Defense Analytics Refresh Orchestrator"
  description: "Triggers a Qlik Sense app reload for defense program analytics, validates data freshness in Snowflake, and distributes a summary notification to program managers via Teams."
  tags:
    - analytics
    - qlik-sense
    - snowflake
    - microsoft-teams
    - defense
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: trigger-qlik-refresh
          description: "Given a Qlik Sense app ID and program code, reload the app, validate Snowflake data freshness, and notify program managers via Teams."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik Sense app ID."
            - name: program_code
              in: body
              type: string
              description: "The defense program code."
          steps:
            - name: reload-app
              type: call
              call: qliksense.reload-app
              with:
                app_id: "{{app_id}}"
            - name: check-freshness
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT MAX(updated_at) as last_update FROM program_data WHERE program='{{program_code}}'"
            - name: notify-managers
              type: call
              call: msteams.post-message
              with:
                channel_id: "program-analytics"
                text: "Qlik Sense analytics refreshed for {{program_code}}. Data as of: {{check-freshness.last_update}}."
  consumes:
    - type: http
      namespace: qliksense
      baseUri: "https://qlik.lockheedmartin.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: apps
          path: "/apps/{{app_id}}/reload"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: reload-app
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.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: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers an Ansible Automation Platform patch deployment job for classified infrastructure, creates a ServiceNow change record, monitors via Datadog, and sends completion status to Teams.

naftiko: "0.5"
info:
  label: "Red Hat Ansible Patch Deployment Orchestrator"
  description: "Triggers an Ansible Automation Platform patch deployment job for classified infrastructure, creates a ServiceNow change record, monitors via Datadog, and sends completion status to Teams."
  tags:
    - infrastructure
    - ansible
    - servicenow
    - datadog
    - microsoft-teams
    - patching
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: trigger-patch-deployment
          description: "Given an Ansible job template ID and target inventory, trigger patch deployment, create a ServiceNow change record, verify system health via Datadog, and notify operations."
          inputParameters:
            - name: template_id
              in: body
              type: string
              description: "The Ansible Automation Platform job template ID."
            - name: inventory
              in: body
              type: string
              description: "Target inventory name for patching."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Ansible patch deployment: {{inventory}}"
                category: "infrastructure"
            - name: launch-job
              type: call
              call: ansible.launch-job
              with:
                template_id: "{{template_id}}"
                inventory: "{{inventory}}"
            - name: check-health
              type: call
              call: datadog.get-monitors
              with:
                tags: "inventory:{{inventory}}"
            - name: notify-ops
              type: call
              call: msteams.post-message
              with:
                channel_id: "infra-ops"
                text: "Patch deployment {{launch-job.id}} for {{inventory}} initiated. Change: {{create-change.number}}. Health: {{check-health.overall_status}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: ansible
      baseUri: "https://ansible.lockheedmartin.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.ansible_token"
      resources:
        - name: jobs
          path: "/job_templates/{{template_id}}/launch/"
          inputParameters:
            - name: template_id
              in: path
          operations:
            - name: launch-job
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a Salesforce government contract opportunity closes as Won, creates a corresponding SAP project/WBS element in S/4HANA and notifies the program management team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Contract Opportunity to SAP Project Sync"
  description: "When a Salesforce government contract opportunity closes as Won, creates a corresponding SAP project/WBS element in S/4HANA and notifies the program management team via Teams."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - program-management
    - defense-contracts
capability:
  exposes:
    - type: mcp
      namespace: contract-program-sync
      port: 8080
      tools:
        - name: create-program-from-contract-win
          description: "Given a Salesforce opportunity ID for a Closed Won government contract, retrieve contract details, create a SAP S/4HANA project with WBS structure, and notify the program management team in Teams. Use when a defense contract award is confirmed."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The 18-character Salesforce opportunity ID for the contract win."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-project
              type: call
              call: sap.create-project
              with:
                project_name: "{{get-opportunity.name}}"
                customer_id: "{{get-opportunity.account_id}}"
                contract_value: "{{get-opportunity.amount}}"
            - name: notify-program-mgmt
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_programs_channel_id"
                text: "Contract Won: {{get-opportunity.name}} | SAP Project: {{create-sap-project.project_id}} | Value: ${{get-opportunity.amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lockheed-martin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: projects
          path: "/A_Project"
          operations:
            - name: create-project
              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

When a government contract opportunity is marked as Closed Won in Salesforce, creates a SAP project, generates a Confluence program charter, and broadcasts the win announcement via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Government Contract Win Notification"
  description: "When a government contract opportunity is marked as Closed Won in Salesforce, creates a SAP project, generates a Confluence program charter, and broadcasts the win announcement via Teams."
  tags:
    - sales
    - salesforce
    - sap
    - confluence
    - microsoft-teams
    - government-contracts
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: trigger-contract-win
          description: "Given a Salesforce opportunity ID marked Closed Won, create a SAP project structure, generate a Confluence program charter page, and broadcast the win to leadership via Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-project
              type: call
              call: sap.create-project
              with:
                project_name: "{{get-opportunity.Name}}"
                customer: "{{get-opportunity.Account.Name}}"
                value: "{{get-opportunity.Amount}}"
            - name: create-charter
              type: call
              call: confluence.create-page
              with:
                space_key: "PROGRAMS"
                title: "Program Charter: {{get-opportunity.Name}}"
                body: "Contract value: {{get-opportunity.Amount}}. Customer: {{get-opportunity.Account.Name}}."
            - name: announce-win
              type: call
              call: msteams.post-message
              with:
                channel_id: "leadership-wins"
                text: "CONTRACT WIN: {{get-opportunity.Name}} valued at {{get-opportunity.Amount}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_PROJECT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: projects
          path: "/A_Project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Generates a weekly digest of Lockheed Martin's active government contract opportunities from Salesforce CRM and posts the pipeline summary to the business development Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Government Opportunity Pipeline Digest"
  description: "Generates a weekly digest of Lockheed Martin's active government contract opportunities from Salesforce CRM and posts the pipeline summary to the business development Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - business-development
    - microsoft-teams
    - defense-contracts
capability:
  exposes:
    - type: mcp
      namespace: crm-reporting
      port: 8080
      tools:
        - name: digest-opportunity-pipeline
          description: "Retrieve active government contract opportunities from Salesforce CRM with stage, expected value, and close date, then post a weekly pipeline summary to the BD leadership Teams channel. Use for weekly program development reviews."
          inputParameters:
            - name: days_back
              in: body
              type: integer
              description: "Number of days of activity to include in the digest."
          steps:
            - name: get-opportunities
              type: call
              call: salesforce.query-opportunities
              with:
                days_back: "{{days_back}}"
            - name: post-digest
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_bd_channel_id"
                text: "BD Pipeline Digest (last {{days_back}} days): {{get-opportunities.count}} active opportunities. Pipeline value: ${{get-opportunities.total_value}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lockheed-martin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-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-message
              method: POST

When a defense proposal reaches final review in Salesforce, syncs pricing data to SAP, generates a Confluence proposal summary, and notifies the business development team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce to SAP Defense Proposal Sync"
  description: "When a defense proposal reaches final review in Salesforce, syncs pricing data to SAP, generates a Confluence proposal summary, and notifies the business development team via Teams."
  tags:
    - sales
    - salesforce
    - sap
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: trigger-proposal-sync
          description: "Given a Salesforce opportunity ID at final review stage, sync pricing to SAP, create a Confluence summary, and notify business development."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: sync-pricing
              type: call
              call: sap.create-quotation
              with:
                customer: "{{get-opportunity.Account.Name}}"
                amount: "{{get-opportunity.Amount}}"
            - name: create-summary
              type: call
              call: confluence.create-page
              with:
                space_key: "BD"
                title: "Proposal: {{get-opportunity.Name}}"
                body: "Value: {{get-opportunity.Amount}}. SAP Quote: {{sync-pricing.quotation_id}}."
            - name: notify-bd
              type: call
              call: msteams.post-message
              with:
                channel_id: "business-development"
                text: "Proposal {{get-opportunity.Name}} synced to SAP. Quote: {{sync-pricing.quotation_id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_SALES_QUOTATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quotations
          path: "/A_SalesQuotation"
          operations:
            - name: create-quotation
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a defense subcontractor contract nears expiration, retrieves contract details from SAP Ariba, creates a Jira renewal task, notifies the procurement team via Teams, and logs the renewal in Salesforce.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Workflow"
  description: "When a defense subcontractor contract nears expiration, retrieves contract details from SAP Ariba, creates a Jira renewal task, notifies the procurement team via Teams, and logs the renewal in Salesforce."
  tags:
    - procurement
    - sap-ariba
    - jira
    - microsoft-teams
    - salesforce
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: trigger-contract-renewal
          description: "Given a SAP Ariba contract ID nearing expiration, orchestrate renewal by fetching contract details, creating a Jira task, notifying procurement via Teams, and updating Salesforce."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP Ariba contract ID."
            - name: expiry_date
              in: body
              type: string
              description: "Contract expiration date in YYYY-MM-DD format."
          steps:
            - name: get-contract
              type: call
              call: ariba.get-contract
              with:
                contract_id: "{{contract_id}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project: "PROC"
                summary: "Contract renewal: {{get-contract.supplier_name}} expiring {{expiry_date}}"
                issue_type: "Task"
            - name: notify-procurement
              type: call
              call: msteams.post-message
              with:
                channel_id: "procurement-ops"
                text: "Contract {{contract_id}} with {{get-contract.supplier_name}} expires {{expiry_date}}. Jira: {{create-jira-task.key}}"
            - name: update-salesforce
              type: call
              call: salesforce.update-opportunity
              with:
                contract_id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/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: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: update-opportunity
              method: PATCH

Registers a new defense subcontractor in SAP Ariba, creates a vendor master record in SAP S/4HANA, and notifies the contracts and procurement Teams channel.

naftiko: "0.5"
info:
  label: "SAP Ariba Defense Subcontractor Onboarding"
  description: "Registers a new defense subcontractor in SAP Ariba, creates a vendor master record in SAP S/4HANA, and notifies the contracts and procurement Teams channel."
  tags:
    - procurement
    - sap-ariba
    - sap
    - supplier-management
    - defense-contracts
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-ops
      port: 8080
      tools:
        - name: onboard-subcontractor
          description: "Given defense subcontractor details, register in SAP Ariba, create a vendor master in SAP S/4HANA, and notify the contracts and procurement Teams channel. Use for onboarding new defense subcontractors and suppliers."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the defense subcontractor."
            - name: cage_code
              in: body
              type: string
              description: "The DoD CAGE code for the subcontractor."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact email for the subcontractor."
          steps:
            - name: register-in-ariba
              type: call
              call: ariba.create-supplier
              with:
                name: "{{supplier_name}}"
                customField1: "{{cage_code}}"
                contactEmail: "{{contact_email}}"
            - name: create-sap-vendor
              type: call
              call: sap.create-vendor
              with:
                supplierName: "{{supplier_name}}"
                aribaId: "{{register-in-ariba.supplier_id}}"
                cageCode: "{{cage_code}}"
            - name: notify-contracts
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_contracts_channel_id"
                text: "Subcontractor onboarded: {{supplier_name}} (CAGE: {{cage_code}}) | Ariba: {{register-in-ariba.supplier_id}} | SAP Vendor: {{create-sap-vendor.vendor_id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-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"
          operations:
            - name: create-vendor
              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

When a new RFP is received in SAP Ariba, creates a Jira epic for response coordination, generates a Confluence response template, assigns the capture team, and notifies via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba RFP Response Coordinator"
  description: "When a new RFP is received in SAP Ariba, creates a Jira epic for response coordination, generates a Confluence response template, assigns the capture team, and notifies via Teams."
  tags:
    - procurement
    - sap-ariba
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: trigger-rfp-response
          description: "Given a SAP Ariba sourcing event ID, create a Jira epic for RFP coordination, generate a Confluence template, and notify the capture team via Teams."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The SAP Ariba sourcing event ID."
            - name: capture_team
              in: body
              type: string
              description: "The capture team channel ID."
          steps:
            - name: get-event
              type: call
              call: ariba.get-sourcing-event
              with:
                event_id: "{{event_id}}"
            - name: create-epic
              type: call
              call: jira.create-issue
              with:
                project: "CAPTURE"
                summary: "RFP Response: {{get-event.title}}"
                issue_type: "Epic"
            - name: create-template
              type: call
              call: confluence.create-page
              with:
                space_key: "CAPTURE"
                title: "RFP Template: {{get-event.title}}"
                body: "Due: {{get-event.due_date}}. Jira Epic: {{create-epic.key}}."
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "{{capture_team}}"
                text: "New RFP: {{get-event.title}}. Due: {{get-event.due_date}}. Epic: {{create-epic.key}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: sourcing-events
          path: "/sourcing/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-sourcing-event
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Assesses defense supplier risk by pulling SAP Ariba supplier data, checking Salesforce contract history, generating a Confluence risk report, and notifying the procurement risk team via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Risk Assessment"
  description: "Assesses defense supplier risk by pulling SAP Ariba supplier data, checking Salesforce contract history, generating a Confluence risk report, and notifying the procurement risk team via Teams."
  tags:
    - procurement
    - sap-ariba
    - salesforce
    - confluence
    - microsoft-teams
    - risk-management
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: trigger-supplier-risk
          description: "Given a SAP Ariba supplier ID, pull supplier data, check Salesforce contract history, publish a Confluence risk report, and notify procurement risk team."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
          steps:
            - name: get-supplier
              type: call
              call: ariba.get-supplier
              with:
                supplier_id: "{{supplier_id}}"
            - name: get-contracts
              type: call
              call: salesforce.get-contracts
              with:
                supplier_name: "{{get-supplier.name}}"
            - name: create-report
              type: call
              call: confluence.create-page
              with:
                space_key: "RISK"
                title: "Supplier Risk: {{get-supplier.name}}"
                body: "Active contracts: {{get-contracts.count}}. Total value: {{get-contracts.total_value}}."
            - name: notify-risk-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "procurement-risk"
                text: "Supplier risk assessment: {{get-supplier.name}}. Contracts: {{get-contracts.count}}. Report: {{create-report.url}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query?q=SELECT+Id,Name+FROM+Contract+WHERE+Account.Name='{{supplier_name}}'"
          inputParameters:
            - name: supplier_name
              in: path
          operations:
            - name: get-contracts
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When SAP detects a program budget overrun threshold breach, retrieves cost details, creates a Jira escalation issue, sends a Datadog custom event, and notifies program finance leadership via Teams.

naftiko: "0.5"
info:
  label: "SAP Budget Overrun Alert and Escalation"
  description: "When SAP detects a program budget overrun threshold breach, retrieves cost details, creates a Jira escalation issue, sends a Datadog custom event, and notifies program finance leadership via Teams."
  tags:
    - finance
    - sap
    - jira
    - datadog
    - microsoft-teams
    - budget
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: trigger-budget-overrun
          description: "Given a SAP program code with a budget overrun, fetch cost breakdown, create a Jira escalation, emit a Datadog event, and alert finance leadership via Teams."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The defense program code."
            - name: threshold_pct
              in: body
              type: string
              description: "The budget overrun percentage threshold breached."
          steps:
            - name: get-costs
              type: call
              call: sap.get-program-costs
              with:
                program_code: "{{program_code}}"
            - name: create-escalation
              type: call
              call: jira.create-issue
              with:
                project: "FIN"
                summary: "Budget overrun {{threshold_pct}}%: {{program_code}}"
                priority: "Critical"
            - name: emit-event
              type: call
              call: datadog.post-event
              with:
                title: "Budget overrun: {{program_code}}"
                text: "Overrun {{threshold_pct}}%. Actual: {{get-costs.actual_cost}}. Budget: {{get-costs.budget}}."
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "finance-leadership"
                text: "BUDGET ALERT: {{program_code}} overrun by {{threshold_pct}}%. Jira: {{create-escalation.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_PROJECT_COST"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/ProjectCosts(program='{{program_code}}')"
          inputParameters:
            - name: program_code
              in: path
          operations:
            - name: get-program-costs
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: post-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a defense program travel request is submitted in SAP Concur, validates ITAR travel compliance, checks traveler clearance in Workday, and creates a security briefing task in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Concur Defense Travel Request Orchestrator"
  description: "When a defense program travel request is submitted in SAP Concur, validates ITAR travel compliance, checks traveler clearance in Workday, and creates a security briefing task in ServiceNow."
  tags:
    - travel
    - sap-concur
    - workday
    - servicenow
    - microsoft-teams
    - itar
capability:
  exposes:
    - type: mcp
      namespace: travel
      port: 8080
      tools:
        - name: trigger-travel-compliance
          description: "Given a Concur travel request ID, validate ITAR destination compliance, verify traveler clearance status in Workday, and create a pre-travel security briefing task in ServiceNow."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The SAP Concur travel request ID."
            - name: traveler_id
              in: body
              type: string
              description: "The Workday worker ID of the traveler."
          steps:
            - name: get-request
              type: call
              call: concur.get-travel-request
              with:
                request_id: "{{request_id}}"
            - name: check-clearance
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{traveler_id}}"
            - name: create-briefing-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Pre-travel security briefing: {{check-clearance.full_name}} to {{get-request.destination}}"
                category: "security_travel"
            - name: notify-traveler
              type: call
              call: msteams.post-message
              with:
                recipient_upn: "{{check-clearance.work_email}}"
                text: "Your travel to {{get-request.destination}} requires a security briefing. Ticket: {{create-briefing-task.number}}."
  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: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves submitted SAP Concur expense reports above policy thresholds, flags policy violations, and routes exception reports to the travel and expense compliance team via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Compliance Audit"
  description: "Retrieves submitted SAP Concur expense reports above policy thresholds, flags policy violations, and routes exception reports to the travel and expense compliance team via Teams."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-compliance
      port: 8080
      tools:
        - name: audit-travel-expenses
          description: "Retrieve SAP Concur expense reports exceeding the per-diem or total travel policy limits and create ServiceNow approval tasks for finance review. Alert the T&E compliance team in Teams. Run nightly or before period close."
          inputParameters:
            - name: threshold_amount
              in: body
              type: number
              description: "Dollar amount above which expense reports require secondary review."
            - name: report_date
              in: body
              type: string
              description: "Filter for expense reports submitted on or after this date in YYYY-MM-DD format."
          steps:
            - name: get-expense-reports
              type: call
              call: concur.list-reports
              with:
                submitDateAfter: "{{report_date}}"
            - name: create-review-tasks
              type: call
              call: servicenow.create-approval
              with:
                short_description: "Travel expense reports exceeding ${{threshold_amount}} — compliance review required"
                category: "travel_expense_audit"
            - name: notify-compliance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "T&E Audit: Reports exceeding ${{threshold_amount}} have been routed to ServiceNow for review. SNOW: {{create-review-tasks.number}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: list-reports
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              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

Looks up a SAP S/4HANA purchase order by number and returns header status, contractor name, total value, and contract line items for program finance and procurement review.

naftiko: "0.5"
info:
  label: "SAP Contract Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, contractor name, total value, and contract line items for program finance and procurement review."
  tags:
    - procurement
    - erp
    - sap
    - finance
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO status, supplier name, total amount, and currency. Use for defense contract procurement audits, spend analysis, and subcontractor reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500099001."
          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"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-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

Reconciles SAP goods receipts against supplier invoices, flags discrepancies, creates a Jira investigation task for procurement, and sends a summary to the AP team via Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Invoice Reconciliation"
  description: "Reconciles SAP goods receipts against supplier invoices, flags discrepancies, creates a Jira investigation task for procurement, and sends a summary to the AP team via Teams."
  tags:
    - finance
    - sap
    - jira
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: trigger-gr-ir-reconciliation
          description: "Given a SAP purchase order number, reconcile goods receipts against invoices, flag discrepancies, create a Jira task, and notify the accounts payable team."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year to reconcile."
          steps:
            - name: get-receipts
              type: call
              call: sap.get-goods-receipts
              with:
                po_number: "{{po_number}}"
            - name: get-invoices
              type: call
              call: sap.get-invoices
              with:
                po_number: "{{po_number}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project: "AP"
                summary: "GR/IR reconciliation: PO {{po_number}} (FY{{fiscal_year}})"
            - name: notify-ap
              type: call
              call: msteams.post-message
              with:
                channel_id: "accounts-payable"
                text: "GR/IR reconciliation for PO {{po_number}}: Receipts: {{get-receipts.total_amount}}. Invoices: {{get-invoices.total_amount}}. Jira: {{create-task.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-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: goods-receipts
          path: "/A_PurchaseOrder('{{po_number}}')/to_PurchaseOrderItem"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-goods-receipts
              method: GET
        - name: invoices
          path: "/A_PurOrdAccountAssignment?$filter=PurchaseOrder eq '{{po_number}}'"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Executes a read-only SQL query against SAP HANA to retrieve program financial data, returning result set for ad-hoc defense program cost analysis.

naftiko: "0.5"
info:
  label: "SAP HANA Data Query Lookup"
  description: "Executes a read-only SQL query against SAP HANA to retrieve program financial data, returning result set for ad-hoc defense program cost analysis."
  tags:
    - data-analytics
    - sap-hana
    - finance
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: run-hana-query
          description: "Given a SQL SELECT statement, execute it against SAP HANA and return the result set. Use for ad-hoc program cost queries and financial data extraction."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "A read-only SQL SELECT statement."
          call: saphana.execute-query
          with:
            query: "{{sql_query}}"
          outputParameters:
            - name: rows
              type: array
              mapping: "$.results"
            - name: row_count
              type: integer
              mapping: "$.rowCount"
  consumes:
    - type: http
      namespace: saphana
      baseUri: "https://hana.lockheedmartin.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.hana_user"
        password: "$secrets.hana_password"
      resources:
        - name: sql
          path: "/sql/execute"
          operations:
            - name: execute-query
              method: POST

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

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 and logistics."
  tags:
    - logistics
    - sap
    - procurement
    - supply-chain
    - defense
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number, return material description, base unit of measure, and material group. Use for parts procurement and supply chain queries."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: uom
              type: string
              mapping: "$.d.BaseUnitOfMeasure"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Validates SAP S/4HANA posting periods for program-level company codes at month-end, checks open items, and posts a close-readiness report to the program finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period Close and Program Financial Review"
  description: "Validates SAP S/4HANA posting periods for program-level company codes at month-end, checks open items, and posts a close-readiness report to the program finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - period-close
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: validate-program-period-close
          description: "Given a fiscal period and SAP company code, check posting period status and count open items in SAP S/4HANA for defense program financial reporting. Post a close-readiness summary to the program finance Teams channel."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period in YYYYMM format, e.g. 202503."
            - name: company_code
              in: body
              type: string
              description: "SAP company code for the program, e.g. LM01."
          steps:
            - name: check-periods
              type: call
              call: sap.get-posting-periods
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: get-open-items
              type: call
              call: sap.get-open-items
              with:
                period: "{{fiscal_period}}"
                companyCode: "{{company_code}}"
            - name: post-report
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Period Close {{fiscal_period}} ({{company_code}}): Status={{check-periods.status}} | Open Items={{get-open-items.count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPLANDATA_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: posting-periods
          path: "/PostingPeriods"
          operations:
            - name: get-posting-periods
              method: GET
        - name: open-items
          path: "/OpenItems"
          operations:
            - name: get-open-items
              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-message
              method: POST

Validates SAP timesheet entries against DCAA compliance rules, flags exceptions, creates a Jira audit task, and notifies the compliance team via Teams.

naftiko: "0.5"
info:
  label: "SAP Timesheet to DCAA Compliance Checker"
  description: "Validates SAP timesheet entries against DCAA compliance rules, flags exceptions, creates a Jira audit task, and notifies the compliance team via Teams."
  tags:
    - compliance
    - sap
    - jira
    - microsoft-teams
    - dcaa
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: trigger-timesheet-audit
          description: "Given a SAP pay period and program code, validate timesheet entries against DCAA rules, flag exceptions, create a Jira audit task, and notify compliance."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "The pay period end date in YYYY-MM-DD format."
            - name: program_code
              in: body
              type: string
              description: "The defense program code."
          steps:
            - name: get-timesheets
              type: call
              call: sap.get-timesheets
              with:
                pay_period: "{{pay_period}}"
                program_code: "{{program_code}}"
            - name: create-audit-task
              type: call
              call: jira.create-issue
              with:
                project: "COMPLY"
                summary: "DCAA timesheet audit: {{program_code}} ({{pay_period}})"
            - name: notify-compliance
              type: call
              call: msteams.post-message
              with:
                channel_id: "dcaa-compliance"
                text: "Timesheet audit for {{program_code}} ({{pay_period}}): {{get-timesheets.entry_count}} entries, {{get-timesheets.exception_count}} exceptions. Jira: {{create-audit-task.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_MANAGE_WORKFORCE_TIMESHEET"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: timesheets
          path: "/TimeSheetEntry?$filter=PayPeriod eq '{{pay_period}}' and Program eq '{{program_code}}'"
          inputParameters:
            - name: pay_period
              in: path
            - name: program_code
              in: path
          operations:
            - name: get-timesheets
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Synchronizes program revenue recognition data from SAP to Salesforce, updates the opportunity stage and amount, refreshes the Snowflake analytics view, and notifies finance via Teams.

naftiko: "0.5"
info:
  label: "SAP to Salesforce Program Revenue Sync"
  description: "Synchronizes program revenue recognition data from SAP to Salesforce, updates the opportunity stage and amount, refreshes the Snowflake analytics view, and notifies finance via Teams."
  tags:
    - finance
    - sap
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: trigger-revenue-sync
          description: "Given a SAP program code, pull revenue recognition data, update the corresponding Salesforce opportunity, refresh Snowflake analytics, and notify finance."
          inputParameters:
            - name: program_code
              in: body
              type: string
              description: "The SAP program code."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period, e.g. 2026-Q1."
          steps:
            - name: get-revenue
              type: call
              call: sap.get-revenue
              with:
                program_code: "{{program_code}}"
                period: "{{fiscal_period}}"
            - name: update-salesforce
              type: call
              call: salesforce.update-opportunity
              with:
                program_code: "{{program_code}}"
                amount: "{{get-revenue.recognized_revenue}}"
            - name: refresh-analytics
              type: call
              call: snowflake.run-query
              with:
                query: "CALL refresh_revenue_view('{{program_code}}')"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "finance-ops"
                text: "Revenue sync complete for {{program_code}} ({{fiscal_period}}). Recognized: {{get-revenue.recognized_revenue}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_REVENUE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: revenue
          path: "/Revenue(program='{{program_code}}')"
          inputParameters:
            - name: program_code
              in: path
          operations:
            - name: get-revenue
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lockheedmartin.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.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: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves vendor master data from SAP S/4HANA by vendor number, returning company details, payment terms, and CAGE code for defense subcontractor verification.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number, returning company details, payment terms, and CAGE code for defense subcontractor verification."
  tags:
    - procurement
    - sap
    - defense
    - subcontractor
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, return vendor name, address, payment terms, and CAGE code. Use for subcontractor verification and procurement compliance."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number, e.g. 0001000123."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: cage_code
              type: string
              mapping: "$.d.CageCode"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

When a security clearance nears expiration in Workday, creates a ServiceNow reinvestigation request, suspends program-specific Okta access, and notifies the employee and FSO via Teams.

naftiko: "0.5"
info:
  label: "Security Clearance Expiry Renewal Orchestrator"
  description: "When a security clearance nears expiration in Workday, creates a ServiceNow reinvestigation request, suspends program-specific Okta access, and notifies the employee and FSO via Teams."
  tags:
    - security-clearance
    - workday
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-clearance
      port: 8080
      tools:
        - name: trigger-clearance-renewal
          description: "Given a worker ID with an expiring clearance, create a ServiceNow reinvestigation ticket, temporarily restrict Okta program access, and notify the employee and Facility Security Officer."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID with expiring clearance."
            - name: clearance_type
              in: body
              type: string
              description: "Clearance type: SECRET, TOP_SECRET, or TS_SCI."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-reinvestigation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Clearance reinvestigation: {{get-worker.full_name}} ({{clearance_type}})"
                category: "security_clearance"
                assigned_group: "FSO_Operations"
            - name: restrict-access
              type: call
              call: okta.suspend-group
              with:
                user_id: "{{get-worker.work_email}}"
                group: "program-classified-{{clearance_type}}"
            - name: notify-employee
              type: call
              call: msteams.post-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your {{clearance_type}} clearance reinvestigation has been initiated. Ticket: {{create-reinvestigation.number}}. Contact FSO for next steps."
  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: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups/{{group}}/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
            - name: group
              in: path
          operations:
            - name: suspend-group
              method: DELETE
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: post-message
              method: POST

Aggregates pending ServiceNow change requests, creates a Confluence CAB agenda, schedules the review meeting via Teams, and notifies CAB members with change summaries.

naftiko: "0.5"
info:
  label: "ServiceNow Change Advisory Board Scheduler"
  description: "Aggregates pending ServiceNow change requests, creates a Confluence CAB agenda, schedules the review meeting via Teams, and notifies CAB members with change summaries."
  tags:
    - change-management
    - servicenow
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: trigger-cab-meeting
          description: "Given a CAB meeting date, aggregate pending ServiceNow changes, publish a Confluence agenda, and notify CAB members via Teams."
          inputParameters:
            - name: meeting_date
              in: body
              type: string
              description: "The CAB meeting date in YYYY-MM-DD format."
          steps:
            - name: get-pending-changes
              type: call
              call: servicenow.get-changes
              with:
                status: "pending_approval"
            - name: create-agenda
              type: call
              call: confluence.create-page
              with:
                space_key: "CAB"
                title: "CAB Agenda - {{meeting_date}}"
                body: "Pending changes: {{get-pending-changes.total_count}}. Review scheduled for {{meeting_date}}."
            - name: notify-cab
              type: call
              call: msteams.post-message
              with:
                channel_id: "cab-members"
                text: "CAB meeting {{meeting_date}}: {{get-pending-changes.total_count}} changes to review. Agenda: {{create-agenda.url}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=state=pending_approval"
          operations:
            - name: get-changes
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up a configuration item in the ServiceNow CMDB by asset tag or hostname, returning asset details, owner, classification, and support group for IT operations.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Looks up a configuration item in the ServiceNow CMDB by asset tag or hostname, returning asset details, owner, classification, and support group for IT operations."
  tags:
    - it-operations
    - servicenow
    - cmdb
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-asset-management
      port: 8080
      tools:
        - name: get-cmdb-ci
          description: "Given a ServiceNow asset tag or hostname, return the configuration item details including owner, support group, environment, and classification. Use for IT asset verification and incident triage."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The asset tag or hostname to look up."
          call: servicenow.get-ci
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: ci_name
              type: string
              mapping: "$.result[0].name"
            - name: owner
              type: string
              mapping: "$.result[0].owned_by.display_value"
            - name: support_group
              type: string
              mapping: "$.result[0].support_group.display_value"
            - name: environment
              type: string
              mapping: "$.result[0].u_environment"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: cmdb-ci
          path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: path
          operations:
            - name: get-ci
              method: GET

Creates a ServiceNow change request for IT infrastructure modifications in classified or sensitive environments, requiring security team sign-off before CAB approval.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request with Security Review"
  description: "Creates a ServiceNow change request for IT infrastructure modifications in classified or sensitive environments, requiring security team sign-off before CAB approval."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - security
capability:
  exposes:
    - type: mcp
      namespace: secure-change-mgmt
      port: 8080
      tools:
        - name: create-secure-change-request
          description: "Given a change description, environment classification, and implementation window, create a ServiceNow change request and notify the change advisory board and security review team via Teams. Use for all changes affecting classified or sensitive systems."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the planned change and business justification."
            - name: environment_class
              in: body
              type: string
              description: "Environment classification: unclassified, sensitive, or classified."
            - name: implementation_window
              in: body
              type: string
              description: "Planned maintenance window in ISO 8601 format."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "{{change_description}}"
                environment: "{{environment_class}}"
                start_date: "{{implementation_window}}"
            - name: notify-cab
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_cab_channel_id"
                text: "New Change Request {{create-cr.number}} [{{environment_class}}]: {{change_description}} | Window: {{implementation_window}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: post-message
              method: POST

After a major incident is resolved in ServiceNow, generates a postmortem report, publishes to Confluence, creates Jira follow-up actions, and distributes to stakeholders via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Postmortem Generator"
  description: "After a major incident is resolved in ServiceNow, generates a postmortem report, publishes to Confluence, creates Jira follow-up actions, and distributes to stakeholders via Teams."
  tags:
    - incident-management
    - servicenow
    - confluence
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-management
      port: 8080
      tools:
        - name: trigger-postmortem
          description: "Given a ServiceNow major incident number, generate a postmortem, publish to Confluence, create Jira follow-up items, and notify stakeholders via Teams."
          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:
                number: "{{incident_number}}"
            - name: publish-postmortem
              type: call
              call: confluence.create-page
              with:
                space_key: "POSTMORTEM"
                title: "Postmortem: {{incident_number}} - {{get-incident.short_description}}"
                body: "Duration: {{get-incident.duration}}. Root cause: {{get-incident.root_cause}}."
            - name: create-actions
              type: call
              call: jira.create-issue
              with:
                project: "FOLLOWUP"
                summary: "Post-incident actions: {{incident_number}}"
            - name: notify-stakeholders
              type: call
              call: msteams.post-message
              with:
                channel_id: "incident-postmortems"
                text: "Postmortem published for {{incident_number}}. Report: {{publish-postmortem.url}}. Follow-ups: {{create-actions.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lockheedmartin.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches a SharePoint document library for classified or CUI documents by filename or metadata, returning document location and classification markings.

naftiko: "0.5"
info:
  label: "SharePoint Classified Document Lookup"
  description: "Searches a SharePoint document library for classified or CUI documents by filename or metadata, returning document location and classification markings."
  tags:
    - document-management
    - sharepoint
    - security-clearance
    - itar
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: document-management
      port: 8080
      tools:
        - name: search-classified-docs
          description: "Given a search query and SharePoint site, return matching documents with their classification level, file path, and last modified date. Use for ITAR and CUI document retrieval."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: query
              in: body
              type: string
              description: "Search query for document name or metadata."
          call: sharepoint.search-docs
          with:
            site_id: "{{site_id}}"
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
            - name: total_count
              type: integer
              mapping: "$.@odata.count"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: site_id
              in: path
            - name: query
              in: path
          operations:
            - name: search-docs
              method: GET

Monitors Snowflake task execution for the program analytics, cost, and supply chain data pipelines, creates a ServiceNow incident if jobs fail, and alerts the data engineering team via Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Monitor"
  description: "Monitors Snowflake task execution for the program analytics, cost, and supply chain data pipelines, creates a ServiceNow incident if jobs fail, and alerts the data engineering team via Teams."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - monitoring
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-program-data-pipelines
          description: "Query Snowflake task execution history for failures in program analytics, EAC, and supply chain pipelines over the last N hours. Open a ServiceNow incident and alert the data engineering Teams channel if critical jobs have failed."
          inputParameters:
            - name: hours_back
              in: body
              type: integer
              description: "Number of hours of task history to check, e.g. 6."
          steps:
            - name: get-failed-tasks
              type: call
              call: snowflake.query-task-history
              with:
                hours_back: "{{hours_back}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Snowflake pipeline failures over last {{hours_back}} hours"
                category: "data_platform"
                priority: "2"
            - name: notify-data-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Snowflake pipeline failures detected (last {{hours_back}}h). SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lockheed-martin.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/statements"
          operations:
            - name: query-task-history
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Queries SAP S/4HANA for program-level cost actuals and writes a structured snapshot to Snowflake for program finance analytics and EAC reporting.

naftiko: "0.5"
info:
  label: "Snowflake Program Cost Analytics Snapshot"
  description: "Queries SAP S/4HANA for program-level cost actuals and writes a structured snapshot to Snowflake for program finance analytics and EAC reporting."
  tags:
    - finance
    - analytics
    - sap
    - snowflake
    - program-management
capability:
  exposes:
    - type: mcp
      namespace: program-finance-ops
      port: 8080
      tools:
        - name: capture-program-cost-snapshot
          description: "Given a SAP program WBS element and fiscal period, retrieve program cost actuals from SAP S/4HANA and write a timestamped snapshot to Snowflake for EAC and EVMS analytics. Use for daily program cost data ingestion."
          inputParameters:
            - name: wbs_element
              in: body
              type: string
              description: "The SAP WBS element code for the program, e.g. LM-F35-2025."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format."
          steps:
            - name: get-cost-actuals
              type: call
              call: sap.get-wbs-actuals
              with:
                wbs_element: "{{wbs_element}}"
                period: "{{fiscal_period}}"
            - name: write-to-snowflake
              type: call
              call: snowflake.insert-program-snapshot
              with:
                wbs: "{{wbs_element}}"
                period: "{{fiscal_period}}"
                data: "{{get-cost-actuals.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lockheed-martin-s4.sap.com/sap/opu/odata/sap/API_COPROJECTACTIVITYITEM_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: wbs-actuals
          path: "/A_EnterpriseProjectElement"
          operations:
            - name: get-wbs-actuals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lockheed-martin.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-program-snapshot
              method: POST

Triggers a Snowflake data pipeline refresh for program analytics, validates data quality thresholds, and sends a Datadog custom metric and Teams notification on completion.

naftiko: "0.5"
info:
  label: "Snowflake Program Data Refresh and Alert"
  description: "Triggers a Snowflake data pipeline refresh for program analytics, validates data quality thresholds, and sends a Datadog custom metric and Teams notification on completion."
  tags:
    - data-analytics
    - snowflake
    - datadog
    - microsoft-teams
    - data-pipeline
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: trigger-data-refresh
          description: "Given a Snowflake warehouse and pipeline name, trigger refresh, validate data quality, emit a Datadog metric, and notify the analytics team via Teams."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse name."
            - name: pipeline_name
              in: body
              type: string
              description: "The data pipeline name to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: snowflake.execute-task
              with:
                warehouse: "{{warehouse}}"
                task_name: "{{pipeline_name}}"
            - name: check-quality
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT COUNT(*) as row_count FROM {{pipeline_name}}_output"
            - name: emit-metric
              type: call
              call: datadog.post-metric
              with:
                metric: "pipeline.refresh.row_count"
                value: "{{check-quality.row_count}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "data-analytics"
                text: "Pipeline {{pipeline_name}} refreshed. Rows: {{check-quality.row_count}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-task
              method: POST
            - name: run-query
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/series"
          operations:
            - name: post-metric
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When SolarWinds detects network performance degradation on classified infrastructure, retrieves node metrics, creates a ServiceNow incident, and alerts the network operations team via Teams.

naftiko: "0.5"
info:
  label: "SolarWinds Network Performance Degradation Handler"
  description: "When SolarWinds detects network performance degradation on classified infrastructure, retrieves node metrics, creates a ServiceNow incident, and alerts the network operations team via Teams."
  tags:
    - network-operations
    - solarwinds
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-operations
      port: 8080
      tools:
        - name: trigger-perf-degradation
          description: "Given a SolarWinds node ID with performance degradation, retrieve metrics, create a ServiceNow incident, and alert network operations via Teams."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "The SolarWinds node ID."
            - name: metric_type
              in: body
              type: string
              description: "The degraded metric: latency, packet_loss, or bandwidth."
          steps:
            - name: get-metrics
              type: call
              call: solarwinds.get-node-metrics
              with:
                node_id: "{{node_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Network degradation: {{get-metrics.node_name}} - {{metric_type}}"
                impact: "2"
            - name: notify-netops
              type: call
              call: msteams.post-message
              with:
                channel_id: "network-ops"
                text: "Network degradation on {{get-metrics.node_name}}. {{metric_type}}: {{get-metrics.current_value}}. Ticket: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.lockheedmartin.com/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: nodes
          path: "/Query?query=SELECT+*+FROM+Orion.Nodes+WHERE+NodeID={{node_id}}"
          inputParameters:
            - name: node_id
              in: path
          operations:
            - name: get-node-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the status of a Tableau workbook or data extract refresh on Tableau Server, returning last refresh time and completion status for program reporting dashboards.

naftiko: "0.5"
info:
  label: "Tableau Defense Report Status Lookup"
  description: "Checks the status of a Tableau workbook or data extract refresh on Tableau Server, returning last refresh time and completion status for program reporting dashboards."
  tags:
    - analytics
    - tableau
    - defense
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-workbook-status
          description: "Given a Tableau workbook ID, return the last extract refresh time, status, and owner. Use for verifying defense program dashboard data freshness."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          call: tableau.get-workbook
          with:
            workbook_id: "{{workbook_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.workbook.name"
            - name: updated_at
              type: string
              mapping: "$.workbook.updatedAt"
            - name: owner
              type: string
              mapping: "$.workbook.owner.name"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.lockheedmartin.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbook_id}}"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: get-workbook
              method: GET

Orchestrates a Teradata to Snowflake data migration by extracting table data, loading into Snowflake, validating row counts, and notifying the data engineering team via Teams.

naftiko: "0.5"
info:
  label: "Teradata to Snowflake Data Migration Orchestrator"
  description: "Orchestrates a Teradata to Snowflake data migration by extracting table data, loading into Snowflake, validating row counts, and notifying the data engineering team via Teams."
  tags:
    - data-engineering
    - teradata
    - snowflake
    - microsoft-teams
    - data-migration
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: trigger-data-migration
          description: "Given a Teradata database and table name, extract data, load into Snowflake, validate counts, and notify the data engineering team."
          inputParameters:
            - name: source_database
              in: body
              type: string
              description: "The Teradata source database name."
            - name: table_name
              in: body
              type: string
              description: "The table name to migrate."
          steps:
            - name: extract-data
              type: call
              call: teradata.export-table
              with:
                database: "{{source_database}}"
                table: "{{table_name}}"
            - name: load-snowflake
              type: call
              call: snowflake.run-query
              with:
                query: "COPY INTO {{table_name}} FROM @teradata_stage/{{table_name}}.csv"
            - name: validate-counts
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT COUNT(*) as cnt FROM {{table_name}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "data-migration"
                text: "Migration complete: {{source_database}}.{{table_name}}. Source rows: {{extract-data.row_count}}. Target rows: {{validate-counts.cnt}}."
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://teradata.lockheedmartin.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.teradata_user"
        password: "$secrets.teradata_password"
      resources:
        - name: exports
          path: "/databases/{{database}}/tables/{{table}}/export"
          inputParameters:
            - name: database
              in: path
            - name: table
              in: path
          operations:
            - name: export-table
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.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: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new classified environment is requested, provisions a Terraform Cloud workspace, applies Azure Government infrastructure templates, creates a ServiceNow change record, and notifies the engineering team.

naftiko: "0.5"
info:
  label: "Terraform Classified Workspace Deployment"
  description: "When a new classified environment is requested, provisions a Terraform Cloud workspace, applies Azure Government infrastructure templates, creates a ServiceNow change record, and notifies the engineering team."
  tags:
    - infrastructure
    - terraform
    - azure
    - servicenow
    - microsoft-teams
    - classified-networks
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: trigger-classified-deployment
          description: "Given a workspace name and classification level, create a Terraform Cloud workspace, trigger Azure Gov infrastructure apply, log a ServiceNow change record, and notify engineering."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Name for the new Terraform workspace."
            - name: classification
              in: body
              type: string
              description: "Classification level: CUI, SECRET, or TOP_SECRET."
            - name: region
              in: body
              type: string
              description: "Azure Government region, e.g. usgovvirginia."
          steps:
            - name: create-workspace
              type: call
              call: terraform.create-workspace
              with:
                name: "{{workspace_name}}"
                auto_apply: "false"
            - name: trigger-apply
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{create-workspace.id}}"
                message: "Classified deployment: {{classification}} in {{region}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Terraform deployment: {{workspace_name}} ({{classification}})"
                category: "infrastructure"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "infra-deployments"
                text: "Classified workspace {{workspace_name}} created. Classification: {{classification}}. Change: {{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/lockheed-martin/workspaces"
          operations:
            - name: create-workspace
              method: POST
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_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: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates and configures a new Terraform Cloud workspace for secure government cloud infrastructure, links it to a GitHub repository, and notifies the cloud architecture team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Workspace Provisioning"
  description: "Creates and configures a new Terraform Cloud workspace for secure government cloud infrastructure, links it to a GitHub repository, and notifies the cloud architecture team via Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - github
    - microsoft-teams
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-secure-workspace
          description: "Given a workspace name, GitHub repository, and environment classification, create a Terraform Cloud workspace linked to the source repo and notify the cloud architecture team in Teams. Use when standing up new program or classified environment infrastructure."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "The name for the Terraform Cloud workspace in kebab-case."
            - name: github_repo
              in: body
              type: string
              description: "The GitHub repository URL to link to the workspace."
            - name: environment_class
              in: body
              type: string
              description: "Environment classification: unclassified, sensitive, or classified."
          steps:
            - name: create-workspace
              type: call
              call: terraform.create-workspace
              with:
                name: "{{workspace_name}}"
                vcs_repo: "{{github_repo}}"
            - name: notify-cloud-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_cloud_channel_id"
                text: "Terraform workspace '{{workspace_name}}' ({{environment_class}}) provisioned. ID: {{create-workspace.id}} | Repo: {{github_repo}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/lockheed-martin/workspaces"
          operations:
            - name: create-workspace
              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 virtual machine details from VMware vCenter by VM name, returning power state, resource allocation, and host placement for infrastructure capacity planning.

naftiko: "0.5"
info:
  label: "VMware VM Inventory Lookup"
  description: "Retrieves virtual machine details from VMware vCenter by VM name, returning power state, resource allocation, and host placement for infrastructure capacity planning."
  tags:
    - infrastructure
    - vmware
    - capacity-planning
    - classified-networks
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: get-vm-details
          description: "Given a VMware virtual machine name, return power state, CPU count, memory allocation, and host. Use for classified infrastructure capacity and compliance audits."
          inputParameters:
            - name: vm_name
              in: body
              type: string
              description: "The virtual machine name in vCenter."
          call: vmware.get-vm
          with:
            vm_name: "{{vm_name}}"
          outputParameters:
            - name: power_state
              type: string
              mapping: "$.value[0].power_state"
            - name: cpu_count
              type: integer
              mapping: "$.value[0].cpu_count"
            - name: memory_mb
              type: integer
              mapping: "$.value[0].memory_size_MiB"
  consumes:
    - type: http
      namespace: vmware
      baseUri: "https://vcenter.lockheedmartin.com/api/vcenter"
      authentication:
        type: bearer
        token: "$secrets.vmware_token"
      resources:
        - name: vms
          path: "/vm?filter.names={{vm_name}}"
          inputParameters:
            - name: vm_name
              in: path
          operations:
            - name: get-vm
              method: GET

Provisions a new VMware virtual machine for a classified program, registers it in ServiceNow CMDB, runs a STIG compliance scan, and notifies the infrastructure team via Teams.

naftiko: "0.5"
info:
  label: "VMware VM Provisioning and Compliance Check"
  description: "Provisions a new VMware virtual machine for a classified program, registers it in ServiceNow CMDB, runs a STIG compliance scan, and notifies the infrastructure team via Teams."
  tags:
    - infrastructure
    - vmware
    - servicenow
    - ansible
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: trigger-vm-provision
          description: "Given VM specifications and program classification, provision via vCenter, register in CMDB, run compliance scan, and notify the infrastructure team."
          inputParameters:
            - name: vm_name
              in: body
              type: string
              description: "The desired VM name."
            - name: cpu_count
              in: body
              type: string
              description: "Number of CPUs."
            - name: memory_gb
              in: body
              type: string
              description: "Memory in GB."
            - name: classification
              in: body
              type: string
              description: "Classification: CUI, SECRET, or TOP_SECRET."
          steps:
            - name: create-vm
              type: call
              call: vmware.create-vm
              with:
                name: "{{vm_name}}"
                cpu: "{{cpu_count}}"
                memory_mb: "{{memory_gb}}000"
            - name: register-cmdb
              type: call
              call: servicenow.create-ci
              with:
                name: "{{vm_name}}"
                category: "virtual_machine"
                classification: "{{classification}}"
            - name: run-compliance
              type: call
              call: ansible.launch-job
              with:
                template_id: "stig-scan"
                extra_vars: "target={{vm_name}}"
            - name: notify-infra
              type: call
              call: msteams.post-message
              with:
                channel_id: "infra-provisioning"
                text: "VM {{vm_name}} provisioned ({{classification}}). CMDB: {{register-cmdb.sys_id}}. STIG scan: {{run-compliance.id}}."
  consumes:
    - type: http
      namespace: vmware
      baseUri: "https://vcenter.lockheedmartin.com/api/vcenter"
      authentication:
        type: bearer
        token: "$secrets.vmware_token"
      resources:
        - name: vms
          path: "/vm"
          operations:
            - name: create-vm
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci_server"
          operations:
            - name: create-ci
              method: POST
    - type: http
      namespace: ansible
      baseUri: "https://ansible.lockheedmartin.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.ansible_token"
      resources:
        - name: jobs
          path: "/job_templates/{{template_id}}/launch/"
          inputParameters:
            - name: template_id
              in: path
          operations:
            - name: launch-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Initiates the annual compensation review by pulling headcount data from Workday, generating salary band analysis in Snowflake, publishing results to Power BI, and notifying HR leadership via Teams.

naftiko: "0.5"
info:
  label: "Workday Annual Compensation Review Orchestrator"
  description: "Initiates the annual compensation review by pulling headcount data from Workday, generating salary band analysis in Snowflake, publishing results to Power BI, and notifying HR leadership via Teams."
  tags:
    - hr
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: trigger-comp-review
          description: "Given a review cycle year and business unit, pull Workday headcount, run Snowflake salary analytics, refresh Power BI compensation dashboard, and notify HR leadership."
          inputParameters:
            - name: review_year
              in: body
              type: string
              description: "The compensation review year, e.g. 2026."
            - name: business_unit
              in: body
              type: string
              description: "The business unit code, e.g. AERO."
          steps:
            - name: get-headcount
              type: call
              call: workday.get-headcount
              with:
                business_unit: "{{business_unit}}"
                as_of_date: "{{review_year}}-01-01"
            - name: run-analysis
              type: call
              call: snowflake.run-query
              with:
                query: "CALL comp_review_analysis('{{business_unit}}', '{{review_year}}')"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "comp-review-{{business_unit}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "hr-leadership"
                text: "{{review_year}} compensation review for {{business_unit}} ready. Headcount: {{get-headcount.total}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/lockheed-martin/workers?business_unit={{business_unit}}"
          inputParameters:
            - name: business_unit
              in: path
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lockheedmartin.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: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

During open enrollment, pulls eligible employees from Workday, sends enrollment reminders via Teams, tracks completion in Jira, and generates a compliance report in Power BI.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Orchestrator"
  description: "During open enrollment, pulls eligible employees from Workday, sends enrollment reminders via Teams, tracks completion in Jira, and generates a compliance report in Power BI."
  tags:
    - hr
    - workday
    - jira
    - microsoft-teams
    - power-bi
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: trigger-enrollment-reminders
          description: "Given a benefits enrollment period and business unit, pull eligible employees from Workday, send reminders via Teams, track in Jira, and refresh the Power BI report."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "The enrollment period label, e.g. OE-2026."
            - name: business_unit
              in: body
              type: string
              description: "The business unit code."
          steps:
            - name: get-eligible
              type: call
              call: workday.get-benefits-eligible
              with:
                business_unit: "{{business_unit}}"
            - name: send-reminders
              type: call
              call: msteams.post-message
              with:
                channel_id: "hr-benefits"
                text: "Open enrollment {{enrollment_period}}: {{get-eligible.pending_count}} employees have not yet enrolled in {{business_unit}}."
            - name: create-tracker
              type: call
              call: jira.create-issue
              with:
                project: "HR"
                summary: "Benefits enrollment tracking: {{enrollment_period}} - {{business_unit}}"
            - name: refresh-report
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "benefits-enrollment"
  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: "/lockheed-martin/benefits/eligible?business_unit={{business_unit}}"
          inputParameters:
            - name: business_unit
              in: path
          operations:
            - name: get-benefits-eligible
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When a contractor is converted to full-time in Workday, provisions permanent Okta credentials, updates ServiceNow CMDB records, and initiates the security clearance process via Teams notification to FSO.

naftiko: "0.5"
info:
  label: "Workday Contractor to Employee Conversion Orchestrator"
  description: "When a contractor is converted to full-time in Workday, provisions permanent Okta credentials, updates ServiceNow CMDB records, and initiates the security clearance process via Teams notification to FSO."
  tags:
    - hr
    - workday
    - okta
    - servicenow
    - microsoft-teams
    - security-clearance
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: trigger-contractor-conversion
          description: "Given a Workday worker ID for a contractor-to-employee conversion, provision permanent Okta identity, update CMDB records, and notify FSO to initiate clearance processing."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID being converted."
            - name: target_clearance
              in: body
              type: string
              description: "Target clearance level for the converted employee."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: provision-okta
              type: call
              call: okta.create-user
              with:
                email: "{{get-worker.work_email}}"
                first_name: "{{get-worker.first_name}}"
                last_name: "{{get-worker.last_name}}"
            - name: update-cmdb
              type: call
              call: servicenow.update-ci
              with:
                user_email: "{{get-worker.work_email}}"
                employment_type: "FTE"
            - name: notify-fso
              type: call
              call: msteams.post-message
              with:
                channel_id: "fso-operations"
                text: "Contractor conversion: {{get-worker.full_name}} to FTE. Target clearance: {{target_clearance}}. Okta provisioned."
  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: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: update-ci
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves an employee profile from Workday by worker ID, returning name, title, department, clearance status, and manager for HR and program staffing inquiries.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, title, department, clearance status, and manager for HR and program staffing inquiries."
  tags:
    - hr
    - workday
    - program-management
    - staffing
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday worker ID, return employee name, job title, department, security clearance level, and direct manager. Use for program staffing verification and org chart queries."
          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.full_name"
            - name: job_title
              type: string
              mapping: "$.worker.job_title"
            - name: department
              type: string
              mapping: "$.worker.department"
            - name: clearance_level
              type: string
              mapping: "$.worker.clearance_level"
  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: "/lockheed-martin/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Retrieves active employee headcount grouped by program code and cost center from Workday to support DCAA labor cost allocation and government contract compliance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot for DCAA Compliance"
  description: "Retrieves active employee headcount grouped by program code and cost center from Workday to support DCAA labor cost allocation and government contract compliance reporting."
  tags:
    - hr
    - finance
    - workday
    - compliance
    - dcaa
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-compliance
      port: 8080
      tools:
        - name: get-program-headcount
          description: "Return active employee headcount grouped by program code and cost center from Workday. Used for DCAA labor cost allocation, indirect rate calculations, and government contract workforce reporting."
          call: workday.get-headcount
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  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: "/lockheed-martin/workers"
          operations:
            - name: get-headcount
              method: GET

When an engineering or program job requisition is approved in Workday, creates a Jira tracking issue for the program hiring team and notifies the HR and program management Teams channels.

naftiko: "0.5"
info:
  label: "Workday Job Requisition to Jira Program Tracker"
  description: "When an engineering or program job requisition is approved in Workday, creates a Jira tracking issue for the program hiring team and notifies the HR and program management Teams channels."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - microsoft-teams
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: sync-requisition-to-jira
          description: "Given a Workday job requisition ID for a cleared or program engineering role, create a Jira task for the hiring team and notify the HR and program Teams channels. Invoke when an approved requisition is confirmed in Workday."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: program_code
              in: body
              type: string
              description: "The associated program code for Jira project routing, e.g. F35."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Hire: {{get-requisition.job_title}} — Program {{program_code}}"
                description: "Req {{requisition_id}}: {{get-requisition.job_title}} | Clearance: {{get-requisition.clearance_required}} | Target: {{get-requisition.target_hire_date}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Req approved: {{get-requisition.job_title}} [{{program_code}}] | Jira: {{create-jira-task.key}} | Clearance: {{get-requisition.clearance_required}}"
  consumes:
    - 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: "/lockheed-martin/recruiting/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lockheed-martin.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks Workday Learning for overdue mandatory training assignments, creates ServiceNow compliance tickets for non-compliant employees, and sends escalation notifications to managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Checks Workday Learning for overdue mandatory training assignments, creates ServiceNow compliance tickets for non-compliant employees, and sends escalation notifications to managers via Teams."
  tags:
    - compliance
    - workday
    - servicenow
    - microsoft-teams
    - training
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: trigger-training-compliance
          description: "Given a training course ID and compliance deadline, check for overdue completions in Workday Learning, create ServiceNow tickets, and notify managers of non-compliant employees."
          inputParameters:
            - name: course_id
              in: body
              type: string
              description: "The Workday Learning course ID."
            - name: deadline
              in: body
              type: string
              description: "Compliance deadline in YYYY-MM-DD format."
          steps:
            - name: get-overdue
              type: call
              call: workday.get-learning-assignments
              with:
                course_id: "{{course_id}}"
                status: "overdue"
            - name: create-tickets
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Overdue training: {{course_id}} - {{get-overdue.overdue_count}} employees"
                category: "compliance"
            - name: notify-managers
              type: call
              call: msteams.post-message
              with:
                channel_id: "manager-alerts"
                text: "Training compliance alert: {{get-overdue.overdue_count}} employees overdue for course {{course_id}}. Deadline: {{deadline}}. Ticket: {{create-tickets.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: learning
          path: "/lockheed-martin/learning/assignments?course={{course_id}}"
          inputParameters:
            - name: course_id
              in: path
          operations:
            - name: get-learning-assignments
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When an organization restructure is approved in Workday, updates Okta group memberships, refreshes ServiceNow CMDB org structures, and notifies affected managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Organization Restructure Propagator"
  description: "When an organization restructure is approved in Workday, updates Okta group memberships, refreshes ServiceNow CMDB org structures, and notifies affected managers via Teams."
  tags:
    - hr
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: trigger-org-restructure
          description: "Given a Workday organization change event ID, propagate changes to Okta groups, update ServiceNow org structures, and notify affected managers."
          inputParameters:
            - name: org_change_id
              in: body
              type: string
              description: "The Workday organization change event ID."
          steps:
            - name: get-org-change
              type: call
              call: workday.get-org-change
              with:
                change_id: "{{org_change_id}}"
            - name: update-okta-groups
              type: call
              call: okta.update-groups
              with:
                org_unit: "{{get-org-change.new_org_unit}}"
                members: "{{get-org-change.affected_workers}}"
            - name: update-cmdb
              type: call
              call: servicenow.update-ci
              with:
                org_unit: "{{get-org-change.new_org_unit}}"
            - name: notify-managers
              type: call
              call: msteams.post-message
              with:
                channel_id: "hr-org-changes"
                text: "Organization restructure: {{get-org-change.description}}. Affected workers: {{get-org-change.worker_count}}. Okta and CMDB 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: org-changes
          path: "/lockheed-martin/organizationChanges/{{change_id}}"
          inputParameters:
            - name: change_id
              in: path
          operations:
            - name: get-org-change
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lockheedmartin.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: update-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://lockheedmartin.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: update-ci
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Initiates the annual engineering performance review cycle in Workday for all program-aligned engineers and sends kickoff reminders to engineering managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle for Engineers"
  description: "Initiates the annual engineering performance review cycle in Workday for all program-aligned engineers and sends kickoff reminders to engineering managers via Teams."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-engineering-review-cycle
          description: "Given a review cycle name and due date, initiate the Workday performance review process for engineering populations and notify engineering managers via Teams. Use at the start of the annual performance cycle."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "Name of the performance review cycle, e.g. 2025 Engineering Annual Review."
            - name: due_date
              in: body
              type: string
              description: "Review completion deadline in YYYY-MM-DD format."
          steps:
            - name: start-cycle
              type: call
              call: workday.create-review-cycle
              with:
                name: "{{cycle_name}}"
                dueDate: "{{due_date}}"
                population: "engineering"
            - name: notify-managers
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Engineering Performance Review '{{cycle_name}}' launched in Workday. Complete reviews by {{due_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/lockheed-martin/performanceManagement/reviewCycles"
          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: post-message
              method: POST

When a new job requisition is approved in Workday, creates a LinkedIn job posting, generates a Jira recruiting task, and notifies the talent acquisition team via Teams.

naftiko: "0.5"
info:
  label: "Workday Requisition to LinkedIn Job Posting"
  description: "When a new job requisition is approved in Workday, creates a LinkedIn job posting, generates a Jira recruiting task, and notifies the talent acquisition team via Teams."
  tags:
    - talent-acquisition
    - workday
    - linkedin
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: trigger-job-posting
          description: "Given a Workday requisition ID, create a LinkedIn job posting, generate a Jira recruiting task, and notify the talent acquisition team."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-linkedin
              type: call
              call: linkedin.create-job
              with:
                title: "{{get-requisition.job_title}}"
                location: "{{get-requisition.location}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project: "RECRUIT"
                summary: "Recruiting: {{get-requisition.job_title}} ({{get-requisition.location}})"
            - name: notify-ta
              type: call
              call: msteams.post-message
              with:
                channel_id: "talent-acquisition"
                text: "New posting: {{get-requisition.job_title}} in {{get-requisition.location}}. Jira: {{create-jira-task.key}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/lockheed-martin/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: jobs
          path: "/simpleJobPostings"
          operations:
            - name: create-job
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lockheedmartin.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST