American Airlines Capabilities

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

Sort
Expand

Retrieves an AAdvantage member's loyalty tier, LP balance, and qualification status.

naftiko: "0.5"
info:
  label: "AAdvantage Member Tier Lookup"
  description: "Retrieves an AAdvantage member's loyalty tier, LP balance, and qualification status."
  tags:
    - customer-service
    - loyalty
    - aadvantage
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: get-member-tier
          description: "Look up AAdvantage member status."
          inputParameters:
            - name: aadvantage_number
              in: body
              type: string
              description: "AAdvantage number."
          call: "loyalty-api.get-member"
          with:
            member_id: "{{aadvantage_number}}"
          outputParameters:
            - name: tier
              type: string
              mapping: "$.currentTier"
            - name: lp_balance
              type: number
              mapping: "$.lpBalance"
  consumes:
    - type: http
      namespace: loyalty-api
      baseUri: "https://loyalty.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_loyalty_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET

Creates ADA accommodation request for passengers with disabilities.

naftiko: "0.5"
info:
  label: "ADA Accommodation Request"
  description: "Creates ADA accommodation request for passengers with disabilities."
  tags:
    - customer-service
    - accessibility
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: ada
      port: 8080
      tools:
        - name: request-ada
          description: "Submit ADA request."
          inputParameters:
            - name: pnr
              in: body
              type: string
            - name: type
              in: body
              type: string
            - name: station
              in: body
              type: string
          call: "ground-ops.create-ada"
          with:
            pnr: "{{pnr}}"
            type: "{{type}}"
            station: "{{station}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: ada
          path: "/ada/request"
          operations:
            - name: create-ada
              method: POST

Checks current Admirals Club lounge occupancy and availability.

naftiko: "0.5"
info:
  label: "Admirals Club Capacity Check"
  description: "Checks current Admirals Club lounge occupancy and availability."
  tags:
    - customer-service
    - lounge
    - ground-ops
capability:
  exposes:
    - type: mcp
      namespace: lounge
      port: 8080
      tools:
        - name: check-capacity
          description: "Check Admirals Club capacity."
          inputParameters:
            - name: station
              in: body
              type: string
            - name: terminal
              in: body
              type: string
          call: "lounge-api.get-capacity"
          with:
            station: "{{station}}"
            terminal: "{{terminal}}"
          outputParameters:
            - name: occupancy
              type: number
              mapping: "$.currentOccupancy"
            - name: capacity
              type: number
              mapping: "$.maxCapacity"
  consumes:
    - type: http
      namespace: lounge-api
      baseUri: "https://lounges.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_lounge_token"
      resources:
        - name: capacity
          path: "/clubs/{{station}}/{{terminal}}"
          inputParameters:
            - name: station
              in: path
            - name: terminal
              in: path
          operations:
            - name: get-capacity
              method: GET

Queries Adobe Analytics for a significant traffic spike or drop on a key page, and publishes a structured digest to the digital analytics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Adobe Analytics Traffic Anomaly Digest"
  description: "Queries Adobe Analytics for a significant traffic spike or drop on a key page, and publishes a structured digest to the digital analytics team in Microsoft Teams."
  tags:
    - analytics
    - adobe-analytics
    - microsoft-teams
    - reporting
    - traffic-monitoring
capability:
  exposes:
    - type: mcp
      namespace: digital-analytics
      port: 8080
      tools:
        - name: digest-traffic-anomaly
          description: "Given an Adobe Analytics report suite ID, a date range, and a page segment, retrieve page-level traffic metrics and post an anomaly digest to Microsoft Teams."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID, e.g. aaairlinesprod."
            - name: page_name
              in: body
              type: string
              description: "Page name or segment to evaluate for the traffic anomaly."
            - name: date_range
              in: body
              type: string
              description: "Date range in ISO-8601 format, e.g. 2025-03-01/2025-03-07."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the digest to."
          steps:
            - name: run-report
              type: call
              call: "adobe-analytics.run-ranked-report"
              with:
                rsid: "{{report_suite_id}}"
                dimension: "page"
                filter: "{{page_name}}"
                dateRange: "{{date_range}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "TRAFFIC ANOMALY DIGEST: {{report_suite_id}} | Page: {{page_name}} | Range: {{date_range}} | Visits: {{run-report.totalVisits}} | Bounce Rate: {{run-report.bounceRate}}% | Revenue Impact: {{run-report.revenue}}"
  consumes:
    - namespace: adobe-analytics
      type: http
      baseUri: "https://analytics.adobe.io/api/americanairlines/reports"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: ranked-report
          path: "/ranked"
          operations:
            - name: run-ranked-report
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the delivery status for an Adobe Campaign email broadcast and posts a performance summary to the marketing team channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Adobe Campaign Email Delivery Status Check"
  description: "Retrieves the delivery status for an Adobe Campaign email broadcast and posts a performance summary to the marketing team channel in Microsoft Teams."
  tags:
    - marketing
    - adobe-campaign
    - microsoft-teams
    - email-delivery
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: get-delivery-status
          description: "Given an Adobe Campaign delivery ID, retrieve delivery statistics and post a formatted status report to Microsoft Teams. Use to monitor in-flight or completed email campaigns."
          inputParameters:
            - name: delivery_id
              in: body
              type: string
              description: "Adobe Campaign delivery ID, e.g. DM1234."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the delivery status summary."
          steps:
            - name: get-delivery
              type: call
              call: "adobe-campaign.get-delivery"
              with:
                delivery_id: "{{delivery_id}}"
            - name: post-status
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "DELIVERY STATUS: {{get-delivery.label}} | Status: {{get-delivery.status}} | Sent: {{get-delivery.successCount}} | Failed: {{get-delivery.failureCount}} | Opens: {{get-delivery.trackingUrlCount}} | ID: {{delivery_id}}"
  consumes:
    - namespace: adobe-campaign
      type: http
      baseUri: "https://mc.adobe.io/americanairlines/campaign/datapackage"
      authentication:
        type: bearer
        token: "$secrets.adobe_campaign_token"
      resources:
        - name: delivery
          path: "/nms:delivery/{delivery_id}"
          inputParameters:
            - name: delivery_id
              in: path
          operations:
            - name: get-delivery
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries an ML training job status from the Kubeflow Pipelines API and posts a structured digest to the data science team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "AI Model Training Run Status Digest"
  description: "Queries an ML training job status from the Kubeflow Pipelines API and posts a structured digest to the data science team in Microsoft Teams."
  tags:
    - ai
    - ml
    - kubeflow
    - microsoft-teams
    - model-training
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: digest-training-run
          description: "Given a Kubeflow pipeline run ID, retrieve run status, duration, and step results, then post a model training digest to the data science Teams channel."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Kubeflow Pipelines run ID (UUID)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the ML digest."
          steps:
            - name: get-run
              type: call
              call: "kubeflow.get-run"
              with:
                run_id: "{{run_id}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "ML TRAINING DIGEST: Run {{run_id}} | Pipeline: {{get-run.pipeline_spec.name}} | Status: {{get-run.run.status}} | Duration: {{get-run.run.duration}} | Finished: {{get-run.run.finished_at}}"
  consumes:
    - namespace: kubeflow
      type: http
      baseUri: "https://kubeflow.aa.com/pipeline/apis/v1beta1"
      authentication:
        type: bearer
        token: "$secrets.kubeflow_token"
      resources:
        - name: run
          path: "/runs/{run_id}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves maintenance status, open MEL items, and next check for an AA aircraft.

naftiko: "0.5"
info:
  label: "Aircraft Maintenance Status"
  description: "Retrieves maintenance status, open MEL items, and next check for an AA aircraft."
  tags:
    - maintenance
    - flight-operations
    - safety
capability:
  exposes:
    - type: mcp
      namespace: mx
      port: 8080
      tools:
        - name: get-mx-status
          description: "Check aircraft maintenance status."
          inputParameters:
            - name: tail_number
              in: body
              type: string
              description: "Tail number."
          call: "mx-api.get-status"
          with:
            tail: "{{tail_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.maintenanceStatus"
            - name: open_items
              type: array
              mapping: "$.openMELItems"
            - name: next_check
              type: string
              mapping: "$.nextCheck"
  consumes:
    - type: http
      namespace: mx-api
      baseUri: "https://maintenance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: aircraft
          path: "/aircraft/{{tail}}/status"
          inputParameters:
            - name: tail
              in: path
          operations:
            - name: get-status
              method: GET

Executes aircraft swap by finding replacement, updating records, recalculating W&B, and notifying ops.

naftiko: "0.5"
info:
  label: "Aircraft Swap Orchestrator"
  description: "Executes aircraft swap by finding replacement, updating records, recalculating W&B, and notifying ops."
  tags:
    - flight-operations
    - dispatch
    - fleet-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: swap
      port: 8080
      tools:
        - name: execute-swap
          description: "Execute aircraft swap."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: original_tail
              in: body
              type: string
            - name: station
              in: body
              type: string
          steps:
            - name: find
              type: call
              call: "fleet-api.find-available"
              with:
                station: "{{station}}"
            - name: update
              type: call
              call: "pss.update-aircraft"
              with:
                flight: "{{flight_number}}"
                tail: "{{find.tail_number}}"
            - name: recalc
              type: call
              call: "dispatch-api.recalc-wb"
              with:
                flight: "{{flight_number}}"
                tail: "{{find.tail_number}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel}}"
                text: "Swap: {{flight_number}} {{original_tail}} -> {{find.tail_number}}"
  consumes:
    - type: http
      namespace: fleet-api
      baseUri: "https://fleet.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_fleet_token"
      resources:
        - name: available
          path: "/aircraft/available"
          operations:
            - name: find-available
              method: POST
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: aircraft
          path: "/flights/{{flight}}/aircraft"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: update-aircraft
              method: PUT
    - type: http
      namespace: dispatch-api
      baseUri: "https://dispatch.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: wb
          path: "/weight-balance/recalc"
          operations:
            - name: recalc-wb
              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-channel-message
              method: POST

Coordinates turnaround including fueling, ground crew, catering, and cleaning at AA hubs.

naftiko: "0.5"
info:
  label: "Aircraft Turnaround Orchestrator"
  description: "Coordinates turnaround including fueling, ground crew, catering, and cleaning at AA hubs."
  tags:
    - ground-ops
    - flight-operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: turnaround
      port: 8080
      tools:
        - name: coordinate-turnaround
          description: "Initiate turnaround activities."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: gate
              in: body
              type: string
              description: "Gate."
            - name: station
              in: body
              type: string
              description: "Station (DFW, CLT, MIA, ORD, PHX, PHL, LAX)."
          steps:
            - name: request-fuel
              type: call
              call: "ground-ops.create-fuel-request"
              with:
                flight: "{{flight_number}}"
                gate: "{{gate}}"
            - name: dispatch-crew
              type: call
              call: "ground-ops.dispatch-crew"
              with:
                gate: "{{gate}}"
                station: "{{station}}"
            - name: order-catering
              type: call
              call: "catering-api.create-order"
              with:
                flight: "{{flight_number}}"
                station: "{{station}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel}}"
                text: "Turnaround initiated: {{flight_number}} at gate {{gate}} ({{station}})"
  consumes:
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: fuel
          path: "/fueling/request"
          operations:
            - name: create-fuel-request
              method: POST
        - name: crew
          path: "/crew/dispatch"
          operations:
            - name: dispatch-crew
              method: POST
    - type: http
      namespace: catering-api
      baseUri: "https://catering.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_catering_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves ancillary revenue for a booking.

naftiko: "0.5"
info:
  label: "Ancillary Revenue Lookup"
  description: "Retrieves ancillary revenue for a booking."
  tags:
    - revenue-management
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: ancillary
      port: 8080
      tools:
        - name: get-ancillary
          description: "Get ancillary revenue."
          inputParameters:
            - name: pnr
              in: body
              type: string
          call: "analytics-api.get-ancillaries"
          with:
            pnr: "{{pnr}}"
          outputParameters:
            - name: total
              type: number
              mapping: "$.total"
            - name: items
              type: array
              mapping: "$.items"
  consumes:
    - type: http
      namespace: analytics-api
      baseUri: "https://analytics.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: ancillaries
          path: "/bookings/{{pnr}}/ancillaries"
          inputParameters:
            - name: pnr
              in: path
          operations:
            - name: get-ancillaries
              method: GET

When aircraft is grounded, searches parts network, arranges shipping, and notifies maintenance.

naftiko: "0.5"
info:
  label: "AOG Parts Expedite Orchestrator"
  description: "When aircraft is grounded, searches parts network, arranges shipping, and notifies maintenance."
  tags:
    - maintenance
    - logistics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: aog
      port: 8080
      tools:
        - name: expedite-part
          description: "Expedite AOG part."
          inputParameters:
            - name: part_number
              in: body
              type: string
            - name: tail_number
              in: body
              type: string
            - name: station
              in: body
              type: string
          steps:
            - name: search
              type: call
              call: "parts-api.search-network"
              with:
                part: "{{part_number}}"
            - name: ship
              type: call
              call: "logistics-api.expedite"
              with:
                part: "{{part_number}}"
                from: "{{search.closest}}"
                to: "{{station}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{mx_channel}}"
                text: "AOG: {{part_number}} for {{tail_number}} at {{station}} | ETA: {{ship.eta}}"
  consumes:
    - type: http
      namespace: parts-api
      baseUri: "https://maintenance.aa.com/api/v1/parts"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: search
          path: "/search/network"
          operations:
            - name: search-network
              method: POST
    - type: http
      namespace: logistics-api
      baseUri: "https://logistics.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_logistics_token"
      resources:
        - name: expedite
          path: "/shipments/expedite"
          operations:
            - name: expedite
              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-channel-message
              method: POST

Executes a parameterized KQL query against Azure Log Analytics and returns structured results for use in incident triage or anomaly detection workflows.

naftiko: "0.5"
info:
  label: "Azure Log Analytics Observability Query"
  description: "Executes a parameterized KQL query against Azure Log Analytics and returns structured results for use in incident triage or anomaly detection workflows."
  tags:
    - observability
    - azure-log-analytics
    - cloud
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: log-analytics
      port: 8080
      tools:
        - name: run-log-query
          description: "Given a KQL query string and time range, execute it against the American Airlines Azure Log Analytics workspace and return structured rows. Use when investigating service anomalies or building observability reports."
          inputParameters:
            - name: kql_query
              in: body
              type: string
              description: "KQL query to execute against Azure Log Analytics."
            - name: timespan
              in: body
              type: string
              description: "ISO-8601 timespan, e.g. PT1H for last hour or P7D for last 7 days."
          call: "azurelogs.run-query"
          with:
            query: "{{kql_query}}"
            timespan: "{{timespan}}"
          outputParameters:
            - name: rows
              type: array
              mapping: "$.tables[0].rows"
            - name: columns
              type: array
              mapping: "$.tables[0].columns"
  consumes:
    - namespace: azurelogs
      type: http
      baseUri: "https://api.loganalytics.io/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_log_analytics_token"
      resources:
        - name: query
          path: "/workspaces/{workspace_id}/query"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: run-query
              method: POST

Retrieves baggage claim carousel and delivery status for a flight arrival.

naftiko: "0.5"
info:
  label: "Baggage Claim Lookup"
  description: "Retrieves baggage claim carousel and delivery status for a flight arrival."
  tags:
    - customer-service
    - baggage
    - ground-ops
capability:
  exposes:
    - type: mcp
      namespace: baggage
      port: 8080
      tools:
        - name: get-claim
          description: "Look up baggage claim for a flight."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: station
              in: body
              type: string
              description: "Arrival airport."
          call: "baggage-api.get-claim"
          with:
            flight: "{{flight_number}}"
            station: "{{station}}"
          outputParameters:
            - name: carousel
              type: string
              mapping: "$.carousel"
            - name: status
              type: string
              mapping: "$.deliveryStatus"
  consumes:
    - type: http
      namespace: baggage-api
      baseUri: "https://baggage.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_baggage_token"
      resources:
        - name: claims
          path: "/claim/{{flight}}"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-claim
              method: GET

