Marriott International Capabilities

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

Sort
Expand

Retrieves booking funnel conversion data from Adobe Analytics for Marriott.com, returning step-by-step drop-off rates from search to confirmation.

naftiko: "0.5"
info:
  label: "Adobe Analytics Booking Funnel Report"
  description: "Retrieves booking funnel conversion data from Adobe Analytics for Marriott.com, returning step-by-step drop-off rates from search to confirmation."
  tags:
    - marketing
    - adobe-analytics
    - reporting
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: digital-analytics
      port: 8080
      tools:
        - name: get-booking-funnel
          description: "Given a date range, retrieve booking funnel conversion metrics from Adobe Analytics."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "adobe-analytics.get-funnel-report"
          with:
            report_suite: "marriott-booking"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: search_to_select_rate
              type: string
              mapping: "$.report.data.steps[0].conversion_rate"
            - name: select_to_book_rate
              type: string
              mapping: "$.report.data.steps[1].conversion_rate"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/marriott"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-funnel-report
              method: POST

Given a set of guest feedback records from Salesforce, uses an AI API to generate a concise summary of recurring complaint themes and posts the insight to the hotel operations Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Guest Complaint Summarizer"
  description: "Given a set of guest feedback records from Salesforce, uses an AI API to generate a concise summary of recurring complaint themes and posts the insight to the hotel operations Teams channel."
  tags:
    - ai
    - guest-experience
    - salesforce
    - anthropic
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: ai-ops
      port: 8080
      tools:
        - name: summarize-guest-complaints
          description: "Given a property code and date range, retrieve guest complaint cases from Salesforce, pass them to the Anthropic Claude API for theme extraction and summarization, and post the resulting insight to the hotel operations Teams channel. Use for weekly operations reviews and quality management reporting."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code to analyze guest complaints for."
            - name: start_date
              in: body
              type: string
              description: "Start date of the analysis window in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date of the analysis window in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to post the AI-generated summary to."
          steps:
            - name: get-complaint-cases
              type: call
              call: "salesforce-complaints.get-cases"
              with:
                property_code: "{{property_code}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: generate-summary
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Summarize the following guest complaint cases from Marriott property {{property_code}} between {{start_date}} and {{end_date}}, identifying the top recurring themes and recommended actions: {{get-complaint-cases.cases}}"
            - name: post-insight
              type: call
              call: "msteams-ai.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Guest Complaint Analysis for {{property_code}} ({{start_date}} to {{end_date}}): {{generate-summary.content}}"
  consumes:
    - type: http
      namespace: salesforce-complaints
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/query"
          operations:
            - name: get-cases
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams-ai
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Verifies integrity and timeliness of data backups in Amazon S3, checking object counts and last modified timestamps.

naftiko: "0.5"
info:
  label: "Amazon S3 Data Backup Verification"
  description: "Verifies integrity and timeliness of data backups in Amazon S3, checking object counts and last modified timestamps."
  tags:
    - infrastructure
    - amazon-s3
    - data-protection
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: verify-s3-backup
          description: "Given an S3 bucket and prefix, verify backup completeness."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The S3 bucket name."
            - name: prefix
              in: body
              type: string
              description: "The S3 key prefix."
          call: "s3.list-objects"
          with:
            bucket: "{{bucket_name}}"
            prefix: "{{prefix}}"
          outputParameters:
            - name: object_count
              type: string
              mapping: "$.KeyCount"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        access_key: "$secrets.aws_access_key"
        secret_key: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{bucket}}"
          inputParameters:
            - name: bucket
              in: path
          operations:
            - name: list-objects
              method: GET

Broadcasts operational alerts via Amazon SNS, creates ServiceNow incidents, and notifies Teams.

naftiko: "0.5"
info:
  label: "Amazon SNS Operational Alert Publisher"
  description: "Broadcasts operational alerts via Amazon SNS, creates ServiceNow incidents, and notifies Teams."
  tags:
    - operations
    - amazon-sns
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: operational-alerts
      port: 8080
      tools:
        - name: broadcast-alert
          description: "Given alert details, publish to SNS, create incident, and notify Teams."
          inputParameters:
            - name: topic_arn
              in: body
              type: string
              description: "The SNS topic ARN."
            - name: subject
              in: body
              type: string
              description: "Alert subject."
            - name: message
              in: body
              type: string
              description: "Alert message."
          steps:
            - name: publish-sns
              type: call
              call: "sns.publish"
              with:
                topic_arn: "{{topic_arn}}"
                subject: "{{subject}}"
                message: "{{message}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "{{subject}}"
                description: "{{message}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "operations-center"
                message: "{{subject}}: {{message}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: sns
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: aws-sigv4
        access_key: "$secrets.aws_access_key"
        secret_key: "$secrets.aws_secret_key"
      resources:
        - name: topics
          path: "/"
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an associate separation is processed in Workday, disables the Microsoft 365 account, revokes Okta sessions, and closes all open ServiceNow tickets assigned to that user.

naftiko: "0.5"
info:
  label: "Associate Offboarding Workflow"
  description: "When an associate separation is processed in Workday, disables the Microsoft 365 account, revokes Okta sessions, and closes all open ServiceNow tickets assigned to that user."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-associate-offboarding
          description: "Given a Workday employee ID for a departing associate, disable their Microsoft 365 account, revoke all Okta sessions, and close open ServiceNow tickets. Invoke on confirmed separation or termination events."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing associate."
            - name: separation_date
              in: body
              type: string
              description: "The effective separation date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-lookup.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-m365-user
              type: call
              call: "msgraph-offboard.disable-user"
              with:
                user_id: "{{get-worker.work_email}}"
            - name: revoke-okta-sessions
              type: call
              call: "okta.clear-user-sessions"
              with:
                user_id: "{{get-worker.work_email}}"
            - name: close-snow-tickets
              type: call
              call: "servicenow-offboard.close-user-tickets"
              with:
                assigned_to: "{{get-worker.work_email}}"
  consumes:
    - type: http
      namespace: workday-lookup
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marriott/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{user_id}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://marriott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{user_id}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: clear-user-sessions
              method: DELETE
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH

When an associate's role changes in Workday, updates their Okta group assignments, adjusts their Microsoft 365 license tier, and notifies HR and the associate via Teams.

naftiko: "0.5"
info:
  label: "Associate Role Change Workflow"
  description: "When an associate's role changes in Workday, updates their Okta group assignments, adjusts their Microsoft 365 license tier, and notifies HR and the associate via Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - microsoft-365
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: process-role-change
          description: "Given a Workday employee ID and new job role, update the associate's Okta application groups and Microsoft 365 license, then notify both the associate and HR via Teams. Invoke when a role change, promotion, or transfer is confirmed in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the associate changing roles."
            - name: new_job_role
              in: body
              type: string
              description: "The new job role code in Okta format."
            - name: effective_date
              in: body
              type: string
              description: "The effective date of the role change in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-okta-groups
              type: call
              call: "okta-role.assign-group"
              with:
                user_id: "{{get-worker.work_email}}"
                group_name: "{{new_job_role}}"
            - name: notify-associate
              type: call
              call: "msteams-role.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your role has been updated to {{new_job_role}} effective {{effective_date}}. Your system access has been adjusted accordingly."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marriott/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-role
      baseUri: "https://marriott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{group_id}/users/{user_id}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: assign-group
              method: PUT
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Initiates quarterly user access reviews in Azure AD, creates ServiceNow tracking tickets, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "Azure AD Access Review Trigger"
  description: "Initiates quarterly user access reviews in Azure AD, creates ServiceNow tracking tickets, and notifies the security team via Teams."
  tags:
    - security
    - azure-active-directory
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: trigger-access-review
          description: "Given an Azure AD application ID, create an access review and track via ServiceNow."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Azure AD application ID."
          steps:
            - name: create-review
              type: call
              call: "azuread.create-access-review"
              with:
                app_id: "{{app_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Access review initiated for app {{app_id}}"
                category: "security_compliance"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "security-team"
                message: "Access review created for app {{app_id}}. Review ID: {{create-review.id}}. Ticket: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: access-reviews
          path: "/identityGovernance/accessReviews/definitions"
          operations:
            - name: create-access-review
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Audits Azure AD conditional access policies, generates compliance reports in SharePoint, and notifies security.

naftiko: "0.5"
info:
  label: "Azure AD Conditional Access Audit"
  description: "Audits Azure AD conditional access policies, generates compliance reports in SharePoint, and notifies security."
  tags:
    - security
    - azure-active-directory
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: audit-conditional-access
          description: "Retrieve conditional access policies and generate compliance report."
          inputParameters:
            - name: baseline_id
              in: body
              type: string
              description: "Security baseline document ID."
          steps:
            - name: get-policies
              type: call
              call: "azuread.list-conditional-access-policies"
              with: {}
            - name: create-report
              type: call
              call: "sharepoint.create-item"
              with:
                site_id: "marriott-security"
                list_name: "ComplianceReports"
                fields:
                  report_type: "conditional-access-audit"
                  policy_count: "{{get-policies.value.length}}"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "security-governance"
                message: "CA policy audit: {{get-policies.value.length}} policies reviewed. Report: {{create-report.webUrl}}"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: conditional-access
          path: "/identity/conditionalAccess/policies"
          operations:
            - name: list-conditional-access-policies
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: create-item
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Detects Azure spending anomalies in a subscription, creates a ServiceNow change request to investigate, and alerts the FinOps team via Teams.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Responder"
  description: "Detects Azure spending anomalies in a subscription, creates a ServiceNow change request to investigate, and alerts the FinOps team via Teams."
  tags:
    - cloud
    - finops
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure subscription ID and a detected spend anomaly amount, create a ServiceNow change request for investigation and alert the FinOps Teams channel. Invoke when Azure Cost Management detects an unexpected spend spike."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the cost anomaly was detected."
            - name: anomaly_amount
              in: body
              type: number
              description: "The anomalous spend amount in USD above the expected baseline."
            - name: service_name
              in: body
              type: string
              description: "The Azure service or resource group responsible for the anomaly."
          steps:
            - name: create-change-request
              type: call
              call: "servicenow-change.create-change"
              with:
                short_description: "Azure cost anomaly: {{service_name}} — ${{anomaly_amount}} above baseline"
                category: "cloud_cost"
                subscription_id: "{{subscription_id}}"
            - name: alert-finops
              type: call
              call: "msteams-finops.post-channel-message"
              with:
                channel_id: "finops-alerts"
                text: "Cost Anomaly Detected: Azure {{service_name}} in subscription {{subscription_id}} is ${{anomaly_amount}} over budget. Change request: {{create-change-request.number}}"
  consumes:
    - type: http
      namespace: servicenow-change
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors Azure Data Factory pipeline runs, detects failures, and creates ServiceNow incidents with error details.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Monitor"
  description: "Monitors Azure Data Factory pipeline runs, detects failures, and creates ServiceNow incidents with error details."
  tags:
    - data-engineering
    - azure-data-factory
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-integration
      port: 8080
      tools:
        - name: monitor-adf-pipeline
          description: "Given an ADF pipeline name, check latest run and escalate failures."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "The pipeline name."
            - name: factory_name
              in: body
              type: string
              description: "The factory name."
          steps:
            - name: get-runs
              type: call
              call: "adf.get-pipeline-runs"
              with:
                factory_name: "{{factory_name}}"
                pipeline_name: "{{pipeline_name}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "ADF failure: {{pipeline_name}}"
                category: "data_engineering"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-engineering"
                message: "ADF {{pipeline_name}} - Status: {{get-runs.value[0].status}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipeline-runs
          path: "/subscriptions/{{sub_id}}/resourceGroups/marriott-data/providers/Microsoft.DataFactory/factories/{{factory_name}}/pipelineruns"
          inputParameters:
            - name: factory_name
              in: path
          operations:
            - name: get-pipeline-runs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Azure Databricks guest analytics pipeline runs, detects failures, and escalates via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "Azure Databricks Guest Analytics Pipeline"
  description: "Monitors Azure Databricks guest analytics pipeline runs, detects failures, and escalates via ServiceNow and Teams."
  tags:
    - data-engineering
    - azure-databricks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-guest-pipeline
          description: "Given a Databricks job ID, check latest run status and escalate failures."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "The Databricks job ID."
          steps:
            - name: get-run
              type: call
              call: "databricks.get-latest-run"
              with:
                job_id: "{{job_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Databricks pipeline failure: job {{job_id}}"
                category: "data_engineering"
                assigned_to: "Data_Engineering"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-engineering"
                message: "Pipeline failure: Job {{job_id}}. State: {{get-run.state.result_state}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://marriott-databricks.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/list"
          operations:
            - name: get-latest-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks Azure Functions deployments, validates health, updates ServiceNow CMDB, and notifies dev team.

naftiko: "0.5"
info:
  label: "Azure Functions Deployment Tracker"
  description: "Tracks Azure Functions deployments, validates health, updates ServiceNow CMDB, and notifies dev team."
  tags:
    - engineering
    - azure-functions
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: serverless-ops
      port: 8080
      tools:
        - name: track-deployment
          description: "Given a function app name, verify deployment health and update tracking."
          inputParameters:
            - name: function_app
              in: body
              type: string
              description: "The Azure Function App name."
            - name: deployment_id
              in: body
              type: string
              description: "The deployment ID."
          steps:
            - name: get-deployment
              type: call
              call: "azure.get-deployment-status"
              with:
                function_app: "{{function_app}}"
                deployment_id: "{{deployment_id}}"
            - name: update-cmdb
              type: call
              call: "servicenow.update-ci"
              with:
                ci_name: "azure-func-{{function_app}}"
                attributes:
                  version: "{{get-deployment.properties.version}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-deployments"
                message: "Function {{function_app}} deployed. Status: {{get-deployment.properties.status}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: deployments
          path: "/subscriptions/{{sub_id}}/resourceGroups/marriott-functions/providers/Microsoft.Web/sites/{{function_app}}/deployments/{{deployment_id}}"
          inputParameters:
            - name: function_app
              in: path
            - name: deployment_id
              in: path
          operations:
            - name: get-deployment-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: update-ci
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Responds to AKS pod scaling events by logging in Datadog, updating ServiceNow CMDB, and notifying platform engineering.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Scaling Handler"
  description: "Responds to AKS pod scaling events by logging in Datadog, updating ServiceNow CMDB, and notifying platform engineering."
  tags:
    - infrastructure
    - azure-kubernetes-service
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: platform-engineering
      port: 8080
      tools:
        - name: handle-scaling-event
          description: "Given AKS cluster and deployment details, process a scaling event."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The AKS cluster name."
            - name: deployment
              in: body
              type: string
              description: "The deployment name."
            - name: new_replicas
              in: body
              type: string
              description: "New replica count."
          steps:
            - name: log-event
              type: call
              call: "datadog.create-event"
              with:
                title: "AKS Scaling: {{deployment}} in {{cluster_name}}"
                text: "Scaled to {{new_replicas}} replicas"
            - name: update-cmdb
              type: call
              call: "servicenow.update-ci"
              with:
                ci_name: "{{cluster_name}}-{{deployment}}"
                attributes:
                  replica_count: "{{new_replicas}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "platform-engineering"
                message: "AKS scaling: {{deployment}} in {{cluster_name}} scaled to {{new_replicas}} replicas."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: update-ci
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Azure Log Analytics for security events including failed logins and privilege escalations across Marriott cloud infrastructure.