Tracks boarding progress for a flight showing scanned passengers and boarding group status.

naftiko: "0.5"
info:
  label: "Boarding Process Tracker"
  description: "Tracks boarding progress for a flight showing scanned passengers and boarding group status."
  tags:
    - ground-ops
    - flight-operations
    - tracking
capability:
  exposes:
    - type: mcp
      namespace: boarding
      port: 8080
      tools:
        - name: get-boarding
          description: "Get boarding progress."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: gate
              in: body
              type: string
              description: "Gate."
          call: "gate-api.get-boarding"
          with:
            flight: "{{flight_number}}"
            gate: "{{gate}}"
          outputParameters:
            - name: boarded
              type: number
              mapping: "$.boarded"
            - name: expected
              type: number
              mapping: "$.expected"
            - name: group
              type: string
              mapping: "$.currentGroup"
  consumes:
    - type: http
      namespace: gate-api
      baseUri: "https://groundops.aa.com/api/v1/gates"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: boarding
          path: "/{{gate}}/boarding"
          inputParameters:
            - name: gate
              in: path
          operations:
            - name: get-boarding
              method: GET

Creates a new AA Cargo booking with routing and commodity details.

naftiko: "0.5"
info:
  label: "Cargo Booking Creation"
  description: "Creates a new AA Cargo booking with routing and commodity details."
  tags:
    - cargo
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: cargo-booking
      port: 8080
      tools:
        - name: create-booking
          description: "Create cargo booking."
          inputParameters:
            - name: shipper
              in: body
              type: string
              description: "Shipper."
            - name: origin
              in: body
              type: string
              description: "Origin."
            - name: destination
              in: body
              type: string
              description: "Destination."
            - name: weight_kg
              in: body
              type: number
              description: "Weight."
          call: "cargo-api.create-booking"
          with:
            shipper: "{{shipper}}"
            origin: "{{origin}}"
            destination: "{{destination}}"
            weight: "{{weight_kg}}"
          outputParameters:
            - name: booking_id
              type: string
              mapping: "$.bookingId"
            - name: awb
              type: string
              mapping: "$.awbNumber"
  consumes:
    - type: http
      namespace: cargo-api
      baseUri: "https://cargo.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_cargo_token"
      resources:
        - name: bookings
          path: "/bookings"
          operations:
            - name: create-booking
              method: POST

Generates daily AA Cargo revenue summary.

naftiko: "0.5"
info:
  label: "Cargo Revenue Daily Summary"
  description: "Generates daily AA Cargo revenue summary."
  tags:
    - cargo
    - revenue-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: cargo-rev
      port: 8080
      tools:
        - name: get-summary
          description: "Get daily cargo revenue."
          inputParameters:
            - name: date
              in: body
              type: string
          call: "cargo-api.get-daily"
          with:
            date: "{{date}}"
          outputParameters:
            - name: revenue
              type: number
              mapping: "$.totalRevenue"
            - name: shipments
              type: number
              mapping: "$.totalShipments"
  consumes:
    - type: http
      namespace: cargo-api
      baseUri: "https://cargo.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_cargo_token"
      resources:
        - name: daily
          path: "/analytics/daily"
          operations:
            - name: get-daily
              method: POST

Retrieves tracking status for an AA Cargo shipment by air waybill number.

naftiko: "0.5"
info:
  label: "Cargo Shipment Tracking"
  description: "Retrieves tracking status for an AA Cargo shipment by air waybill number."
  tags:
    - cargo
    - logistics
    - tracking
capability:
  exposes:
    - type: mcp
      namespace: cargo
      port: 8080
      tools:
        - name: track-cargo
          description: "Track AA Cargo shipment."
          inputParameters:
            - name: awb_number
              in: body
              type: string
              description: "Air waybill."
          call: "cargo-api.get-tracking"
          with:
            awb: "{{awb_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: location
              type: string
              mapping: "$.currentLocation"
            - name: eta
              type: string
              mapping: "$.eta"
  consumes:
    - type: http
      namespace: cargo-api
      baseUri: "https://cargo.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_cargo_token"
      resources:
        - name: tracking
          path: "/tracking/{{awb}}"
          inputParameters:
            - name: awb
              in: path
          operations:
            - name: get-tracking
              method: GET

Creates or updates catering orders for flight departures.

naftiko: "0.5"
info:
  label: "Catering Order Management"
  description: "Creates or updates catering orders for flight departures."
  tags:
    - catering
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: catering
      port: 8080
      tools:
        - name: manage-catering
          description: "Manage catering order."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: station
              in: body
              type: string
            - name: meal_counts
              in: body
              type: string
          call: "catering-api.upsert"
          with:
            flight: "{{flight_number}}"
            station: "{{station}}"
            meals: "{{meal_counts}}"
          outputParameters:
            - name: order_id
              type: string
              mapping: "$.orderId"
  consumes:
    - type: http
      namespace: catering-api
      baseUri: "https://catering.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_catering_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: upsert
              method: PUT

When a TeamCity or GitHub Actions build fails on a protected branch, creates a Datadog deployment marker, opens a GitHub issue, and alerts the engineering channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Triage"
  description: "When a TeamCity or GitHub Actions build fails on a protected branch, creates a Datadog deployment marker, opens a GitHub issue, and alerts the engineering channel in Microsoft Teams."
  tags:
    - devops
    - cicd
    - incident-response
    - datadog
    - github
    - teamcity
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a failed pipeline's project key, branch, commit SHA, and job name, annotate Datadog, open a GitHub issue, and post a Teams alert to the engineering channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The repository or project identifier, e.g. aa-reservations."
            - name: branch
              in: body
              type: string
              description: "Git branch that failed, e.g. main."
            - name: commit_sha
              in: body
              type: string
              description: "Full commit SHA of the failing build."
            - name: job_name
              in: body
              type: string
              description: "Name of the specific build job that failed."
            - name: log_url
              in: body
              type: string
              description: "URL to the full build log."
          steps:
            - name: create-marker
              type: call
              call: "datadog.create-event"
              with:
                title: "Build Failure: {{project_key}} / {{branch}}"
                text: "Job {{job_name}} failed at commit {{commit_sha}}. Log: {{log_url}}"
                alert_type: "error"
                tags: "project:{{project_key}},branch:{{branch}}"
            - name: open-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "{{project_key}}"
                title: "[CI FAILURE] {{branch}} — {{job_name}}"
                body: "Commit: {{commit_sha}}\nBranch: {{branch}}\nJob: {{job_name}}\nLog: {{log_url}}\nDatadog event: {{create-marker.url}}"
                labels: "ci-failure,needs-triage"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.engineering_teams_channel_id"
                message: "BUILD FAILURE: {{project_key}} | Branch: {{branch}} | Job: {{job_name}} | Commit: {{commit_sha}} | Issue: {{open-issue.html_url}}"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes complaints via Salesforce, checks AAdvantage tier, determines compensation, and sends resolution.

naftiko: "0.5"
info:
  label: "Customer Complaint Resolution Orchestrator"
  description: "Processes complaints via Salesforce, checks AAdvantage tier, determines compensation, and sends resolution."
  tags:
    - customer-service
    - salesforce
    - loyalty
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: complaints
      port: 8080
      tools:
        - name: resolve-complaint
          description: "Process customer complaint."
          inputParameters:
            - name: aadvantage_number
              in: body
              type: string
              description: "AAdvantage number."
            - name: complaint_type
              in: body
              type: string
              description: "Type."
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: description
              in: body
              type: string
              description: "Description."
          steps:
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "{{complaint_type}} — {{flight_number}}"
                description: "{{description}}"
            - name: check-tier
              type: call
              call: "loyalty-api.get-member"
              with:
                member_id: "{{aadvantage_number}}"
            - name: compensate
              type: call
              call: "loyalty-api.issue-credit"
              with:
                member: "{{aadvantage_number}}"
                type: "{{complaint_type}}"
            - name: notify
              type: call
              call: "notification-api.send-email"
              with:
                member: "{{aadvantage_number}}"
                template: "complaint_resolution"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://aa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: loyalty-api
      baseUri: "https://loyalty.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_loyalty_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET
        - name: credits
          path: "/members/{{member}}/credits"
          inputParameters:
            - name: member
              in: path
          operations:
            - name: issue-credit
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: email
          path: "/email/send"
          operations:
            - name: send-email
              method: POST

Monitors tight connections at AA hubs and identifies at-risk passengers.

naftiko: "0.5"
info:
  label: "Passenger Connection Monitor"
  description: "Monitors tight connections at AA hubs and identifies at-risk passengers."
  tags:
    - customer-service
    - flight-operations
    - connections
capability:
  exposes:
    - type: mcp
      namespace: connections
      port: 8080
      tools:
        - name: check-connections
          description: "Identify tight connections."
          inputParameters:
            - name: hub
              in: body
              type: string
              description: "Hub."
            - name: threshold
              in: body
              type: number
              description: "Minutes threshold."
          call: "pss.get-tight-connections"
          with:
            station: "{{hub}}"
            threshold: "{{threshold}}"
          outputParameters:
            - name: at_risk
              type: array
              mapping: "$.atRiskPassengers"
            - name: total
              type: number
              mapping: "$.totalAtRisk"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: connections
          path: "/connections/at-risk"
          operations:
            - name: get-tight-connections
              method: POST

Retrieves assigned crew for a specific AA flight.

naftiko: "0.5"
info:
  label: "Flight Crew Assignment Lookup"
  description: "Retrieves assigned crew for a specific AA flight."
  tags:
    - crew-scheduling
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: crew-roster
      port: 8080
      tools:
        - name: get-crew
          description: "Get crew assignment."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: flight_date
              in: body
              type: string
          call: "crew-api.get-assignment"
          with:
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: captain
              type: string
              mapping: "$.captain.name"
            - name: cabin_crew
              type: array
              mapping: "$.cabinCrew"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: assignments
          path: "/flights/{{flight}}/crew"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-assignment
              method: GET

Generates monthly crew bid packages with pairings and credit values.

naftiko: "0.5"
info:
  label: "Crew Bid Package Generation"
  description: "Generates monthly crew bid packages with pairings and credit values."
  tags:
    - crew-scheduling
    - operations
capability:
  exposes:
    - type: mcp
      namespace: bidding
      port: 8080
      tools:
        - name: generate-bids
          description: "Generate bid package."
          inputParameters:
            - name: base
              in: body
              type: string
            - name: position
              in: body
              type: string
            - name: month
              in: body
              type: string
          call: "crew-api.generate-bids"
          with:
            base: "{{base}}"
            position: "{{position}}"
            month: "{{month}}"
          outputParameters:
            - name: package_id
              type: string
              mapping: "$.packageId"
            - name: pairings
              type: number
              mapping: "$.totalPairings"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: bids
          path: "/bidding/generate"
          operations:
            - name: generate-bids
              method: POST

Verifies crew member FAA duty time compliance against Part 117 limits.

naftiko: "0.5"
info:
  label: "Crew Duty Time Compliance Check"
  description: "Verifies crew member FAA duty time compliance against Part 117 limits."
  tags:
    - crew-scheduling
    - compliance
    - safety
capability:
  exposes:
    - type: mcp
      namespace: crew-compliance
      port: 8080
      tools:
        - name: check-duty-time
          description: "Check crew duty time compliance."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "crew-api.get-duty-status"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: remaining_hours
              type: number
              mapping: "$.remainingLegalHours"
            - name: compliant
              type: boolean
              mapping: "$.isCompliant"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: duty
          path: "/crew/{{employee_id}}/duty-status"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-duty-status
              method: GET

Books crew layover hotels, arranges transport, and notifies crew.

naftiko: "0.5"
info:
  label: "Crew Hotel Booking Orchestrator"
  description: "Books crew layover hotels, arranges transport, and notifies crew."
  tags:
    - crew-scheduling
    - logistics
    - operations
capability:
  exposes:
    - type: mcp
      namespace: crew-hotels
      port: 8080
      tools:
        - name: book-hotel
          description: "Book crew hotel."
          inputParameters:
            - name: crew_count
              in: body
              type: number
            - name: station
              in: body
              type: string
            - name: trip_id
              in: body
              type: string
          steps:
            - name: check
              type: call
              call: "hotel-api.check-availability"
              with:
                station: "{{station}}"
                rooms: "{{crew_count}}"
            - name: book
              type: call
              call: "hotel-api.book-rooms"
              with:
                hotel: "{{check.hotel_id}}"
                rooms: "{{crew_count}}"
            - name: van
              type: call
              call: "transport-api.book-van"
              with:
                station: "{{station}}"
                hotel: "{{check.hotel_id}}"
            - name: notify
              type: call
              call: "crew-comms.send-update"
              with:
                trip_id: "{{trip_id}}"
                message: "Hotel: {{check.hotel_name}} | Conf: {{book.confirmation}}"
  consumes:
    - type: http
      namespace: hotel-api
      baseUri: "https://crew-services.aa.com/api/v1/hotels"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_services_token"
      resources:
        - name: availability
          path: "/availability"
          operations:
            - name: check-availability
              method: POST
        - name: bookings
          path: "/bookings"
          operations:
            - name: book-rooms
              method: POST
    - type: http
      namespace: transport-api
      baseUri: "https://crew-services.aa.com/api/v1/transport"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_services_token"
      resources:
        - name: vans
          path: "/crew-van/book"
          operations:
            - name: book-van
              method: POST
    - type: http
      namespace: crew-comms
      baseUri: "https://crew.aa.com/api/v1/comms"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: updates
          path: "/trips/{{trip_id}}/notify"
          inputParameters:
            - name: trip_id
              in: path
          operations:
            - name: send-update
              method: POST

Checks crew travel document validity for international assignments.

naftiko: "0.5"
info:
  label: "Crew Passport and Visa Check"
  description: "Checks crew travel document validity for international assignments."
  tags:
    - crew-scheduling
    - compliance
    - international
capability:
  exposes:
    - type: mcp
      namespace: crew-docs
      port: 8080
      tools:
        - name: check-docs
          description: "Verify crew documents."
          inputParameters:
            - name: employee_id
              in: body
              type: string
            - name: country
              in: body
              type: string
          call: "crew-api.check-docs"
          with:
            employee: "{{employee_id}}"
            country: "{{country}}"
          outputParameters:
            - name: passport_valid
              type: boolean
              mapping: "$.passportValid"
            - name: visa_valid
              type: boolean
              mapping: "$.visaValid"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: docs
          path: "/crew/{{employee}}/documents/check"
          inputParameters:
            - name: employee
              in: path
          operations:
            - name: check-docs
              method: POST

Finds and assigns qualified reserve crew, checks duty compliance, and notifies scheduling.

naftiko: "0.5"
info:
  label: "Crew Reserve Callout Orchestrator"
  description: "Finds and assigns qualified reserve crew, checks duty compliance, and notifies scheduling."
  tags:
    - crew-scheduling
    - operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crew-reserve
      port: 8080
      tools:
        - name: callout-reserve
          description: "Assign a reserve crew member."
          inputParameters:
            - name: trip_id
              in: body
              type: string
              description: "Trip ID."
            - name: base
              in: body
              type: string
              description: "Crew base."
            - name: position
              in: body
              type: string
              description: "Position."
          steps:
            - name: find-reserves
              type: call
              call: "crew-api.search-reserves"
              with:
                base: "{{base}}"
                position: "{{position}}"
            - name: verify-duty
              type: call
              call: "crew-api.verify-duty"
              with:
                employee_id: "{{find-reserves.top_candidate}}"
                trip_id: "{{trip_id}}"
            - name: assign
              type: call
              call: "crew-api.assign-trip"
              with:
                employee_id: "{{find-reserves.top_candidate}}"
                trip_id: "{{trip_id}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{scheduling_channel}}"
                text: "Reserve assigned: {{find-reserves.top_candidate_name}} to trip {{trip_id}}"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: reserves
          path: "/reserves/search"
          operations:
            - name: search-reserves
              method: POST
        - name: duty
          path: "/crew/{{employee_id}}/duty-verify"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: verify-duty
              method: POST
        - name: assignments
          path: "/trips/assign"
          operations:
            - name: assign-trip
              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-channel-message
              method: POST

Retrieves a named Crystal Reports report instance and publishes the key metrics to a SharePoint document library and alerts stakeholders in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Crystal Reports Business Metrics Snapshot"
  description: "Retrieves a named Crystal Reports report instance and publishes the key metrics to a SharePoint document library and alerts stakeholders in Microsoft Teams."
  tags:
    - reporting
    - crystal-reports
    - sharepoint
    - microsoft-teams
    - business-metrics
capability:
  exposes:
    - type: mcp
      namespace: business-reporting
      port: 8080
      tools:
        - name: publish-crystal-report
          description: "Given a Crystal Reports report ID and a SharePoint destination, retrieve the report export, upload it to SharePoint, and notify the stakeholder channel in Microsoft Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Crystal Reports report identifier."
            - name: report_name
              in: body
              type: string
              description: "Human-readable report name for the Teams notification."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the report should be uploaded."
            - name: sharepoint_folder_path
              in: body
              type: string
              description: "SharePoint folder path within the site, e.g. Reports/Finance/Monthly."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the publication notification."
          steps:
            - name: get-report-export
              type: call
              call: "crystal-reports.export-report"
              with:
                report_id: "{{report_id}}"
                format: "PDF"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                folder_path: "{{sharepoint_folder_path}}"
                file_name: "{{report_name}}.pdf"
                content: "{{get-report-export.content}}"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "REPORT PUBLISHED: {{report_name}} | SharePoint: {{upload-to-sharepoint.webUrl}} | Format: PDF"
  consumes:
    - namespace: crystal-reports
      type: http
      baseUri: "https://boe.aa.com/biprws/raylight/v1"
      authentication:
        type: bearer
        token: "$secrets.crystal_reports_token"
      resources:
        - name: report-export
          path: "/documents/{report_id}/schedules"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: export-report
              method: POST
    - namespace: sharepoint
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: file-upload
          path: "/sites/{site_id}/drive/root:/{folder_path}/{file_name}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates and submits customs docs for international cargo.

naftiko: "0.5"
info:
  label: "Customs Documentation Orchestrator"
  description: "Generates and submits customs docs for international cargo."
  tags:
    - cargo
    - compliance
    - customs
capability:
  exposes:
    - type: mcp
      namespace: customs
      port: 8080
      tools:
        - name: process-customs
          description: "Process customs documentation."
          inputParameters:
            - name: awb
              in: body
              type: string
            - name: country
              in: body
              type: string
            - name: hs_code
              in: body
              type: string
          steps:
            - name: invoice
              type: call
              call: "cargo-api.generate-invoice"
              with:
                awb: "{{awb}}"
                country: "{{country}}"
            - name: declaration
              type: call
              call: "cargo-api.generate-declaration"
              with:
                awb: "{{awb}}"
                hs_code: "{{hs_code}}"
            - name: submit
              type: call
              call: "customs-api.submit"
              with:
                awb: "{{awb}}"
                invoice: "{{invoice.id}}"
                declaration: "{{declaration.id}}"
  consumes:
    - type: http
      namespace: cargo-api
      baseUri: "https://cargo.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_cargo_token"
      resources:
        - name: invoices
          path: "/docs/invoice"
          operations:
            - name: generate-invoice
              method: POST
        - name: declarations
          path: "/docs/declaration"
          operations:
            - name: generate-declaration
              method: POST
    - type: http
      namespace: customs-api
      baseUri: "https://customs.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_customs_token"
      resources:
        - name: submit
          path: "/submit"
          operations:
            - name: submit
              method: POST

When a GitHub release is published, creates a corresponding Datadog deployment marker on the affected service so that performance anomalies can be correlated to the deployment.

naftiko: "0.5"
info:
  label: "Datadog Deployment Marker on GitHub Release"
  description: "When a GitHub release is published, creates a corresponding Datadog deployment marker on the affected service so that performance anomalies can be correlated to the deployment."
  tags:
    - devops
    - observability
    - github
    - datadog
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: deployment-tracking
      port: 8080
      tools:
        - name: mark-deployment
          description: "Given a GitHub release tag, repository, and Datadog service name, create a Datadog deployment event marker and post a confirmation to Microsoft Teams. Use immediately after a production release is published."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "GitHub organization, e.g. AmericanAirlines."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: release_tag
              in: body
              type: string
              description: "Git tag of the release, e.g. v2.4.1."
            - name: datadog_service
              in: body
              type: string
              description: "Datadog service name to annotate, e.g. aa-checkin-api."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the deployment confirmation."
          steps:
            - name: get-release
              type: call
              call: "github.get-release-by-tag"
              with:
                owner: "{{owner}}"
                repo: "{{repo}}"
                tag: "{{release_tag}}"
            - name: create-dd-event
              type: call
              call: "datadog.create-event"
              with:
                title: "Deployment: {{datadog_service}} {{release_tag}}"
                text: "{{get-release.body}}"
                alert_type: "info"
                tags: "service:{{datadog_service}},version:{{release_tag}},env:production"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "DEPLOYED: {{datadog_service}} {{release_tag}} | GitHub: {{get-release.html_url}} | Datadog marker: {{create-dd-event.url}}"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: release-by-tag
          path: "/repos/{owner}/{repo}/releases/tags/{tag}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release-by-tag
              method: GET
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches the current health status of a named service from Datadog and returns monitor states and SLO compliance for agent-driven triage.

naftiko: "0.5"
info:
  label: "Datadog Service Health Dashboard Snapshot"
  description: "Fetches the current health status of a named service from Datadog and returns monitor states and SLO compliance for agent-driven triage."
  tags:
    - observability
    - datadog
    - monitoring
    - slo
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Given an AA service name, retrieve active Datadog monitors and their states. Use this tool to assess service health before making routing or deployment decisions."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name tag value, e.g. aa-checkin-api."
          call: "datadog.list-monitors"
          with:
            tags: "service:{{service_name}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: list-monitors
              method: GET

Retrieves SLO compliance status for all flight-operations SLOs from Datadog and publishes a weekly digest to the engineering leadership channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Weekly Digest"
  description: "Retrieves SLO compliance status for all flight-operations SLOs from Datadog and publishes a weekly digest to the engineering leadership channel in Microsoft Teams."
  tags:
    - observability
    - datadog
    - slo
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: digest-slo-compliance
          description: "Given a Datadog SLO query tag and a Teams channel ID, retrieve all matching SLOs with their compliance percentages and post a structured weekly digest. Use every Monday for engineering leadership reporting."
          inputParameters:
            - name: slo_tag
              in: body
              type: string
              description: "Datadog SLO tag filter, e.g. team:flight-ops."
            - name: timeframe
              in: body
              type: string
              description: "SLO timeframe to report: 7d, 30d, or 90d."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the weekly SLO digest."
          steps:
            - name: get-slos
              type: call
              call: "datadog.list-slos"
              with:
                tags_query: "{{slo_tag}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "SLO WEEKLY DIGEST ({{timeframe}}): Tag={{slo_tag}} | Total SLOs: {{get-slos.count}} | At risk: {{get-slos.atRiskCount}} | Breached: {{get-slos.breachedCount}} | Full report: https://app.datadoghq.com/slo"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          inputParameters:
            - name: tags_query
              in: query
          operations:
            - name: list-slos
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates deicing by checking conditions, queuing aircraft, dispatching trucks, and notifying crew.

naftiko: "0.5"
info:
  label: "Deicing Coordination Orchestrator"
  description: "Coordinates deicing by checking conditions, queuing aircraft, dispatching trucks, and notifying crew."
  tags:
    - ground-ops
    - flight-operations
    - weather
    - safety
capability:
  exposes:
    - type: mcp
      namespace: deicing
      port: 8080
      tools:
        - name: coordinate-deicing
          description: "Coordinate deicing for departing aircraft."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: tail_number
              in: body
              type: string
              description: "Tail."
            - name: gate
              in: body
              type: string
              description: "Gate."
            - name: station
              in: body
              type: string
              description: "Station."
          steps:
            - name: check-conditions
              type: call
              call: "weather-api.get-deice"
              with:
                station: "{{station}}"
            - name: queue
              type: call
              call: "ground-ops.queue-deicing"
              with:
                tail: "{{tail_number}}"
                gate: "{{gate}}"
                fluid: "{{check-conditions.recommended_fluid}}"
            - name: dispatch
              type: call
              call: "ground-ops.dispatch-truck"
              with:
                gate: "{{gate}}"
            - name: notify-crew
              type: call
              call: "crew-comms.send-message"
              with:
                flight: "{{flight_number}}"
                message: "Deicing queued. Holdover: {{check-conditions.holdover_time}} min"
  consumes:
    - type: http
      namespace: weather-api
      baseUri: "https://dispatch.aa.com/api/v1/weather"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: deice
          path: "/deicing/{{station}}"
          inputParameters:
            - name: station
              in: path
          operations:
            - name: get-deice
              method: GET
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: queue
          path: "/deicing/queue"
          operations:
            - name: queue-deicing
              method: POST
        - name: trucks
          path: "/deicing/dispatch"
          operations:
            - name: dispatch-truck
              method: POST
    - type: http
      namespace: crew-comms
      baseUri: "https://crew.aa.com/api/v1/comms"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: messages
          path: "/flights/{{flight}}/message"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: send-message
              method: POST

Determines and issues compensation for delayed flight passengers.

naftiko: "0.5"
info:
  label: "Flight Delay Compensation Orchestrator"
  description: "Determines and issues compensation for delayed flight passengers."
  tags:
    - customer-service
    - compliance
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: delay-comp
      port: 8080
      tools:
        - name: process-compensation
          description: "Process delay compensation."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: delay_minutes
              in: body
              type: number
            - name: route_type
              in: body
              type: string
          steps:
            - name: get-pax
              type: call
              call: "pss.get-passengers"
              with:
                flight: "{{flight_number}}"
            - name: calc
              type: call
              call: "compensation-api.calculate"
              with:
                delay: "{{delay_minutes}}"
                route: "{{route_type}}"
            - name: issue
              type: call
              call: "compensation-api.issue-vouchers"
              with:
                passengers: "{{get-pax.passengers}}"
                amount: "{{calc.amount}}"
            - name: notify
              type: call
              call: "notification-api.batch-notify"
              with:
                passengers: "{{get-pax.passengers}}"
                template: "delay_compensation"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: passengers
          path: "/flights/{{flight}}/passengers"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-passengers
              method: GET
    - type: http
      namespace: compensation-api
      baseUri: "https://compensation.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_compensation_token"
      resources:
        - name: calc
          path: "/calculate"
          operations:
            - name: calculate
              method: POST
        - name: vouchers
          path: "/vouchers/batch"
          operations:
            - name: issue-vouchers
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: batch
          path: "/batch/notify"
          operations:
            - name: batch-notify
              method: POST

Orchestrates pre-departure checks for weather, crew, aircraft, and generates dispatch release.

naftiko: "0.5"
info:
  label: "Flight Dispatch Release Orchestrator"
  description: "Orchestrates pre-departure checks for weather, crew, aircraft, and generates dispatch release."
  tags:
    - dispatch
    - flight-operations
    - safety
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: dispatch
      port: 8080
      tools:
        - name: process-release
          description: "Run pre-departure checks and generate release."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: tail_number
              in: body
              type: string
              description: "Tail."
            - name: captain_id
              in: body
              type: string
              description: "Captain ID."
          steps:
            - name: weather
              type: call
              call: "dispatch-api.get-weather"
              with:
                flight: "{{flight_number}}"
            - name: crew
              type: call
              call: "crew-api.get-duty-status"
              with:
                employee_id: "{{captain_id}}"
            - name: mx
              type: call
              call: "mx-api.get-status"
              with:
                tail: "{{tail_number}}"
            - name: release
              type: call
              call: "dispatch-api.create-release"
              with:
                flight: "{{flight_number}}"
                weather_ok: "{{weather.safe}}"
                crew_legal: "{{crew.isCompliant}}"
  consumes:
    - type: http
      namespace: dispatch-api
      baseUri: "https://dispatch.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: weather
          path: "/weather/route/{{flight}}"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-weather
              method: GET
        - name: releases
          path: "/releases"
          operations:
            - name: create-release
              method: POST
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: duty
          path: "/crew/{{employee_id}}/duty-status"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-duty-status
              method: GET
    - type: http
      namespace: mx-api
      baseUri: "https://maintenance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: aircraft
          path: "/aircraft/{{tail}}/status"
          inputParameters:
            - name: tail
              in: path
          operations:
            - name: get-status
              method: GET

Coordinates recovery after flight diversion including ground handling, hotels, crew rest, and incident logging.

naftiko: "0.5"
info:
  label: "Diversion Recovery Orchestrator"
  description: "Coordinates recovery after flight diversion including ground handling, hotels, crew rest, and incident logging."
  tags:
    - flight-operations
    - customer-service
    - ground-ops
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: diversion
      port: 8080
      tools:
        - name: handle-diversion
          description: "Coordinate diversion recovery."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: diversion_airport
              in: body
              type: string
              description: "Diversion airport."
            - name: reason
              in: body
              type: string
              description: "Reason."
          steps:
            - name: arrange-handling
              type: call
              call: "ground-ops.request-handling"
              with:
                station: "{{diversion_airport}}"
                flight: "{{flight_number}}"
            - name: book-hotels
              type: call
              call: "hotel-api.book"
              with:
                flight: "{{flight_number}}"
                station: "{{diversion_airport}}"
            - name: check-crew
              type: call
              call: "crew-api.check-rest"
              with:
                flight: "{{flight_number}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Diversion: {{flight_number}} to {{diversion_airport}} — {{reason}}"
                priority: "1"
  consumes:
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: handling
          path: "/handling/request"
          operations:
            - name: request-handling
              method: POST
    - type: http
      namespace: hotel-api
      baseUri: "https://crew-services.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_services_token"
      resources:
        - name: accommodations
          path: "/accommodations/book"
          operations:
            - name: book
              method: POST
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: rest
          path: "/crew/rest-check"
          operations:
            - name: check-rest
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When an employee departure is confirmed in PeopleSoft, opens a GitHub offboarding issue, archives the SharePoint folder, and alerts the IT and HR teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Checklist Initiator"
  description: "When an employee departure is confirmed in PeopleSoft, opens a GitHub offboarding issue, archives the SharePoint folder, and alerts the IT and HR teams via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - peoplesoft
    - sharepoint
    - microsoft-teams
    - github
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a departing employee's ID, name, last day, and department, open a GitHub offboarding issue, lock the SharePoint folder, and notify IT and HR in Microsoft Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "PeopleSoft employee ID (EMPLID) of the departing employee."
            - name: full_name
              in: body
              type: string
              description: "Full name of the departing employee."
            - name: last_day
              in: body
              type: string
              description: "Last working day in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "Employee's department, used to route the Teams notification."
          steps:
            - name: open-offboarding-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "it-access-provisioning"
                title: "IT Offboarding: {{full_name}} (last day {{last_day}})"
                body: "Employee ID: {{employee_id}}\nFull Name: {{full_name}}\nLast Day: {{last_day}}\nDepartment: {{department}}\nAction: Revoke all system access by EOD {{last_day}}"
                labels: "offboarding,{{department}}"
            - name: notify-hr-it
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.hr_it_teams_channel_id"
                message: "OFFBOARDING INITIATED: {{full_name}} (ID: {{employee_id}}) | Last Day: {{last_day}} | Dept: {{department}} | Issue: {{open-offboarding-issue.html_url}}"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Assigns cabin crew positions based on seniority and qualifications.