naftiko: "0.5"
info:
  label: "Azure Log Analytics Security Query"
  description: "Queries Azure Log Analytics for security events including failed logins and privilege escalations across Marriott cloud infrastructure."
  tags:
    - security
    - azure-log-analytics
    - compliance
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: security-monitoring
      port: 8080
      tools:
        - name: query-security-events
          description: "Given a workspace ID and time range, retrieve security events."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Log Analytics workspace ID."
            - name: time_range
              in: body
              type: string
              description: "Time range: 1h, 12h, 24h."
          call: "loganalytics.run-query"
          with:
            workspace_id: "{{workspace_id}}"
            timespan: "{{time_range}}"
          outputParameters:
            - name: event_count
              type: string
              mapping: "$.tables[0].rows.length"
  consumes:
    - type: http
      namespace: loganalytics
      baseUri: "https://api.loganalytics.io/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_loganalytics_token"
      resources:
        - name: query
          path: "/workspaces/{{workspace_id}}/query"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: run-query
              method: POST

Triggers Azure ML pipeline for demand forecasts, stores results in Power BI, and notifies revenue management via Teams.

naftiko: "0.5"
info:
  label: "Azure Machine Learning Demand Forecast"
  description: "Triggers Azure ML pipeline for demand forecasts, stores results in Power BI, and notifies revenue management via Teams."
  tags:
    - data-science
    - azure-machine-learning
    - power-bi
    - microsoft-teams
    - revenue-management
capability:
  exposes:
    - type: mcp
      namespace: revenue-intelligence
      port: 8080
      tools:
        - name: run-demand-forecast
          description: "Given a region and forecast horizon, trigger the ML demand forecast."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Target region."
            - name: horizon_days
              in: body
              type: string
              description: "Forecast horizon in days."
          steps:
            - name: trigger-pipeline
              type: call
              call: "azureml.submit-pipeline-run"
              with:
                pipeline_id: "demand-forecast-v3"
                parameters:
                  region: "{{region}}"
                  horizon: "{{horizon_days}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "demand-forecast-{{region}}"
            - name: notify-revenue
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "revenue-management"
                message: "Demand forecast initiated for {{region}}. Pipeline: {{trigger-pipeline.run_id}}"
  consumes:
    - type: http
      namespace: azureml
      baseUri: "https://marriott-ml.api.azureml.ms"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: pipelines
          path: "/pipelines/{{pipeline_id}}/submit"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: submit-pipeline-run
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the status of scheduled backup jobs for critical hotel property systems in Datadog and creates a ServiceNow incident if any backups are found to have failed.

naftiko: "0.5"
info:
  label: "Backup Verification Monitor"
  description: "Checks the status of scheduled backup jobs for critical hotel property systems in Datadog and creates a ServiceNow incident if any backups are found to have failed."
  tags:
    - itsm
    - infrastructure
    - datadog
    - servicenow
    - backup
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: backup-monitoring
      port: 8080
      tools:
        - name: verify-backup-status
          description: "Given a Datadog monitor tag scoped to backup jobs, check for any failed backup monitors and automatically create a ServiceNow incident for each failure. Use for daily automated backup health checks across property systems."
          inputParameters:
            - name: backup_monitor_tag
              in: body
              type: string
              description: "Datadog monitor tag used to identify backup job monitors (e.g., job:backup, env:production)."
            - name: property_code
              in: body
              type: string
              description: "Marriott property code to scope the backup check."
          steps:
            - name: get-backup-monitors
              type: call
              call: "datadog-backup.get-host-monitors"
              with:
                tags: "{{backup_monitor_tag}}"
            - name: create-backup-incident
              type: call
              call: "servicenow-backup.create-incident"
              with:
                short_description: "Backup failure detected for property {{property_code}}"
                category: "backup"
                urgency: "2"
  consumes:
    - type: http
      namespace: datadog-backup
      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"
          operations:
            - name: get-host-monitors
              method: GET
    - type: http
      namespace: servicenow-backup
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves Marriott Bonvoy member tier status, point balance, and stay history from Salesforce for guest recognition.

naftiko: "0.5"
info:
  label: "Bonvoy Loyalty Tier Lookup"
  description: "Retrieves Marriott Bonvoy member tier status, point balance, and stay history from Salesforce for guest recognition."
  tags:
    - loyalty
    - salesforce
    - guest-experience
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: get-bonvoy-status
          description: "Given a Bonvoy member number, retrieve tier status and points from Salesforce."
          inputParameters:
            - name: member_number
              in: body
              type: string
              description: "The Bonvoy membership number."
          call: "salesforce.get-member"
          with:
            member_number: "{{member_number}}"
          outputParameters:
            - name: tier
              type: string
              mapping: "$.records[0].Tier_Status__c"
            - name: points_balance
              type: string
              mapping: "$.records[0].Points_Balance__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: get-member
              method: GET

After a qualifying Bonvoy member stay completes, triggers a post-stay NPS survey via Salesforce Marketing Cloud and logs the contact interaction.

naftiko: "0.5"
info:
  label: "Bonvoy Member NPS Survey Trigger"
  description: "After a qualifying Bonvoy member stay completes, triggers a post-stay NPS survey via Salesforce Marketing Cloud and logs the contact interaction."
  tags:
    - crm
    - guest-experience
    - salesforce
    - nps
    - marketing
capability:
  exposes:
    - type: mcp
      namespace: guest-feedback
      port: 8080
      tools:
        - name: trigger-post-stay-survey
          description: "Given a Salesforce contact ID and stay completion details, send a post-stay NPS survey via Salesforce Marketing Cloud and update the contact record with the survey send date. Use within 24 hours of a guest checkout for qualifying Bonvoy members."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The Salesforce contact ID of the departed guest."
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code where the stay occurred."
            - name: checkout_date
              in: body
              type: string
              description: "The actual checkout date in YYYY-MM-DD format."
          steps:
            - name: send-survey
              type: call
              call: "sfmc.trigger-journey"
              with:
                contact_id: "{{contact_id}}"
                journey_name: "PostStay_NPS"
                property_code: "{{property_code}}"
                checkout_date: "{{checkout_date}}"
            - name: update-contact
              type: call
              call: "salesforce-nps.update-contact"
              with:
                contact_id: "{{contact_id}}"
                nps_survey_sent_date: "{{checkout_date}}"
  consumes:
    - type: http
      namespace: sfmc
      baseUri: "https://mc.marriott.com/interaction/v1"
      authentication:
        type: bearer
        token: "$secrets.sfmc_token"
      resources:
        - name: journeys
          path: "/interactions/contactEvents"
          operations:
            - name: trigger-journey
              method: POST
    - type: http
      namespace: salesforce-nps
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{contact_id}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: update-contact
              method: PATCH

Retrieves vendor contract documents from Box by contract ID or vendor name, returning file metadata and download links.

naftiko: "0.5"
info:
  label: "Box Vendor Contract Retrieval"
  description: "Retrieves vendor contract documents from Box by contract ID or vendor name, returning file metadata and download links."
  tags:
    - legal
    - box
    - document-management
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: contract-management
      port: 8080
      tools:
        - name: get-contract-document
          description: "Given a vendor name or contract ID, retrieve contract documents from Box."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "Vendor name or contract ID."
          call: "box.search-files"
          with:
            query: "{{search_term}}"
            ancestor_folder_ids: "vendor-contracts"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.entries[0].name"
            - name: download_url
              type: string
              mapping: "$.entries[0].shared_link.download_url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-files
              method: GET

Synchronizes approved brand templates from Canva to SharePoint for property marketing teams.

naftiko: "0.5"
info:
  label: "Canva Brand Template Sync"
  description: "Synchronizes approved brand templates from Canva to SharePoint for property marketing teams."
  tags:
    - marketing
    - canva
    - sharepoint
    - brand-management
capability:
  exposes:
    - type: mcp
      namespace: brand-assets
      port: 8080
      tools:
        - name: sync-brand-templates
          description: "Given a Canva folder ID, sync templates to SharePoint."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The Canva folder ID."
            - name: brand
              in: body
              type: string
              description: "The brand name."
          steps:
            - name: get-designs
              type: call
              call: "canva.list-designs"
              with:
                folder_id: "{{folder_id}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "marriott-brand-assets"
                folder_path: "Templates/{{brand}}"
            - name: notify-marketing
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "brand-{{brand}}-marketing"
                message: "{{get-designs.total_count}} templates synced for {{brand}}."
  consumes:
    - type: http
      namespace: canva
      baseUri: "https://api.canva.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.canva_token"
      resources:
        - name: designs
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: list-designs
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive
          path: "/sites/{{site_id}}/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Cisco wireless controllers for guest WiFi performance at Marriott properties.

naftiko: "0.5"
info:
  label: "Cisco Property WiFi Monitor"
  description: "Monitors Cisco wireless controllers for guest WiFi performance at Marriott properties."
  tags:
    - infrastructure
    - cisco
    - monitoring
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: monitor-guest-wifi
          description: "Given a property code, retrieve guest WiFi metrics."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The property code."
          call: "cisco.get-network-summary"
          with:
            network_name: "MarriottGuest-{{property_code}}"
          outputParameters:
            - name: connected_clients
              type: string
              mapping: "$.summary.client_count"
  consumes:
    - type: http
      namespace: cisco
      baseUri: "https://marriott-cisco.meraki.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.cisco_meraki_key"
      resources:
        - name: networks
          path: "/networks/{{network_name}}/clients"
          inputParameters:
            - name: network_name
              in: path
          operations:
            - name: get-network-summary
              method: GET

Monitors Cloudflare WAF events for Marriott web properties, escalating blocked threats via ServiceNow incidents and Teams alerts.

naftiko: "0.5"
info:
  label: "Cloudflare Web Application Firewall Monitor"
  description: "Monitors Cloudflare WAF events for Marriott web properties, escalating blocked threats via ServiceNow incidents and Teams alerts."
  tags:
    - security
    - cloudflare
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: web-security
      port: 8080
      tools:
        - name: monitor-waf-events
          description: "Given a Cloudflare zone ID, retrieve recent WAF events and escalate critical blocks."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone ID."
          steps:
            - name: get-events
              type: call
              call: "cloudflare.get-waf-events"
              with:
                zone_id: "{{zone_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "WAF blocked {{get-events.total_blocked}} threats on zone {{zone_id}}"
                category: "security_incident"
                assigned_to: "Security_Operations"
            - name: alert-secops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "security-operations"
                message: "WAF Alert: {{get-events.total_blocked}} blocked events on zone {{zone_id}} in last hour. Top rule: {{get-events.top_rule}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: firewall-events
          path: "/zones/{{zone_id}}/firewall/events"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: get-waf-events
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a SAP Concur expense report is submitted by an associate, notifies their manager via Microsoft Teams with a direct link to review and approve.