naftiko: "0.5"
info:
  label: "Flight Attendant Position Assignment"
  description: "Assigns cabin crew positions based on seniority and qualifications."
  tags:
    - crew-scheduling
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: fa
      port: 8080
      tools:
        - name: assign-positions
          description: "Assign FA positions."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: date
              in: body
              type: string
          call: "crew-api.assign-fa"
          with:
            flight: "{{flight_number}}"
            date: "{{date}}"
          outputParameters:
            - name: assignments
              type: array
              mapping: "$.assignments"
            - name: lead
              type: string
              mapping: "$.leadFA"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: fa
          path: "/flights/{{flight}}/fa-positions"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: assign-fa
              method: POST

Calculates fatigue risk score for a pilot based on duty periods.

naftiko: "0.5"
info:
  label: "Pilot Fatigue Risk Assessment"
  description: "Calculates fatigue risk score for a pilot based on duty periods."
  tags:
    - crew-scheduling
    - safety
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: fatigue
      port: 8080
      tools:
        - name: assess-fatigue
          description: "Calculate fatigue risk."
          inputParameters:
            - name: employee_id
              in: body
              type: string
            - name: trip_id
              in: body
              type: string
          call: "frms-api.assess"
          with:
            employee: "{{employee_id}}"
            trip: "{{trip_id}}"
          outputParameters:
            - name: score
              type: number
              mapping: "$.riskScore"
            - name: level
              type: string
              mapping: "$.riskLevel"
  consumes:
    - type: http
      namespace: frms-api
      baseUri: "https://safety.aa.com/api/v1/frms"
      authentication:
        type: bearer
        token: "$secrets.aa_safety_token"
      resources:
        - name: assess
          path: "/assess"
          operations:
            - name: assess
              method: POST

Generates fleet utilization summary with block hours and aircraft availability.

naftiko: "0.5"
info:
  label: "Fleet Utilization Report"
  description: "Generates fleet utilization summary with block hours and aircraft availability."
  tags:
    - fleet-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: fleet
      port: 8080
      tools:
        - name: get-utilization
          description: "Get fleet utilization."
          inputParameters:
            - name: fleet_type
              in: body
              type: string
              description: "Fleet type."
            - name: period
              in: body
              type: string
              description: "Period."
          call: "fleet-api.get-util"
          with:
            fleet: "{{fleet_type}}"
            period: "{{period}}"
          outputParameters:
            - name: block_hours
              type: number
              mapping: "$.totalBlockHours"
            - name: utilization
              type: number
              mapping: "$.avgDailyUtilization"
  consumes:
    - type: http
      namespace: fleet-api
      baseUri: "https://fleet.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_fleet_token"
      resources:
        - name: util
          path: "/utilization/report"
          operations:
            - name: get-util
              method: POST

When a Datadog monitor fires on a flight-operations service, creates an Azure Log Analytics query for root-cause context, opens a GitHub issue, and posts an alert to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Flight Operations Incident Response"
  description: "When a Datadog monitor fires on a flight-operations service, creates an Azure Log Analytics query for root-cause context, opens a GitHub issue, and posts an alert to Microsoft Teams."
  tags:
    - operations
    - incident-response
    - datadog
    - azure-log-analytics
    - github
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: flight-ops
      port: 8080
      tools:
        - name: handle-ops-incident
          description: "Given a Datadog monitor alert ID and service name, query Azure Log Analytics for supporting telemetry, open a GitHub issue with full context, and notify the operations channel in Microsoft Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: service_name
              in: body
              type: string
              description: "Name of the flight-operations service affected, e.g. check-in-api."
            - name: severity
              in: body
              type: string
              description: "Alert severity level: P1, P2, or P3."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the alert notification to."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: query-logs
              type: call
              call: "azurelogs.run-query"
              with:
                query: "AzureDiagnostics | where ResourceType == '{{service_name}}' | order by TimeGenerated desc | take 50"
                timespan: "PT1H"
            - name: open-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "flight-ops-platform"
                title: "[{{severity}}] Ops Incident: {{service_name}} — {{get-monitor.name}}"
                body: "Monitor: {{get-monitor.name}}\nService: {{service_name}}\nSeverity: {{severity}}\nLog excerpt: {{query-logs.rows}}"
                labels: "incident,{{severity}}"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "INCIDENT {{severity}}: {{service_name}} | Monitor: {{get-monitor.name}} | GitHub: {{open-issue.html_url}}"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitor
          path: "/monitor/{monitor_id}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - namespace: azurelogs
      type: http
      baseUri: "https://api.loganalytics.io/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_log_analytics_token"
      resources:
        - name: query
          path: "/workspaces/{workspace_id}/query"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: run-query
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks flight plan filing status with ATC.

naftiko: "0.5"
info:
  label: "Flight Plan Filing Status"
  description: "Checks flight plan filing status with ATC."
  tags:
    - dispatch
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: flight-plan
      port: 8080
      tools:
        - name: get-plan
          description: "Check flight plan status."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: date
              in: body
              type: string
          call: "dispatch-api.get-plan"
          with:
            flight: "{{flight_number}}"
            date: "{{date}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.filingStatus"
            - name: route
              type: string
              mapping: "$.filedRoute"
  consumes:
    - type: http
      namespace: dispatch-api
      baseUri: "https://dispatch.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: plans
          path: "/flight-plans/{{flight}}/status"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-plan
              method: GET

Retrieves real-time flight status for an American Airlines flight including departure, arrival, gate, and delay information.

naftiko: "0.5"
info:
  label: "Flight Status Lookup"
  description: "Retrieves real-time flight status for an American Airlines flight including departure, arrival, gate, and delay information."
  tags:
    - flight-operations
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: flight-ops
      port: 8080
      tools:
        - name: get-flight-status
          description: "Look up current AA flight status."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "AA flight number."
            - name: flight_date
              in: body
              type: string
              description: "Flight date."
          call: "aa-api.get-status"
          with:
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.flightStatus"
            - name: departure_time
              type: string
              mapping: "$.departureTime"
            - name: arrival_time
              type: string
              mapping: "$.arrivalTime"
            - name: gate
              type: string
              mapping: "$.gate"
  consumes:
    - type: http
      namespace: aa-api
      baseUri: "https://api.aa.com/v1/flights"
      authentication:
        type: bearer
        token: "$secrets.aa_api_token"
      resources:
        - name: status
          path: "/status/{{flight}}/{{date}}"
          inputParameters:
            - name: flight
              in: path
            - name: date
              in: path
          operations:
            - name: get-status
              method: GET

Retrieves actual fuel burn for a completed flight.

naftiko: "0.5"
info:
  label: "Flight Fuel Burn Lookup"
  description: "Retrieves actual fuel burn for a completed flight."
  tags:
    - fuel-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: fuel-burn
      port: 8080
      tools:
        - name: get-burn
          description: "Get fuel burn data."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: date
              in: body
              type: string
          call: "fuel-api.get-burn"
          with:
            flight: "{{flight_number}}"
            date: "{{date}}"
          outputParameters:
            - name: planned
              type: number
              mapping: "$.planned"
            - name: actual
              type: number
              mapping: "$.actual"
  consumes:
    - type: http
      namespace: fuel-api
      baseUri: "https://analytics.aa.com/api/v1/fuel"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: burn
          path: "/flights/{{flight}}/burn"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-burn
              method: GET

Generates fuel cost analysis for a fleet segment with tankering and hedging insights.

naftiko: "0.5"
info:
  label: "Fuel Cost Analysis Report"
  description: "Generates fuel cost analysis for a fleet segment with tankering and hedging insights."
  tags:
    - fuel-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: fuel
      port: 8080
      tools:
        - name: get-fuel-report
          description: "Generate fuel cost analysis."
          inputParameters:
            - name: fleet_type
              in: body
              type: string
              description: "Fleet type."
            - name: period
              in: body
              type: string
              description: "Period."
          call: "fuel-api.query-costs"
          with:
            fleet: "{{fleet_type}}"
            period: "{{period}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.totalCost"
            - name: avg_price
              type: number
              mapping: "$.avgPricePerGallon"
  consumes:
    - type: http
      namespace: fuel-api
      baseUri: "https://analytics.aa.com/api/v1/fuel"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: costs
          path: "/cost-analysis"
          operations:
            - name: query-costs
              method: POST

Recommends optimal gate assignments minimizing connection times.

naftiko: "0.5"
info:
  label: "Gate Assignment Optimizer"
  description: "Recommends optimal gate assignments minimizing connection times."
  tags:
    - ground-ops
    - flight-operations
    - optimization
capability:
  exposes:
    - type: mcp
      namespace: gates
      port: 8080
      tools:
        - name: optimize-gate
          description: "Get gate recommendation."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: station
              in: body
              type: string
              description: "Station."
          call: "gate-api.optimize"
          with:
            flight: "{{flight_number}}"
            station: "{{station}}"
          outputParameters:
            - name: gate
              type: string
              mapping: "$.recommendedGate"
            - name: score
              type: number
              mapping: "$.connectionScore"
  consumes:
    - type: http
      namespace: gate-api
      baseUri: "https://groundops.aa.com/api/v1/gates"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: optimize
          path: "/optimize"
          operations:
            - name: optimize
              method: POST

Retrieves GitHub Actions workflow run statistics for a repository and posts a CI usage digest to the DevOps engineering channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Actions Workflow Usage Digest"
  description: "Retrieves GitHub Actions workflow run statistics for a repository and posts a CI usage digest to the DevOps engineering channel in Microsoft Teams."
  tags:
    - devops
    - github
    - cicd
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: digest-workflow-usage
          description: "Given a GitHub owner, repository, and branch, retrieve recent workflow run statistics and post a CI usage digest to Microsoft Teams. Use weekly to track build health and frequency."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "GitHub organization or owner, e.g. AmericanAirlines."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: branch
              in: body
              type: string
              description: "Branch to scope the workflow runs to, e.g. main."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the CI usage digest."
          steps:
            - name: get-workflow-runs
              type: call
              call: "github.list-workflow-runs"
              with:
                owner: "{{owner}}"
                repo: "{{repo}}"
                branch: "{{branch}}"
                per_page: 100
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "CI USAGE DIGEST: {{owner}}/{{repo}} | Branch: {{branch}} | Total Runs: {{get-workflow-runs.total_count}} | Success: {{get-workflow-runs.successCount}} | Failure: {{get-workflow-runs.failureCount}} | Details: https://github.com/{{owner}}/{{repo}}/actions"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{owner}/{repo}/actions/runs"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: branch
              in: query
            - name: per_page
              in: query
          operations:
            - name: list-workflow-runs
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a pull request is opened on a critical repository, posts a structured review request to the owning team's Microsoft Teams channel with PR metadata and a link.

naftiko: "0.5"
info:
  label: "GitHub Pull Request to Teams Review Request"
  description: "When a pull request is opened on a critical repository, posts a structured review request to the owning team's Microsoft Teams channel with PR metadata and a link."
  tags:
    - devops
    - github
    - microsoft-teams
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: devops-collab
      port: 8080
      tools:
        - name: notify-pr-review
          description: "Given a GitHub PR number, repository, and Teams channel ID, fetch PR details from GitHub and post a formatted review request card to Microsoft Teams."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "GitHub organization or owner name, e.g. AmericanAirlines."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: pr_number
              in: body
              type: integer
              description: "Pull request number."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the review request to."
          steps:
            - name: get-pr
              type: call
              call: "github.get-pull-request"
              with:
                owner: "{{owner}}"
                repo: "{{repo}}"
                pull_number: "{{pr_number}}"
            - name: post-review-request
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "PR REVIEW REQUESTED: {{get-pr.title}} | Repo: {{owner}}/{{repo}} | Author: {{get-pr.user.login}} | Branch: {{get-pr.head.ref}} → {{get-pr.base.ref}} | URL: {{get-pr.html_url}}"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-request
          path: "/repos/{owner}/{repo}/pulls/{pull_number}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves open Dependabot security alerts across American Airlines GitHub repositories and posts a prioritized advisory digest to the security team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Advisory Digest"
  description: "Retrieves open Dependabot security alerts across American Airlines GitHub repositories and posts a prioritized advisory digest to the security team in Microsoft Teams."
  tags:
    - security
    - github
    - dependabot
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-reporting
      port: 8080
      tools:
        - name: digest-security-advisories
          description: "Given a GitHub organization and severity filter, retrieve open Dependabot alerts and post a prioritized digest to the security Teams channel. Use weekly or when a critical CVE is published."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "GitHub organization name, e.g. AmericanAirlines."
            - name: severity
              in: body
              type: string
              description: "Minimum severity to include: critical, high, medium, or low."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the security advisory digest."
          steps:
            - name: get-alerts
              type: call
              call: "github.list-org-dependabot-alerts"
              with:
                org: "{{org}}"
                severity: "{{severity}}"
                state: "open"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "SECURITY ADVISORY DIGEST: Org={{org}} | Severity >= {{severity}} | Open Alerts: {{get-alerts.total_count}} | Critical: {{get-alerts.criticalCount}} | High: {{get-alerts.highCount}} | Review: https://github.com/orgs/{{org}}/security/risk"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-dependabot-alerts
          path: "/orgs/{org}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-org-dependabot-alerts
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a GitLab merge request is merged to main, creates a Datadog deployment event to correlate post-merge service behaviour with the code change.

naftiko: "0.5"
info:
  label: "GitLab Merge Request to Datadog Annotation"
  description: "When a GitLab merge request is merged to main, creates a Datadog deployment event to correlate post-merge service behaviour with the code change."
  tags:
    - devops
    - gitlab
    - datadog
    - deployment
    - observability
capability:
  exposes:
    - type: mcp
      namespace: gitlab-tracking
      port: 8080
      tools:
        - name: annotate-merge-to-datadog
          description: "Given a GitLab project ID, MR IID, and Datadog service name, fetch MR details and create a Datadog deployment event. Use immediately after a merge to main to correlate deployments with observability data."
          inputParameters:
            - name: project_id
              in: body
              type: integer
              description: "GitLab project ID."
            - name: mr_iid
              in: body
              type: integer
              description: "GitLab merge request internal ID (IID)."
            - name: datadog_service
              in: body
              type: string
              description: "Datadog service name to annotate."
          steps:
            - name: get-mr
              type: call
              call: "gitlab.get-merge-request"
              with:
                project_id: "{{project_id}}"
                mr_iid: "{{mr_iid}}"
            - name: create-dd-event
              type: call
              call: "datadog.create-event"
              with:
                title: "MR Merged: {{get-mr.title}}"
                text: "{{get-mr.description}}\nAuthor: {{get-mr.author.name}}\nTarget: {{get-mr.target_branch}}"
                alert_type: "info"
                tags: "service:{{datadog_service}},gitlab-mr:{{mr_iid}},branch:{{get-mr.target_branch}}"
  consumes:
    - namespace: gitlab
      type: http
      baseUri: "https://gitlab.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.gitlab_token"
      resources:
        - name: merge-request
          path: "/projects/{project_id}/merge_requests/{mr_iid}"
          inputParameters:
            - name: project_id
              in: path
            - name: mr_iid
              in: path
          operations:
            - name: get-merge-request
              method: GET
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Retrieves key Google Analytics metrics for aa.com and publishes a structured weekly web performance digest to the Digital Experience team channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Web Performance Digest"
  description: "Retrieves key Google Analytics metrics for aa.com and publishes a structured weekly web performance digest to the Digital Experience team channel in Microsoft Teams."
  tags:
    - analytics
    - google-analytics
    - microsoft-teams
    - reporting
    - digital-experience
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: digest-web-performance
          description: "Given a Google Analytics 4 property ID and date range, retrieve sessions, bounce rate, and conversion metrics for aa.com and post a web performance digest to Microsoft Teams."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "Google Analytics 4 property ID, e.g. 123456789."
            - 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."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the web performance digest."
          steps:
            - name: run-report
              type: call
              call: "google-analytics.run-report"
              with:
                property_id: "{{property_id}}"
                startDate: "{{start_date}}"
                endDate: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "WEB PERFORMANCE ({{start_date}} to {{end_date}}): Sessions: {{run-report.sessions}} | Users: {{run-report.totalUsers}} | Bounce Rate: {{run-report.bounceRate}}% | Avg Session Duration: {{run-report.averageSessionDuration}}s | Conversions: {{run-report.conversions}}"
  consumes:
    - namespace: google-analytics
      type: http
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: report
          path: "/properties/{property_id}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves ground support equipment status at an AA station.