naftiko: "0.5"
info:
  label: "Concur Expense Report Approval Notifier"
  description: "When a SAP Concur expense report is submitted by an associate, notifies their manager via Microsoft Teams with a direct link to review and approve."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approvals
      port: 8080
      tools:
        - name: notify-expense-approver
          description: "Given an expense report ID and approver UPN, retrieve the expense report details from SAP Concur and send the approver a Teams message with a summary and approval link. Use when an associate submits a travel or business expense report."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID requiring approval."
            - name: approver_upn
              in: body
              type: string
              description: "UPN of the manager who needs to approve the expense report."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: notify-approver
              type: call
              call: "msteams-expense.send-message"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Expense approval required: Report {{expense_report_id}} submitted by {{get-expense-report.employee_name}} for ${{get-expense-report.total_amount}} ({{get-expense-report.purpose}}). Approve at: {{get-expense-report.approval_url}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{report_id}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams-expense
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

When brand standards are updated in Confluence, sends Teams notifications and creates SharePoint tracking entries for acknowledgment.

naftiko: "0.5"
info:
  label: "Confluence Brand Standards Updater"
  description: "When brand standards are updated in Confluence, sends Teams notifications and creates SharePoint tracking entries for acknowledgment."
  tags:
    - operations
    - confluence
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: brand-operations
      port: 8080
      tools:
        - name: notify-brand-update
          description: "Given a Confluence page ID, notify affected teams and track acknowledgments."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID."
            - name: brand
              in: body
              type: string
              description: "The Marriott brand name."
          steps:
            - name: get-page
              type: call
              call: "confluence.get-page"
              with:
                page_id: "{{page_id}}"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "brand-{{brand}}-operations"
                message: "Brand standards updated: {{get-page.title}}. Please review."
            - name: create-tracker
              type: call
              call: "sharepoint.create-item"
              with:
                site_id: "marriott-brand-standards"
                list_name: "AcknowledgmentTracker"
                fields:
                  page_title: "{{get-page.title}}"
                  brand: "{{brand}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://marriott.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: create-item
              method: POST

Queries Datadog for application latency metrics across Marriott booking and loyalty platforms.

naftiko: "0.5"
info:
  label: "Datadog Application Latency Check"
  description: "Queries Datadog for application latency metrics across Marriott booking and loyalty platforms."
  tags:
    - monitoring
    - datadog
    - infrastructure
    - performance
capability:
  exposes:
    - type: mcp
      namespace: platform-monitoring
      port: 8080
      tools:
        - name: check-app-latency
          description: "Given a service name, retrieve latency percentiles."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
            - name: time_window
              in: body
              type: string
              description: "Time window: 1h, 6h, 24h."
          call: "datadog.query-metrics"
          with:
            query: "avg:trace.http.request.duration{service:{{service_name}}}"
            from: "{{time_window}}"
          outputParameters:
            - name: p99_ms
              type: string
              mapping: "$.series[0].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET

Queries Datadog for the current health status of a named host or service and returns monitor states for use in operational dashboards.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Queries Datadog for the current health status of a named host or service and returns monitor states for use in operational dashboards."
  tags:
    - observability
    - datadog
    - monitoring
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-host-health
          description: "Given a hostname, retrieve all active Datadog monitors and their current states for that host. Use when investigating an outage, during on-call triage, or to populate operational status dashboards."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "The fully qualified hostname or service name to check in Datadog."
          call: "datadog.get-host-monitors"
          with:
            host: "{{hostname}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: host-monitors
          path: "/monitor"
          operations:
            - name: get-host-monitors
              method: GET

Retrieves SLO compliance data from Datadog for all critical hotel systems and publishes a weekly compliance summary to the IT leadership Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Retrieves SLO compliance data from Datadog for all critical hotel systems and publishes a weekly compliance summary to the IT leadership Teams channel."
  tags:
    - observability
    - datadog
    - slo
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-report
          description: "Given a Datadog SLO tag filter and a Teams channel ID, retrieve all SLO compliance results for the past 7 days and post a compliance summary. Use for weekly IT reliability reviews, vendor SLA checks, and executive reporting."
          inputParameters:
            - name: slo_tag_filter
              in: body
              type: string
              description: "Datadog tag filter to scope which SLOs to report on (e.g., env:production, team:hotel-systems)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to post the SLO compliance report to."
          steps:
            - name: get-slo-status
              type: call
              call: "datadog-slo.get-slos"
              with:
                tags_query: "{{slo_tag_filter}}"
            - name: post-report
              type: call
              call: "msteams-slo.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Weekly SLO Compliance Report: {{get-slo-status.compliant_count}} SLOs meeting target, {{get-slo-status.breached_count}} breaching SLOs detected. Filter: {{slo_tag_filter}}."
  consumes:
    - type: http
      namespace: datadog-slo
      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"
          operations:
            - name: get-slos
              method: GET
    - type: http
      namespace: msteams-slo
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves real user monitoring data from Dynatrace for Marriott's booking platform, returning page load times and user satisfaction scores.

naftiko: "0.5"
info:
  label: "Dynatrace Booking Platform Monitor"
  description: "Retrieves real user monitoring data from Dynatrace for Marriott's booking platform, returning page load times and user satisfaction scores."
  tags:
    - monitoring
    - dynatrace
    - performance
    - digital-experience
capability:
  exposes:
    - type: mcp
      namespace: digital-experience
      port: 8080
      tools:
        - name: get-rum-report
          description: "Given an application name, retrieve RUM metrics from Dynatrace."
          inputParameters:
            - name: application_name
              in: body
              type: string
              description: "The Dynatrace application name."
          call: "dynatrace.get-rum-metrics"
          with:
            application_name: "{{application_name}}"
          outputParameters:
            - name: apdex_score
              type: string
              mapping: "$.result[0].data[0].values[0]"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://marriott.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query"
          operations:
            - name: get-rum-metrics
              method: GET

Checks F5 load balancer pool member health for Marriott booking platforms.

naftiko: "0.5"
info:
  label: "F5 Load Balancer Health Check"
  description: "Checks F5 load balancer pool member health for Marriott booking platforms."
  tags:
    - infrastructure
    - f5-networks
    - monitoring
    - networking
capability:
  exposes:
    - type: mcp
      namespace: network-infrastructure
      port: 8080
      tools:
        - name: check-pool-status
          description: "Given an F5 pool name, retrieve member health."
          inputParameters:
            - name: pool_name
              in: body
              type: string
              description: "The F5 pool name."
          call: "f5.get-pool-members"
          with:
            pool_name: "{{pool_name}}"
          outputParameters:
            - name: total_members
              type: string
              mapping: "$.items.length"
            - name: active_members
              type: string
              mapping: "$.active_count"
  consumes:
    - type: http
      namespace: f5
      baseUri: "https://marriott-f5.com/mgmt/tm"
      authentication:
        type: basic
        username: "$secrets.f5_user"
        password: "$secrets.f5_password"
      resources:
        - name: pools
          path: "/ltm/pool/{{pool_name}}/members"
          inputParameters:
            - name: pool_name
              in: path
          operations:
            - name: get-pool-members
              method: GET

Retrieves Facebook ad campaign performance metrics for Marriott brand campaigns including impressions, clicks, and cost per acquisition.

naftiko: "0.5"
info:
  label: "Facebook Ad Campaign Tracker"
  description: "Retrieves Facebook ad campaign performance metrics for Marriott brand campaigns including impressions, clicks, and cost per acquisition."
  tags:
    - marketing
    - facebook
    - advertising
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: paid-media
      port: 8080
      tools:
        - name: get-campaign-performance
          description: "Given a campaign ID, retrieve performance metrics."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The campaign ID."
          call: "facebook.get-campaign-insights"
          with:
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: impressions
              type: string
              mapping: "$.data[0].impressions"
            - name: clicks
              type: string
              mapping: "$.data[0].clicks"
  consumes:
    - type: http
      namespace: facebook
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_token"
      resources:
        - name: insights
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-insights
              method: GET

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

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "When a GitHub Actions workflow fails on a protected branch, creates a Jira bug, posts a Datadog deployment event, and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure event with repo, branch, commit SHA, and run URL, create a Jira bug, post a Datadog event, and alert the engineering Teams channel. Invoke on any protected-branch pipeline failure."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "GitHub repository name in org/repo format."
            - name: branch
              in: body
              type: string
              description: "The branch name where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The Git commit SHA of the failing run."
            - name: run_url
              in: body
              type: string
              description: "Direct URL to the failing GitHub Actions run."
            - name: workflow_name
              in: body
              type: string
              description: "Name of the failing GitHub Actions workflow."
          steps:
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}} — {{workflow_name}}"
                description: "Branch: {{branch}}\nCommit: {{commit_sha}}\nRun: {{run_url}}"
            - name: post-datadog-event
              type: call
              call: "datadog-events.create-event"
              with:
                title: "CI Failure: {{repository}}"
                text: "Workflow {{workflow_name}} failed on {{branch}} at {{commit_sha}}"
                alert_type: "error"
            - name: alert-teams
              type: call
              call: "msteams-eng.post-channel-message"
              with:
                channel_id: "engineering-alerts"
                text: "Pipeline Failure: {{repository}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Jira: {{create-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://marriott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-events
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves open pull requests from a GitHub repository and checks Snyk for known vulnerabilities in the changed dependencies.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Security Scan"
  description: "Retrieves open pull requests from a GitHub repository and checks Snyk for known vulnerabilities in the changed dependencies."
  tags:
    - devops
    - security
    - github
    - snyk
    - code-quality
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: scan-pr-dependencies
          description: "Given a GitHub repository and pull request number, retrieve the list of changed files and run a Snyk dependency vulnerability scan. Returns a summary of any critical or high vulnerabilities found. Use during code review and pre-merge gates."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "GitHub repository in org/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number to scan."
          steps:
            - name: get-pr-files
              type: call
              call: "github.get-pr-files"
              with:
                repo: "{{repository}}"
                pr_number: "{{pr_number}}"
            - name: run-snyk-scan
              type: call
              call: "snyk.test-project"
              with:
                org: "marriott"
                project: "{{repository}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-files
          path: "/repos/{owner}/{repo}/pulls/{pull_number}/files"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: get-pr-files
              method: GET
    - type: http
      namespace: snyk
      baseUri: "https://api.snyk.io/rest"
      authentication:
        type: bearer
        token: "$secrets.snyk_token"
      resources:
        - name: projects
          path: "/orgs/{org_id}/projects"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: test-project
              method: GET

Lists all members of a GitHub organization repository with their permission levels and cross-references against active associates in Okta to identify access anomalies.

naftiko: "0.5"
info:
  label: "GitHub Repository Access Audit"
  description: "Lists all members of a GitHub organization repository with their permission levels and cross-references against active associates in Okta to identify access anomalies."
  tags:
    - security
    - devops
    - github
    - okta
    - access-audit
capability:
  exposes:
    - type: mcp
      namespace: access-audit
      port: 8080
      tools:
        - name: audit-repo-access
          description: "Given a GitHub organization and repository name, retrieve all collaborators and their permission levels, then cross-reference with active Okta users to flag any external or deprovisioned accounts with remaining access. Use for quarterly access reviews and compliance audits."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "The GitHub organization name."
            - name: repository
              in: body
              type: string
              description: "The repository name to audit collaborator access for."
          steps:
            - name: get-collaborators
              type: call
              call: "github-audit.get-repo-collaborators"
              with:
                org: "{{github_org}}"
                repo: "{{repository}}"
            - name: get-active-okta-users
              type: call
              call: "okta-audit.list-active-users"
              with:
                filter: "status eq ACTIVE"
  consumes:
    - type: http
      namespace: github-audit
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: collaborators
          path: "/repos/{owner}/{repo}/collaborators"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo-collaborators
              method: GET
    - type: http
      namespace: okta-audit
      baseUri: "https://marriott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: list-active-users
              method: GET

Pulls weekly website traffic metrics from Google Analytics for Marriott brand sites, then sends a summary to a Teams channel.

naftiko: "0.5"
info:
  label: "Google Analytics Website Traffic Digest"
  description: "Pulls weekly website traffic metrics from Google Analytics for Marriott brand sites, then sends a summary to a Teams channel."
  tags:
    - marketing
    - google-analytics
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: digital-marketing
      port: 8080
      tools:
        - name: generate-traffic-digest
          description: "Given a brand site identifier, pull weekly traffic metrics and post a digest to Teams."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
          steps:
            - name: get-traffic
              type: call
              call: "google-analytics.get-report"
              with:
                property_id: "{{property_id}}"
                date_range: "last_7_days"
                metrics: "sessions,bounceRate,goalConversionRate"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "digital-marketing-team"
                message: "Weekly Traffic: Sessions: {{get-traffic.sessions}}, Bounce Rate: {{get-traffic.bounceRate}}%, Conversion: {{get-traffic.goalConversionRate}}%"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves property operational documents and templates from Google Drive shared folders.

naftiko: "0.5"
info:
  label: "Google Drive Property Documents"
  description: "Retrieves property operational documents and templates from Google Drive shared folders."
  tags:
    - operations
    - google-drive
    - document-management
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: property-ops
      port: 8080
      tools:
        - name: get-property-documents
          description: "Given a property ID, retrieve associated documents from Google Drive."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The property identifier."
          call: "google-drive.list-files"
          with:
            folder_id: "property-{{property_id}}"
          outputParameters:
            - name: document_count
              type: string
              mapping: "$.files.length"
  consumes:
    - type: http
      namespace: google-drive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files"
          operations:
            - name: list-files
              method: GET

Retrieves guest feedback from Google Forms and syncs results to Salesforce.

naftiko: "0.5"
info:
  label: "Google Forms Guest Feedback Sync"
  description: "Retrieves guest feedback from Google Forms and syncs results to Salesforce."
  tags:
    - guest-experience
    - google-forms
    - salesforce
    - feedback
capability:
  exposes:
    - type: mcp
      namespace: guest-feedback
      port: 8080
      tools:
        - name: sync-feedback
          description: "Given a form ID, retrieve responses and sync to Salesforce."
          inputParameters:
            - name: form_id
              in: body
              type: string
              description: "The Google Forms form ID."
          steps:
            - name: get-responses
              type: call
              call: "google-forms.get-responses"
              with:
                form_id: "{{form_id}}"
            - name: sync-to-salesforce
              type: call
              call: "salesforce.create-records"
              with:
                object: "Guest_Feedback__c"
                records: "{{get-responses.responses}}"
  consumes:
    - type: http
      namespace: google-forms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_forms_token"
      resources:
        - name: responses
          path: "/forms/{{form_id}}/responses"
          inputParameters:
            - name: form_id
              in: path
          operations:
            - name: get-responses
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: composite
          path: "/composite/sobjects"
          operations:
            - name: create-records
              method: POST

Retrieves Google Maps business listing data for a Marriott property, checking accuracy of address, phone, and ratings.

naftiko: "0.5"
info:
  label: "Google Maps Property Listing Audit"
  description: "Retrieves Google Maps business listing data for a Marriott property, checking accuracy of address, phone, and ratings."
  tags:
    - marketing
    - google-maps
    - hospitality
    - operations
capability:
  exposes:
    - type: mcp
      namespace: property-marketing
      port: 8080
      tools:
        - name: audit-property-listing
          description: "Given a Place ID, retrieve listing details for auditing."
          inputParameters:
            - name: place_id
              in: body
              type: string
              description: "The Google Maps Place ID."
          call: "google-maps.get-place-details"
          with:
            place_id: "{{place_id}}"
          outputParameters:
            - name: rating
              type: string
              mapping: "$.result.rating"
            - name: total_reviews
              type: string
              mapping: "$.result.user_ratings_total"
  consumes:
    - type: http
      namespace: google-maps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apiKey
        key: "$secrets.google_maps_api_key"
      resources:
        - name: places
          path: "/place/details/json"
          operations:
            - name: get-place-details
              method: GET

Retrieves search performance data from Google Search Console for Marriott web properties.

naftiko: "0.5"
info:
  label: "Google Search Console SEO Report"
  description: "Retrieves search performance data from Google Search Console for Marriott web properties."
  tags:
    - marketing
    - google-search-console
    - seo
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: seo-analytics
      port: 8080
      tools:
        - name: get-seo-report
          description: "Given a site URL and date range, retrieve search performance metrics."
          inputParameters:
            - name: site_url
              in: body
              type: string
              description: "The site URL."
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          call: "searchconsole.query-analytics"
          with:
            site_url: "{{site_url}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: total_clicks
              type: string
              mapping: "$.rows[0].clicks"
            - name: avg_position
              type: string
              mapping: "$.rows[0].position"
  consumes:
    - type: http
      namespace: searchconsole
      baseUri: "https://searchconsole.googleapis.com/webmasters/v3"
      authentication:
        type: bearer
        token: "$secrets.google_searchconsole_token"
      resources:
        - name: analytics
          path: "/sites/{{site_url}}/searchAnalytics/query"
          inputParameters:
            - name: site_url
              in: path
          operations:
            - name: query-analytics
              method: POST

Retrieves property budget vs. actual data from Google Sheets for GM review.

naftiko: "0.5"
info:
  label: "Google Sheets Property Budget Tracker"
  description: "Retrieves property budget vs. actual data from Google Sheets for GM review."
  tags:
    - finance
    - google-sheets
    - reporting
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: property-finance
      port: 8080
      tools:
        - name: get-budget-status
          description: "Given a spreadsheet ID, retrieve budget data."
          inputParameters:
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID."
            - name: sheet_name
              in: body
              type: string
              description: "The sheet tab name."
          call: "google-sheets.get-values"
          with:
            spreadsheet_id: "{{spreadsheet_id}}"
            range: "{{sheet_name}}!A1:Z100"
          outputParameters:
            - name: values
              type: string
              mapping: "$.values"
  consumes:
    - type: http
      namespace: google-sheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: get-values
              method: GET

Retrieves the latest GTM container version for Marriott web properties.

naftiko: "0.5"
info:
  label: "Google Tag Manager Container Check"
  description: "Retrieves the latest GTM container version for Marriott web properties."
  tags:
    - marketing
    - google-tag-manager
    - digital-experience
capability:
  exposes:
    - type: mcp
      namespace: tag-management
      port: 8080
      tools:
        - name: check-container-version
          description: "Given a GTM account and container, retrieve latest version."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "GTM account ID."
            - name: container_id
              in: body
              type: string
              description: "GTM container ID."
          call: "gtm.get-latest-version"
          with:
            account_id: "{{account_id}}"
            container_id: "{{container_id}}"
          outputParameters:
            - name: version_id
              type: string
              mapping: "$.containerVersion.containerVersionId"
  consumes:
    - type: http
      namespace: gtm
      baseUri: "https://www.googleapis.com/tagmanager/v2"
      authentication:
        type: bearer
        token: "$secrets.gtm_token"
      resources:
        - name: versions
          path: "/accounts/{{account_id}}/containers/{{container_id}}/versions"
          inputParameters:
            - name: account_id
              in: path
            - name: container_id
              in: path
          operations:
            - name: get-latest-version
              method: GET

Retrieves a Marriott Bonvoy member's loyalty profile and tier status from Salesforce Service Cloud given a loyalty number or email address.

naftiko: "0.5"
info:
  label: "Guest Loyalty Profile Lookup"
  description: "Retrieves a Marriott Bonvoy member's loyalty profile and tier status from Salesforce Service Cloud given a loyalty number or email address."
  tags:
    - crm
    - guest-experience
    - salesforce
    - loyalty
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: get-bonvoy-profile
          description: "Given a Marriott Bonvoy loyalty number or registered email, retrieve the member's tier, lifetime points, stay history summary, and linked contact record from Salesforce. Use at check-in, for guest service recovery, or during service agent interactions."
          inputParameters:
            - name: loyalty_number
              in: body
              type: string
              description: "The Marriott Bonvoy loyalty membership number."
          call: "salesforce.get-bonvoy-contact"
          with:
            loyalty_id: "{{loyalty_number}}"
          outputParameters:
            - name: member_name
              type: string
              mapping: "$.records[0].Name"
            - name: tier
              type: string
              mapping: "$.records[0].Loyalty_Tier__c"
            - name: lifetime_points
              type: number
              mapping: "$.records[0].Lifetime_Points__c"
            - name: contact_id
              type: string
              mapping: "$.records[0].Id"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/query"
          operations:
            - name: get-bonvoy-contact
              method: GET

When a guest complaint is received, creates a Salesforce Service Cloud case, tags it with the property and loyalty tier, and notifies the property manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Guest Service Recovery Case Creator"
  description: "When a guest complaint is received, creates a Salesforce Service Cloud case, tags it with the property and loyalty tier, and notifies the property manager via Microsoft Teams."
  tags:
    - crm
    - guest-experience
    - salesforce
    - microsoft-teams
    - service-recovery
capability:
  exposes:
    - type: mcp
      namespace: guest-service
      port: 8080
      tools:
        - name: create-service-recovery-case
          description: "Given a guest complaint description, loyalty number, and property code, create a Salesforce Service Cloud case and alert the property manager in Teams. Invoke when a guest escalation or complaint is received via any channel."
          inputParameters:
            - name: loyalty_number
              in: body
              type: string
              description: "The Marriott Bonvoy loyalty number of the complaining guest."
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code where the issue occurred."
            - name: complaint_description
              in: body
              type: string
              description: "Full description of the guest complaint or service failure."
            - name: manager_teams_upn
              in: body
              type: string
              description: "UPN of the property manager to notify in Microsoft Teams."
          steps:
            - name: create-case
              type: call
              call: "salesforce-cases.create-case"
              with:
                subject: "Guest Complaint — Property {{property_code}}"
                description: "{{complaint_description}}"
                loyalty_number: "{{loyalty_number}}"
            - name: notify-manager
              type: call
              call: "msteams-notify.send-message"
              with:
                recipient_upn: "{{manager_teams_upn}}"
                text: "Guest service case opened: {{create-case.case_number}} — Property {{property_code}}. Please review and respond within SLA."
  consumes:
    - type: http
      namespace: salesforce-cases
      baseUri: "https://marriott.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: msteams-notify
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls daily RevPAR and ADR metrics from Salesforce and publishes a consolidated revenue digest to a Microsoft Teams channel for regional leadership.

naftiko: "0.5"
info:
  label: "Hotel Revenue Intelligence Digest"
  description: "Pulls daily RevPAR and ADR metrics from Salesforce and publishes a consolidated revenue digest to a Microsoft Teams channel for regional leadership."
  tags:
    - finance
    - revenue-management
    - reporting
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: revenue-reporting
      port: 8080
      tools:
        - name: digest-daily-revenue
          description: "Given a region code and date, fetch RevPAR and ADR metrics from Salesforce analytics and post a digest summary to the regional leadership Teams channel. Use for daily revenue stand-ups and executive reporting."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "Marriott region code (e.g., APAC, EMEA, NAMRC)."
            - name: report_date
              in: body
              type: string
              description: "The reporting date in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID where the digest will be posted."
          steps:
            - name: get-revenue-metrics
              type: call
              call: "salesforce-revenue.get-revenue-report"
              with:
                region: "{{region_code}}"
                report_date: "{{report_date}}"
            - name: post-digest
              type: call
              call: "msteams-digest.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Revenue Digest for {{region_code}} — {{report_date}} | RevPAR: {{get-revenue-metrics.revpar}} | ADR: {{get-revenue-metrics.adr}} | Occupancy: {{get-revenue-metrics.occupancy_pct}}%"
  consumes:
    - type: http
      namespace: salesforce-revenue
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: revenue-reports
          path: "/analytics/reports/{report_id}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-revenue-report
              method: GET
    - type: http
      namespace: msteams-digest
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new lead is captured in HubSpot, enriches with Salesforce account data, creates a follow-up task, and notifies the sales team via Teams.

naftiko: "0.5"
info:
  label: "HubSpot Digital Lead Enrichment"
  description: "When a new lead is captured in HubSpot, enriches with Salesforce account data, creates a follow-up task, and notifies the sales team via Teams."
  tags:
    - marketing
    - hubspot
    - salesforce
    - microsoft-teams
    - sales
capability:
  exposes:
    - type: mcp
      namespace: lead-management
      port: 8080
      tools:
        - name: enrich-digital-lead
          description: "Given a HubSpot contact ID, enrich with Salesforce data and create follow-up."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
            - name: region
              in: body
              type: string
              description: "Sales region."
          steps:
            - name: get-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{contact_id}}"
            - name: create-task
              type: call
              call: "salesforce.create-task"
              with:
                subject: "Follow up: {{get-contact.firstname}} {{get-contact.lastname}}"
                priority: "High"
            - name: notify-sales
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales-{{region}}"
                message: "New digital lead: {{get-contact.firstname}} {{get-contact.lastname}} at {{get-contact.company}}. Task created."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Takes a Workday requisition and posts to Indeed, then notifies the recruiter in Teams with the live listing URL.

naftiko: "0.5"
info:
  label: "Indeed Job Posting Distribution"
  description: "Takes a Workday requisition and posts to Indeed, then notifies the recruiter in Teams with the live listing URL."
  tags:
    - hr
    - indeed
    - workday
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: distribute-job-posting
          description: "Given a Workday requisition ID, create an Indeed posting and notify the recruiter."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-job
              type: call
              call: "indeed.create-posting"
              with:
                title: "{{get-requisition.title}}"
                location: "{{get-requisition.location}}"
                company: "Marriott International"
            - name: notify-recruiter
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-requisition.recruiter_email}}"
                message: "Job posted to Indeed: {{get-requisition.title}}. URL: {{post-job.url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/marriott/recruiting/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: indeed
      baseUri: "https://apis.indeed.com/v2"
      authentication:
        type: bearer
        token: "$secrets.indeed_token"
      resources:
        - name: postings
          path: "/postings"
          operations:
            - name: create-posting
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves data quality scores from Informatica for guest master data, identifying duplicates and data completeness metrics.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Report"
  description: "Retrieves data quality scores from Informatica for guest master data, identifying duplicates and data completeness metrics."
  tags:
    - data-management
    - informatica
    - reporting
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: get-data-quality-scores
          description: "Given a data domain, retrieve quality scores from Informatica."
          inputParameters:
            - name: domain
              in: body
              type: string
              description: "The data domain: guest, property, reservation."
          call: "informatica.get-quality-report"
          with:
            domain: "{{domain}}"
          outputParameters:
            - name: completeness_score
              type: string
              mapping: "$.report.completeness"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://marriott.informaticacloud.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: quality-reports
          path: "/quality/reports"
          operations:
            - name: get-quality-report
              method: GET

Pulls engagement metrics from Instagram for Marriott brand accounts and posts a weekly digest to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "Instagram Brand Engagement Digest"
  description: "Pulls engagement metrics from Instagram for Marriott brand accounts and posts a weekly digest to the marketing Teams channel."
  tags:
    - marketing
    - instagram
    - microsoft-teams
    - social-media
capability:
  exposes:
    - type: mcp
      namespace: social-marketing
      port: 8080
      tools:
        - name: generate-instagram-digest
          description: "Given an Instagram business account ID, compile weekly metrics."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Instagram business account ID."
          steps:
            - name: get-insights
              type: call
              call: "instagram.get-account-insights"
              with:
                account_id: "{{account_id}}"
                period: "week"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "social-media-marketing"
                message: "Weekly Instagram: Reach: {{get-insights.data[0].values[0].value}}, Impressions: {{get-insights.data[1].values[0].value}}"
  consumes:
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: insights
          path: "/{{account_id}}/insights"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-insights
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a critical IT incident is detected by Datadog, creates a ServiceNow incident ticket, assigns it to the on-call team, and posts an alert to the operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "IT Incident Response Handler"
  description: "When a critical IT incident is detected by Datadog, creates a ServiceNow incident ticket, assigns it to the on-call team, and posts an alert to the operations Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-it-incident
          description: "Given a Datadog alert payload including monitor name, severity, and affected host, create a ServiceNow P1 or P2 incident and alert the IT ops Teams channel. Invoke when a critical infrastructure or application alert fires in Datadog."
          inputParameters:
            - name: monitor_name
              in: body
              type: string
              description: "The name of the Datadog monitor that fired."
            - name: severity
              in: body
              type: string
              description: "Alert severity: critical or high."
            - name: affected_host
              in: body
              type: string
              description: "Hostname or service name affected by the alert."
            - name: alert_url
              in: body
              type: string
              description: "Direct URL to the Datadog alert for investigation."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-incidents.create-incident"
              with:
                short_description: "[{{severity}}] {{monitor_name}} — Host: {{affected_host}}"
                urgency: "1"
                category: "infrastructure"
            - name: post-alert
              type: call
              call: "msteams-ops.post-channel-message"
              with:
                channel_id: "it-operations-alerts"
                text: "IT Incident {{create-incident.number}}: {{monitor_name}} | Severity: {{severity}} | Host: {{affected_host}} | Alert: {{alert_url}}"
  consumes:
    - type: http
      namespace: servicenow-incidents
      baseUri: "https://marriott.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-ops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls the current sprint status from Jira for a given project and publishes a daily stand-up digest to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Engineering Sprint Digest"
  description: "Pulls the current sprint status from Jira for a given project and publishes a daily stand-up digest to the engineering Teams channel."
  tags:
    - devops
    - jira
    - sprint
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: digest-sprint-status
          description: "Given a Jira project key and active sprint ID, retrieve all in-progress and blocked issues and post a stand-up digest to the engineering Teams channel. Use for daily stand-up preparation and sprint health monitoring."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key (e.g., ENG, DIG, MOB)."
            - name: sprint_id
              in: body
              type: integer
              description: "The active Jira sprint ID."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the sprint digest to."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-sprint.get-sprint-issues"
              with:
                project: "{{project_key}}"
                sprint_id: "{{sprint_id}}"
            - name: post-digest
              type: call
              call: "msteams-sprint.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Sprint Digest — {{project_key}} Sprint {{sprint_id}}: {{get-sprint-issues.in_progress_count}} in progress, {{get-sprint-issues.blocked_count}} blocked, {{get-sprint-issues.done_count}} done."
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://marriott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/board/{board_id}/sprint/{sprint_id}/issue"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-issues
              method: GET
    - type: http
      namespace: msteams-sprint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Syncs open positions from Workday to LinkedIn Recruiter and notifies talent acquisition teams via Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Sync"
  description: "Syncs open positions from Workday to LinkedIn Recruiter and notifies talent acquisition teams via Teams."
  tags:
    - hr
    - linkedin
    - workday
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: sync-linkedin-pipeline
          description: "Given a Workday requisition ID, sync to LinkedIn and notify TA."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{get-requisition.title}}"
                location: "{{get-requisition.location}}"
            - name: notify-ta
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "talent-acquisition"
                message: "LinkedIn posting synced: {{get-requisition.title}}. URL: {{post-to-linkedin.posting_url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/marriott/recruiting/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Launches targeted email campaigns in MailChimp for Bonvoy members, syncing segment data from Salesforce and posting metrics to Teams.