naftiko: "0.5"
info:
  label: "Ground Equipment Status"
  description: "Retrieves ground support equipment status at an AA station."
  tags:
    - ground-ops
    - equipment
    - tracking
capability:
  exposes:
    - type: mcp
      namespace: gse
      port: 8080
      tools:
        - name: get-gse
          description: "Check ground equipment."
          inputParameters:
            - name: station
              in: body
              type: string
            - name: type
              in: body
              type: string
          call: "ground-ops.get-equipment"
          with:
            station: "{{station}}"
            type: "{{type}}"
          outputParameters:
            - name: available
              type: number
              mapping: "$.available"
            - name: in_use
              type: number
              mapping: "$.inUse"
  consumes:
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: equipment
          path: "/equipment/status"
          operations:
            - name: get-equipment
              method: POST

Validates hazmat cargo against IATA dangerous goods regulations.

naftiko: "0.5"
info:
  label: "Hazmat Cargo Compliance Check"
  description: "Validates hazmat cargo against IATA dangerous goods regulations."
  tags:
    - cargo
    - compliance
    - safety
capability:
  exposes:
    - type: mcp
      namespace: hazmat
      port: 8080
      tools:
        - name: check-hazmat
          description: "Validate hazmat compliance."
          inputParameters:
            - name: awb
              in: body
              type: string
            - name: un_number
              in: body
              type: string
          call: "cargo-api.validate-hazmat"
          with:
            awb: "{{awb}}"
            un: "{{un_number}}"
          outputParameters:
            - name: compliant
              type: boolean
              mapping: "$.isCompliant"
            - name: violations
              type: array
              mapping: "$.violations"
  consumes:
    - type: http
      namespace: cargo-api
      baseUri: "https://cargo.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_cargo_token"
      resources:
        - name: hazmat
          path: "/hazmat/validate"
          operations:
            - name: validate-hazmat
              method: POST

Retrieves HubSpot campaign engagement metrics and publishes a digest summary to the marketing team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Campaign Performance Digest"
  description: "Retrieves HubSpot campaign engagement metrics and publishes a digest summary to the marketing team's Microsoft Teams channel."
  tags:
    - marketing
    - hubspot
    - microsoft-teams
    - reporting
    - campaign-performance
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a HubSpot campaign ID, fetch email performance metrics and post a formatted digest to the marketing Teams channel. Use to surface open rates, click rates, and unsubscribes for a campaign."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "HubSpot campaign ID to retrieve performance metrics for."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the marketing digest post."
          steps:
            - name: get-campaign
              type: call
              call: "hubspot.get-campaign"
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-stats
              type: call
              call: "hubspot.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "CAMPAIGN DIGEST: {{get-campaign.name}} | Sent: {{get-stats.numSent}} | Opens: {{get-stats.numOpens}} | Clicks: {{get-stats.numClicks}} | Unsubscribes: {{get-stats.numUnsubscribed}} | Open Rate: {{get-stats.openRate}}%"
  consumes:
    - namespace: hubspot
      type: http
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaign
          path: "/emails/{campaign_id}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
        - name: campaign-stats
          path: "/emails/{campaign_id}/statistics/list"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Performs a periodic IAM access review by querying Microsoft Graph for users with privileged roles, cross-referencing active employees in PeopleSoft, and flagging or revoking stale access via Teams notification.

naftiko: "0.5"
info:
  label: "IAM Access Review and Revocation Orchestrator"
  description: "Performs a periodic IAM access review by querying Microsoft Graph for users with privileged roles, cross-referencing active employees in PeopleSoft, and flagging or revoking stale access via Teams notification."
  tags:
    - security
    - iam
    - microsoft-teams
    - access-review
    - governance
capability:
  exposes:
    - type: mcp
      namespace: iam-governance
      port: 8080
      tools:
        - name: review-privileged-access
          description: "Given a Microsoft Graph directory role ID, list all members of that role, check each against PeopleSoft to identify terminated employees, and post a stale-access report to the security Teams channel."
          inputParameters:
            - name: role_id
              in: body
              type: string
              description: "Microsoft Entra directory role ID (GUID) to review, e.g. Global Administrator."
            - name: role_name
              in: body
              type: string
              description: "Human-readable name of the role, e.g. Global Administrator."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the access review report."
          steps:
            - name: get-role-members
              type: call
              call: "msgraph.get-role-members"
              with:
                role_id: "{{role_id}}"
            - name: post-review
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "IAM ACCESS REVIEW: Role={{role_name}} | Members: {{get-role-members.count}} | Action required: Review at https://entra.microsoft.com/roles/{{role_id}}/members"
  consumes:
    - namespace: msgraph
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: role-members
          path: "/directoryRoles/{role_id}/members"
          inputParameters:
            - name: role_id
              in: path
          operations:
            - name: get-role-members
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When AWS cost anomaly detection fires, annotates the event in Datadog, opens a GitHub issue for the owning team, and posts a cost alert to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Infrastructure Cost Anomaly Responder"
  description: "When AWS cost anomaly detection fires, annotates the event in Datadog, opens a GitHub issue for the owning team, and posts a cost alert to Microsoft Teams."
  tags:
    - finops
    - cloud
    - aws
    - datadog
    - github
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an AWS cost anomaly ID, service, and estimated USD overage, annotate Datadog, open a GitHub issue for the owning team, and alert the FinOps channel in Microsoft Teams."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "The AWS Cost Anomaly Detection anomaly identifier."
            - name: aws_service
              in: body
              type: string
              description: "AWS service or linked account driving the anomaly, e.g. Amazon EC2."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated cost overage in USD."
            - name: owning_team
              in: body
              type: string
              description: "Engineering team responsible for the AWS resources, used to route the GitHub issue."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "AWS Cost Anomaly: {{aws_service}}"
                text: "Anomaly {{anomaly_id}} — estimated overage ${{estimated_overage_usd}}"
                alert_type: "warning"
                tags: "service:{{aws_service}},team:{{owning_team}}"
            - name: open-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "cloud-cost-governance"
                title: "AWS Cost Anomaly: {{aws_service}} — ${{estimated_overage_usd}} overage"
                body: "Anomaly ID: {{anomaly_id}}\nService: {{aws_service}}\nEstimated overage: ${{estimated_overage_usd}}\nDatadog event: {{annotate-datadog.url}}\nOwning team: {{owning_team}}"
                labels: "cost-anomaly,{{owning_team}}"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.finops_teams_channel_id"
                message: "AWS COST ANOMALY: {{aws_service}} | Est. overage: ${{estimated_overage_usd}} | Team: {{owning_team}} | Issue: {{open-issue.html_url}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up interline baggage rules with partner airlines.

naftiko: "0.5"
info:
  label: "Interline Baggage Agreement Lookup"
  description: "Looks up interline baggage rules with partner airlines."
  tags:
    - customer-service
    - baggage
    - partnerships
capability:
  exposes:
    - type: mcp
      namespace: interline
      port: 8080
      tools:
        - name: get-rules
          description: "Get interline baggage rules."
          inputParameters:
            - name: partner
              in: body
              type: string
          call: "partnership-api.get-baggage"
          with:
            partner: "{{partner}}"
          outputParameters:
            - name: through_check
              type: boolean
              mapping: "$.throughCheck"
            - name: free_bags
              type: number
              mapping: "$.freeBags"
  consumes:
    - type: http
      namespace: partnership-api
      baseUri: "https://partnerships.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_partnerships_token"
      resources:
        - name: baggage
          path: "/interline/baggage/{{partner}}"
          inputParameters:
            - name: partner
              in: path
          operations:
            - name: get-baggage
              method: GET

When a flight is cancelled, retrieves affected passengers, finds rebooking options, executes rebookings, and sends notifications.

naftiko: "0.5"
info:
  label: "Irregular Ops Rebooking Orchestrator"
  description: "When a flight is cancelled, retrieves affected passengers, finds rebooking options, executes rebookings, and sends notifications."
  tags:
    - flight-operations
    - customer-service
    - rebooking
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: irrops
      port: 8080
      tools:
        - name: handle-irrops
          description: "Rebook passengers from a cancelled flight."
          inputParameters:
            - name: cancelled_flight
              in: body
              type: string
              description: "Cancelled flight."
            - name: flight_date
              in: body
              type: string
              description: "Flight date."
            - name: reason
              in: body
              type: string
              description: "Cancellation reason."
          steps:
            - name: get-passengers
              type: call
              call: "pss.get-passengers"
              with:
                flight: "{{cancelled_flight}}"
                date: "{{flight_date}}"
            - name: find-alternatives
              type: call
              call: "pss.search-alternatives"
              with:
                origin: "{{get-passengers.origin}}"
                destination: "{{get-passengers.destination}}"
            - name: rebook
              type: call
              call: "pss.batch-rebook"
              with:
                passengers: "{{get-passengers.pnrs}}"
                alternatives: "{{find-alternatives.options}}"
            - name: notify
              type: call
              call: "notification-api.batch-notify"
              with:
                passengers: "{{get-passengers.passengers}}"
                template: "irrops_rebooking"
                reason: "{{reason}}"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: passengers
          path: "/flights/{{flight}}/passengers"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-passengers
              method: GET
        - name: alternatives
          path: "/availability/search"
          operations:
            - name: search-alternatives
              method: POST
        - name: rebooking
          path: "/rebooking/batch"
          operations:
            - name: batch-rebook
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: batch
          path: "/batch/notify"
          operations:
            - name: batch-notify
              method: POST

Finds crew with language skills for international routes.

naftiko: "0.5"
info:
  label: "Cabin Crew Language Search"
  description: "Finds crew with language skills for international routes."
  tags:
    - crew-scheduling
    - international
capability:
  exposes:
    - type: mcp
      namespace: lang-crew
      port: 8080
      tools:
        - name: search-language
          description: "Find language crew."
          inputParameters:
            - name: language
              in: body
              type: string
            - name: base
              in: body
              type: string
          call: "crew-api.search-lang"
          with:
            language: "{{language}}"
            base: "{{base}}"
          outputParameters:
            - name: crew
              type: array
              mapping: "$.qualified"
            - name: count
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: lang
          path: "/crew/language-search"
          operations:
            - name: search-lang
              method: POST

Retrieves LinkedIn organization page engagement metrics and publishes a weekly social performance digest to the Marketing team channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Social Engagement Digest"
  description: "Retrieves LinkedIn organization page engagement metrics and publishes a weekly social performance digest to the Marketing team channel in Microsoft Teams."
  tags:
    - marketing
    - social
    - linkedin
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-linkedin-engagement
          description: "Given a LinkedIn organization URN and a date range, retrieve page follower and engagement statistics and post a social performance digest to Microsoft Teams."
          inputParameters:
            - name: org_urn
              in: body
              type: string
              description: "LinkedIn organization URN, e.g. urn:li:organization:123456."
            - 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."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the social digest."
          steps:
            - name: get-follower-stats
              type: call
              call: "linkedin.get-follower-stats"
              with:
                org_urn: "{{org_urn}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: get-share-stats
              type: call
              call: "linkedin.get-share-stats"
              with:
                org_urn: "{{org_urn}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "LINKEDIN DIGEST ({{start_date}} to {{end_date}}): Followers: {{get-follower-stats.followerCount}} | New: {{get-follower-stats.organicFollowerGain}} | Impressions: {{get-share-stats.impressionCount}} | Engagements: {{get-share-stats.engagementCount}} | Shares: {{get-share-stats.shareCount}}"
  consumes:
    - namespace: linkedin
      type: http
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: follower-stats
          path: "/organizationFollowerStatistics"
          inputParameters:
            - name: org_urn
              in: query
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-follower-stats
              method: GET
        - name: share-stats
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: org_urn
              in: query
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-share-stats
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves recent LinkedIn job posting performance and syncs applicant pipeline metrics into a SharePoint tracking sheet, then posts a weekly digest to the Talent Acquisition Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Sync"
  description: "Retrieves recent LinkedIn job posting performance and syncs applicant pipeline metrics into a SharePoint tracking sheet, then posts a weekly digest to the Talent Acquisition Teams channel."
  tags:
    - hr
    - recruiting
    - linkedin
    - sharepoint
    - microsoft-teams
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: sync-linkedin-pipeline
          description: "Given a LinkedIn job posting URN, retrieve applicant and impression metrics, update a SharePoint list row, and post a pipeline digest to the Talent Acquisition Teams channel."
          inputParameters:
            - name: job_urn
              in: body
              type: string
              description: "LinkedIn job posting URN, e.g. urn:li:jobPosting:1234567."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the talent pipeline tracking list lives."
            - name: list_id
              in: body
              type: string
              description: "SharePoint list ID for the pipeline tracker."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the TA weekly digest."
          steps:
            - name: get-job-analytics
              type: call
              call: "linkedin.get-job-analytics"
              with:
                job_urn: "{{job_urn}}"
            - name: update-tracker
              type: call
              call: "sharepoint.create-list-item"
              with:
                site_id: "{{sharepoint_site_id}}"
                list_id: "{{list_id}}"
                fields: "{\"JobUrn\":\"{{job_urn}}\",\"Impressions\":\"{{get-job-analytics.impressionCount}}\",\"Applies\":\"{{get-job-analytics.applyCount}}\",\"Views\":\"{{get-job-analytics.viewCount}}\"}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "TALENT PIPELINE: {{job_urn}} | Impressions: {{get-job-analytics.impressionCount}} | Views: {{get-job-analytics.viewCount}} | Applies: {{get-job-analytics.applyCount}} | Tracker updated."
  consumes:
    - namespace: linkedin
      type: http
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-analytics
          path: "/jobPostingAnalytics"
          inputParameters:
            - name: job_urn
              in: query
          operations:
            - name: get-job-analytics
              method: GET
    - namespace: sharepoint
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: list-items
          path: "/sites/{site_id}/lists/{list_id}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_id
              in: path
          operations:
            - name: create-list-item
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves load factor and booking data for a flight across cabin classes.

naftiko: "0.5"
info:
  label: "Flight Load Factor Report"
  description: "Retrieves load factor and booking data for a flight across cabin classes."
  tags:
    - revenue-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: load-factor
      port: 8080
      tools:
        - name: get-load-factor
          description: "Get load factor for a flight."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: flight_date
              in: body
              type: string
              description: "Date."
          call: "analytics-api.get-load"
          with:
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: load_factor
              type: number
              mapping: "$.overallLoadFactor"
            - name: first_load
              type: number
              mapping: "$.firstClassLoad"
  consumes:
    - type: http
      namespace: analytics-api
      baseUri: "https://analytics.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: load
          path: "/flights/{{flight}}/load-factor"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-load
              method: GET

Files lost baggage claims via WorldTracer, Salesforce case, and passenger SMS notification.

naftiko: "0.5"
info:
  label: "Lost Baggage Claim Orchestrator"
  description: "Files lost baggage claims via WorldTracer, Salesforce case, and passenger SMS notification."
  tags:
    - customer-service
    - baggage
    - salesforce
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: lost-baggage
      port: 8080
      tools:
        - name: file-claim
          description: "Process lost baggage claim."
          inputParameters:
            - name: pnr
              in: body
              type: string
              description: "PNR."
            - name: bag_tag
              in: body
              type: string
              description: "Bag tag."
            - name: flight_number
              in: body
              type: string
              description: "Flight."
          steps:
            - name: create-tracer
              type: call
              call: "baggage-api.create-tracer"
              with:
                pnr: "{{pnr}}"
                bag_tag: "{{bag_tag}}"
                flight: "{{flight_number}}"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Lost bag {{bag_tag}} on {{flight_number}}"
                priority: "High"
            - name: send-sms
              type: call
              call: "notification-api.send-sms"
              with:
                pnr: "{{pnr}}"
                message: "Baggage claim filed. Track: https://aa.com/baggage/{{create-tracer.tracer_id}}"
  consumes:
    - type: http
      namespace: baggage-api
      baseUri: "https://baggage.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_baggage_token"
      resources:
        - name: tracers
          path: "/worldtracer/create"
          operations:
            - name: create-tracer
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://aa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: sms
          path: "/sms/send"
          operations:
            - name: send-sms
              method: POST