naftiko: "0.5"
info:
  label: "MailChimp Bonvoy Campaign Launcher"
  description: "Launches targeted email campaigns in MailChimp for Bonvoy members, syncing segment data from Salesforce and posting metrics to Teams."
  tags:
    - marketing
    - mailchimp
    - salesforce
    - microsoft-teams
    - loyalty
capability:
  exposes:
    - type: mcp
      namespace: loyalty-marketing
      port: 8080
      tools:
        - name: launch-bonvoy-campaign
          description: "Given a segment ID and template, launch a Bonvoy member campaign."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "The Salesforce member segment ID."
            - name: template_id
              in: body
              type: string
              description: "The MailChimp template ID."
            - name: campaign_name
              in: body
              type: string
              description: "Campaign name."
          steps:
            - name: get-segment
              type: call
              call: "salesforce.get-campaign-members"
              with:
                segment_id: "{{segment_id}}"
            - name: create-campaign
              type: call
              call: "mailchimp.create-campaign"
              with:
                name: "{{campaign_name}}"
                template_id: "{{template_id}}"
            - name: send-campaign
              type: call
              call: "mailchimp.send-campaign"
              with:
                campaign_id: "{{create-campaign.id}}"
            - name: notify-marketing
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "loyalty-marketing"
                message: "Bonvoy campaign '{{campaign_name}}' launched to {{get-segment.totalSize}} members."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/query"
          operations:
            - name: get-campaign-members
              method: GET
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-campaign
              method: POST
        - name: campaign-actions
          path: "/campaigns/{{campaign_id}}/actions/send"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: send-campaign
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks device compliance in Microsoft Endpoint Manager, creates remediation tickets in ServiceNow.

naftiko: "0.5"
info:
  label: "Microsoft Endpoint Device Compliance"
  description: "Checks device compliance in Microsoft Endpoint Manager, creates remediation tickets in ServiceNow."
  tags:
    - security
    - microsoft-endpoint-manager
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: endpoint-security
      port: 8080
      tools:
        - name: check-device-compliance
          description: "Given a device ID, check compliance and create remediation tickets."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The Intune device ID."
          steps:
            - name: get-compliance
              type: call
              call: "intune.get-device-compliance"
              with:
                device_id: "{{device_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Non-compliant device: {{device_id}}"
                category: "endpoint_security"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "endpoint-security"
                message: "Device violation: {{get-compliance.deviceName}}. Ticket: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: intune
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: devices
          path: "/deviceManagement/managedDevices/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device-compliance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves financial consolidation data from Excel Online workbooks via Microsoft Graph for executive reporting.

naftiko: "0.5"
info:
  label: "Microsoft Excel Financial Consolidation"
  description: "Retrieves financial consolidation data from Excel Online workbooks via Microsoft Graph for executive reporting."
  tags:
    - finance
    - microsoft-excel
    - reporting
    - financial-reporting
capability:
  exposes:
    - type: mcp
      namespace: financial-reporting
      port: 8080
      tools:
        - name: get-consolidation-data
          description: "Given an Excel workbook ID, retrieve financial data."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Excel workbook drive item ID."
            - name: worksheet
              in: body
              type: string
              description: "The worksheet name."
          call: "msgraph.get-range"
          with:
            workbook_id: "{{workbook_id}}"
            worksheet: "{{worksheet}}"
          outputParameters:
            - name: values
              type: string
              mapping: "$.values"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: workbooks
          path: "/me/drive/items/{{workbook_id}}/workbook/worksheets/{{worksheet}}/usedRange"
          inputParameters:
            - name: workbook_id
              in: path
            - name: worksheet
              in: path
          operations:
            - name: get-range
              method: GET

Books meeting rooms at Marriott corporate offices via Microsoft Graph, checking availability and sending invites.

naftiko: "0.5"
info:
  label: "Microsoft Teams Meeting Room Booking"
  description: "Books meeting rooms at Marriott corporate offices via Microsoft Graph, checking availability and sending invites."
  tags:
    - operations
    - microsoft-teams
    - facilities
    - productivity
capability:
  exposes:
    - type: mcp
      namespace: workplace-services
      port: 8080
      tools:
        - name: book-meeting-room
          description: "Given a building, date, and time, find and book an available room."
          inputParameters:
            - name: building
              in: body
              type: string
              description: "Building name."
            - name: date
              in: body
              type: string
              description: "Meeting date."
            - name: start_time
              in: body
              type: string
              description: "Start time."
          steps:
            - name: find-rooms
              type: call
              call: "msgraph.find-meeting-times"
              with:
                building: "{{building}}"
                date: "{{date}}"
                start_time: "{{start_time}}"
            - name: create-booking
              type: call
              call: "msgraph.create-event"
              with:
                room_email: "{{find-rooms.meetingTimeSuggestions[0].locations[0].locationEmailAddress}}"
                start: "{{date}}T{{start_time}}:00"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: calendar
          path: "/me/findMeetingTimes"
          operations:
            - name: find-meeting-times
              method: POST
        - name: events
          path: "/me/events"
          operations:
            - name: create-event
              method: POST

When a new associate is added in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "New Associate Onboarding Orchestrator"
  description: "When a new associate is added in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-associate-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Microsoft 365, and Microsoft Teams. Invoke when a new hotel or corporate associate is confirmed in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new associate."
            - name: start_date
              in: body
              type: string
              description: "The associate's start date in YYYY-MM-DD format."
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code where the associate will work (e.g., MDCZM)."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New associate onboarding: {{get-worker.full_name}} — Property {{property_code}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-m365
              type: call
              call: "msgraph.create-user"
              with:
                display_name: "{{get-worker.full_name}}"
                mail_nickname: "{{get-worker.first_name}}.{{get-worker.last_name}}"
                department: "{{get-worker.department}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{provision-m365.user_principal_name}}"
                text: "Welcome to Marriott, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-onboarding-ticket.number}}. Your start date is {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marriott/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries New Relic for application performance metrics including error rate, throughput, and response time for Marriott's digital platforms.

naftiko: "0.5"
info:
  label: "New Relic APM Health Check"
  description: "Queries New Relic for application performance metrics including error rate, throughput, and response time for Marriott's digital platforms."
  tags:
    - monitoring
    - new-relic
    - infrastructure
    - performance
capability:
  exposes:
    - type: mcp
      namespace: apm-monitoring
      port: 8080
      tools:
        - name: check-app-health
          description: "Given a New Relic application ID, retrieve current health metrics."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic.get-app-metrics"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: error_rate
              type: string
              mapping: "$.application.application_summary.error_rate"
            - name: throughput
              type: string
              mapping: "$.application.application_summary.throughput"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET

Provisions application access for a new associate in Okta based on their job role and property assignment, then confirms via Teams.

naftiko: "0.5"
info:
  label: "Okta User Access Provisioning"
  description: "Provisions application access for a new associate in Okta based on their job role and property assignment, then confirms via Teams."
  tags:
    - identity
    - security
    - okta
    - access-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-mgmt
      port: 8080
      tools:
        - name: provision-user-access
          description: "Given a new associate's email and job role, assign the appropriate Okta application groups and send a confirmation to their Teams account. Use during onboarding or when an associate changes roles and requires updated application access."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The work email address of the associate requiring access."
            - name: job_role
              in: body
              type: string
              description: "The job role code used to determine which Okta groups to assign (e.g., FRONT_DESK, REVENUE_MGR, IT_ADMIN)."
            - name: teams_upn
              in: body
              type: string
              description: "The UPN of the associate's Microsoft Teams account for confirmation notification."
          steps:
            - name: get-okta-user
              type: call
              call: "okta-provision.get-user-by-email"
              with:
                email: "{{user_email}}"
            - name: assign-groups
              type: call
              call: "okta-provision.assign-group"
              with:
                user_id: "{{get-okta-user.user_id}}"
                group_name: "{{job_role}}"
            - name: confirm-access
              type: call
              call: "msteams-identity.send-message"
              with:
                recipient_upn: "{{teams_upn}}"
                text: "Your application access has been provisioned in Okta for role {{job_role}}. You can now log in to your assigned applications at marriott.okta.com."
  consumes:
    - type: http
      namespace: okta-provision
      baseUri: "https://marriott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user-by-email
              method: GET
        - name: groups
          path: "/groups/{group_id}/users/{user_id}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: assign-group
              method: PUT
    - type: http
      namespace: msteams-identity
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves general ledger account balances from Oracle Cloud ERP for a specified period and cost center.

naftiko: "0.5"
info:
  label: "Oracle Cloud ERP GL Balance Lookup"
  description: "Retrieves general ledger account balances from Oracle Cloud ERP for a specified period and cost center."
  tags:
    - finance
    - oracle-cloud
    - reporting
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-gl
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Given a GL account and period, retrieve the balance from Oracle Cloud ERP."
          inputParameters:
            - name: account_code
              in: body
              type: string
              description: "The GL account code."
            - name: period
              in: body
              type: string
              description: "The accounting period."
          call: "oracle-erp.get-balance"
          with:
            account_code: "{{account_code}}"
            period: "{{period}}"
          outputParameters:
            - name: net_balance
              type: string
              mapping: "$.items[0].NetAmount"
  consumes:
    - type: http
      namespace: oracle-erp
      baseUri: "https://marriott-erp.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_erp_token"
      resources:
        - name: gl-balances
          path: "/generalLedgerBalances"
          operations:
            - name: get-balance
              method: GET

Queries Oracle Opera PMS for real-time room inventory and availability for a given Marriott property and date range.

naftiko: "0.5"
info:
  label: "Oracle Opera Room Availability Check"
  description: "Queries Oracle Opera PMS for real-time room inventory and availability for a given Marriott property and date range."
  tags:
    - revenue-management
    - oracle
    - hospitality
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: revenue-management
      port: 8080
      tools:
        - name: check-room-availability
          description: "Given a property code and date range, return room availability by type from Oracle Opera."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code."
            - name: check_in
              in: body
              type: string
              description: "Check-in date in YYYY-MM-DD format."
            - name: check_out
              in: body
              type: string
              description: "Check-out date in YYYY-MM-DD format."
          call: "oracle-opera.get-availability"
          with:
            property_code: "{{property_code}}"
            start_date: "{{check_in}}"
            end_date: "{{check_out}}"
          outputParameters:
            - name: available_rooms
              type: string
              mapping: "$.availability.total_available"
            - name: occupancy_rate
              type: string
              mapping: "$.availability.occupancy_pct"
  consumes:
    - type: http
      namespace: oracle-opera
      baseUri: "https://marriott-opera.oraclehospitality.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_opera_token"
      resources:
        - name: availability
          path: "/properties/{{property_code}}/availability"
          inputParameters:
            - name: property_code
              in: path
          operations:
            - name: get-availability
              method: GET

Processes firewall rule changes by validating ServiceNow approval, applying the rule in Palo Alto Networks, and logging for compliance.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Rule Change Handler"
  description: "Processes firewall rule changes by validating ServiceNow approval, applying the rule in Palo Alto Networks, and logging for compliance."
  tags:
    - security
    - palo-alto-networks
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: process-firewall-change
          description: "Given a change request number and rule details, validate and apply the firewall rule."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
            - name: rule_name
              in: body
              type: string
              description: "Name for the firewall rule."
          steps:
            - name: verify-change
              type: call
              call: "servicenow.get-change-request"
              with:
                number: "{{change_number}}"
            - name: apply-rule
              type: call
              call: "paloalto.create-security-rule"
              with:
                rule_name: "{{rule_name}}"
            - name: log-change
              type: call
              call: "servicenow.update-change-request"
              with:
                number: "{{change_number}}"
                work_notes: "Rule {{rule_name}} applied. ID: {{apply-rule.rule_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: get-change-request
              method: GET
            - name: update-change-request
              method: PATCH
    - type: http
      namespace: paloalto
      baseUri: "https://marriott-panorama.paloaltonetworks.com/restapi/v10.2"
      authentication:
        type: apiKey
        key: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules"
          operations:
            - name: create-security-rule
              method: POST

Pulls current headcount by property, department, and employment type from Workday for use in workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Pulls current headcount by property, department, and employment type from Workday for use in workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns a breakdown of Marriott associates by property code, department, and employment type from Workday. Use for workforce planning, budget forecasting, and executive headcount reporting."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "Optional Marriott property code to filter results. Leave blank for global headcount."
          call: "workday-hc.headcount-export"
          with:
            location: "{{property_code}}"
          outputParameters:
            - name: total_headcount
              type: number
              mapping: "$.total"
            - name: by_department
              type: array
              mapping: "$.departments"
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/marriott/workers/export"
          operations:
            - name: headcount-export
              method: GET

Retrieves team skill assessment scores from Pluralsight, generates development plans in SharePoint, and notifies managers.

naftiko: "0.5"
info:
  label: "Pluralsight Skills Assessment Report"
  description: "Retrieves team skill assessment scores from Pluralsight, generates development plans in SharePoint, and notifies managers."
  tags:
    - hr
    - pluralsight
    - sharepoint
    - microsoft-teams
    - learning
capability:
  exposes:
    - type: mcp
      namespace: talent-development
      port: 8080
      tools:
        - name: analyze-skills
          description: "Given a Pluralsight team ID, analyze skills and create development plans."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Pluralsight team ID."
          steps:
            - name: get-assessments
              type: call
              call: "pluralsight.get-team-skills"
              with:
                team_id: "{{team_id}}"
            - name: create-plan
              type: call
              call: "sharepoint.create-item"
              with:
                site_id: "marriott-learning"
                list_name: "DevelopmentPlans"
                fields:
                  team_id: "{{team_id}}"
                  avg_score: "{{get-assessments.average_score}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-leadership"
                message: "Skills analysis for team {{team_id}}: Avg score {{get-assessments.average_score}}/300."
  consumes:
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: teams
          path: "/teams/{{team_id}}/skills"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: get-team-skills
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: create-item
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a refresh of the Marriott revenue Power BI dataset and notifies stakeholders via Teams when the refresh completes.

naftiko: "0.5"
info:
  label: "Power BI Revenue Report Refresh"
  description: "Triggers a refresh of the Marriott revenue Power BI dataset and notifies stakeholders via Teams when the refresh completes."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-revenue-report
          description: "Given a Power BI dataset ID and workspace ID, trigger a dataset refresh and notify the revenue management Teams channel when complete. Use at end of business day or before executive revenue review meetings."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the revenue report to refresh."
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the dataset."
            - name: notify_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to notify when refresh completes."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "{{dataset_id}}"
                workspace_id: "{{workspace_id}}"
            - name: notify-complete
              type: call
              call: "msteams-bi.post-channel-message"
              with:
                channel_id: "{{notify_channel_id}}"
                text: "Power BI revenue report refresh triggered for dataset {{dataset_id}}. Data will be available shortly."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{workspace_id}/datasets/{dataset_id}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams-bi
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Publishes a property-level promotional campaign in Adobe Experience Manager and triggers a social post to the property's LinkedIn and Meta pages.

naftiko: "0.5"
info:
  label: "Property Marketing Campaign Launch"
  description: "Publishes a property-level promotional campaign in Adobe Experience Manager and triggers a social post to the property's LinkedIn and Meta pages."
  tags:
    - marketing
    - adobe
    - linkedin
    - meta
    - social-media
    - campaign
capability:
  exposes:
    - type: mcp
      namespace: marketing-campaigns
      port: 8080
      tools:
        - name: launch-property-campaign
          description: "Given a campaign title, body copy, property code, and target channels, publish the campaign content in Adobe Experience Manager and distribute to LinkedIn and Meta. Use when launching seasonal promotions, F&B events, or property-specific offers."
          inputParameters:
            - name: campaign_title
              in: body
              type: string
              description: "The headline/title of the promotional campaign."
            - name: campaign_body
              in: body
              type: string
              description: "The full campaign body copy or description."
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code for targeting and attribution."
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization URN ID for the property page."
            - name: meta_page_id
              in: body
              type: string
              description: "Meta/Facebook page ID for the property page."
          steps:
            - name: publish-aem-content
              type: call
              call: "adobe-aem.create-content-fragment"
              with:
                title: "{{campaign_title}}"
                body: "{{campaign_body}}"
                property_code: "{{property_code}}"
            - name: post-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                author: "urn:li:organization:{{linkedin_org_id}}"
                text: "{{campaign_title}} — {{campaign_body}}"
            - name: post-meta
              type: call
              call: "meta.create-post"
              with:
                page_id: "{{meta_page_id}}"
                message: "{{campaign_title}} — {{campaign_body}}"
  consumes:
    - type: http
      namespace: adobe-aem
      baseUri: "https://author.marriott.com/api/assets"
      authentication:
        type: bearer
        token: "$secrets.aem_token"
      resources:
        - name: content-fragments
          path: "/content/dam/marriott/campaigns"
          operations:
            - name: create-content-fragment
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_page_token"
      resources:
        - name: feed-posts
          path: "/{page_id}/feed"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: create-post
              method: POST

Triggers a Qlik Sense app reload for operations dashboards and posts refresh status to Teams.

naftiko: "0.5"
info:
  label: "Qlik Sense Operations Dashboard"
  description: "Triggers a Qlik Sense app reload for operations dashboards and posts refresh status to Teams."
  tags:
    - reporting
    - qlik-sense
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: operations-reporting
      port: 8080
      tools:
        - name: refresh-ops-dashboard
          description: "Given a Qlik Sense app ID, trigger reload and notify."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik Sense app ID."
          steps:
            - name: trigger-reload
              type: call
              call: "qliksense.reload-app"
              with:
                app_id: "{{app_id}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-operations"
                message: "Ops dashboard refreshed. App: {{app_id}}, Status: {{trigger-reload.status}}"
  consumes:
    - type: http
      namespace: qliksense
      baseUri: "https://marriott.us.qlikcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qliksense_token"
      resources:
        - name: reloads
          path: "/reloads"
          operations:
            - name: reload-app
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls property-level revenue forecasts from SAP S/4HANA, consolidates them in Snowflake, and publishes a summary report to Power BI for finance leadership review.

naftiko: "0.5"
info:
  label: "Quarterly Financial Forecast Consolidation"
  description: "Pulls property-level revenue forecasts from SAP S/4HANA, consolidates them in Snowflake, and publishes a summary report to Power BI for finance leadership review."
  tags:
    - finance
    - forecasting
    - sap
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-forecasting
      port: 8080
      tools:
        - name: consolidate-quarterly-forecast
          description: "Given a fiscal quarter and year, extract property revenue forecasts from SAP S/4HANA, load them into the Snowflake finance warehouse, and trigger a Power BI dataset refresh to surface the consolidated forecast. Use for quarterly planning cycles and CFO reporting."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "The fiscal quarter to consolidate (e.g., Q3-2026)."
            - name: snowflake_schema
              in: body
              type: string
              description: "The Snowflake target schema for the consolidated forecast data."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh after the data load."
          steps:
            - name: get-sap-forecast
              type: call
              call: "sap-forecast.get-forecast-data"
              with:
                fiscal_period: "{{fiscal_quarter}}"
            - name: refresh-powerbi
              type: call
              call: "powerbi-forecast.trigger-refresh"
              with:
                dataset_id: "{{powerbi_dataset_id}}"
  consumes:
    - type: http
      namespace: sap-forecast
      baseUri: "https://marriott-s4.sap.com/sap/opu/odata/sap/FAR_ACDOCA_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: forecast-data
          path: "/AcdocaItems"
          operations:
            - name: get-forecast-data
              method: GET
    - type: http
      namespace: powerbi-forecast
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{workspace_id}/datasets/{dataset_id}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Retrieves corporate account health metrics from Salesforce for enterprise sales review.

naftiko: "0.5"
info:
  label: "Salesforce Corporate Account Health"
  description: "Retrieves corporate account health metrics from Salesforce for enterprise sales review."
  tags:
    - sales
    - salesforce
    - reporting
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: enterprise-sales
      port: 8080
      tools:
        - name: get-account-health
          description: "Given a Salesforce account ID, retrieve account health metrics."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: "salesforce.get-account-health"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: contract_value
              type: string
              mapping: "$.records[0].Contract_Value__c"
            - name: satisfaction_score
              type: string
              mapping: "$.records[0].CSAT_Score__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: get-account-health
              method: GET

When a new group sales lead arrives in Salesforce, enriches it with company data and routes it to the appropriate regional sales team with a Teams notification.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment and Routing"
  description: "When a new group sales lead arrives in Salesforce, enriches it with company data and routes it to the appropriate regional sales team with a Teams notification."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: enrich-and-route-lead
          description: "Given a Salesforce lead ID, retrieve the lead details, update the record with enriched company data, assign to the correct regional sales owner, and notify them via Teams. Use when a new group sales or corporate account lead is created in Salesforce."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich and route."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-leads.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: update-lead-owner
              type: call
              call: "salesforce-leads.update-lead"
              with:
                lead_id: "{{lead_id}}"
                status: "Working"
            - name: notify-owner
              type: call
              call: "msteams-sales.send-message"
              with:
                recipient_upn: "{{get-lead.owner_email}}"
                text: "New group sales lead assigned: {{get-lead.company}} — {{get-lead.first_name}} {{get-lead.last_name}} | Est. room nights: {{get-lead.estimated_room_nights}} | Salesforce: {{lead_id}}"
  consumes:
    - type: http
      namespace: salesforce-leads
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{lead_id}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries SAP Ariba for supplier contracts expiring within 90 days and notifies the procurement team via Microsoft Teams with a prioritized renewal list.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Alert"
  description: "Queries SAP Ariba for supplier contracts expiring within 90 days and notifies the procurement team via Microsoft Teams with a prioritized renewal list."
  tags:
    - procurement
    - sap-ariba
    - contract-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-mgmt
      port: 8080
      tools:
        - name: alert-expiring-contracts
          description: "Query SAP Ariba for all supplier contracts expiring within a specified number of days and post an expiry alert to the procurement Teams channel. Use for monthly contract renewal planning and supplier relationship management."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: integer
              description: "Number of days ahead to look for expiring contracts (e.g., 90)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the procurement team alert."
          steps:
            - name: get-expiring-contracts
              type: call
              call: "ariba-contracts.get-contracts"
              with:
                expiry_days: "{{days_until_expiry}}"
            - name: post-alert
              type: call
              call: "msteams-contracts.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Contract Expiry Alert: {{get-expiring-contracts.count}} supplier contracts expire within {{days_until_expiry}} days. Please review in SAP Ariba and initiate renewals."
  consumes:
    - type: http
      namespace: ariba-contracts
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          operations:
            - name: get-contracts
              method: GET
    - type: http
      namespace: msteams-contracts
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Submits a new procurement requisition in SAP Ariba and routes it for approval, then notifies the requester via Microsoft Teams when a decision is made.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Requisition Approval"
  description: "Submits a new procurement requisition in SAP Ariba and routes it for approval, then notifies the requester via Microsoft Teams when a decision is made."
  tags:
    - procurement
    - sap-ariba
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ariba-procurement
      port: 8080
      tools:
        - name: submit-requisition
          description: "Given a procurement item description, cost center, and amount, create a requisition in SAP Ariba and notify the requester of the submission. Use for hotel supply purchases, FF&E orders, and operating expense requisitions."
          inputParameters:
            - name: item_description
              in: body
              type: string
              description: "Description of the goods or services being requested."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center to charge the purchase against."
            - name: amount
              in: body
              type: number
              description: "Estimated amount in USD."
            - name: requester_upn
              in: body
              type: string
              description: "UPN of the associate submitting the request."
          steps:
            - name: create-requisition
              type: call
              call: "ariba.create-requisition"
              with:
                description: "{{item_description}}"
                cost_center: "{{cost_center}}"
                estimated_amount: "{{amount}}"
                requester: "{{requester_upn}}"
            - name: notify-requester
              type: call
              call: "msteams-ariba.send-message"
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Your procurement requisition {{create-requisition.requisition_id}} for {{item_description}} (${{amount}}) has been submitted to SAP Ariba and is pending approval."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams-ariba
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates new vendor onboarding by creating the vendor in SAP Ariba, generating a ServiceNow ticket for compliance review, provisioning a SharePoint document folder, and notifying procurement via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Vendor Onboarding Orchestrator"
  description: "Orchestrates new vendor onboarding by creating the vendor in SAP Ariba, generating a ServiceNow ticket for compliance review, provisioning a SharePoint document folder, and notifying procurement via Teams."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-management
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create records across SAP Ariba, ServiceNow, SharePoint, and notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "The vendor company name."
            - name: vendor_category
              in: body
              type: string
              description: "Vendor category: food-beverage, maintenance, technology, amenities."
          steps:
            - name: create-vendor
              type: call
              call: "ariba.create-supplier"
              with:
                name: "{{vendor_name}}"
                category: "{{vendor_category}}"
            - name: create-compliance-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Vendor compliance review: {{vendor_name}}"
                category: "procurement_compliance"
                assigned_to: "Vendor_Compliance"
            - name: create-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "marriott-procurement"
                folder_path: "Vendors/{{vendor_name}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement-team"
                message: "New vendor onboarding: {{vendor_name}} ({{vendor_category}}). Ariba ID: {{create-vendor.id}}. Compliance ticket: {{create-compliance-ticket.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves monthly expense summary from SAP Concur for a cost center, returning total spend and policy violations.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Policy Audit"
  description: "Retrieves monthly expense summary from SAP Concur for a cost center, returning total spend and policy violations."
  tags:
    - finance
    - sap-concur
    - reporting
    - expense-management
capability:
  exposes:
    - type: mcp
      namespace: finance-expenses
      port: 8080
      tools:
        - name: get-expense-audit
          description: "Given a cost center and month, retrieve expense audit data."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The cost center code."
            - name: month
              in: body
              type: string
              description: "Month in YYYY-MM format."
          call: "concur.get-expense-summary"
          with:
            cost_center: "{{cost_center}}"
            month: "{{month}}"
          outputParameters:
            - name: total_spend
              type: string
              mapping: "$.summary.total_amount"
            - name: violation_count
              type: string
              mapping: "$.summary.policy_violations"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: get-expense-summary
              method: GET

Queries SAP HANA for real-time revenue data across Marriott properties, returning ADR, occupancy, and RevPAR metrics.

naftiko: "0.5"
info:
  label: "SAP HANA Revenue Analytics Query"
  description: "Queries SAP HANA for real-time revenue data across Marriott properties, returning ADR, occupancy, and RevPAR metrics."
  tags:
    - finance
    - sap-hana
    - revenue-management
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: revenue-analytics
      port: 8080
      tools:
        - name: query-revenue-metrics
          description: "Given a region and period, retrieve revenue metrics from SAP HANA."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Operating region."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
          call: "saphana.run-query"
          with:
            region: "{{region}}"
            period: "{{period}}"
          outputParameters:
            - name: adr
              type: string
              mapping: "$.results[0].avg_daily_rate"
            - name: revpar
              type: string
              mapping: "$.results[0].revpar"
  consumes:
    - type: http
      namespace: saphana
      baseUri: "https://marriott-hana.cfapps.sap.hana.ondemand.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.saphana_token"
      resources:
        - name: queries
          path: "/query"
          operations:
            - name: run-query
              method: POST