Submits Flagship First/Business meal preorder.

naftiko: "0.5"
info:
  label: "Premium Meal Preorder"
  description: "Submits Flagship First/Business meal preorder."
  tags:
    - inflight-services
    - catering
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: preorder
      port: 8080
      tools:
        - name: submit-preorder
          description: "Submit meal preorder."
          inputParameters:
            - name: pnr
              in: body
              type: string
            - name: flight_number
              in: body
              type: string
            - name: meal
              in: body
              type: string
          call: "catering-api.preorder"
          with:
            pnr: "{{pnr}}"
            flight: "{{flight_number}}"
            meal: "{{meal}}"
          outputParameters:
            - name: confirmation
              type: string
              mapping: "$.confirmation"
  consumes:
    - type: http
      namespace: catering-api
      baseUri: "https://catering.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_catering_token"
      resources:
        - name: preorders
          path: "/preorders"
          operations:
            - name: preorder
              method: POST

Coordinates inflight medical emergency by contacting MedAire, finding diversions, alerting stations, and creating incidents.

naftiko: "0.5"
info:
  label: "Medical Emergency Response Orchestrator"
  description: "Coordinates inflight medical emergency by contacting MedAire, finding diversions, alerting stations, and creating incidents."
  tags:
    - safety
    - flight-operations
    - emergency
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: medical
      port: 8080
      tools:
        - name: handle-medical
          description: "Coordinate medical emergency response."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: emergency_type
              in: body
              type: string
              description: "Emergency type."
            - name: position
              in: body
              type: string
              description: "Aircraft position."
          steps:
            - name: contact-medaire
              type: call
              call: "medaire-api.initiate"
              with:
                flight: "{{flight_number}}"
                emergency: "{{emergency_type}}"
            - name: find-diversions
              type: call
              call: "dispatch-api.find-diversions"
              with:
                position: "{{position}}"
            - name: alert-station
              type: call
              call: "ground-ops.alert"
              with:
                station: "{{find-diversions.nearest}}"
                flight: "{{flight_number}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Medical on {{flight_number}}: {{emergency_type}}"
                priority: "1"
  consumes:
    - type: http
      namespace: medaire-api
      baseUri: "https://medaire.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_medaire_token"
      resources:
        - name: consults
          path: "/consults/initiate"
          operations:
            - name: initiate
              method: POST
    - type: http
      namespace: dispatch-api
      baseUri: "https://dispatch.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: diversions
          path: "/diversions/search"
          operations:
            - name: find-diversions
              method: POST
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: alerts
          path: "/stations/alert"
          operations:
            - name: alert
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Processes miles transfer between AAdvantage and oneworld partners.

naftiko: "0.5"
info:
  label: "Loyalty Partner Miles Transfer"
  description: "Processes miles transfer between AAdvantage and oneworld partners."
  tags:
    - loyalty
    - aadvantage
    - partnerships
capability:
  exposes:
    - type: mcp
      namespace: miles
      port: 8080
      tools:
        - name: transfer-miles
          description: "Transfer miles to partner."
          inputParameters:
            - name: aadvantage_number
              in: body
              type: string
            - name: partner
              in: body
              type: string
            - name: amount
              in: body
              type: number
          call: "loyalty-api.transfer"
          with:
            member: "{{aadvantage_number}}"
            partner: "{{partner}}"
            amount: "{{amount}}"
          outputParameters:
            - name: transfer_id
              type: string
              mapping: "$.transferId"
            - name: balance
              type: number
              mapping: "$.newBalance"
  consumes:
    - type: http
      namespace: loyalty-api
      baseUri: "https://loyalty.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_loyalty_token"
      resources:
        - name: transfers
          path: "/miles/transfer"
          operations:
            - name: transfer
              method: POST

Creates a maintenance work order in the AA TechOps system.

naftiko: "0.5"
info:
  label: "Maintenance Work Order Creation"
  description: "Creates a maintenance work order in the AA TechOps system."
  tags:
    - maintenance
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: mx-orders
      port: 8080
      tools:
        - name: create-wo
          description: "Create maintenance work order."
          inputParameters:
            - name: tail_number
              in: body
              type: string
            - name: discrepancy
              in: body
              type: string
            - name: priority
              in: body
              type: string
          call: "mx-api.create-wo"
          with:
            tail: "{{tail_number}}"
            description: "{{discrepancy}}"
            priority: "{{priority}}"
          outputParameters:
            - name: wo_id
              type: string
              mapping: "$.workOrderId"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: mx-api
      baseUri: "https://maintenance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: work-orders
          path: "/work-orders"
          operations:
            - name: create-wo
              method: POST

When a new hire is confirmed in PeopleSoft, provisions a SharePoint onboarding folder, sends a Microsoft Teams welcome message, and creates a GitHub onboarding issue for IT access setup.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new hire is confirmed in PeopleSoft, provisions a SharePoint onboarding folder, sends a Microsoft Teams welcome message, and creates a GitHub onboarding issue for IT access setup."
  tags:
    - hr
    - onboarding
    - peoplesoft
    - sharepoint
    - microsoft-teams
    - github
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-new-hire-onboarding
          description: "Given a new hire's PeopleSoft employee ID, start date, and manager email, provision a SharePoint folder, send a Teams welcome, and open a GitHub IT onboarding issue."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "PeopleSoft employee ID (EMPLID) of the new hire."
            - name: full_name
              in: body
              type: string
              description: "Full legal name of the new hire."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: manager_teams_id
              in: body
              type: string
              description: "Microsoft Teams user ID (UPN) of the hiring manager."
            - name: department
              in: body
              type: string
              description: "Department the new hire is joining, e.g. Technology."
          steps:
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "$secrets.hr_sharepoint_site_id"
                folder_path: "Onboarding/{{start_date}}/{{full_name}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{manager_teams_id}}"
                message: "New hire confirmed: {{full_name}} | Start: {{start_date}} | Dept: {{department}} | Onboarding docs: {{provision-folder.webUrl}}"
            - name: open-it-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "it-access-provisioning"
                title: "IT Onboarding: {{full_name}} (starts {{start_date}})"
                body: "Employee ID: {{employee_id}}\nFull Name: {{full_name}}\nStart Date: {{start_date}}\nDepartment: {{department}}\nSharePoint: {{provision-folder.webUrl}}"
                labels: "onboarding,new-hire,{{department}}"
  consumes:
    - namespace: sharepoint
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: folder
          path: "/sites/{site_id}/drive/root:/{folder_path}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: PUT
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST

Processes no-show passengers, releasing seats for standby.

naftiko: "0.5"
info:
  label: "Passenger No-Show Processing"
  description: "Processes no-show passengers, releasing seats for standby."
  tags:
    - flight-operations
    - revenue-management
capability:
  exposes:
    - type: mcp
      namespace: no-show
      port: 8080
      tools:
        - name: process-no-shows
          description: "Process no-shows."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: flight_date
              in: body
              type: string
          call: "pss.process-no-shows"
          with:
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.noShowCount"
            - name: released
              type: number
              mapping: "$.seatsReleased"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: no-shows
          path: "/flights/{{flight}}/no-shows"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: process-no-shows
              method: POST

Verifies flight ops comply with airport noise curfews.

naftiko: "0.5"
info:
  label: "Noise Curfew Compliance Check"
  description: "Verifies flight ops comply with airport noise curfews."
  tags:
    - compliance
    - flight-operations
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: noise
      port: 8080
      tools:
        - name: check-curfew
          description: "Check noise curfew."
          inputParameters:
            - name: airport
              in: body
              type: string
            - name: time
              in: body
              type: string
          call: "compliance-api.check"
          with:
            airport: "{{airport}}"
            time: "{{time}}"
          outputParameters:
            - name: compliant
              type: boolean
              mapping: "$.isCompliant"
  consumes:
    - type: http
      namespace: compliance-api
      baseUri: "https://compliance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_compliance_token"
      resources:
        - name: curfew
          path: "/noise/check"
          operations:
            - name: check
              method: POST

Synchronizes seat inventory with oneworld codeshare partners.

naftiko: "0.5"
info:
  label: "Oneworld Codeshare Inventory Sync"
  description: "Synchronizes seat inventory with oneworld codeshare partners."
  tags:
    - flight-operations
    - partnerships
    - revenue-management
capability:
  exposes:
    - type: mcp
      namespace: codeshare
      port: 8080
      tools:
        - name: sync-inventory
          description: "Sync inventory with partner."
          inputParameters:
            - name: partner_code
              in: body
              type: string
            - name: flight_number
              in: body
              type: string
            - name: flight_date
              in: body
              type: string
          call: "inventory-api.sync"
          with:
            partner: "{{partner_code}}"
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.syncStatus"
            - name: seats
              type: number
              mapping: "$.seatsSynced"
  consumes:
    - type: http
      namespace: inventory-api
      baseUri: "https://inventory.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_inventory_token"
      resources:
        - name: sync
          path: "/codeshare/sync"
          operations:
            - name: sync
              method: POST

Compiles daily OCC briefing from weather, fleet, and crew data, posts to Teams.

naftiko: "0.5"
info:
  label: "Ops Daily Briefing Orchestrator"
  description: "Compiles daily OCC briefing from weather, fleet, and crew data, posts to Teams."
  tags:
    - operations
    - flight-operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: briefing
      port: 8080
      tools:
        - name: generate-briefing
          description: "Generate daily ops briefing."
          inputParameters:
            - name: date
              in: body
              type: string
          steps:
            - name: weather
              type: call
              call: "weather-api.get-outlook"
              with:
                date: "{{date}}"
            - name: fleet
              type: call
              call: "mx-api.get-summary"
              with:
                date: "{{date}}"
            - name: crew
              type: call
              call: "crew-api.get-coverage"
              with:
                date: "{{date}}"
            - name: post
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{occ_channel}}"
                text: "DAILY OPS {{date}} | Weather: {{weather.summary}} | Fleet: {{fleet.available}}/{{fleet.total}} | Crew: {{crew.coverage}}%"
  consumes:
    - type: http
      namespace: weather-api
      baseUri: "https://dispatch.aa.com/api/v1/weather"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: outlook
          path: "/network/outlook"
          operations:
            - name: get-outlook
              method: POST
    - type: http
      namespace: mx-api
      baseUri: "https://maintenance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: summary
          path: "/fleet/summary"
          operations:
            - name: get-summary
              method: POST
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: coverage
          path: "/coverage/summary"
          operations:
            - name: get-coverage
              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-channel-message
              method: POST

Manages overbooked flights by finding volunteers, calculating compensation, and sending offers.

naftiko: "0.5"
info:
  label: "Overbooking Management Orchestrator"
  description: "Manages overbooked flights by finding volunteers, calculating compensation, and sending offers."
  tags:
    - revenue-management
    - customer-service
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: overbooking
      port: 8080
      tools:
        - name: manage-overbooking
          description: "Handle overbooking."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: flight_date
              in: body
              type: string
            - name: overbook_count
              in: body
              type: number
          steps:
            - name: find-volunteers
              type: call
              call: "pss.find-volunteers"
              with:
                flight: "{{flight_number}}"
                count: "{{overbook_count}}"
            - name: calc-comp
              type: call
              call: "compensation-api.get-rates"
              with:
                flight: "{{flight_number}}"
            - name: find-alts
              type: call
              call: "pss.search-alternatives"
              with:
                origin: "{{find-volunteers.origin}}"
                destination: "{{find-volunteers.destination}}"
            - name: send-offers
              type: call
              call: "notification-api.batch-notify"
              with:
                passengers: "{{find-volunteers.candidates}}"
                template: "volunteer_offer"
                amount: "{{calc-comp.amount}}"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: volunteers
          path: "/flights/{{flight}}/volunteers"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: find-volunteers
              method: POST
        - name: alts
          path: "/availability/search"
          operations:
            - name: search-alternatives
              method: POST
    - type: http
      namespace: compensation-api
      baseUri: "https://compensation.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_compensation_token"
      resources:
        - name: rates
          path: "/rates/vdb"
          operations:
            - name: get-rates
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: batch
          path: "/batch/notify"
          operations:
            - name: batch-notify
              method: POST

Queries spare parts availability at AA maintenance stations.

naftiko: "0.5"
info:
  label: "Maintenance Parts Inventory Lookup"
  description: "Queries spare parts availability at AA maintenance stations."
  tags:
    - maintenance
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: parts
      port: 8080
      tools:
        - name: check-parts
          description: "Check spare parts."
          inputParameters:
            - name: part_number
              in: body
              type: string
            - name: station
              in: body
              type: string
          call: "mx-api.get-stock"
          with:
            part: "{{part_number}}"
            station: "{{station}}"
          outputParameters:
            - name: quantity
              type: number
              mapping: "$.quantity"
            - name: lead_time
              type: number
              mapping: "$.leadTimeDays"
  consumes:
    - type: http
      namespace: mx-api
      baseUri: "https://maintenance.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_mx_token"
      resources:
        - name: stock
          path: "/parts/stock"
          operations:
            - name: get-stock
              method: POST

Processes upgrades by checking cabin availability, verifying AAdvantage eligibility, and sending confirmation.

naftiko: "0.5"
info:
  label: "Passenger Upgrade Orchestrator"
  description: "Processes upgrades by checking cabin availability, verifying AAdvantage eligibility, and sending confirmation."
  tags:
    - customer-service
    - loyalty
    - aadvantage
capability:
  exposes:
    - type: mcp
      namespace: upgrades
      port: 8080
      tools:
        - name: process-upgrade
          description: "Process passenger upgrade."
          inputParameters:
            - name: pnr
              in: body
              type: string
              description: "PNR."
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: aadvantage_number
              in: body
              type: string
              description: "AAdvantage number."
            - name: target_cabin
              in: body
              type: string
              description: "Target cabin (Flagship First, Flagship Business, First)."
          steps:
            - name: check-cabin
              type: call
              call: "pss.check-cabin"
              with:
                flight: "{{flight_number}}"
                cabin: "{{target_cabin}}"
            - name: verify-eligibility
              type: call
              call: "loyalty-api.check-upgrade"
              with:
                member: "{{aadvantage_number}}"
                cabin: "{{target_cabin}}"
            - name: execute
              type: call
              call: "pss.process-upgrade"
              with:
                pnr: "{{pnr}}"
                flight: "{{flight_number}}"
                cabin: "{{target_cabin}}"
            - name: confirm
              type: call
              call: "notification-api.send-email"
              with:
                member: "{{aadvantage_number}}"
                template: "upgrade_confirmation"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: cabin
          path: "/availability/cabin"
          operations:
            - name: check-cabin
              method: POST
        - name: upgrades
          path: "/upgrades/process"
          operations:
            - name: process-upgrade
              method: POST
    - type: http
      namespace: loyalty-api
      baseUri: "https://loyalty.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_loyalty_token"
      resources:
        - name: upgrade
          path: "/members/{{member}}/upgrade-eligibility"
          inputParameters:
            - name: member
              in: path
          operations:
            - name: check-upgrade
              method: GET
    - type: http
      namespace: notification-api
      baseUri: "https://notifications.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_notification_token"
      resources:
        - name: email
          path: "/email/send"
          operations:
            - name: send-email
              method: POST

Retrieves an employee's current profile, department, and manager from PeopleSoft HCM for HR agent workflows and headcount reporting.