Looks up a Marriott SAP purchase order by number and returns header status, vendor details, and total value for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a Marriott SAP purchase order by number and returns header status, vendor details, and total value for procurement review."
  tags:
    - procurement
    - erp
    - sap
    - finance
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total value, and currency. Use for procurement approvals, vendor payment tracking, and accounts payable reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., 4500123456)."
          call: "sap-erp.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://marriott-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{po_number}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Submits an IT change request in ServiceNow, assigns it to the CAB review group, and notifies approvers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Approval"
  description: "Submits an IT change request in ServiceNow, assigns it to the CAB review group, and notifies approvers via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change title, description, risk level, and implementation window, create a ServiceNow change request and notify the Change Advisory Board channel in Teams. Use when planning infrastructure changes, software deployments, or configuration modifications."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "Short title describing the change being requested."
            - name: change_description
              in: body
              type: string
              description: "Detailed description of the change, rationale, and rollback plan."
            - name: risk_level
              in: body
              type: string
              description: "Risk level of the change: low, medium, or high."
            - name: implementation_window
              in: body
              type: string
              description: "Planned implementation date and time window in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow-cr.create-change"
              with:
                short_description: "{{change_title}}"
                description: "{{change_description}}"
                risk: "{{risk_level}}"
                start_date: "{{implementation_window}}"
            - name: notify-cab
              type: call
              call: "msteams-cab.post-channel-message"
              with:
                channel_id: "change-advisory-board"
                text: "New change request submitted: {{create-change.number}} — {{change_title}} | Risk: {{risk_level}} | Window: {{implementation_window}} | Please review in ServiceNow."
  consumes:
    - type: http
      namespace: servicenow-cr
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries ServiceNow CMDB for IT asset details by asset tag, returning device type, assigned user, and location.

naftiko: "0.5"
info:
  label: "ServiceNow IT Asset Lookup"
  description: "Queries ServiceNow CMDB for IT asset details by asset tag, returning device type, assigned user, and location."
  tags:
    - it-operations
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-assets
      port: 8080
      tools:
        - name: lookup-asset
          description: "Given an asset tag, retrieve device details from ServiceNow CMDB."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The IT asset tag."
          call: "servicenow.get-asset"
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: device_type
              type: string
              mapping: "$.result.sys_class_name"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/alm_hardware"
          operations:
            - name: get-asset
              method: GET

Creates KB articles in ServiceNow from resolved incidents and notifies the IT support team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Publisher"
  description: "Creates KB articles in ServiceNow from resolved incidents and notifies the IT support team via Teams."
  tags:
    - it-operations
    - servicenow
    - microsoft-teams
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: knowledge-ops
      port: 8080
      tools:
        - name: publish-kb-article
          description: "Given incident details, create a KB article and notify support."
          inputParameters:
            - name: title
              in: body
              type: string
              description: "Article title."
            - name: resolution
              in: body
              type: string
              description: "Resolution steps."
          steps:
            - name: create-article
              type: call
              call: "servicenow.create-kb-article"
              with:
                title: "{{title}}"
                text: "{{resolution}}"
            - name: notify-support
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "it-service-desk"
                message: "New KB article: {{title}}. Article: {{create-article.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: kb-articles
          path: "/table/kb_knowledge"
          operations:
            - name: create-kb-article
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates problem management trend reports from ServiceNow identifying recurring issues and resolution times.

naftiko: "0.5"
info:
  label: "ServiceNow Problem Trend Report"
  description: "Generates problem management trend reports from ServiceNow identifying recurring issues and resolution times."
  tags:
    - it-operations
    - servicenow
    - reporting
    - problem-management
capability:
  exposes:
    - type: mcp
      namespace: it-service-management
      port: 8080
      tools:
        - name: get-problem-trends
          description: "Given a date range, retrieve problem trend data."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          call: "servicenow.get-problem-stats"
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: total_problems
              type: string
              mapping: "$.result.stats.total"
            - name: avg_resolution_days
              type: string
              mapping: "$.result.stats.avg_resolution"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: stats
          path: "/stats/problem"
          operations:
            - name: get-problem-stats
              method: GET

Updates property operations manuals in SharePoint, notifies properties via Teams, and creates Confluence KB entries.

naftiko: "0.5"
info:
  label: "SharePoint Operations Manual Distribution"
  description: "Updates property operations manuals in SharePoint, notifies properties via Teams, and creates Confluence KB entries."
  tags:
    - operations
    - sharepoint
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: property-operations
      port: 8080
      tools:
        - name: distribute-manual-update
          description: "Given a document ID, distribute updates and notify teams."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The SharePoint document ID."
            - name: brand
              in: body
              type: string
              description: "Target brand."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-document"
              with:
                site_id: "marriott-policies"
                document_id: "{{document_id}}"
            - name: create-kb
              type: call
              call: "confluence.create-page"
              with:
                space_key: "OPS"
                title: "Policy Update: {{get-document.name}}"
            - name: notify-properties
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "brand-{{brand}}-operations"
                message: "Manual updated: {{get-document.name}}. KB: {{create-kb._links.webui}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drive/items/{{document_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://marriott.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the status of scheduled Snowflake data pipeline tasks and alerts via Microsoft Teams if any tasks have failed or are overdue.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Monitor"
  description: "Checks the status of scheduled Snowflake data pipeline tasks and alerts via Microsoft Teams if any tasks have failed or are overdue."
  tags:
    - data
    - analytics
    - snowflake
    - monitoring
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Queries Snowflake for the execution history of a named task schema and returns failed or overdue tasks. Posts a Teams alert if failures are detected. Use for daily data pipeline monitoring and on-call triage."
          inputParameters:
            - name: schema_name
              in: body
              type: string
              description: "The Snowflake schema containing the pipeline tasks to check."
            - name: alert_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post alerts to if failures are found."
          steps:
            - name: get-task-history
              type: call
              call: "snowflake.get-task-history"
              with:
                schema: "{{schema_name}}"
            - name: post-alert
              type: call
              call: "msteams-data.post-channel-message"
              with:
                channel_id: "{{alert_channel_id}}"
                text: "Data pipeline health check for schema {{schema_name}}: {{get-task-history.failed_count}} failed tasks detected. Please investigate."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://marriott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{database}/schemas/{schema}/tasks"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: get-task-history
              method: GET
    - type: http
      namespace: msteams-data
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls engagement metrics from LinkedIn and Meta for all Marriott brand pages and publishes a weekly digest to the marketing Teams channel.

naftiko: "0.5"
info:
  label: "Social Media Performance Digest"
  description: "Pulls engagement metrics from LinkedIn and Meta for all Marriott brand pages and publishes a weekly digest to the marketing Teams channel."
  tags:
    - marketing
    - social-media
    - linkedin
    - meta
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: social-reporting
      port: 8080
      tools:
        - name: digest-social-performance
          description: "Given a LinkedIn organization ID and Meta page ID, retrieve weekly engagement metrics from both platforms and post a consolidated digest to the marketing Teams channel. Use for weekly brand performance reviews and campaign post-mortems."
          inputParameters:
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization URN ID for the Marriott brand page."
            - name: meta_page_id
              in: body
              type: string
              description: "Meta page ID for the Marriott Facebook brand page."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to post the social digest to."
          steps:
            - name: get-linkedin-stats
              type: call
              call: "linkedin-analytics.get-organization-stats"
              with:
                organization_id: "{{linkedin_org_id}}"
            - name: get-meta-stats
              type: call
              call: "meta-analytics.get-page-insights"
              with:
                page_id: "{{meta_page_id}}"
            - name: post-digest
              type: call
              call: "msteams-social.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Weekly Social Performance: LinkedIn impressions: {{get-linkedin-stats.impressions}} | LinkedIn engagements: {{get-linkedin-stats.engagements}} | Meta reach: {{get-meta-stats.reach}} | Meta reactions: {{get-meta-stats.reactions}}"
  consumes:
    - type: http
      namespace: linkedin-analytics
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-stats
          path: "/organizationalEntityShareStatistics"
          operations:
            - name: get-organization-stats
              method: GET
    - type: http
      namespace: meta-analytics
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_page_token"
      resources:
        - name: page-insights
          path: "/{page_id}/insights"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page-insights
              method: GET
    - type: http
      namespace: msteams-social
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves network device status from SolarWinds for hotel property infrastructure including uptime, CPU, and memory.

naftiko: "0.5"
info:
  label: "SolarWinds Network Monitor"
  description: "Retrieves network device status from SolarWinds for hotel property infrastructure including uptime, CPU, and memory."
  tags:
    - infrastructure
    - solarwinds
    - monitoring
    - networking
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: check-network-device
          description: "Given a SolarWinds node ID, retrieve device health."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "The SolarWinds node ID."
          call: "solarwinds.get-node"
          with:
            node_id: "{{node_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.node.StatusDescription"
            - name: cpu_load
              type: string
              mapping: "$.node.CPULoad"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://marriott-solarwinds.com/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: nodes
          path: "/Query"
          operations:
            - name: get-node
              method: POST

Triggers a Tableau workbook refresh for franchise performance dashboards and notifies franchise operations leadership via Teams.

naftiko: "0.5"
info:
  label: "Tableau Franchise Performance Dashboard"
  description: "Triggers a Tableau workbook refresh for franchise performance dashboards and notifies franchise operations leadership via Teams."
  tags:
    - reporting
    - tableau
    - microsoft-teams
    - franchise
capability:
  exposes:
    - type: mcp
      namespace: franchise-reporting
      port: 8080
      tools:
        - name: refresh-franchise-dashboard
          description: "Given a Tableau workbook ID, trigger refresh and notify leadership."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          steps:
            - name: trigger-refresh
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbook_id: "{{workbook_id}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "franchise-operations"
                message: "Franchise performance dashboard refreshed. Workbook: {{workbook_id}}. Job: {{trigger-refresh.job.id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://marriott-tableau.online.tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/marriott/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Teradata data warehouse for guest segment analytics including average stay length and repeat frequency.

naftiko: "0.5"
info:
  label: "Teradata Guest Segment Analytics"
  description: "Queries Teradata data warehouse for guest segment analytics including average stay length and repeat frequency."
  tags:
    - analytics
    - teradata
    - reporting
    - guest-experience
capability:
  exposes:
    - type: mcp
      namespace: guest-analytics
      port: 8080
      tools:
        - name: query-guest-segments
          description: "Given a segment and quarter, retrieve analytics from Teradata."
          inputParameters:
            - name: segment
              in: body
              type: string
              description: "Guest segment."
            - name: quarter
              in: body
              type: string
              description: "Fiscal quarter."
          call: "teradata.run-query"
          with:
            segment: "{{segment}}"
            quarter: "{{quarter}}"
          outputParameters:
            - name: avg_length_of_stay
              type: string
              mapping: "$.results[0].avg_los"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://marriott-teradata.analytics.teradata.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
      resources:
        - name: queries
          path: "/queries"
          operations:
            - name: run-query
              method: POST

Triggers a Terraform Cloud workspace run to provision new hotel property infrastructure, notifies the infrastructure team via Teams, and logs a ServiceNow change record.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision new hotel property infrastructure, notifies the infrastructure team via Teams, and logs a ServiceNow change record."
  tags:
    - cloud
    - infrastructure
    - terraform
    - servicenow
    - microsoft-teams
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-property-infrastructure
          description: "Given a Terraform Cloud workspace ID and property code, trigger a Terraform run to provision the required cloud infrastructure for a new or renovated hotel property, create a ServiceNow change record, and notify the infrastructure team. Use when onboarding a new property or expanding cloud footprint."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID containing the infrastructure configuration."
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code being provisioned."
            - name: environment
              in: body
              type: string
              description: "Target environment: dev, staging, or production."
          steps:
            - name: trigger-tf-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                message: "Provisioning infrastructure for property {{property_code}} in {{environment}}"
            - name: create-snow-change
              type: call
              call: "servicenow-infra.create-change"
              with:
                short_description: "Infrastructure provisioning: Property {{property_code}} — {{environment}}"
                category: "cloud_provisioning"
            - name: notify-infra-team
              type: call
              call: "msteams-infra.post-channel-message"
              with:
                channel_id: "infrastructure-deployments"
                text: "Terraform run triggered for property {{property_code}} ({{environment}}). Change request: {{create-snow-change.number}}. Run ID: {{trigger-tf-run.run_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: servicenow-infra
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-infra
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{team_id}/channels/{channel_id}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors Twitter for Marriott brand mentions, escalates negative sentiment tweets via Salesforce cases and Teams alerts.

naftiko: "0.5"
info:
  label: "Twitter Brand Mention Monitor"
  description: "Monitors Twitter for Marriott brand mentions, escalates negative sentiment tweets via Salesforce cases and Teams alerts."
  tags:
    - marketing
    - twitter
    - salesforce
    - microsoft-teams
    - social-media
capability:
  exposes:
    - type: mcp
      namespace: social-listening
      port: 8080
      tools:
        - name: process-brand-mention
          description: "Given a search query, find brand mentions and escalate negative ones."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Twitter search query."
          steps:
            - name: search-tweets
              type: call
              call: "twitter.search-recent"
              with:
                query: "{{query}}"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Twitter brand mention escalation"
                origin: "Twitter"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "social-media-team"
                message: "Brand alert: {{search-tweets.result_count}} mentions. Case: {{create-case.CaseNumber}}"
  consumes:
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_bearer_token"
      resources:
        - name: tweets
          path: "/tweets/search/recent"
          operations:
            - name: search-recent
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up an open vendor invoice in SAP S/4HANA, validates it against the purchase order, and triggers payment approval workflow.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing"
  description: "Looks up an open vendor invoice in SAP S/4HANA, validates it against the purchase order, and triggers payment approval workflow."
  tags:
    - finance
    - erp
    - sap
    - accounts-payable
    - invoice
capability:
  exposes:
    - type: mcp
      namespace: accounts-payable
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given a vendor invoice number and PO number, retrieve the invoice from SAP, validate the amount matches the PO, and trigger the payment approval workflow. Use for accounts payable processing and three-way invoice matching."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number to process."
            - name: po_number
              in: body
              type: string
              description: "The associated SAP purchase order number for three-way match validation."
          steps:
            - name: get-invoice
              type: call
              call: "sap-fi.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po-for-match
              type: call
              call: "sap-mm.get-po"
              with:
                po_number: "{{po_number}}"
            - name: trigger-approval
              type: call
              call: "sap-fi.approve-invoice"
              with:
                invoice_id: "{{get-invoice.invoice_id}}"
                po_total: "{{get-po-for-match.total_value}}"
  consumes:
    - type: http
      namespace: sap-fi
      baseUri: "https://marriott-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{invoice_number}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
            - name: approve-invoice
              method: POST
    - type: http
      namespace: sap-mm
      baseUri: "https://marriott-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{po_number}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Initiates data restores from Veritas NetBackup, creates ServiceNow change requests, and notifies requestors via Teams.