naftiko: "0.5"
info:
  label: "PeopleSoft Employee Profile Lookup"
  description: "Retrieves an employee's current profile, department, and manager from PeopleSoft HCM for HR agent workflows and headcount reporting."
  tags:
    - hr
    - peoplesoft
    - employee-data
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-data
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a PeopleSoft employee ID, retrieve the employee's current job title, department, location, and manager. Use in onboarding, offboarding, and headcount audit workflows."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "PeopleSoft employee ID (EMPLID)."
          call: "peoplesoft.get-employee"
          with:
            emplid: "{{employee_id}}"
          outputParameters:
            - name: employee_name
              type: string
              mapping: "$.name"
            - name: job_title
              type: string
              mapping: "$.jobTitle"
            - name: department
              type: string
              mapping: "$.department"
            - name: manager_id
              type: string
              mapping: "$.managerId"
  consumes:
    - namespace: peoplesoft
      type: http
      baseUri: "https://hcm.aa.com/PSIGW/RESTListeningConnector/PSFT_HR"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_username"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: employee
          path: "/EmployeeProfile/v1/{emplid}"
          inputParameters:
            - name: emplid
              in: path
          operations:
            - name: get-employee
              method: GET

Validates pet-in-cabin booking against aircraft and route restrictions.

naftiko: "0.5"
info:
  label: "Pet Booking Validation"
  description: "Validates pet-in-cabin booking against aircraft and route restrictions."
  tags:
    - customer-service
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: pet
      port: 8080
      tools:
        - name: validate-pet
          description: "Validate pet booking."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: pet_type
              in: body
              type: string
          call: "pss.validate-pet"
          with:
            flight: "{{flight_number}}"
            pet: "{{pet_type}}"
          outputParameters:
            - name: allowed
              type: boolean
              mapping: "$.isAllowed"
            - name: slots
              type: number
              mapping: "$.remainingSlots"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: pet
          path: "/bookings/pet-validation"
          operations:
            - name: validate-pet
              method: POST

Retrieves pilot training records including type ratings and recurrent training dates.

naftiko: "0.5"
info:
  label: "Pilot Training Record Lookup"
  description: "Retrieves pilot training records including type ratings and recurrent training dates."
  tags:
    - crew-scheduling
    - training
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: training
      port: 8080
      tools:
        - name: get-training
          description: "Look up pilot training records."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "crew-api.get-training"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: type_ratings
              type: array
              mapping: "$.typeRatings"
            - name: next_recurrent
              type: string
              mapping: "$.nextRecurrent"
  consumes:
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: training
          path: "/pilots/{{employee_id}}/training"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-training
              method: GET

Retrieves Pluralsight course completion data for a team and posts a learning progress digest to the HR development channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight Learning Completion Reporter"
  description: "Retrieves Pluralsight course completion data for a team and posts a learning progress digest to the HR development channel in Microsoft Teams."
  tags:
    - hr
    - learning-development
    - pluralsight
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: learning-dev
      port: 8080
      tools:
        - name: digest-team-learning
          description: "Given a Pluralsight team handle and a date range, retrieve course completions and post a learning progress digest to Microsoft Teams. Use for monthly L&D reporting."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Pluralsight team identifier."
            - 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."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the L&D digest."
          steps:
            - name: get-completions
              type: call
              call: "pluralsight.get-team-progress"
              with:
                team_id: "{{team_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "L&D DIGEST ({{start_date}} to {{end_date}}): Team {{team_id}} | Courses Completed: {{get-completions.totalCoursesCompleted}} | Hours Watched: {{get-completions.totalMinutesWatched}} | Active Learners: {{get-completions.activeLearners}}"
  consumes:
    - namespace: pluralsight
      type: http
      baseUri: "https://api.pluralsight.com/rest"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: team-progress
          path: "/teams/{team_id}/progress"
          inputParameters:
            - name: team_id
              in: path
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-team-progress
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Microsoft Power Automate flow fails, queries the run history, opens a GitHub issue for the automation team, and posts a failure summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power Automate Workflow Failure Alert"
  description: "When a Microsoft Power Automate flow fails, queries the run history, opens a GitHub issue for the automation team, and posts a failure summary to Microsoft Teams."
  tags:
    - automation
    - microsoft-power-automate
    - github
    - microsoft-teams
    - workflow-monitoring
capability:
  exposes:
    - type: mcp
      namespace: automation-ops
      port: 8080
      tools:
        - name: handle-flow-failure
          description: "Given a Power Automate flow ID, flow name, and run ID, retrieve run error details, open a GitHub issue, and alert the automation team in Microsoft Teams."
          inputParameters:
            - name: flow_id
              in: body
              type: string
              description: "Microsoft Power Automate flow identifier (GUID)."
            - name: flow_name
              in: body
              type: string
              description: "Human-readable flow name for notifications."
            - name: run_id
              in: body
              type: string
              description: "Specific flow run ID that failed."
            - name: environment_id
              in: body
              type: string
              description: "Power Platform environment ID where the flow runs."
          steps:
            - name: get-run-details
              type: call
              call: "power-automate.get-flow-run"
              with:
                environment_id: "{{environment_id}}"
                flow_id: "{{flow_id}}"
                run_id: "{{run_id}}"
            - name: open-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "automation-platform"
                title: "Flow Failure: {{flow_name}}"
                body: "Flow: {{flow_name}}\nFlow ID: {{flow_id}}\nRun ID: {{run_id}}\nError: {{get-run-details.error.message}}\nFailed action: {{get-run-details.error.action}}"
                labels: "automation,flow-failure,needs-triage"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.automation_teams_channel_id"
                message: "FLOW FAILURE: {{flow_name}} | Error: {{get-run-details.error.message}} | Failed action: {{get-run-details.error.action}} | Issue: {{open-issue.html_url}}"
  consumes:
    - namespace: power-automate
      type: http
      baseUri: "https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple/environments"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: flow-run
          path: "/{environment_id}/flows/{flow_id}/runs/{run_id}"
          inputParameters:
            - name: environment_id
              in: path
            - name: flow_id
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-flow-run
              method: GET
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reports ramp safety incidents via ServiceNow, Teams notification, and Workday employee record.

naftiko: "0.5"
info:
  label: "Ramp Safety Incident Orchestrator"
  description: "Reports ramp safety incidents via ServiceNow, Teams notification, and Workday employee record."
  tags:
    - safety
    - ground-ops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: report-incident
          description: "Report ramp safety incident."
          inputParameters:
            - name: station
              in: body
              type: string
              description: "Station."
            - name: incident_type
              in: body
              type: string
              description: "Type."
            - name: employee_id
              in: body
              type: string
              description: "Employee."
            - name: description
              in: body
              type: string
              description: "Description."
          steps:
            - name: create-report
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Ramp safety: {{incident_type}} at {{station}}"
                category: "safety"
                priority: "1"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{safety_channel}}"
                text: "SAFETY at {{station}}: {{incident_type}} — {{description}}"
            - name: log
              type: call
              call: "peoplesoft.create-event"
              with:
                employee_id: "{{employee_id}}"
                event_type: "{{incident_type}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://aa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: peoplesoft
      baseUri: "https://peoplesoft.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_peoplesoft_token"
      resources:
        - name: events
          path: "/safety/events"
          operations:
            - name: create-event
              method: POST

Generates route profitability metrics including load factor, RASM, and operating margin.

naftiko: "0.5"
info:
  label: "Route Profitability Report"
  description: "Generates route profitability metrics including load factor, RASM, and operating margin."
  tags:
    - revenue-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: route-analytics
      port: 8080
      tools:
        - name: get-route-profitability
          description: "Retrieve route profitability metrics."
          inputParameters:
            - name: origin
              in: body
              type: string
              description: "Origin."
            - name: destination
              in: body
              type: string
              description: "Destination."
            - name: period
              in: body
              type: string
              description: "Period."
          call: "analytics-api.get-route"
          with:
            origin: "{{origin}}"
            destination: "{{destination}}"
            period: "{{period}}"
          outputParameters:
            - name: load_factor
              type: number
              mapping: "$.loadFactor"
            - name: rasm
              type: number
              mapping: "$.rasm"
            - name: margin
              type: number
              mapping: "$.operatingMargin"
  consumes:
    - type: http
      namespace: analytics-api
      baseUri: "https://analytics.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: routes
          path: "/routes/profitability"
          operations:
            - name: get-route
              method: POST

Generates RPM report broken down by operations.

naftiko: "0.5"
info:
  label: "Revenue Passenger Miles Report"
  description: "Generates RPM report broken down by operations."
  tags:
    - revenue-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: rpm
      port: 8080
      tools:
        - name: get-rpm
          description: "Generate RPM report."
          inputParameters:
            - name: start_date
              in: body
              type: string
            - name: end_date
              in: body
              type: string
          call: "analytics-api.get-rpm"
          with:
            start: "{{start_date}}"
            end: "{{end_date}}"
          outputParameters:
            - name: total
              type: number
              mapping: "$.totalRPM"
            - name: domestic
              type: number
              mapping: "$.domesticRPM"
  consumes:
    - type: http
      namespace: analytics-api
      baseUri: "https://analytics.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_analytics_token"
      resources:
        - name: rpm
          path: "/metrics/rpm"
          operations:
            - name: get-rpm
              method: POST

Submits runway slot requests at slot-controlled airports.

naftiko: "0.5"
info:
  label: "Runway Slot Request"
  description: "Submits runway slot requests at slot-controlled airports."
  tags:
    - flight-operations
    - dispatch
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: slots
      port: 8080
      tools:
        - name: request-slot
          description: "Request runway slot."
          inputParameters:
            - name: airport
              in: body
              type: string
            - name: flight_number
              in: body
              type: string
            - name: time
              in: body
              type: string
          call: "slot-api.request"
          with:
            airport: "{{airport}}"
            flight: "{{flight_number}}"
            time: "{{time}}"
          outputParameters:
            - name: slot_id
              type: string
              mapping: "$.slotId"
            - name: granted
              type: string
              mapping: "$.grantedTime"
  consumes:
    - type: http
      namespace: slot-api
      baseUri: "https://scheduling.aa.com/api/v1/slots"
      authentication:
        type: bearer
        token: "$secrets.aa_scheduling_token"
      resources:
        - name: slots
          path: "/request"
          operations:
            - name: request
              method: POST

When a high-priority Salesforce case is opened or escalated, posts a structured escalation notification to the customer operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to Teams"
  description: "When a high-priority Salesforce case is opened or escalated, posts a structured escalation notification to the customer operations Microsoft Teams channel."
  tags:
    - crm
    - customer-support
    - salesforce
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: case-escalation
      port: 8080
      tools:
        - name: escalate-salesforce-case
          description: "Given a Salesforce case ID and priority level, retrieve case details and post an escalation notification to the customer ops Teams channel. Use when a new P1 or P2 case is detected in Salesforce."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case record ID to escalate."
            - name: priority
              in: body
              type: string
              description: "Escalation priority: P1 or P2."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the escalation notification."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: post-escalation
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "CASE ESCALATION ({{priority}}): {{get-case.Subject}} | Status: {{get-case.Status}} | Customer: {{get-case.Account.Name}} | Owner: {{get-case.Owner.Name}} | Salesforce: https://american-airlines.my.salesforce.com/{{case_id}}"
  consumes:
    - namespace: salesforce
      type: http
      baseUri: "https://american-airlines.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: case
          path: "/sobjects/Case/{case_id}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current status, priority, and assigned owner of a Salesforce case for use in customer service routing and escalation workflows.

naftiko: "0.5"
info:
  label: "Salesforce Customer Case Status Lookup"
  description: "Retrieves the current status, priority, and assigned owner of a Salesforce case for use in customer service routing and escalation workflows."
  tags:
    - crm
    - customer-support
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: customer-service
      port: 8080
      tools:
        - name: get-case-status
          description: "Given a Salesforce case ID, return its current status, priority, subject, and assigned owner. Use in agent workflows that need to assess whether a customer issue is pending, in-progress, or resolved."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case record ID."
          call: "salesforce.get-case"
          with:
            case_id: "{{case_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: priority
              type: string
              mapping: "$.Priority"
            - name: subject
              type: string
              mapping: "$.Subject"
            - name: owner_name
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - namespace: salesforce
      type: http
      baseUri: "https://american-airlines.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: case
          path: "/sobjects/Case/{case_id}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET

When a new lead arrives in Salesforce Lightning, enriches it with ZoomInfo firmographic data and updates the Salesforce record, then notifies the owning sales rep via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead Intelligence Enrichment"
  description: "When a new lead arrives in Salesforce Lightning, enriches it with ZoomInfo firmographic data and updates the Salesforce record, then notifies the owning sales rep via Microsoft Teams."
  tags:
    - crm
    - sales
    - salesforce
    - zoominfo
    - microsoft-teams
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-salesforce-lead
          description: "Given a Salesforce lead ID and contact email, query ZoomInfo for firmographic enrichment, update the Salesforce lead record, and notify the owning rep in Microsoft Teams."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead record ID."
            - name: contact_email
              in: body
              type: string
              description: "Contact email address to use for ZoomInfo lookup."
            - name: rep_teams_id
              in: body
              type: string
              description: "Microsoft Teams user ID (UPN) of the sales rep who owns this lead."
          steps:
            - name: lookup-zoominfo
              type: call
              call: "zoominfo.search-contact"
              with:
                email: "{{contact_email}}"
            - name: update-lead
              type: call
              call: "salesforce.update-lead"
              with:
                lead_id: "{{lead_id}}"
                Company: "{{lookup-zoominfo.company}}"
                Industry: "{{lookup-zoominfo.industry}}"
                AnnualRevenue: "{{lookup-zoominfo.revenue}}"
                NumberOfEmployees: "{{lookup-zoominfo.employeeCount}}"
                Title: "{{lookup-zoominfo.jobTitle}}"
            - name: notify-rep
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{rep_teams_id}}"
                message: "Lead Enriched: {{lookup-zoominfo.firstName}} {{lookup-zoominfo.lastName}} | Company: {{lookup-zoominfo.company}} | Industry: {{lookup-zoominfo.industry}} | Employees: {{lookup-zoominfo.employeeCount}} | Salesforce: https://american-airlines.my.salesforce.com/{{lead_id}}"
  consumes:
    - namespace: zoominfo
      type: http
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contact
          path: "/contact"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-contact
              method: GET
    - namespace: salesforce
      type: http
      baseUri: "https://american-airlines.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead
          path: "/sobjects/Lead/{lead_id}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes schedule change impact on connections and crew, notifies planning.

naftiko: "0.5"
info:
  label: "Schedule Change Impact Orchestrator"
  description: "Analyzes schedule change impact on connections and crew, notifies planning."
  tags:
    - scheduling
    - flight-operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: schedule
      port: 8080
      tools:
        - name: assess-change
          description: "Analyze schedule change."
          inputParameters:
            - name: flight_number
              in: body
              type: string
            - name: new_time
              in: body
              type: string
          steps:
            - name: connections
              type: call
              call: "scheduling-api.analyze-cx"
              with:
                flight: "{{flight_number}}"
                time: "{{new_time}}"
            - name: crew
              type: call
              call: "crew-api.assess-impact"
              with:
                flight: "{{flight_number}}"
                time: "{{new_time}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{planning_channel}}"
                text: "Schedule change {{flight_number}}: {{connections.affected}} cx, {{crew.pairings}} pairings"
  consumes:
    - type: http
      namespace: scheduling-api
      baseUri: "https://scheduling.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_scheduling_token"
      resources:
        - name: cx
          path: "/analysis/connections"
          operations:
            - name: analyze-cx
              method: POST
    - type: http
      namespace: crew-api
      baseUri: "https://crew.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_crew_token"
      resources:
        - name: impact
          path: "/pairings/impact"
          operations:
            - name: assess-impact
              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-channel-message
              method: POST

Retrieves seat map and availability for an AA flight.

naftiko: "0.5"
info:
  label: "Seat Map Availability Lookup"
  description: "Retrieves seat map and availability for an AA flight."
  tags:
    - customer-service
    - flight-operations
capability:
  exposes:
    - type: mcp
      namespace: seat-map
      port: 8080
      tools:
        - name: get-seat-map
          description: "Get seat availability."
          inputParameters:
            - name: flight_number
              in: body
              type: string
              description: "Flight."
            - name: flight_date
              in: body
              type: string
              description: "Date."
          call: "pss.get-seats"
          with:
            flight: "{{flight_number}}"
            date: "{{flight_date}}"
          outputParameters:
            - name: available
              type: number
              mapping: "$.availableSeats"
            - name: cabins
              type: object
              mapping: "$.cabinBreakdown"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: seats
          path: "/flights/{{flight}}/seat-map"
          inputParameters:
            - name: flight
              in: path
          operations:
            - name: get-seats
              method: GET

When Palo Alto Networks raises a high-severity threat, logs the event in Datadog, opens a GitHub security issue, and escalates to the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Security Threat Alert Triage"
  description: "When Palo Alto Networks raises a high-severity threat, logs the event in Datadog, opens a GitHub security issue, and escalates to the security team via Microsoft Teams."
  tags:
    - security
    - incident-response
    - palo-alto-networks
    - datadog
    - github
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-security-threat
          description: "Given a Palo Alto Networks threat ID and severity, annotate Datadog with the event, open a GitHub security issue, and notify the security team in Microsoft Teams."
          inputParameters:
            - name: threat_id
              in: body
              type: string
              description: "Palo Alto Networks threat event identifier."
            - name: severity
              in: body
              type: string
              description: "Threat severity: critical, high, medium, or low."
            - name: source_ip
              in: body
              type: string
              description: "Source IP address of the detected threat."
            - name: destination_ip
              in: body
              type: string
              description: "Destination IP address targeted by the threat."
            - name: threat_name
              in: body
              type: string
              description: "Human-readable name of the detected threat signature."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Security Threat: {{threat_name}} ({{severity}})"
                text: "Threat {{threat_id}} — src: {{source_ip}} → dst: {{destination_ip}}"
                alert_type: "error"
                tags: "severity:{{severity}},threat:{{threat_id}}"
            - name: open-security-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "security-response"
                title: "[{{severity}}] Security Threat: {{threat_name}}"
                body: "Threat ID: {{threat_id}}\nSeverity: {{severity}}\nSource IP: {{source_ip}}\nDestination IP: {{destination_ip}}\nDatadog: {{annotate-datadog.url}}"
                labels: "security,{{severity}},needs-investigation"
            - name: notify-security-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.security_teams_channel_id"
                message: "SECURITY THREAT ({{severity}}): {{threat_name}} | Src: {{source_ip}} | Dst: {{destination_ip}} | Issue: {{open-security-issue.html_url}}"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves estimated security wait times at an AA hub.

naftiko: "0.5"
info:
  label: "Security Checkpoint Wait Times"
  description: "Retrieves estimated security wait times at an AA hub."
  tags:
    - customer-service
    - airport
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-waits
          description: "Get security wait times."
          inputParameters:
            - name: station
              in: body
              type: string
            - name: terminal
              in: body
              type: string
          call: "airport-api.get-waits"
          with:
            station: "{{station}}"
            terminal: "{{terminal}}"
          outputParameters:
            - name: standard
              type: number
              mapping: "$.standardWait"
            - name: precheck
              type: number
              mapping: "$.precheckWait"
  consumes:
    - type: http
      namespace: airport-api
      baseUri: "https://api.aa.com/v1/airports"
      authentication:
        type: bearer
        token: "$secrets.aa_api_token"
      resources:
        - name: waits
          path: "/{{station}}/security"
          inputParameters:
            - name: station
              in: path
          operations:
            - name: get-waits
              method: GET

Queries Teradata system tables for long-running or blocked queries and posts a pipeline health digest to the data engineering channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Teradata Data Pipeline Health Monitor"
  description: "Queries Teradata system tables for long-running or blocked queries and posts a pipeline health digest to the data engineering channel in Microsoft Teams."
  tags:
    - data
    - analytics
    - teradata
    - microsoft-teams
    - pipeline-monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-teradata-pipeline
          description: "Given a Teradata query threshold (in seconds), retrieve active sessions exceeding that duration and post a digest to the data engineering Teams channel. Use for proactive data pipeline triage."
          inputParameters:
            - name: duration_threshold_seconds
              in: body
              type: integer
              description: "Alert threshold in seconds. Queries running longer than this value will be included in the digest."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the data pipeline health digest."
          steps:
            - name: query-active-sessions
              type: call
              call: "teradata.query-sessions"
              with:
                min_duration_seconds: "{{duration_threshold_seconds}}"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "TERADATA PIPELINE HEALTH: {{query-active-sessions.longRunningCount}} queries > {{duration_threshold_seconds}}s | Blocked: {{query-active-sessions.blockedCount}} | Top query: {{query-active-sessions.topQuery}} ({{query-active-sessions.topDuration}}s)"
  consumes:
    - namespace: teradata
      type: http
      baseUri: "https://teradata.aa.com/api/rest/v1"
      authentication:
        type: basic
        username: "$secrets.teradata_username"
        password: "$secrets.teradata_password"
      resources:
        - name: sessions
          path: "/queryMonitor/sessions"
          inputParameters:
            - name: min_duration_seconds
              in: query
          operations:
            - name: query-sessions
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Terraform Cloud detects a plan with drift on a production workspace, annotates Datadog, opens a GitHub issue, and notifies the infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Drift Alert"
  description: "When Terraform Cloud detects a plan with drift on a production workspace, annotates Datadog, opens a GitHub issue, and notifies the infrastructure team via Microsoft Teams."
  tags:
    - cloud
    - infra
    - terraform
    - datadog
    - github
    - microsoft-teams
    - drift-detection
capability:
  exposes:
    - type: mcp
      namespace: infra-governance
      port: 8080
      tools:
        - name: handle-terraform-drift
          description: "Given a Terraform Cloud workspace name and run ID, create a Datadog event, open a GitHub issue with drift details, and alert the infrastructure channel in Microsoft Teams."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name where drift was detected, e.g. aa-prod-network."
            - name: run_id
              in: body
              type: string
              description: "Terraform Cloud run ID that identified the drift."
            - name: resource_count
              in: body
              type: integer
              description: "Number of resources with detected drift."
          steps:
            - name: get-run
              type: call
              call: "terraform.get-run"
              with:
                run_id: "{{run_id}}"
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Terraform Drift: {{workspace_name}}"
                text: "Run {{run_id}} detected drift on {{resource_count}} resources. Status: {{get-run.status}}"
                alert_type: "warning"
                tags: "workspace:{{workspace_name}},env:production"
            - name: open-issue
              type: call
              call: "github.create-issue"
              with:
                owner: "AmericanAirlines"
                repo: "infrastructure"
                title: "Terraform Drift: {{workspace_name}} ({{resource_count}} resources)"
                body: "Workspace: {{workspace_name}}\nRun ID: {{run_id}}\nDrifted resources: {{resource_count}}\nRun status: {{get-run.status}}\nDatadog: {{annotate-datadog.url}}"
                labels: "infrastructure,drift,production"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "$secrets.infra_teams_channel_id"
                message: "TERRAFORM DRIFT: {{workspace_name}} | {{resource_count}} resources | Run: {{run_id}} | Issue: {{open-issue.html_url}}"
  consumes:
    - namespace: terraform
      type: http
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_cloud_token"
      resources:
        - name: run
          path: "/runs/{run_id}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issues
          path: "/repos/{owner}/{repo}/issues"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: create-issue
              method: POST
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee completes a trip, retrieves the SAP Concur expense report status and posts a summary to the employee's Microsoft Teams, prompting submission if still in draft.

naftiko: "0.5"
info:
  label: "Travel Expense Report Submission"
  description: "When an employee completes a trip, retrieves the SAP Concur expense report status and posts a summary to the employee's Microsoft Teams, prompting submission if still in draft."
  tags:
    - finance
    - travel
    - sap-concur
    - microsoft-teams
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: travel-finance
      port: 8080
      tools:
        - name: check-expense-report
          description: "Given an employee login ID and SAP Concur report ID, retrieve the expense report status and post a summary or submission reminder to Microsoft Teams."
          inputParameters:
            - name: employee_login_id
              in: body
              type: string
              description: "The employee's SAP Concur login ID or email address."
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to check."
            - name: teams_user_id
              in: body
              type: string
              description: "Microsoft Teams user ID (UPN) to send the notification to."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{teams_user_id}}"
                message: "Expense Report {{report_id}}: Status={{get-report.Status}} | Total={{get-report.Total}} {{get-report.CurrencyCode}} | Trip={{get-report.Name}} | Submit at: https://www.concursolutions.com"
  consumes:
    - namespace: concur
      type: http
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.sap_concur_token"
      resources:
        - name: expense-report
          path: "/expense/reports/{report_id}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - namespace: msteams
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.ms_graph_token"
      resources:
        - name: channel-message
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks unaccompanied minor passengers.

naftiko: "0.5"
info:
  label: "Unaccompanied Minor Tracking"
  description: "Tracks unaccompanied minor passengers."
  tags:
    - customer-service
    - safety
    - tracking
capability:
  exposes:
    - type: mcp
      namespace: umnr
      port: 8080
      tools:
        - name: track-umnr
          description: "Track UMNR."
          inputParameters:
            - name: pnr
              in: body
              type: string
          call: "umnr-api.get-status"
          with:
            pnr: "{{pnr}}"
          outputParameters:
            - name: checkpoint
              type: string
              mapping: "$.checkpoint"
            - name: handoff
              type: string
              mapping: "$.handoffStatus"
  consumes:
    - type: http
      namespace: umnr-api
      baseUri: "https://pss.aa.com/api/v2/umnr"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: tracking
          path: "/tracking/{{pnr}}"
          inputParameters:
            - name: pnr
              in: path
          operations:
            - name: get-status
              method: GET

Arranges VIP handling including reservation flagging, meet-and-greet, and station notification.

naftiko: "0.5"
info:
  label: "VIP Passenger Handling Orchestrator"
  description: "Arranges VIP handling including reservation flagging, meet-and-greet, and station notification."
  tags:
    - customer-service
    - ground-ops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vip
      port: 8080
      tools:
        - name: arrange-vip
          description: "Set up VIP handling."
          inputParameters:
            - name: pnr
              in: body
              type: string
            - name: flight_number
              in: body
              type: string
            - name: station
              in: body
              type: string
          steps:
            - name: flag
              type: call
              call: "pss.add-ssr"
              with:
                pnr: "{{pnr}}"
                ssr: "VIP"
            - name: meet-greet
              type: call
              call: "ground-ops.create-meet-greet"
              with:
                station: "{{station}}"
                flight: "{{flight_number}}"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{station_channel}}"
                text: "VIP for {{flight_number}} at {{station}}"
  consumes:
    - type: http
      namespace: pss
      baseUri: "https://pss.aa.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aa_pss_token"
      resources:
        - name: ssr
          path: "/bookings/{{pnr}}/ssr"
          inputParameters:
            - name: pnr
              in: path
          operations:
            - name: add-ssr
              method: POST
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: meet-greet
          path: "/meet-greet/create"
          operations:
            - name: create-meet-greet
              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-channel-message
              method: POST

Assesses weather impact at an AA hub by querying forecasts, identifying affected flights, creating ServiceNow incidents, and alerting OCC.

naftiko: "0.5"
info:
  label: "Weather Impact Assessment Orchestrator"
  description: "Assesses weather impact at an AA hub by querying forecasts, identifying affected flights, creating ServiceNow incidents, and alerting OCC."
  tags:
    - flight-operations
    - weather
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weather
      port: 8080
      tools:
        - name: assess-weather
          description: "Assess weather impact at a hub."
          inputParameters:
            - name: hub
              in: body
              type: string
              description: "Hub code."
            - name: hours
              in: body
              type: number
              description: "Hours ahead."
          steps:
            - name: get-forecast
              type: call
              call: "weather-api.get-forecast"
              with:
                station: "{{hub}}"
                hours: "{{hours}}"
            - name: get-flights
              type: call
              call: "aa-api.search-departures"
              with:
                station: "{{hub}}"
                hours: "{{hours}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Weather at {{hub}}: {{get-forecast.severity}} — {{get-flights.count}} flights"
                priority: "2"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{occ_channel}}"
                text: "Weather alert {{hub}}: {{get-forecast.summary}} | {{get-flights.count}} departures impacted"
  consumes:
    - type: http
      namespace: weather-api
      baseUri: "https://api.weather.gov"
      authentication:
        type: none
      resources:
        - name: forecasts
          path: "/zones/forecast/{{station}}"
          inputParameters:
            - name: station
              in: path
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: aa-api
      baseUri: "https://api.aa.com/v1/flights"
      authentication:
        type: bearer
        token: "$secrets.aa_api_token"
      resources:
        - name: departures
          path: "/departures/search"
          operations:
            - name: search-departures
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://aa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Calculates aircraft weight and balance for pre-departure dispatch.

naftiko: "0.5"
info:
  label: "Weight and Balance Calculation"
  description: "Calculates aircraft weight and balance for pre-departure dispatch."
  tags:
    - dispatch
    - flight-operations
    - safety
capability:
  exposes:
    - type: mcp
      namespace: wb
      port: 8080
      tools:
        - name: calc-wb
          description: "Calculate weight and balance."
          inputParameters:
            - name: tail_number
              in: body
              type: string
              description: "Tail."
            - name: pax_count
              in: body
              type: number
              description: "Passengers."
            - name: cargo_kg
              in: body
              type: number
              description: "Cargo weight."
            - name: fuel_kg
              in: body
              type: number
              description: "Fuel load."
          call: "dispatch-api.calc-wb"
          with:
            tail: "{{tail_number}}"
            pax: "{{pax_count}}"
            cargo: "{{cargo_kg}}"
            fuel: "{{fuel_kg}}"
          outputParameters:
            - name: takeoff_weight
              type: number
              mapping: "$.takeoffWeight"
            - name: within_limits
              type: boolean
              mapping: "$.withinLimits"
  consumes:
    - type: http
      namespace: dispatch-api
      baseUri: "https://dispatch.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_dispatch_token"
      resources:
        - name: wb
          path: "/weight-balance/calculate"
          operations:
            - name: calc-wb
              method: POST

Creates wheelchair assistance request for a passenger.

naftiko: "0.5"
info:
  label: "Wheelchair Service Request"
  description: "Creates wheelchair assistance request for a passenger."
  tags:
    - customer-service
    - ground-ops
    - accessibility
capability:
  exposes:
    - type: mcp
      namespace: wheelchair
      port: 8080
      tools:
        - name: request-wheelchair
          description: "Submit wheelchair request."
          inputParameters:
            - name: pnr
              in: body
              type: string
            - name: station
              in: body
              type: string
            - name: type
              in: body
              type: string
          call: "ground-ops.create-wheelchair"
          with:
            pnr: "{{pnr}}"
            station: "{{station}}"
            type: "{{type}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: ground-ops
      baseUri: "https://groundops.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_ground_ops_token"
      resources:
        - name: wheelchair
          path: "/wheelchair/request"
          operations:
            - name: create-wheelchair
              method: POST

Retrieves inflight WiFi metrics for an aircraft.

naftiko: "0.5"
info:
  label: "Inflight WiFi Performance Report"
  description: "Retrieves inflight WiFi metrics for an aircraft."
  tags:
    - inflight-services
    - technology
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: wifi
      port: 8080
      tools:
        - name: get-wifi
          description: "Get WiFi metrics."
          inputParameters:
            - name: tail_number
              in: body
              type: string
          call: "connectivity-api.get-metrics"
          with:
            tail: "{{tail_number}}"
          outputParameters:
            - name: uptime
              type: number
              mapping: "$.uptimePercent"
            - name: bandwidth
              type: number
              mapping: "$.avgBandwidth"
  consumes:
    - type: http
      namespace: connectivity-api
      baseUri: "https://connectivity.aa.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aa_connectivity_token"
      resources:
        - name: metrics
          path: "/aircraft/{{tail}}/wifi"
          inputParameters:
            - name: tail
              in: path
          operations:
            - name: get-metrics
              method: GET