naftiko: "0.5"
info:
  label: "Veritas NetBackup Restore Handler"
  description: "Initiates data restores from Veritas NetBackup, creates ServiceNow change requests, and notifies requestors via Teams."
  tags:
    - infrastructure
    - veritas-netbackup
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: backup-recovery
      port: 8080
      tools:
        - name: initiate-restore
          description: "Given a backup image ID, initiate restore and track via ServiceNow."
          inputParameters:
            - name: backup_id
              in: body
              type: string
              description: "The NetBackup image ID."
            - name: target_path
              in: body
              type: string
              description: "Restore target path."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Data restore: {{backup_id}}"
                category: "infrastructure"
            - name: start-restore
              type: call
              call: "netbackup.restore-image"
              with:
                backup_id: "{{backup_id}}"
                target_path: "{{target_path}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "infrastructure-ops"
                message: "Restore initiated: {{backup_id}}. Change: {{create-change.number}}. Job: {{start-restore.job_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: netbackup
      baseUri: "https://marriott-netbackup.com/netbackup/admin/api/v4"
      authentication:
        type: bearer
        token: "$secrets.netbackup_token"
      resources:
        - name: restores
          path: "/recovery/workloads/vmware/recoverypoints/{{backup_id}}/recover"
          inputParameters:
            - name: backup_id
              in: path
          operations:
            - name: restore-image
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sends pre-arrival WhatsApp messages to Marriott guests using templates, pulling guest data from Salesforce and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "WhatsApp Guest Pre-Arrival Messenger"
  description: "Sends pre-arrival WhatsApp messages to Marriott guests using templates, pulling guest data from Salesforce and logging in ServiceNow."
  tags:
    - guest-experience
    - whatsapp
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: guest-communications
      port: 8080
      tools:
        - name: send-pre-arrival-message
          description: "Given a reservation ID, send a pre-arrival WhatsApp message."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation confirmation number."
          steps:
            - name: get-reservation
              type: call
              call: "salesforce.get-reservation"
              with:
                reservation_id: "{{reservation_id}}"
            - name: send-message
              type: call
              call: "whatsapp.send-template"
              with:
                phone_number: "{{get-reservation.Guest_Phone__c}}"
                template_name: "marriott_pre_arrival"
            - name: log-communication
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_guest_communications"
                fields:
                  reservation: "{{reservation_id}}"
                  channel: "whatsapp"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: get-reservation
              method: GET
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{phone_number_id}}/messages"
          operations:
            - name: send-template
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://marriott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

During open enrollment, pulls pending status from Workday, sends reminders via Outlook, and tracks completion in SharePoint.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Orchestrator"
  description: "During open enrollment, pulls pending status from Workday, sends reminders via Outlook, and tracks completion in SharePoint."
  tags:
    - hr
    - workday
    - microsoft-outlook
    - sharepoint
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment period, identify pending enrollments and send reminders."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "The enrollment period ID."
          steps:
            - name: get-pending
              type: call
              call: "workday.get-pending-enrollments"
              with:
                period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: "outlook.send-bulk-email"
              with:
                recipients: "{{get-pending.pending_emails}}"
                subject: "Complete Your Benefits Enrollment"
            - name: update-tracker
              type: call
              call: "sharepoint.create-item"
              with:
                site_id: "marriott-hr-benefits"
                list_name: "EnrollmentTracker"
                fields:
                  period: "{{enrollment_period}}"
                  pending_count: "{{get-pending.total_pending}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/marriott/benefits/enrollments"
          operations:
            - name: get-pending-enrollments
              method: GET
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/hr-benefits@marriott.com/sendMail"
          operations:
            - name: send-bulk-email
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: list-items
          path: "/sites/{{site_id}}/lists/{{list_name}}/items"
          inputParameters:
            - name: site_id
              in: path
            - name: list_name
              in: path
          operations:
            - name: create-item
              method: POST

Orchestrates compensation review cycles by pulling data from Workday, refreshing Power BI dashboards, creating SharePoint folders, and notifying HR business partners.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Orchestrator"
  description: "Orchestrates compensation review cycles by pulling data from Workday, refreshing Power BI dashboards, creating SharePoint folders, and notifying HR business partners."
  tags:
    - hr
    - workday
    - power-bi
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: initiate-comp-review
          description: "Given a review cycle ID and department, orchestrate compensation review preparation."
          inputParameters:
            - name: cycle_id
              in: body
              type: string
              description: "The compensation review cycle identifier."
            - name: department
              in: body
              type: string
              description: "The department name."
          steps:
            - name: get-employees
              type: call
              call: "workday.get-department-workers"
              with:
                department: "{{department}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "comp-review-{{cycle_id}}"
            - name: create-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "marriott-hr-compensation"
                folder_path: "CompReviews/{{cycle_id}}/{{department}}"
            - name: notify-hrbp
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr-business-partners"
                message: "Comp review {{cycle_id}} initiated for {{department}}. {{get-employees.total_count}} associates in scope."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marriott/workers"
          operations:
            - name: get-department-workers
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves current headcount and open position data from Workday for a specified Marriott property code, returning staffing levels by department.

naftiko: "0.5"
info:
  label: "Workday Headcount by Property Lookup"
  description: "Retrieves current headcount and open position data from Workday for a specified Marriott property code, returning staffing levels by department."
  tags:
    - hr
    - workday
    - reporting
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-property-headcount
          description: "Given a Marriott property code, retrieve current headcount and open positions from Workday."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code."
          call: "workday.get-headcount"
          with:
            property_code: "{{property_code}}"
          outputParameters:
            - name: total_headcount
              type: string
              mapping: "$.summary.total_active"
            - name: open_positions
              type: string
              mapping: "$.summary.open_reqs"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/marriott/headcount/{{property_code}}"
          inputParameters:
            - name: property_code
              in: path
          operations:
            - name: get-headcount
              method: GET

Checks compliance training completion in Workday Learning, sends reminders via Outlook, and escalates to property HR leads via Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Checks compliance training completion in Workday Learning, sends reminders via Outlook, and escalates to property HR leads via Teams."
  tags:
    - hr
    - workday
    - microsoft-outlook
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hr-compliance
      port: 8080
      tools:
        - name: track-compliance-training
          description: "Given a property code and program ID, check completion and send reminders."
          inputParameters:
            - name: property_code
              in: body
              type: string
              description: "The Marriott property code."
            - name: program_id
              in: body
              type: string
              description: "The training program ID."
          steps:
            - name: get-completion
              type: call
              call: "workday.get-training-status"
              with:
                property_code: "{{property_code}}"
                program_id: "{{program_id}}"
            - name: send-reminders
              type: call
              call: "outlook.send-bulk-email"
              with:
                recipients: "{{get-completion.overdue_emails}}"
                subject: "Action Required: Complete compliance training"
            - name: escalate-hr
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "property-{{property_code}}-hr"
                message: "Training alert: {{get-completion.completion_rate}}% complete. {{get-completion.overdue_count}} associates overdue."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/marriott/learning/programs/{{program_id}}/status"
          inputParameters:
            - name: program_id
              in: path
          operations:
            - name: get-training-status
              method: GET
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/hr-noreply@marriott.com/sendMail"
          operations:
            - name: send-bulk-email
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up open job requisitions in Workday and assigns them to the appropriate recruiter based on property and job family, then notifies the recruiter via Teams.

naftiko: "0.5"
info:
  label: "Workday Open Requisition Recruiter Assignment"
  description: "Looks up open job requisitions in Workday and assigns them to the appropriate recruiter based on property and job family, then notifies the recruiter via Teams."
  tags:
    - hr
    - recruiting
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: assign-requisition-recruiter
          description: "Given a Workday job requisition ID and recruiter UPN, retrieve requisition details, update the recruiter assignment, and notify the assigned recruiter via Teams with job details and priority. Use when opening new roles or reassigning requisitions between recruiters."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: recruiter_upn
              in: body
              type: string
              description: "UPN of the recruiter to assign to the requisition."
          steps:
            - name: get-requisition
              type: call
              call: "workday-recruiting.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: assign-recruiter
              type: call
              call: "workday-recruiting.update-requisition"
              with:
                requisition_id: "{{requisition_id}}"
                recruiter_upn: "{{recruiter_upn}}"
            - name: notify-recruiter
              type: call
              call: "msteams-recruiting.send-message"
              with:
                recipient_upn: "{{recruiter_upn}}"
                text: "New requisition assigned: {{get-requisition.job_title}} at {{get-requisition.property_name}} ({{get-requisition.property_code}}). Req ID: {{requisition_id}}. Target fill date: {{get-requisition.target_fill_date}}."
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/marriott/jobRequisitions/{requisition_id}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
            - name: update-requisition
              method: PATCH
    - type: http
      namespace: msteams-recruiting
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves organizational hierarchy data from Workday for a given manager or department.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves organizational hierarchy data from Workday for a given manager or department."
  tags:
    - hr
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-org
      port: 8080
      tools:
        - name: get-org-chart
          description: "Given a worker ID, retrieve org chart data."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-supervisory-org"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: direct_reports_count
              type: string
              mapping: "$.organization.direct_reports_count"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: organizations
          path: "/marriott/workers/{{worker_id}}/supervisoryOrganization"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-supervisory-org
              method: GET

Retrieves an associate's time off balances from Workday including vacation, sick leave, and personal days remaining.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves an associate's time off balances from Workday including vacation, sick leave, and personal days remaining."
  tags:
    - hr
    - workday
    - employee-experience
capability:
  exposes:
    - type: mcp
      namespace: hr-self-service
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a Workday employee ID, retrieve current time off balances."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-time-off-balance"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation_hours
              type: string
              mapping: "$.balances[0].balance"
            - name: sick_hours
              type: string
              mapping: "$.balances[1].balance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/marriott/workers/{{worker_id}}/timeOffBalances"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-time-off-balance
              method: GET

Submits a time-off request for an associate in Workday and notifies their manager via Microsoft Teams for approval.

naftiko: "0.5"
info:
  label: "Workday Time-Off Request Processor"
  description: "Submits a time-off request for an associate in Workday and notifies their manager via Microsoft Teams for approval."
  tags:
    - hr
    - workday
    - time-off
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: hr-time-off
      port: 8080
      tools:
        - name: submit-time-off-request
          description: "Given a Workday employee ID, leave type, start date, and end date, submit a time-off request in Workday and notify the associate's manager via Teams for approval. Use when an associate requests vacation, sick leave, or personal time."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the associate requesting time off."
            - name: leave_type
              in: body
              type: string
              description: "The type of leave being requested (e.g., VACATION, SICK, PERSONAL)."
            - name: start_date
              in: body
              type: string
              description: "The first day of the requested leave in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "The last day of the requested leave in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-pto.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: submit-leave
              type: call
              call: "workday-pto.create-leave-request"
              with:
                worker_id: "{{workday_employee_id}}"
                leave_type: "{{leave_type}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: notify-manager
              type: call
              call: "msteams-pto.send-message"
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Time-off approval needed: {{get-worker.full_name}} has requested {{leave_type}} from {{start_date}} to {{end_date}}. Request ID: {{submit-leave.request_id}}. Please approve or deny in Workday."
  consumes:
    - type: http
      namespace: workday-pto
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/marriott/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
        - name: leave-requests
          path: "/marriott/workers/{worker_id}/leaveRequests"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: create-leave-request
              method: POST
    - type: http
      namespace: msteams-pto
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{upn}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls YouTube channel analytics for Marriott brand channels and posts digest to Teams.

naftiko: "0.5"
info:
  label: "YouTube Brand Analytics Digest"
  description: "Pulls YouTube channel analytics for Marriott brand channels and posts digest to Teams."
  tags:
    - marketing
    - youtube
    - microsoft-teams
    - social-media
capability:
  exposes:
    - type: mcp
      namespace: video-marketing
      port: 8080
      tools:
        - name: generate-youtube-digest
          description: "Given a YouTube channel ID, compile weekly analytics."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The YouTube channel ID."
          steps:
            - name: get-analytics
              type: call
              call: "youtube.get-channel-analytics"
              with:
                channel_id: "{{channel_id}}"
                period: "last_7_days"
            - name: post-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "content-marketing"
                message: "YouTube Weekly: Views: {{get-analytics.rows[0][0]}}, Watch Time: {{get-analytics.rows[0][1]}}hrs"
  consumes:
    - type: http
      namespace: youtube
      baseUri: "https://youtubeanalytics.googleapis.com/v2"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-channel-analytics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves guest support ticket details from Zendesk for Marriott properties, surfacing status, priority, and agent assignment.

naftiko: "0.5"
info:
  label: "Zendesk Guest Support Ticket Lookup"
  description: "Retrieves guest support ticket details from Zendesk for Marriott properties, surfacing status, priority, and agent assignment."
  tags:
    - customer-service
    - zendesk
    - guest-experience
    - hospitality
capability:
  exposes:
    - type: mcp
      namespace: guest-support
      port: 8080
      tools:
        - name: get-support-ticket
          description: "Given a Zendesk ticket ID, retrieve ticket details including status and priority."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ticket.status"
            - name: priority
              type: string
              mapping: "$.ticket.priority"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://marriott.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET

Enriches corporate sales prospects with ZoomInfo firmographic data and updates Salesforce accounts.

naftiko: "0.5"
info:
  label: "ZoomInfo Corporate Prospect Enrichment"
  description: "Enriches corporate sales prospects with ZoomInfo firmographic data and updates Salesforce accounts."
  tags:
    - sales
    - zoominfo
    - salesforce
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-enablement
      port: 8080
      tools:
        - name: enrich-prospect
          description: "Given a company domain, retrieve data from ZoomInfo and update Salesforce."
          inputParameters:
            - name: company_domain
              in: body
              type: string
              description: "The prospect company domain."
            - name: sf_account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          steps:
            - name: get-company
              type: call
              call: "zoominfo.search-company"
              with:
                domain: "{{company_domain}}"
            - name: update-account
              type: call
              call: "salesforce.update-account"
              with:
                account_id: "{{sf_account_id}}"
                fields:
                  NumberOfEmployees: "{{get-company.employeeCount}}"
                  AnnualRevenue: "{{get-company.revenue}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/search/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://marriott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH