Airbnb Capabilities

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

Sort
Expand

Collects experiment results from Snowflake, runs statistical analysis, generates summary in Confluence, and notifies product teams.

naftiko: "0.5"
info:
  label: "AB Test Results Aggregation Pipeline"
  description: "Collects experiment results from Snowflake, runs statistical analysis, generates summary in Confluence, and notifies product teams."
  tags:
    - experimentation
    - snowflake
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: experimentation
      port: 8080
      tools:
        - name: ab_test_results_aggregation_pipeline
          description: "Orchestrate ab test results aggregation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Validates listing accessibility features, audits against standards in Snowflake, creates improvement tasks in Jira, and notifies inclusion team.

naftiko: "0.5"
info:
  label: "Accessibility Compliance Checker"
  description: "Validates listing accessibility features, audits against standards in Snowflake, creates improvement tasks in Jira, and notifies inclusion team."
  tags:
    - accessibility
    - snowflake
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: accessibility
      port: 8080
      tools:
        - name: accessibility_compliance_checker
          description: "Orchestrate accessibility compliance checker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Submits a Hive query for batch analytics on booking and listing data, returning the query status and result location in S3.

naftiko: "0.5"
info:
  label: "Apache Hive Query Runner"
  description: "Submits a Hive query for batch analytics on booking and listing data, returning the query status and result location in S3."
  tags:
    - analytics
    - apache-hive
    - data
capability:
  exposes:
    - type: mcp
      namespace: batch-analytics
      port: 8080
      tools:
        - name: run-hive-query
          description: "Submit a Hive query, poll for completion, and store the result reference in Elasticsearch for downstream consumption."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "HiveQL query string."
            - name: database
              in: body
              type: string
              description: "Target Hive database."
          steps:
            - name: submit-query
              type: call
              call: "hive.submit-query"
              with:
                query: "{{query}}"
                database: "{{database}}"
            - name: store-result-ref
              type: call
              call: "elasticsearch.index-query-result"
              with:
                index: "hive-query-results"
                query_handle: "{{submit-query.query_handle}}"
                result_location: "{{submit-query.result_location}}"
  consumes:
    - type: http
      namespace: hive
      baseUri: "https://hive-server.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.hive_token"
      resources:
        - name: queries
          path: "/queries"
          operations:
            - name: submit-query
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: query-results
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-query-result
              method: POST

Analyzes cancellation patterns in Snowflake, identifies policy impacts, creates insights in Confluence, and notifies product team.

naftiko: "0.5"
info:
  label: "Booking Cancellation Analysis Pipeline"
  description: "Analyzes cancellation patterns in Snowflake, identifies policy impacts, creates insights in Confluence, and notifies product team."
  tags:
    - analytics
    - snowflake
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: booking_cancellation_analysis_pipeline
          description: "Orchestrate booking cancellation analysis pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

After payment capture, creates the booking record in PostgreSQL, sends confirmation via RabbitMQ to the messaging service, updates the calendar in Elasticsearch, and notifies the host.

naftiko: "0.5"
info:
  label: "Booking Confirmation Orchestrator"
  description: "After payment capture, creates the booking record in PostgreSQL, sends confirmation via RabbitMQ to the messaging service, updates the calendar in Elasticsearch, and notifies the host."
  tags:
    - marketplace
    - payments
    - rabbitmq
    - postgresql
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: booking-management
      port: 8080
      tools:
        - name: confirm-booking
          description: "Orchestrate post-payment booking confirmation across storage, messaging, and notification systems."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation identifier."
            - name: payment_intent_id
              in: body
              type: string
              description: "The captured payment intent ID."
          steps:
            - name: create-booking
              type: call
              call: "postgresql.create-booking"
              with:
                reservation_id: "{{reservation_id}}"
                payment_intent_id: "{{payment_intent_id}}"
            - name: send-confirmation
              type: call
              call: "rabbitmq.publish"
              with:
                exchange: "guest-notifications"
                routing_key: "booking.confirmed"
                payload:
                  reservation_id: "{{reservation_id}}"
                  guest_email: "{{create-booking.guest_email}}"
            - name: update-calendar
              type: call
              call: "elasticsearch.update-calendar"
              with:
                index: "listing-calendars"
                listing_id: "{{create-booking.listing_id}}"
                dates: "{{create-booking.date_range}}"
                status: "booked"
            - name: notify-host
              type: call
              call: "rabbitmq.publish-host"
              with:
                exchange: "host-notifications"
                routing_key: "booking.new.{{create-booking.host_id}}"
                payload:
                  reservation_id: "{{reservation_id}}"
                  guest_name: "{{create-booking.guest_name}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://reservation-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reservation_db_token"
      resources:
        - name: bookings
          path: "/bookings"
          operations:
            - name: create-booking
              method: POST
    - type: http
      namespace: rabbitmq
      baseUri: "https://rabbitmq.airbnb.internal/api"
      authentication:
        type: basic
        username: "$secrets.rabbitmq_user"
        password: "$secrets.rabbitmq_password"
      resources:
        - name: guest-messages
          path: "/exchanges/%2f/{{exchange}}/publish"
          inputParameters:
            - name: exchange
              in: path
          operations:
            - name: publish
              method: POST
        - name: host-messages
          path: "/exchanges/%2f/{{exchange}}/publish"
          inputParameters:
            - name: exchange
              in: path
          operations:
            - name: publish-host
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: calendars
          path: "/{{index}}/_update_by_query"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: update-calendar
              method: POST

Analyzes checkout funnel in Snowflake, identifies friction points, runs experiments in Datadog, creates optimization tasks, and notifies product.

naftiko: "0.5"
info:
  label: "Checkout Conversion Optimizer"
  description: "Analyzes checkout funnel in Snowflake, identifies friction points, runs experiments in Datadog, creates optimization tasks, and notifies product."
  tags:
    - conversion
    - snowflake
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: conversion
      port: 8080
      tools:
        - name: checkout_conversion_optimizer
          description: "Orchestrate checkout conversion optimizer workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-datadog
              type: call
              call: "datadog.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs a real-time analytics query against ClickHouse for search and booking funnel metrics, returning aggregated results for product analytics dashboards.

naftiko: "0.5"
info:
  label: "ClickHouse Analytics Query"
  description: "Runs a real-time analytics query against ClickHouse for search and booking funnel metrics, returning aggregated results for product analytics dashboards."
  tags:
    - analytics
    - clickhouse
    - marketplace
capability:
  exposes:
    - type: mcp
      namespace: realtime-analytics
      port: 8080
      tools:
        - name: query-clickhouse
          description: "Execute a ClickHouse SQL query for real-time analytics and cache results in Elasticsearch for dashboard rendering."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "ClickHouse SQL query."
            - name: cache_key
              in: body
              type: string
              description: "Cache key for the query result."
          steps:
            - name: run-query
              type: call
              call: "clickhouse.execute-query"
              with:
                query: "{{query}}"
            - name: cache-result
              type: call
              call: "elasticsearch.index-cache"
              with:
                index: "analytics-cache"
                cache_key: "{{cache_key}}"
                data: "{{run-query.data}}"
  consumes:
    - type: http
      namespace: clickhouse
      baseUri: "https://clickhouse.airbnb.internal:8123"
      authentication:
        type: basic
        username: "$secrets.clickhouse_user"
        password: "$secrets.clickhouse_password"
      resources:
        - name: queries
          path: "/"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: cache
          path: "/{{index}}/_doc/{{cache_key}}"
          inputParameters:
            - name: index
              in: path
            - name: cache_key
              in: path
          operations:
            - name: index-cache
              method: PUT

Queries Cloudflare for DNS records associated with a given zone, returning record type, name, content, and TTL.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Record Lookup"
  description: "Queries Cloudflare for DNS records associated with a given zone, returning record type, name, content, and TTL."
  tags:
    - infrastructure
    - cloudflare
    - networking
capability:
  exposes:
    - type: mcp
      namespace: dns-management
      port: 8080
      tools:
        - name: list-dns-records
          description: "List DNS records for a Cloudflare zone. Returns record name, type, content, and TTL."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone identifier."
          call: "cloudflare.list-records"
          with:
            zone_id: "{{zone_id}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_api_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: list-records
              method: GET

Runs a CloudWatch Logs Insights query against a specified log group and returns matching log events for the given time range.

naftiko: "0.5"
info:
  label: "CloudWatch Log Query"
  description: "Runs a CloudWatch Logs Insights query against a specified log group and returns matching log events for the given time range."
  tags:
    - observability
    - amazon-web-services
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: log-analytics
      port: 8080
      tools:
        - name: query-logs
          description: "Run a CloudWatch Logs Insights query and return matching events."
          inputParameters:
            - name: log_group
              in: body
              type: string
              description: "CloudWatch log group name."
            - name: query_string
              in: body
              type: string
              description: "CloudWatch Logs Insights query."
            - name: start_time
              in: body
              type: string
              description: "Query start time in epoch milliseconds."
            - name: end_time
              in: body
              type: string
              description: "Query end time in epoch milliseconds."
          call: "cloudwatch.start-query"
          with:
            logGroupName: "{{log_group}}"
            queryString: "{{query_string}}"
            startTime: "{{start_time}}"
            endTime: "{{end_time}}"
  consumes:
    - type: http
      namespace: cloudwatch
      baseUri: "https://logs.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_cloudwatch_token"
      resources:
        - name: queries
          path: "/"
          operations:
            - name: start-query
              method: POST

Retrieves Confluence page content for Airbnb knowledge base.

naftiko: "0.5"
info:
  label: "Confluence Page Retrieval"
  description: "Retrieves Confluence page content for Airbnb knowledge base."
  tags:
    - collaboration
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Get page at Airbnb."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The page_id to look up." 
          call: "confluence.get-page_id"
          with:
            page_id: "{{page_id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence_page_retrieval
              method: GET

Queues flagged content, runs automated checks in Snowflake, escalates to human review via Jira, and notifies trust team.

naftiko: "0.5"
info:
  label: "Content Moderation Escalation Pipeline"
  description: "Queues flagged content, runs automated checks in Snowflake, escalates to human review via Jira, and notifies trust team."
  tags:
    - trust-safety
    - snowflake
    - jira
    - elasticsearch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trust-safety
      port: 8080
      tools:
        - name: content_moderation_escalation_pipeline
          description: "Orchestrate content moderation escalation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-elasticsearch
              type: call
              call: "elasticsearch.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://airbnb-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When user-generated content is flagged, retrieves the content from PostgreSQL, runs it through a Hugging Face toxicity classifier, and creates a moderation ticket in ServiceNow if toxic.

naftiko: "0.5"
info:
  label: "Content Moderation Pipeline"
  description: "When user-generated content is flagged, retrieves the content from PostgreSQL, runs it through a Hugging Face toxicity classifier, and creates a moderation ticket in ServiceNow if toxic."
  tags:
    - trust-safety
    - content-moderation
    - hugging-face
    - postgresql
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: content-moderation
      port: 8080
      tools:
        - name: moderate-content
          description: "Screen flagged user content for toxicity and auto-create a moderation case if needed."
          inputParameters:
            - name: content_id
              in: body
              type: string
              description: "The content identifier."
            - name: content_type
              in: body
              type: string
              description: "Type of content (review, message, listing_description)."
          steps:
            - name: get-content
              type: call
              call: "postgresql.get-content"
              with:
                content_id: "{{content_id}}"
                content_type: "{{content_type}}"
            - name: classify-toxicity
              type: call
              call: "huggingface.text-classification"
              with:
                model: "airbnb/content-toxicity-v2"
                inputs: "{{get-content.text}}"
            - name: create-moderation-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Content moderation: {{content_type}} {{content_id}}"
                category: "content_moderation"
                description: "Toxicity score: {{classify-toxicity.score}}. Content: {{get-content.text}}"
                priority: "{{classify-toxicity.severity}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://content-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.content_db_token"
      resources:
        - name: content
          path: "/{{content_type}}/{{content_id}}"
          inputParameters:
            - name: content_type
              in: path
            - name: content_id
              in: path
          operations:
            - name: get-content
              method: GET
    - type: http
      namespace: huggingface
      baseUri: "https://api-inference.huggingface.co/models"
      authentication:
        type: bearer
        token: "$secrets.huggingface_token"
      resources:
        - name: classification
          path: "/{{model}}"
          inputParameters:
            - name: model
              in: path
          operations:
            - name: text-classification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Analyzes Zendesk ticket patterns in Snowflake, optimizes routing rules, updates configurations, and notifies support leadership.

naftiko: "0.5"
info:
  label: "Customer Support Routing Optimizer"
  description: "Analyzes Zendesk ticket patterns in Snowflake, optimizes routing rules, updates configurations, and notifies support leadership."
  tags:
    - customer-support
    - zendesk
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: customer-support
      port: 8080
      tools:
        - name: customer_support_routing_optimizer
          description: "Orchestrate customer support routing optimizer workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-zendesk
              type: call
              call: "zendesk.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Audits data access patterns in Snowflake, validates against privacy policies, creates compliance reports in Confluence, and notifies DPO.

naftiko: "0.5"
info:
  label: "Data Governance Compliance Pipeline"
  description: "Audits data access patterns in Snowflake, validates against privacy policies, creates compliance reports in Confluence, and notifies DPO."
  tags:
    - data-governance
    - snowflake
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: data_governance_compliance_pipeline
          description: "Orchestrate data governance compliance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Monitors Airflow DAG health in Datadog, tracks data freshness in Snowflake, creates SLA alerts in Grafana, and notifies data engineering.

naftiko: "0.5"
info:
  label: "Data Pipeline Observability Framework"
  description: "Monitors Airflow DAG health in Datadog, tracks data freshness in Snowflake, creates SLA alerts in Grafana, and notifies data engineering."
  tags:
    - data-engineering
    - datadog
    - snowflake
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: data_pipeline_observability_framework
          description: "Orchestrate data pipeline observability framework workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries Datadog for time-series metrics on a given service and metric name, returning data points for the specified time window.

naftiko: "0.5"
info:
  label: "Datadog Metric Query"
  description: "Queries Datadog for time-series metrics on a given service and metric name, returning data points for the specified time window."
  tags:
    - observability
    - datadog
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: query-metrics
          description: "Query Datadog for a specific metric over a time window. Returns timestamped data points."
          inputParameters:
            - name: metric_query
              in: body
              type: string
              description: "Datadog metric query expression."
            - name: from_ts
              in: body
              type: string
              description: "Start timestamp in epoch seconds."
            - name: to_ts
              in: body
              type: string
              description: "End timestamp in epoch seconds."
          call: "datadog.query-timeseries"
          with:
            query: "{{metric_query}}"
            from: "{{from_ts}}"
            to: "{{to_ts}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: timeseries
          path: "/query"
          operations:
            - name: query-timeseries
              method: GET

Retrieves Datadog monitor status for Airbnb infrastructure.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status"
  description: "Retrieves Datadog monitor status for Airbnb infrastructure."
  tags:
    - monitoring
    - datadog
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-monitor
          description: "Check monitor at Airbnb."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The monitor_id to look up." 
          call: "datadog.get-monitor_id"
          with:
            monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog_monitor_status
              method: GET

Collects market demand data, runs pricing models in Snowflake, updates listing recommendations, monitors in Datadog, and notifies hosts.

naftiko: "0.5"
info:
  label: "Dynamic Pricing Optimization Pipeline"
  description: "Collects market demand data, runs pricing models in Snowflake, updates listing recommendations, monitors in Datadog, and notifies hosts."
  tags:
    - pricing
    - snowflake
    - datadog
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pricing
      port: 8080
      tools:
        - name: dynamic_pricing_optimization_pipeline
          description: "Orchestrate dynamic pricing optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-datadog
              type: call
              call: "datadog.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-salesforce
              type: call
              call: "salesforce.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries Amazon EC2 for the status of a given instance, returning instance state, system status checks, and attached security groups.

naftiko: "0.5"
info:
  label: "EC2 Instance Status Check"
  description: "Queries Amazon EC2 for the status of a given instance, returning instance state, system status checks, and attached security groups."
  tags:
    - infrastructure
    - amazon-web-services
    - ec2
capability:
  exposes:
    - type: mcp
      namespace: compute-ops
      port: 8080
      tools:
        - name: get-instance-status
          description: "Check the status of an EC2 instance and push health metrics to Datadog for infrastructure monitoring."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "EC2 instance identifier."
          steps:
            - name: fetch-status
              type: call
              call: "ec2.describe-instance-status"
              with:
                instance_id: "{{instance_id}}"
            - name: push-health
              type: call
              call: "datadog.submit-check"
              with:
                check: "ec2.instance.health"
                host: "{{instance_id}}"
                status: "{{fetch-status.instance_state}}"
  consumes:
    - type: http
      namespace: ec2
      baseUri: "https://ec2.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_ec2_token"
      resources:
        - name: instances
          path: "/?Action=DescribeInstanceStatus&InstanceId={{instance_id}}"
          inputParameters:
            - name: instance_id
              in: query
          operations:
            - name: describe-instance-status
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: checks
          path: "/check_run"
          operations:
            - name: submit-check
              method: POST

Searches Elasticsearch indexes for Airbnb.

naftiko: "0.5"
info:
  label: "Elasticsearch Log Query"
  description: "Searches Elasticsearch indexes for Airbnb."
  tags:
    - data
    - elasticsearch
    - search
capability:
  exposes:
    - type: mcp
      namespace: search
      port: 8080
      tools:
        - name: search-logs
          description: "Search ES logs at Airbnb."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The query to look up." 
          call: "elasticsearch.get-query"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://airbnb-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch_log_query
              method: GET

Detects emergencies from news APIs, identifies affected bookings in Snowflake, contacts guests via Zendesk, and coordinates response.

naftiko: "0.5"
info:
  label: "Emergency Response Coordination Pipeline"
  description: "Detects emergencies from news APIs, identifies affected bookings in Snowflake, contacts guests via Zendesk, and coordinates response."
  tags:
    - emergency
    - snowflake
    - zendesk
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: emergency
      port: 8080
      tools:
        - name: emergency_response_coordination_pipeline
          description: "Orchestrate emergency response coordination pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-zendesk
              type: call
              call: "zendesk.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Evaluates experience quality in Snowflake, curates featured listings, updates search rankings, and notifies experience hosts.

naftiko: "0.5"
info:
  label: "Experience Marketplace Curation"
  description: "Evaluates experience quality in Snowflake, curates featured listings, updates search rankings, and notifies experience hosts."
  tags:
    - marketplace
    - snowflake
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: marketplace
      port: 8080
      tools:
        - name: experience_marketplace_curation
          description: "Orchestrate experience marketplace curation workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Creates an A/B test experiment in the experimentation service, configures traffic splits, registers metrics in Elasticsearch, and posts the experiment link to the product team.

naftiko: "0.5"
info:
  label: "Experimentation Platform Launcher"
  description: "Creates an A/B test experiment in the experimentation service, configures traffic splits, registers metrics in Elasticsearch, and posts the experiment link to the product team."
  tags:
    - experimentation
    - marketplace
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: experimentation
      port: 8080
      tools:
        - name: launch-experiment
          description: "Launch an A/B test experiment with traffic allocation, metric registration, and team notification."
          inputParameters:
            - name: experiment_name
              in: body
              type: string
              description: "Human-readable experiment name."
            - name: feature_flag
              in: body
              type: string
              description: "Feature flag key for the experiment."
            - name: traffic_percent
              in: body
              type: string
              description: "Percentage of traffic for treatment group."
            - name: primary_metric
              in: body
              type: string
              description: "Primary success metric name."
          steps:
            - name: create-experiment
              type: call
              call: "experimentation-service.create"
              with:
                name: "{{experiment_name}}"
                feature_flag: "{{feature_flag}}"
                traffic_allocation: "{{traffic_percent}}"
            - name: register-metrics
              type: call
              call: "elasticsearch.index-experiment"
              with:
                index: "experiment-configs"
                experiment_id: "{{create-experiment.id}}"
                primary_metric: "{{primary_metric}}"
                status: "active"
  consumes:
    - type: http
      namespace: experimentation-service
      baseUri: "https://experimentation.airbnb.internal/api/v2"
      authentication:
        type: bearer
        token: "$secrets.experimentation_token"
      resources:
        - name: experiments
          path: "/experiments"
          operations:
            - name: create
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: experiments
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-experiment
              method: POST

Rolls out a feature flag to a specified percentage of users, logs the change in Elasticsearch, and notifies the engineering team via the internal messaging system.

naftiko: "0.5"
info:
  label: "Feature Flag Rollout Manager"
  description: "Rolls out a feature flag to a specified percentage of users, logs the change in Elasticsearch, and notifies the engineering team via the internal messaging system."
  tags:
    - experimentation
    - engineering
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: feature-flags
      port: 8080
      tools:
        - name: rollout-feature
          description: "Update a feature flag rollout percentage and log the configuration change."
          inputParameters:
            - name: flag_key
              in: body
              type: string
              description: "Feature flag key identifier."
            - name: rollout_percent
              in: body
              type: string
              description: "Target rollout percentage (0-100)."
            - name: reason
              in: body
              type: string
              description: "Reason for the rollout change."
          steps:
            - name: update-flag
              type: call
              call: "feature-service.update-flag"
              with:
                flag_key: "{{flag_key}}"
                rollout_percent: "{{rollout_percent}}"
            - name: log-change
              type: call
              call: "elasticsearch.index-change"
              with:
                index: "feature-flag-changes"
                flag_key: "{{flag_key}}"
                rollout_percent: "{{rollout_percent}}"
                reason: "{{reason}}"
                changed_by: "{{update-flag.actor}}"
  consumes:
    - type: http
      namespace: feature-service
      baseUri: "https://features.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.feature_service_token"
      resources:
        - name: flags
          path: "/flags/{{flag_key}}"
          inputParameters:
            - name: flag_key
              in: path
          operations:
            - name: update-flag
              method: PATCH
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: changes
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-change
              method: POST

Checks the latest backup object in GCP Cloud Storage for a given service, verifies its integrity and age, and returns backup health status.

naftiko: "0.5"
info:
  label: "GCP Cloud Storage Backup Verifier"
  description: "Checks the latest backup object in GCP Cloud Storage for a given service, verifies its integrity and age, and returns backup health status."
  tags:
    - infrastructure
    - google-cloud-platform
    - gcp-cloud-storage
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: verify-backup
          description: "Verify the latest backup in GCP Cloud Storage for a service including age and integrity."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "GCS bucket name."
            - name: service_prefix
              in: body
              type: string
              description: "Object prefix for the service backups."
          call: "gcs.list-objects"
          with:
            bucket: "{{bucket_name}}"
            prefix: "{{service_prefix}}"
  consumes:
    - type: http
      namespace: gcs
      baseUri: "https://storage.googleapis.com/storage/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_storage_token"
      resources:
        - name: objects
          path: "/b/{{bucket}}/o?prefix={{prefix}}&orderBy=updated%20desc&maxResults=1"
          inputParameters:
            - name: bucket
              in: path
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET

Analyzes market potential in Snowflake, evaluates regulatory landscape, creates expansion proposals in Confluence, and notifies strategy.

naftiko: "0.5"
info:
  label: "Geographic Expansion Analysis Pipeline"
  description: "Analyzes market potential in Snowflake, evaluates regulatory landscape, creates expansion proposals in Confluence, and notifies strategy."
  tags:
    - strategy
    - snowflake
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: strategy
      port: 8080
      tools:
        - name: geographic_expansion_analysis_pipeline
          description: "Orchestrate geographic expansion analysis pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries the GitHub API for repository statistics including commit frequency, open PRs, and contributor count for engineering health dashboards.

naftiko: "0.5"
info:
  label: "Git Repository Metrics Fetcher"
  description: "Queries the GitHub API for repository statistics including commit frequency, open PRs, and contributor count for engineering health dashboards."
  tags:
    - engineering
    - github
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: repo-analytics
      port: 8080
      tools:
        - name: get-repo-stats
          description: "Fetch GitHub repository statistics including contributors, commit activity, and open pull requests."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format."
          call: "github.get-repo-stats"
          with:
            repo: "{{repo}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: stats
          path: "/repos/{{repo}}/stats/contributors"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo-stats
              method: GET

Dispatches a GitHub Actions workflow run for a specified repository and branch, and returns the run ID for tracking.

naftiko: "0.5"
info:
  label: "GitHub Actions Workflow Trigger"
  description: "Dispatches a GitHub Actions workflow run for a specified repository and branch, and returns the run ID for tracking."
  tags:
    - engineering
    - ci-cd
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: trigger-workflow
          description: "Trigger a GitHub Actions workflow dispatch event for a repo and branch."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format."
            - name: workflow_id
              in: body
              type: string
              description: "Workflow filename or ID."
            - name: ref
              in: body
              type: string
              description: "Git ref (branch or tag) to run against."
          call: "github.dispatch-workflow"
          with:
            repo: "{{repo}}"
            workflow_id: "{{workflow_id}}"
            ref: "{{ref}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatches
          path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: dispatch-workflow
              method: POST

Retrieves GitHub repository metadata for Airbnb.

naftiko: "0.5"
info:
  label: "GitHub Repository Lookup"
  description: "Retrieves GitHub repository metadata for Airbnb."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-repo
          description: "Look up repo at Airbnb."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The repo_name to look up." 
          call: "github.get-repo_name"
          with:
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github_repository_lookup
              method: GET

Fetches booking funnel conversion data from Google Analytics for a specified date range and returns step-by-step drop-off metrics.

naftiko: "0.5"
info:
  label: "Google Analytics Booking Funnel Report"
  description: "Fetches booking funnel conversion data from Google Analytics for a specified date range and returns step-by-step drop-off metrics."
  tags:
    - analytics
    - marketplace
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: booking-analytics
      port: 8080
      tools:
        - name: get-funnel-report
          description: "Retrieve booking funnel conversion metrics from Google Analytics and cache the report in Elasticsearch for dashboard use."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: fetch-report
              type: call
              call: "ga.run-funnel-report"
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: cache-report
              type: call
              call: "elasticsearch.index-report"
              with:
                index: "funnel-reports"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
                data: "{{fetch-report.rows}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runFunnelReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-funnel-report
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: reports
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-report
              method: POST

Queries Grafana dashboard data for Airbnb monitoring.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Query"
  description: "Queries Grafana dashboard data for Airbnb monitoring."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-dashboard
          description: "Query dashboard at Airbnb."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The dashboard_uid to look up." 
          call: "grafana.get-dashboard_uid"
          with:
            dashboard_uid: "{{dashboard_uid}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana_dashboard_query
              method: GET

On guest registration, verifies identity documents through a TensorFlow OCR model, validates against watchlists via the trust-safety API, and creates the verified guest profile in PostgreSQL.

naftiko: "0.5"
info:
  label: "Guest Identity Verification Pipeline"
  description: "On guest registration, verifies identity documents through a TensorFlow OCR model, validates against watchlists via the trust-safety API, and creates the verified guest profile in PostgreSQL."
  tags:
    - trust-safety
    - identity-verification
    - tensorflow
    - postgresql
capability:
  exposes:
    - type: mcp
      namespace: identity-verification
      port: 8080
      tools:
        - name: verify-guest-identity
          description: "Process guest identity verification including document OCR, watchlist check, and profile creation."
          inputParameters:
            - name: guest_id
              in: body
              type: string
              description: "The guest user identifier."
            - name: document_url
              in: body
              type: string
              description: "S3 URL of the uploaded identity document."
          steps:
            - name: extract-document
              type: call
              call: "tf-serving.predict"
              with:
                model_name: "id-document-ocr-v3"
                instances:
                  - url: "{{document_url}}"
            - name: check-watchlist
              type: call
              call: "trust-safety.check-watchlist"
              with:
                full_name: "{{extract-document.predictions[0].full_name}}"
                document_number: "{{extract-document.predictions[0].document_number}}"
                country: "{{extract-document.predictions[0].country}}"
            - name: create-profile
              type: call
              call: "postgresql.create-verified-profile"
              with:
                guest_id: "{{guest_id}}"
                verification_status: "{{check-watchlist.result}}"
                document_data: "{{extract-document.predictions[0]}}"
  consumes:
    - type: http
      namespace: tf-serving
      baseUri: "https://ml-serving.airbnb.internal/v1/models"
      authentication:
        type: bearer
        token: "$secrets.ml_serving_token"
      resources:
        - name: predictions
          path: "/{{model_name}}:predict"
          inputParameters:
            - name: model_name
              in: path
          operations:
            - name: predict
              method: POST
    - type: http
      namespace: trust-safety
      baseUri: "https://trust-safety.airbnb.internal/api/v2"
      authentication:
        type: bearer
        token: "$secrets.trust_safety_token"
      resources:
        - name: watchlist
          path: "/watchlist/check"
          operations:
            - name: check-watchlist
              method: POST
    - type: http
      namespace: postgresql
      baseUri: "https://guest-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.guest_db_token"
      resources:
        - name: profiles
          path: "/guests/{{guest_id}}/verified-profile"
          inputParameters:
            - name: guest_id
              in: path
          operations:
            - name: create-verified-profile
              method: POST

Pulls guest reviews from Elasticsearch, processes them through a Hugging Face NLP sentiment model, and writes the sentiment tags back to the listing record.

naftiko: "0.5"
info:
  label: "Guest Review Sentiment Analyzer"
  description: "Pulls guest reviews from Elasticsearch, processes them through a Hugging Face NLP sentiment model, and writes the sentiment tags back to the listing record."
  tags:
    - machine-learning
    - nlp
    - elasticsearch
    - hugging-face
capability:
  exposes:
    - type: mcp
      namespace: review-analytics
      port: 8080
      tools:
        - name: analyze-review-sentiment
          description: "Given a listing ID and date range, fetch reviews from Elasticsearch, score sentiment via Hugging Face, and persist results."
          inputParameters:
            - name: listing_id
              in: body
              type: string
              description: "The listing identifier to analyze reviews for."
            - name: start_date
              in: body
              type: string
              description: "Start date for review window in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date for review window in YYYY-MM-DD format."
          steps:
            - name: fetch-reviews
              type: call
              call: "elasticsearch.search-reviews"
              with:
                index: "guest-reviews"
                listing_id: "{{listing_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: score-sentiment
              type: call
              call: "huggingface.text-classification"
              with:
                model: "airbnb/review-sentiment-v2"
                inputs: "{{fetch-reviews.hits}}"
            - name: persist-sentiment
              type: call
              call: "elasticsearch.bulk-update"
              with:
                index: "guest-reviews"
                docs: "{{score-sentiment.results}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: reviews
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-reviews
              method: POST
        - name: bulk
          path: "/{{index}}/_bulk"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: bulk-update
              method: POST
    - type: http
      namespace: huggingface
      baseUri: "https://api-inference.huggingface.co/models"
      authentication:
        type: bearer
        token: "$secrets.huggingface_token"
      resources:
        - name: classification
          path: "/{{model}}"
          inputParameters:
            - name: model
              in: path
          operations:
            - name: text-classification
              method: POST

Receives safety report, verifies booking details in Snowflake, creates urgent Zendesk case, dispatches support, and escalates to safety team.

naftiko: "0.5"
info:
  label: "Guest Safety Incident Response"
  description: "Receives safety report, verifies booking details in Snowflake, creates urgent Zendesk case, dispatches support, and escalates to safety team."
  tags:
    - trust-safety
    - snowflake
    - zendesk
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trust-safety
      port: 8080
      tools:
        - name: guest_safety_incident_response
          description: "Orchestrate guest safety incident response workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-zendesk
              type: call
              call: "zendesk.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks host registration funnel in Snowflake, identifies drop-off points, creates optimization tasks in Jira, and notifies growth team.

naftiko: "0.5"
info:
  label: "Host Acquisition Funnel Pipeline"
  description: "Tracks host registration funnel in Snowflake, identifies drop-off points, creates optimization tasks in Jira, and notifies growth team."
  tags:
    - growth
    - snowflake
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: growth
      port: 8080
      tools:
        - name: host_acquisition_funnel_pipeline
          description: "Orchestrate host acquisition funnel pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-salesforce
              type: call
              call: "salesforce.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks host engagement metrics in Snowflake, identifies at-risk hosts, creates retention campaigns in HubSpot, and notifies community team.

naftiko: "0.5"
info:
  label: "Host Community Engagement Pipeline"
  description: "Tracks host engagement metrics in Snowflake, identifies at-risk hosts, creates retention campaigns in HubSpot, and notifies community team."
  tags:
    - community
    - snowflake
    - hubspot
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: community
      port: 8080
      tools:
        - name: host_community_engagement_pipeline
          description: "Orchestrate host community engagement pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-hubspot
              type: call
              call: "hubspot.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-salesforce
              type: call
              call: "salesforce.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: hubspot-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Aggregates host earnings data from PostgreSQL, enriches with payout status from the payment service, and caches the result in Elasticsearch for dashboard rendering.

naftiko: "0.5"
info:
  label: "Host Earnings Dashboard Data Fetcher"
  description: "Aggregates host earnings data from PostgreSQL, enriches with payout status from the payment service, and caches the result in Elasticsearch for dashboard rendering."
  tags:
    - host-management
    - payments
    - postgresql
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: host-earnings
      port: 8080
      tools:
        - name: fetch-earnings-dashboard
          description: "Compile host earnings data from multiple sources for dashboard display."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The host identifier."
            - name: period
              in: body
              type: string
              description: "Earnings period (e.g., 2026-Q1)."
          steps:
            - name: get-earnings
              type: call
              call: "postgresql.get-host-earnings"
              with:
                host_id: "{{host_id}}"
                period: "{{period}}"
            - name: get-payouts
              type: call
              call: "payments.get-host-payouts"
              with:
                host_id: "{{host_id}}"
                period: "{{period}}"
            - name: cache-dashboard
              type: call
              call: "elasticsearch.index-dashboard"
              with:
                index: "host-dashboards"
                host_id: "{{host_id}}"
                earnings: "{{get-earnings.summary}}"
                payouts: "{{get-payouts.transactions}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://earnings-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.earnings_db_token"
      resources:
        - name: earnings
          path: "/hosts/{{host_id}}/earnings"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host-earnings
              method: GET
    - type: http
      namespace: payments
      baseUri: "https://payments.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.payments_token"
      resources:
        - name: host-payouts
          path: "/hosts/{{host_id}}/payouts"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host-payouts
              method: GET
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: dashboards
          path: "/{{index}}/_doc/{{host_id}}"
          inputParameters:
            - name: index
              in: path
            - name: host_id
              in: path
          operations:
            - name: index-dashboard
              method: PUT

Receives host damage claims, validates against booking data in Snowflake, processes through Stripe, creates Zendesk case, and notifies insurance.

naftiko: "0.5"
info:
  label: "Host Insurance Claim Processor"
  description: "Receives host damage claims, validates against booking data in Snowflake, processes through Stripe, creates Zendesk case, and notifies insurance."
  tags:
    - insurance
    - snowflake
    - stripe
    - zendesk
    - slack
capability:
  exposes:
    - type: mcp
      namespace: insurance
      port: 8080
      tools:
        - name: host_insurance_claim_processor
          description: "Orchestrate host insurance claim processor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-stripe
              type: call
              call: "stripe.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-zendesk
              type: call
              call: "zendesk.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: stripe
      baseUri: "https://api.stripe.com/v1"
      authentication:
        type: bearer
        token: "$secrets.stripe_secret_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: stripe-op
              method: POST
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Analyzes host response times and patterns in Snowflake, identifies coaching opportunities, and notifies community team.

naftiko: "0.5"
info:
  label: "Host Messaging Analytics Pipeline"
  description: "Analyzes host response times and patterns in Snowflake, identifies coaching opportunities, and notifies community team."
  tags:
    - host-management
    - snowflake
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: host-management
      port: 8080
      tools:
        - name: host_messaging_analytics_pipeline
          description: "Orchestrate host messaging analytics pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a new host is verified, provisions their Salesforce contact record, creates a Zendesk support profile, and sends a welcome email via MailChimp.

naftiko: "0.5"
info:
  label: "Host Onboarding Orchestrator"
  description: "When a new host is verified, provisions their Salesforce contact record, creates a Zendesk support profile, and sends a welcome email via MailChimp."
  tags:
    - host-management
    - onboarding
    - salesforce
    - zendesk
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: host-onboarding
      port: 8080
      tools:
        - name: onboard-host
          description: "Orchestrate new host onboarding across CRM, support, and marketing systems."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The Airbnb host identifier."
            - name: email
              in: body
              type: string
              description: "Host email address."
            - name: full_name
              in: body
              type: string
              description: "Host full name."
          steps:
            - name: create-contact
              type: call
              call: "salesforce.create-contact"
              with:
                email: "{{email}}"
                full_name: "{{full_name}}"
                host_id: "{{host_id}}"
            - name: create-support-user
              type: call
              call: "zendesk.create-user"
              with:
                name: "{{full_name}}"
                email: "{{email}}"
                role: "end-user"
                external_id: "{{host_id}}"
            - name: send-welcome
              type: call
              call: "mailchimp.send-campaign"
              with:
                list_id: "host-welcome"
                email: "{{email}}"
                merge_fields:
                  FNAME: "{{full_name}}"
                  HOST_ID: "{{host_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: create-contact
              method: POST
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: users
          path: "/users.json"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns/{{list_id}}/actions/send"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: send-campaign
              method: POST

Reconciles Stripe payouts against booking records in Snowflake, identifies discrepancies, creates Jira tickets, and notifies finance.

naftiko: "0.5"
info:
  label: "Host Payment Reconciliation Pipeline"
  description: "Reconciles Stripe payouts against booking records in Snowflake, identifies discrepancies, creates Jira tickets, and notifies finance."
  tags:
    - payments
    - stripe
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: host_payment_reconciliation_pipeline
          description: "Orchestrate host payment reconciliation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-stripe
              type: call
              call: "stripe.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: stripe
      baseUri: "https://api.stripe.com/v1"
      authentication:
        type: bearer
        token: "$secrets.stripe_secret_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: stripe-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries the Mastercard payment gateway for a host payout transaction status and returns settlement details including amount, currency, and transfer date.

naftiko: "0.5"
info:
  label: "Host Payout Status Lookup"
  description: "Queries the Mastercard payment gateway for a host payout transaction status and returns settlement details including amount, currency, and transfer date."
  tags:
    - payments
    - host-management
    - mastercard
capability:
  exposes:
    - type: mcp
      namespace: host-payouts
      port: 8080
      tools:
        - name: get-payout-status
          description: "Look up a host payout by transaction ID. Returns status, amount, currency, and settlement date."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "The payout transaction identifier."
          call: "mastercard.get-transfer"
          with:
            transfer_id: "{{transaction_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.transfer.status"
            - name: amount
              type: string
              mapping: "$.transfer.amount.value"
            - name: currency
              type: string
              mapping: "$.transfer.amount.currency"
            - name: settlement_date
              type: string
              mapping: "$.transfer.settlement_date"
  consumes:
    - type: http
      namespace: mastercard
      baseUri: "https://api.mastercard.com/send/v1"
      authentication:
        type: bearer
        token: "$secrets.mastercard_api_token"
      resources:
        - name: transfers
          path: "/partners/transfers/{{transfer_id}}"
          inputParameters:
            - name: transfer_id
              in: path
          operations:
            - name: get-transfer
              method: GET

Calculates Superhost criteria from booking data in Snowflake, updates host status, sends notifications, and publishes results.

naftiko: "0.5"
info:
  label: "Host Superhost Evaluation Pipeline"
  description: "Calculates Superhost criteria from booking data in Snowflake, updates host status, sends notifications, and publishes results."
  tags:
    - host-management
    - snowflake
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: host-management
      port: 8080
      tools:
        - name: host_superhost_evaluation_pipeline
          description: "Orchestrate host superhost evaluation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Evaluates a host's eligibility for Superhost status by pulling review scores from Elasticsearch, cancellation rates from PostgreSQL, and response metrics from the messaging service.

naftiko: "0.5"
info:
  label: "Host Superhost Status Evaluator"
  description: "Evaluates a host's eligibility for Superhost status by pulling review scores from Elasticsearch, cancellation rates from PostgreSQL, and response metrics from the messaging service."
  tags:
    - host-management
    - marketplace
    - elasticsearch
    - postgresql
capability:
  exposes:
    - type: mcp
      namespace: host-quality
      port: 8080
      tools:
        - name: evaluate-superhost
          description: "Evaluate a host's Superhost eligibility by aggregating performance metrics from multiple sources."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The host identifier."
            - name: evaluation_period
              in: body
              type: string
              description: "Evaluation period (e.g., 2025-Q3-2026-Q1)."
          steps:
            - name: get-review-scores
              type: call
              call: "elasticsearch.get-host-reviews"
              with:
                index: "guest-reviews"
                host_id: "{{host_id}}"
                period: "{{evaluation_period}}"
            - name: get-cancellations
              type: call
              call: "postgresql.get-cancellation-rate"
              with:
                host_id: "{{host_id}}"
                period: "{{evaluation_period}}"
            - name: get-response-rate
              type: call
              call: "messaging-service.get-response-metrics"
              with:
                host_id: "{{host_id}}"
                period: "{{evaluation_period}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: host-reviews
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-host-reviews
              method: POST
    - type: http
      namespace: postgresql
      baseUri: "https://host-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.host_db_token"
      resources:
        - name: cancellation-rates
          path: "/hosts/{{host_id}}/cancellation-rate"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-cancellation-rate
              method: GET
    - type: http
      namespace: messaging-service
      baseUri: "https://messaging.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.messaging_token"
      resources:
        - name: response-metrics
          path: "/hosts/{{host_id}}/response-metrics"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-response-metrics
              method: GET

Synchronizes host profile data from PostgreSQL to HubSpot CRM, creating or updating contact records for marketing automation workflows.

naftiko: "0.5"
info:
  label: "HubSpot Contact Sync"
  description: "Synchronizes host profile data from PostgreSQL to HubSpot CRM, creating or updating contact records for marketing automation workflows."
  tags:
    - marketing
    - hubspot
    - host-management
capability:
  exposes:
    - type: mcp
      namespace: marketing-crm
      port: 8080
      tools:
        - name: sync-host-to-hubspot
          description: "Sync a host profile from the internal database to HubSpot as a CRM contact."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The host identifier."
          steps:
            - name: get-host
              type: call
              call: "postgresql.get-host"
              with:
                host_id: "{{host_id}}"
            - name: upsert-contact
              type: call
              call: "hubspot.upsert-contact"
              with:
                email: "{{get-host.email}}"
                properties:
                  firstname: "{{get-host.first_name}}"
                  lastname: "{{get-host.last_name}}"
                  airbnb_host_id: "{{host_id}}"
                  listing_count: "{{get-host.listing_count}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://host-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.host_db_token"
      resources:
        - name: hosts
          path: "/hosts/{{host_id}}"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts"
          operations:
            - name: upsert-contact
              method: POST

On a Datadog alert trigger, creates a ServiceNow incident, posts a notification to the on-call channel, and pages the responsible engineer via the escalation policy.

naftiko: "0.5"
info:
  label: "Incident Response Orchestrator"
  description: "On a Datadog alert trigger, creates a ServiceNow incident, posts a notification to the on-call channel, and pages the responsible engineer via the escalation policy."
  tags:
    - platform-ops
    - incident-management
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: trigger-incident-response
          description: "Given a Datadog alert ID, create a ServiceNow incident and notify the on-call team."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert identifier."
            - name: severity
              in: body
              type: string
              description: "Incident severity level (P1-P4)."
          steps:
            - name: get-alert
              type: call
              call: "datadog.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "{{get-alert.title}}"
                severity: "{{severity}}"
                description: "Auto-created from Datadog alert {{alert_id}}: {{get-alert.message}}"
                assignment_group: "Platform_Engineering"
            - name: notify-oncall
              type: call
              call: "servicenow.notify-group"
              with:
                incident_number: "{{create-incident.number}}"
                group: "Platform_Engineering"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: alerts
          path: "/alert/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.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
        - name: notifications
          path: "/table/incident/{{incident_number}}/notify"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: notify-group
              method: POST

Collects resource metrics from Kubernetes, forecasts demand in Snowflake, plans scaling in Jira, updates Grafana, and notifies SRE.

naftiko: "0.5"
info:
  label: "Infrastructure Capacity Planning Pipeline"
  description: "Collects resource metrics from Kubernetes, forecasts demand in Snowflake, plans scaling in Jira, updates Grafana, and notifies SRE."
  tags:
    - infrastructure
    - kubernetes
    - snowflake
    - grafana
    - jira
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: infrastructure_capacity_planning_pipelin
          description: "Orchestrate infrastructure capacity planning pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-kubernetes
              type: call
              call: "k8s.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-jira
              type: call
              call: "jira.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://airbnb-k8s.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: kubernetes-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST

Collects cloud costs from Kubernetes usage, allocates by team in Snowflake, generates Grafana reports, and notifies engineering leads.

naftiko: "0.5"
info:
  label: "Infrastructure Cost Allocation Pipeline"
  description: "Collects cloud costs from Kubernetes usage, allocates by team in Snowflake, generates Grafana reports, and notifies engineering leads."
  tags:
    - finops
    - kubernetes
    - snowflake
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: infrastructure_cost_allocation_pipeline
          description: "Orchestrate infrastructure cost allocation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-kubernetes
              type: call
              call: "k8s.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://airbnb-k8s.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: kubernetes-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves the Istio virtual service configuration for a given service, returning routing rules, traffic weights, and retry policies.

naftiko: "0.5"
info:
  label: "Istio Service Mesh Traffic Policy"
  description: "Retrieves the Istio virtual service configuration for a given service, returning routing rules, traffic weights, and retry policies."
  tags:
    - infrastructure
    - istio
    - service-mesh
capability:
  exposes:
    - type: mcp
      namespace: service-mesh
      port: 8080
      tools:
        - name: get-virtual-service
          description: "Retrieve Istio virtual service routing configuration and its associated destination rules for a given service."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace."
            - name: service_name
              in: body
              type: string
              description: "Istio virtual service name."
          steps:
            - name: fetch-vs
              type: call
              call: "kubernetes.get-virtual-service"
              with:
                namespace: "{{namespace}}"
                service_name: "{{service_name}}"
            - name: fetch-dr
              type: call
              call: "kubernetes.get-destination-rule"
              with:
                namespace: "{{namespace}}"
                service_name: "{{service_name}}"
  consumes:
    - type: http
      namespace: kubernetes
      baseUri: "https://k8s-api.airbnb.internal"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: virtual-services
          path: "/apis/networking.istio.io/v1beta1/namespaces/{{namespace}}/virtualservices/{{service_name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: service_name
              in: path
          operations:
            - name: get-virtual-service
              method: GET
        - name: destination-rules
          path: "/apis/networking.istio.io/v1beta1/namespaces/{{namespace}}/destinationrules/{{service_name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: service_name
              in: path
          operations:
            - name: get-destination-rule
              method: GET

Retrieves Jira issue status for Airbnb engineering teams.

naftiko: "0.5"
info:
  label: "Jira Issue Status"
  description: "Retrieves Jira issue status for Airbnb engineering teams."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-issue
          description: "Look up Jira issue at Airbnb."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The issue_key to look up." 
          call: "jira.get-issue_key"
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira_issue_status
              method: GET

Publishes a structured event to a Kafka topic via Kafka Connect REST API, used for domain event sourcing across Airbnb microservices.

naftiko: "0.5"
info:
  label: "Kafka Event Stream Publisher"
  description: "Publishes a structured event to a Kafka topic via Kafka Connect REST API, used for domain event sourcing across Airbnb microservices."
  tags:
    - platform-ops
    - event-sourcing
    - kafka-connect
capability:
  exposes:
    - type: mcp
      namespace: event-bus
      port: 8080
      tools:
        - name: publish-event
          description: "Publish a domain event to a Kafka topic and log the publish confirmation to Elasticsearch for event tracing."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "Kafka topic name."
            - name: key
              in: body
              type: string
              description: "Event partition key."
            - name: payload
              in: body
              type: string
              description: "JSON event payload."
          steps:
            - name: produce-message
              type: call
              call: "kafka.produce"
              with:
                topic: "{{topic}}"
                key: "{{key}}"
                value: "{{payload}}"
            - name: log-event
              type: call
              call: "elasticsearch.index-event"
              with:
                index: "kafka-publish-log"
                topic: "{{topic}}"
                key: "{{key}}"
                offset: "{{produce-message.offset}}"
  consumes:
    - type: http
      namespace: kafka
      baseUri: "https://kafka-rest.airbnb.internal/v2"
      authentication:
        type: bearer
        token: "$secrets.kafka_rest_token"
      resources:
        - name: topics
          path: "/topics/{{topic}}"
          inputParameters:
            - name: topic
              in: path
          operations:
            - name: produce
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: events
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-event
              method: POST

Queries Keycloak for active sessions of a given user, returning session count, client associations, and last access times for security auditing.

naftiko: "0.5"
info:
  label: "Keycloak User Session Lookup"
  description: "Queries Keycloak for active sessions of a given user, returning session count, client associations, and last access times for security auditing."
  tags:
    - security
    - keycloak
    - trust-safety
capability:
  exposes:
    - type: mcp
      namespace: auth-management
      port: 8080
      tools:
        - name: get-user-sessions
          description: "Look up active Keycloak sessions for a user and retrieve associated client role mappings."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "Keycloak user identifier."
          steps:
            - name: fetch-sessions
              type: call
              call: "keycloak.get-sessions"
              with:
                user_id: "{{user_id}}"
            - name: fetch-roles
              type: call
              call: "keycloak.get-role-mappings"
              with:
                user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: keycloak
      baseUri: "https://auth.airbnb.internal/admin/realms/airbnb"
      authentication:
        type: bearer
        token: "$secrets.keycloak_admin_token"
      resources:
        - name: sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-sessions
              method: GET
        - name: role-mappings
          path: "/users/{{user_id}}/role-mappings"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-role-mappings
              method: GET

Checks the rollout status of a Kubernetes deployment in the specified namespace and returns replica counts, conditions, and available revision.

naftiko: "0.5"
info:
  label: "Kubernetes Deployment Rollout Status"
  description: "Checks the rollout status of a Kubernetes deployment in the specified namespace and returns replica counts, conditions, and available revision."
  tags:
    - infrastructure
    - kubernetes
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: get-deployment-status
          description: "Query Kubernetes API for deployment rollout status including ready replicas and conditions."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace."
            - name: deployment_name
              in: body
              type: string
              description: "Name of the deployment."
          call: "kubernetes.get-deployment"
          with:
            namespace: "{{namespace}}"
            deployment_name: "{{deployment_name}}"
          outputParameters:
            - name: ready_replicas
              type: string
              mapping: "$.status.readyReplicas"
            - name: desired_replicas
              type: string
              mapping: "$.spec.replicas"
            - name: conditions
              type: string
              mapping: "$.status.conditions"
  consumes:
    - type: http
      namespace: kubernetes
      baseUri: "https://k8s-api.airbnb.internal"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: deployments
          path: "/apis/apps/v1/namespaces/{{namespace}}/deployments/{{deployment_name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment_name
              in: path
          operations:
            - name: get-deployment
              method: GET

Reads host calendar updates from the external iCal feed, reconciles availability in PostgreSQL, and pushes updated blocks to Elasticsearch for real-time search.

naftiko: "0.5"
info:
  label: "Listing Availability Calendar Sync"
  description: "Reads host calendar updates from the external iCal feed, reconciles availability in PostgreSQL, and pushes updated blocks to Elasticsearch for real-time search."
  tags:
    - host-management
    - marketplace
    - postgresql
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: calendar-sync
      port: 8080
      tools:
        - name: sync-calendar
          description: "Synchronize a listing's availability calendar from external iCal source to internal systems."
          inputParameters:
            - name: listing_id
              in: body
              type: string
              description: "The listing identifier."
            - name: ical_url
              in: body
              type: string
              description: "External iCal feed URL."
          steps:
            - name: parse-feed
              type: call
              call: "calendar-service.parse-ical"
              with:
                url: "{{ical_url}}"
            - name: update-availability
              type: call
              call: "postgresql.update-availability"
              with:
                listing_id: "{{listing_id}}"
                blocked_dates: "{{parse-feed.events}}"
            - name: sync-search
              type: call
              call: "elasticsearch.update-calendar"
              with:
                index: "listing-calendars"
                listing_id: "{{listing_id}}"
                availability: "{{update-availability.calendar}}"
  consumes:
    - type: http
      namespace: calendar-service
      baseUri: "https://calendar-service.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calendar_service_token"
      resources:
        - name: ical-parser
          path: "/parse"
          operations:
            - name: parse-ical
              method: POST
    - type: http
      namespace: postgresql
      baseUri: "https://listing-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.listing_db_token"
      resources:
        - name: availability
          path: "/listings/{{listing_id}}/availability"
          inputParameters:
            - name: listing_id
              in: path
          operations:
            - name: update-availability
              method: PUT
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: calendars
          path: "/{{index}}/_doc/{{listing_id}}"
          inputParameters:
            - name: index
              in: path
            - name: listing_id
              in: path
          operations:
            - name: update-calendar
              method: PUT

When a new listing is submitted, fetches listing details from PostgreSQL, runs fraud signals through a TensorFlow model, and flags suspicious listings in Elasticsearch for trust-safety review.

naftiko: "0.5"
info:
  label: "Listing Fraud Detection Pipeline"
  description: "When a new listing is submitted, fetches listing details from PostgreSQL, runs fraud signals through a TensorFlow model, and flags suspicious listings in Elasticsearch for trust-safety review."
  tags:
    - trust-safety
    - machine-learning
    - postgresql
    - tensorflow
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: fraud-detection
      port: 8080
      tools:
        - name: screen-listing
          description: "Screen a newly submitted listing for fraud signals. Returns a risk score and recommended action."
          inputParameters:
            - name: listing_id
              in: body
              type: string
              description: "The listing identifier to screen."
          steps:
            - name: get-listing
              type: call
              call: "postgresql.get-listing"
              with:
                listing_id: "{{listing_id}}"
            - name: score-fraud
              type: call
              call: "tf-serving.predict"
              with:
                model_name: "listing-fraud-v4"
                instances: "{{get-listing.features}}"
            - name: index-result
              type: call
              call: "elasticsearch.index-doc"
              with:
                index: "fraud-screenings"
                listing_id: "{{listing_id}}"
                risk_score: "{{score-fraud.predictions[0].score}}"
                action: "{{score-fraud.predictions[0].recommended_action}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://listing-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.listing_db_token"
      resources:
        - name: listings
          path: "/listings/{{listing_id}}"
          inputParameters:
            - name: listing_id
              in: path
          operations:
            - name: get-listing
              method: GET
    - type: http
      namespace: tf-serving
      baseUri: "https://ml-serving.airbnb.internal/v1/models"
      authentication:
        type: bearer
        token: "$secrets.ml_serving_token"
      resources:
        - name: predictions
          path: "/{{model_name}}:predict"
          inputParameters:
            - name: model_name
              in: path
          operations:
            - name: predict
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: documents
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-doc
              method: POST

Fetches a listing's photo set from Amazon S3, runs each image through a TensorFlow quality-scoring model, and returns an aggregate score to help hosts improve their listing visuals.

naftiko: "0.5"
info:
  label: "Listing Photo Quality Scorer"
  description: "Fetches a listing's photo set from Amazon S3, runs each image through a TensorFlow quality-scoring model, and returns an aggregate score to help hosts improve their listing visuals."
  tags:
    - trust-safety
    - media
    - amazon-s3
    - tensorflow
capability:
  exposes:
    - type: mcp
      namespace: listing-media
      port: 8080
      tools:
        - name: score-listing-photos
          description: "Given a listing ID, retrieve all photos from S3 and score each for quality using the TensorFlow serving endpoint."
          inputParameters:
            - name: listing_id
              in: body
              type: string
              description: "The Airbnb listing identifier."
          steps:
            - name: fetch-photos
              type: call
              call: "s3.list-objects"
              with:
                bucket: "airbnb-listing-photos"
                prefix: "listings/{{listing_id}}/"
            - name: score-images
              type: call
              call: "tf-serving.predict"
              with:
                model_name: "photo-quality-v3"
                instances: "{{fetch-photos.objects}}"
            - name: store-scores
              type: call
              call: "postgresql.upsert-scores"
              with:
                listing_id: "{{listing_id}}"
                scores: "{{score-images.predictions}}"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://airbnb-listing-photos.s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/?list-type=2&prefix={{prefix}}"
          inputParameters:
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET
    - type: http
      namespace: tf-serving
      baseUri: "https://ml-serving.airbnb.internal/v1/models"
      authentication:
        type: bearer
        token: "$secrets.ml_serving_token"
      resources:
        - name: predictions
          path: "/{{model_name}}:predict"
          inputParameters:
            - name: model_name
              in: path
          operations:
            - name: predict
              method: POST
    - type: http
      namespace: postgresql
      baseUri: "https://listing-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.listing_db_token"
      resources:
        - name: scores
          path: "/listings/{{listing_id}}/photo-scores"
          inputParameters:
            - name: listing_id
              in: path
          operations:
            - name: upsert-scores
              method: PUT

Analyzes listing quality scores in Snowflake, identifies low-quality listings, sends improvement notifications, creates Jira tasks, and alerts trust team.

naftiko: "0.5"
info:
  label: "Listing Quality Enforcement Pipeline"
  description: "Analyzes listing quality scores in Snowflake, identifies low-quality listings, sends improvement notifications, creates Jira tasks, and alerts trust team."
  tags:
    - trust-safety
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trust-safety
      port: 8080
      tools:
        - name: listing_quality_enforcement_pipeline
          description: "Orchestrate listing quality enforcement pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-servicenow
              type: call
              call: "servicenow.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST

Deploys a trained recommendation model from S3 to TensorFlow Serving, updates the Kubernetes deployment manifest, and validates the endpoint health.

naftiko: "0.5"
info:
  label: "Listing Recommendation Model Deployment"
  description: "Deploys a trained recommendation model from S3 to TensorFlow Serving, updates the Kubernetes deployment manifest, and validates the endpoint health."
  tags:
    - machine-learning
    - deployment
    - amazon-s3
    - tensorflow
    - kubernetes
capability:
  exposes:
    - type: mcp
      namespace: ml-deployment
      port: 8080
      tools:
        - name: deploy-model
          description: "Deploy a trained ML model to TensorFlow Serving on Kubernetes with health validation."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Model name for serving."
            - name: model_version
              in: body
              type: string
              description: "Model version tag."
            - name: s3_artifact_path
              in: body
              type: string
              description: "S3 path to the model artifact."
          steps:
            - name: update-deployment
              type: call
              call: "kubernetes.patch-deployment"
              with:
                namespace: "ml-serving"
                deployment_name: "tf-serving-{{model_name}}"
                model_path: "{{s3_artifact_path}}"
                model_version: "{{model_version}}"
            - name: validate-health
              type: call
              call: "tf-serving.get-model-status"
              with:
                model_name: "{{model_name}}"
  consumes:
    - type: http
      namespace: kubernetes
      baseUri: "https://k8s-api.airbnb.internal"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: deployments
          path: "/apis/apps/v1/namespaces/{{namespace}}/deployments/{{deployment_name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment_name
              in: path
          operations:
            - name: patch-deployment
              method: PATCH
    - type: http
      namespace: tf-serving
      baseUri: "https://ml-serving.airbnb.internal/v1/models"
      authentication:
        type: bearer
        token: "$secrets.ml_serving_token"
      resources:
        - name: models
          path: "/{{model_name}}"
          inputParameters:
            - name: model_name
              in: path
          operations:
            - name: get-model-status
              method: GET

Audits translation quality across listings in Snowflake, identifies issues, creates localization tasks in Jira, and notifies i18n team.

naftiko: "0.5"
info:
  label: "Localization Quality Pipeline"
  description: "Audits translation quality across listings in Snowflake, identifies issues, creates localization tasks in Jira, and notifies i18n team."
  tags:
    - localization
    - snowflake
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: localization
      port: 8080
      tools:
        - name: localization_quality_pipeline
          description: "Orchestrate localization quality pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-confluence
              type: call
              call: "confluence.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Creates a new experiment run in Kubeflow, logs parameters and metrics from a TensorFlow training job, and stores the model artifact in Amazon S3.

naftiko: "0.5"
info:
  label: "ML Experiment Tracker"
  description: "Creates a new experiment run in Kubeflow, logs parameters and metrics from a TensorFlow training job, and stores the model artifact in Amazon S3."
  tags:
    - machine-learning
    - kubeflow
    - tensorflow
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: ml-experiments
      port: 8080
      tools:
        - name: track-experiment
          description: "Track an ML experiment by creating a run, logging metrics, and storing the trained model artifact."
          inputParameters:
            - name: experiment_name
              in: body
              type: string
              description: "Name of the Kubeflow experiment."
            - name: model_name
              in: body
              type: string
              description: "Name of the model being trained."
            - name: hyperparameters
              in: body
              type: string
              description: "JSON string of training hyperparameters."
          steps:
            - name: create-run
              type: call
              call: "kubeflow.create-run"
              with:
                experiment_name: "{{experiment_name}}"
                parameters: "{{hyperparameters}}"
            - name: get-metrics
              type: call
              call: "kubeflow.get-run-metrics"
              with:
                run_id: "{{create-run.run_id}}"
            - name: upload-artifact
              type: call
              call: "s3.put-object"
              with:
                bucket: "airbnb-ml-artifacts"
                key: "models/{{model_name}}/{{create-run.run_id}}/model.tar.gz"
  consumes:
    - type: http
      namespace: kubeflow
      baseUri: "https://kubeflow.airbnb.internal/pipeline/apis/v1beta1"
      authentication:
        type: bearer
        token: "$secrets.kubeflow_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
        - name: metrics
          path: "/runs/{{run_id}}/metrics"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run-metrics
              method: GET
    - type: http
      namespace: s3
      baseUri: "https://airbnb-ml-artifacts.s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT

Tracks model predictions against outcomes in Snowflake, detects drift, creates retraining tasks in Jira, and notifies ML engineering.

naftiko: "0.5"
info:
  label: "ML Model Performance Monitor"
  description: "Tracks model predictions against outcomes in Snowflake, detects drift, creates retraining tasks in Jira, and notifies ML engineering."
  tags:
    - machine-learning
    - snowflake
    - grafana
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: machine-learning
      port: 8080
      tools:
        - name: ml_model_performance_monitor
          description: "Orchestrate ml model performance monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-grafana
              type: call
              call: "grafana.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a specific New Relic alert condition by policy ID and condition ID, returning threshold details and current state.

naftiko: "0.5"
info:
  label: "New Relic Alert Condition Lookup"
  description: "Retrieves a specific New Relic alert condition by policy ID and condition ID, returning threshold details and current state."
  tags:
    - observability
    - new-relic
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: alerting
      port: 8080
      tools:
        - name: get-alert-condition
          description: "Look up a New Relic alert condition and return its threshold settings and enabled state."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "New Relic alert policy ID."
          call: "newrelic.list-conditions"
          with:
            policy_id: "{{policy_id}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.newrelic_api_key"
      resources:
        - name: conditions
          path: "/alerts_conditions.json?policy_id={{policy_id}}"
          inputParameters:
            - name: policy_id
              in: query
          operations:
            - name: list-conditions
              method: GET

Queries the Nginx status endpoint for a given upstream group and returns the health status, active connections, and request rates per backend server.

naftiko: "0.5"
info:
  label: "Nginx Upstream Health Check"
  description: "Queries the Nginx status endpoint for a given upstream group and returns the health status, active connections, and request rates per backend server."
  tags:
    - infrastructure
    - nginx
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: load-balancer
      port: 8080
      tools:
        - name: check-upstream-health
          description: "Check the health status of an Nginx upstream group and push the results to Datadog for monitoring."
          inputParameters:
            - name: upstream_name
              in: body
              type: string
              description: "Name of the Nginx upstream group."
          steps:
            - name: fetch-status
              type: call
              call: "nginx.get-upstream-status"
              with:
                upstream_name: "{{upstream_name}}"
            - name: push-metrics
              type: call
              call: "datadog.submit-metrics"
              with:
                series:
                  metric: "nginx.upstream.health"
                  tags: "upstream:{{upstream_name}}"
                  points: "{{fetch-status.server_metrics}}"
  consumes:
    - type: http
      namespace: nginx
      baseUri: "https://nginx-controller.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.nginx_controller_token"
      resources:
        - name: upstreams
          path: "/upstreams/{{upstream_name}}"
          inputParameters:
            - name: upstream_name
              in: path
          operations:
            - name: get-upstream-status
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: metrics
          path: "/series"
          operations:
            - name: submit-metrics
              method: POST

Retrieves Okta user profile for Airbnb identity management.

naftiko: "0.5"
info:
  label: "Okta User Profile Lookup"
  description: "Retrieves Okta user profile for Airbnb identity management."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Look up user at Airbnb."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user_email to look up." 
          call: "okta.get-user_email"
          with:
            user_email: "{{user_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://airbnb.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta_user_profile_lookup
              method: GET

Evaluates an Open Policy Agent policy against a given input document and returns the allow/deny decision with detailed reasons.

naftiko: "0.5"
info:
  label: "OPA Policy Evaluation"
  description: "Evaluates an Open Policy Agent policy against a given input document and returns the allow/deny decision with detailed reasons."
  tags:
    - security
    - open-policy-agent
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: policy-engine
      port: 8080
      tools:
        - name: evaluate-policy
          description: "Evaluate an OPA policy against an input payload and log the decision to Elasticsearch for audit."
          inputParameters:
            - name: policy_path
              in: body
              type: string
              description: "OPA policy path (e.g., authz/allow)."
            - name: input_payload
              in: body
              type: string
              description: "JSON input document for policy evaluation."
          steps:
            - name: run-evaluation
              type: call
              call: "opa.evaluate"
              with:
                policy_path: "{{policy_path}}"
                input: "{{input_payload}}"
            - name: log-decision
              type: call
              call: "elasticsearch.index-decision"
              with:
                index: "policy-decisions"
                policy_path: "{{policy_path}}"
                decision: "{{run-evaluation.result}}"
  consumes:
    - type: http
      namespace: opa
      baseUri: "https://opa.airbnb.internal/v1"
      authentication:
        type: bearer
        token: "$secrets.opa_token"
      resources:
        - name: policies
          path: "/data/{{policy_path}}"
          inputParameters:
            - name: policy_path
              in: path
          operations:
            - name: evaluate
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: decisions
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-decision
              method: POST

Retrieves a distributed trace by trace ID from the OpenTelemetry collector, returning span details, durations, and service dependencies.

naftiko: "0.5"
info:
  label: "OpenTelemetry Trace Lookup"
  description: "Retrieves a distributed trace by trace ID from the OpenTelemetry collector, returning span details, durations, and service dependencies."
  tags:
    - observability
    - opentelemetry
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: tracing
      port: 8080
      tools:
        - name: get-trace
          description: "Fetch a distributed trace by trace ID from the OpenTelemetry backend."
          inputParameters:
            - name: trace_id
              in: body
              type: string
              description: "The 32-character hex trace identifier."
          call: "otel.get-trace"
          with:
            traceID: "{{trace_id}}"
  consumes:
    - type: http
      namespace: otel
      baseUri: "https://otel-query.airbnb.internal/api"
      authentication:
        type: bearer
        token: "$secrets.otel_query_token"
      resources:
        - name: traces
          path: "/traces/{{traceID}}"
          inputParameters:
            - name: traceID
              in: path
          operations:
            - name: get-trace
              method: GET

Retrieves PagerDuty incident details for Airbnb on-call teams.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Details"
  description: "Retrieves PagerDuty incident details for Airbnb on-call teams."
  tags:
    - devops
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: get-incident
          description: "Look up incident at Airbnb."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The incident_id to look up." 
          call: "pagerduty.get-incident_id"
          with:
            incident_id: "{{incident_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty_incident_details
              method: GET

Monitors partner API integrations via Datadog, checks response times in Grafana, creates incidents for degradation, and notifies partnerships team.

naftiko: "0.5"
info:
  label: "Partner API Health Monitor"
  description: "Monitors partner API integrations via Datadog, checks response times in Grafana, creates incidents for degradation, and notifies partnerships team."
  tags:
    - partnerships
    - datadog
    - grafana
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: partnerships
      port: 8080
      tools:
        - name: partner_api_health_monitor
          description: "Orchestrate partner api health monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-grafana
              type: call
              call: "grafana.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Receives Stripe disputes, collects booking evidence from Snowflake, creates Zendesk case, processes resolution, and notifies finance.

naftiko: "0.5"
info:
  label: "Payment Dispute Resolution Pipeline"
  description: "Receives Stripe disputes, collects booking evidence from Snowflake, creates Zendesk case, processes resolution, and notifies finance."
  tags:
    - payments
    - stripe
    - snowflake
    - zendesk
    - slack
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: payment_dispute_resolution_pipeline
          description: "Orchestrate payment dispute resolution pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-stripe
              type: call
              call: "stripe.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-zendesk
              type: call
              call: "zendesk.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: stripe
      baseUri: "https://api.stripe.com/v1"
      authentication:
        type: bearer
        token: "$secrets.stripe_secret_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: stripe-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Monitors global platform health via Datadog, detects regional outages, creates incidents in Jira, updates status page, and notifies SRE.

naftiko: "0.5"
info:
  label: "Platform Availability Monitor"
  description: "Monitors global platform health via Datadog, detects regional outages, creates incidents in Jira, updates status page, and notifies SRE."
  tags:
    - sre
    - datadog
    - jira
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sre
      port: 8080
      tools:
        - name: platform_availability_monitor
          description: "Orchestrate platform availability monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks feature usage from Snowflake events, calculates adoption rates, creates improvement tasks in Jira, and notifies product managers.

naftiko: "0.5"
info:
  label: "Platform Feature Adoption Tracker"
  description: "Tracks feature usage from Snowflake events, calculates adoption rates, creates improvement tasks in Jira, and notifies product managers."
  tags:
    - product
    - snowflake
    - grafana
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: product
      port: 8080
      tools:
        - name: platform_feature_adoption_tracker
          description: "Orchestrate platform feature adoption tracker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-grafana
              type: call
              call: "grafana.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers a dataset refresh in Power BI for host analytics dashboards and returns the refresh status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Trigger"
  description: "Triggers a dataset refresh in Power BI for host analytics dashboards and returns the refresh status."
  tags:
    - analytics
    - power-bi
    - host-management
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: refresh-dataset
          description: "Trigger a Power BI dataset refresh for a specified workspace and dataset."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace identifier."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset identifier."
          call: "powerbi.refresh-dataset"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Triggers Power BI dataset refresh for Airbnb reporting.

naftiko: "0.5"
info:
  label: "Power BI Refresh Trigger"
  description: "Triggers Power BI dataset refresh for Airbnb reporting."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: trigger-refresh
          description: "Trigger refresh at Airbnb."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The dataset_id to look up." 
          call: "powerbi.get-dataset_id"
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: power_bi_refresh_trigger
              method: GET

Fetches comparable listing prices from Elasticsearch, runs them through a Kubeflow dynamic pricing model, and updates the host's smart-pricing recommendation in PostgreSQL.

naftiko: "0.5"
info:
  label: "Pricing Optimization Pipeline"
  description: "Fetches comparable listing prices from Elasticsearch, runs them through a Kubeflow dynamic pricing model, and updates the host's smart-pricing recommendation in PostgreSQL."
  tags:
    - marketplace
    - machine-learning
    - elasticsearch
    - kubeflow
    - postgresql
capability:
  exposes:
    - type: mcp
      namespace: smart-pricing
      port: 8080
      tools:
        - name: optimize-pricing
          description: "Generate a smart pricing recommendation for a listing based on comparable market data."
          inputParameters:
            - name: listing_id
              in: body
              type: string
              description: "The listing identifier."
            - name: check_in_date
              in: body
              type: string
              description: "Target check-in date in YYYY-MM-DD format."
            - name: check_out_date
              in: body
              type: string
              description: "Target check-out date in YYYY-MM-DD format."
          steps:
            - name: fetch-comps
              type: call
              call: "elasticsearch.search-comps"
              with:
                index: "listing-prices"
                listing_id: "{{listing_id}}"
                check_in: "{{check_in_date}}"
                check_out: "{{check_out_date}}"
            - name: run-model
              type: call
              call: "kubeflow.predict"
              with:
                pipeline: "smart-pricing-v5"
                features: "{{fetch-comps.aggregations}}"
            - name: update-price
              type: call
              call: "postgresql.upsert-price"
              with:
                listing_id: "{{listing_id}}"
                recommended_price: "{{run-model.prediction}}"
                check_in_date: "{{check_in_date}}"
                check_out_date: "{{check_out_date}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: price-comps
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-comps
              method: POST
    - type: http
      namespace: kubeflow
      baseUri: "https://kubeflow.airbnb.internal/pipeline/apis/v1beta1"
      authentication:
        type: bearer
        token: "$secrets.kubeflow_token"
      resources:
        - name: predictions
          path: "/runs"
          operations:
            - name: predict
              method: POST
    - type: http
      namespace: postgresql
      baseUri: "https://pricing-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pricing_db_token"
      resources:
        - name: prices
          path: "/listings/{{listing_id}}/smart-price"
          inputParameters:
            - name: listing_id
              in: path
          operations:
            - name: upsert-price
              method: PUT

Triggers a React Native mobile app build via GitHub Actions, monitors the build status, and posts the artifact URL to the engineering channel.

naftiko: "0.5"
info:
  label: "React Native Build Pipeline"
  description: "Triggers a React Native mobile app build via GitHub Actions, monitors the build status, and posts the artifact URL to the engineering channel."
  tags:
    - engineering
    - mobile
    - react-native
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: mobile-ci
      port: 8080
      tools:
        - name: trigger-mobile-build
          description: "Trigger a React Native build workflow and report the artifact link when complete."
          inputParameters:
            - name: platform
              in: body
              type: string
              description: "Target platform: ios or android."
            - name: branch
              in: body
              type: string
              description: "Git branch to build from."
          steps:
            - name: dispatch-build
              type: call
              call: "github.dispatch-workflow"
              with:
                repo: "airbnb/mobile-app"
                workflow_id: "build-{{platform}}.yml"
                ref: "{{branch}}"
            - name: get-run
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "airbnb/mobile-app"
                run_id: "{{dispatch-build.run_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dispatches
          path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
        - name: runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET

Monitors local regulations in database, validates listings against rules in Snowflake, flags violations, and notifies policy team.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Automation"
  description: "Monitors local regulations in database, validates listings against rules in Snowflake, flags violations, and notifies policy team."
  tags:
    - compliance
    - snowflake
    - jira
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: regulatory_compliance_automation
          description: "Orchestrate regulatory compliance automation workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-servicenow
              type: call
              call: "servicenow.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Pulls reservation data from PostgreSQL, generates tax summaries per jurisdiction, and uploads the compliance report to Amazon S3 for regulatory filing.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Report Generator"
  description: "Pulls reservation data from PostgreSQL, generates tax summaries per jurisdiction, and uploads the compliance report to Amazon S3 for regulatory filing."
  tags:
    - compliance
    - taxes
    - postgresql
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Generate a regulatory compliance report for a jurisdiction and period, then store in S3."
          inputParameters:
            - name: jurisdiction
              in: body
              type: string
              description: "Tax jurisdiction code."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: pull-data
              type: call
              call: "postgresql.get-reservation-summary"
              with:
                jurisdiction: "{{jurisdiction}}"
                period: "{{period}}"
            - name: generate-report
              type: call
              call: "compliance-service.generate"
              with:
                jurisdiction: "{{jurisdiction}}"
                period: "{{period}}"
                data: "{{pull-data.summary}}"
            - name: upload-report
              type: call
              call: "s3.put-object"
              with:
                bucket: "airbnb-compliance-reports"
                key: "reports/{{jurisdiction}}/{{period}}/compliance-report.pdf"
                body: "{{generate-report.document}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://reservation-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reservation_db_token"
      resources:
        - name: summaries
          path: "/reservations/summary"
          operations:
            - name: get-reservation-summary
              method: POST
    - type: http
      namespace: compliance-service
      baseUri: "https://compliance.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_service_token"
      resources:
        - name: reports
          path: "/reports/generate"
          operations:
            - name: generate
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://airbnb-compliance-reports.s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT

When a cancellation request is received, updates the reservation in PostgreSQL, initiates the refund via the payment gateway, notifies the host through RabbitMQ, and logs the event in Elasticsearch.

naftiko: "0.5"
info:
  label: "Reservation Cancellation Processor"
  description: "When a cancellation request is received, updates the reservation in PostgreSQL, initiates the refund via the payment gateway, notifies the host through RabbitMQ, and logs the event in Elasticsearch."
  tags:
    - marketplace
    - payments
    - rabbitmq
    - postgresql
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: reservation-management
      port: 8080
      tools:
        - name: process-cancellation
          description: "Process a reservation cancellation including refund, host notification, and audit logging."
          inputParameters:
            - name: reservation_id
              in: body
              type: string
              description: "The reservation identifier."
            - name: reason
              in: body
              type: string
              description: "Cancellation reason code."
          steps:
            - name: cancel-reservation
              type: call
              call: "postgresql.cancel-reservation"
              with:
                reservation_id: "{{reservation_id}}"
                reason: "{{reason}}"
            - name: initiate-refund
              type: call
              call: "payments.create-refund"
              with:
                reservation_id: "{{reservation_id}}"
                amount: "{{cancel-reservation.refund_amount}}"
                currency: "{{cancel-reservation.currency}}"
            - name: notify-host
              type: call
              call: "rabbitmq.publish"
              with:
                exchange: "host-notifications"
                routing_key: "cancellation.{{cancel-reservation.host_id}}"
                payload:
                  reservation_id: "{{reservation_id}}"
                  refund_amount: "{{cancel-reservation.refund_amount}}"
            - name: log-event
              type: call
              call: "elasticsearch.index-event"
              with:
                index: "reservation-events"
                event_type: "cancellation"
                reservation_id: "{{reservation_id}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://reservation-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reservation_db_token"
      resources:
        - name: reservations
          path: "/reservations/{{reservation_id}}/cancel"
          inputParameters:
            - name: reservation_id
              in: path
          operations:
            - name: cancel-reservation
              method: POST
    - type: http
      namespace: payments
      baseUri: "https://payments.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.payments_token"
      resources:
        - name: refunds
          path: "/refunds"
          operations:
            - name: create-refund
              method: POST
    - type: http
      namespace: rabbitmq
      baseUri: "https://rabbitmq.airbnb.internal/api"
      authentication:
        type: basic
        username: "$secrets.rabbitmq_user"
        password: "$secrets.rabbitmq_password"
      resources:
        - name: messages
          path: "/exchanges/%2f/{{exchange}}/publish"
          inputParameters:
            - name: exchange
              in: path
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: events
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-event
              method: POST

Analyzes review patterns in Snowflake, detects suspicious activity, flags accounts, creates investigation tasks in Jira, and alerts trust team.

naftiko: "0.5"
info:
  label: "Review Fraud Detection Pipeline"
  description: "Analyzes review patterns in Snowflake, detects suspicious activity, flags accounts, creates investigation tasks in Jira, and alerts trust team."
  tags:
    - trust-safety
    - snowflake
    - jira
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trust-safety
      port: 8080
      tools:
        - name: review_fraud_detection_pipeline
          description: "Orchestrate review fraud detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-datadog
              type: call
              call: "datadog.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a trust-safety incident is reported, creates a ServiceNow case, triggers the emergency response protocol via RabbitMQ, and logs the incident in Elasticsearch for compliance.

naftiko: "0.5"
info:
  label: "Safety Incident Escalation Workflow"
  description: "When a trust-safety incident is reported, creates a ServiceNow case, triggers the emergency response protocol via RabbitMQ, and logs the incident in Elasticsearch for compliance."
  tags:
    - trust-safety
    - incident-management
    - servicenow
    - rabbitmq
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: safety-response
      port: 8080
      tools:
        - name: escalate-safety-incident
          description: "Escalate a trust-safety incident across case management, response coordination, and compliance systems."
          inputParameters:
            - name: incident_type
              in: body
              type: string
              description: "Type of safety incident (e.g., property_damage, guest_safety, harassment)."
            - name: reporter_id
              in: body
              type: string
              description: "User ID of the person reporting."
            - name: reservation_id
              in: body
              type: string
              description: "Associated reservation identifier."
            - name: description
              in: body
              type: string
              description: "Incident description."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Safety Incident: {{incident_type}} - Reservation {{reservation_id}}"
                category: "trust_safety"
                priority: "1"
                description: "{{description}}"
            - name: trigger-response
              type: call
              call: "rabbitmq.publish"
              with:
                exchange: "safety-escalations"
                routing_key: "incident.{{incident_type}}"
                payload:
                  case_number: "{{create-case.number}}"
                  reservation_id: "{{reservation_id}}"
                  reporter_id: "{{reporter_id}}"
            - name: log-compliance
              type: call
              call: "elasticsearch.index-incident"
              with:
                index: "safety-incidents"
                incident_type: "{{incident_type}}"
                case_number: "{{create-case.number}}"
                reservation_id: "{{reservation_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: rabbitmq
      baseUri: "https://rabbitmq.airbnb.internal/api"
      authentication:
        type: basic
        username: "$secrets.rabbitmq_user"
        password: "$secrets.rabbitmq_password"
      resources:
        - name: messages
          path: "/exchanges/%2f/{{exchange}}/publish"
          inputParameters:
            - name: exchange
              in: path
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: incidents
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-incident
              method: POST

Retrieves Salesforce account details for Airbnb sales teams.

naftiko: "0.5"
info:
  label: "Salesforce Account Info"
  description: "Retrieves Salesforce account details for Airbnb sales teams."
  tags:
    - crm
    - salesforce
    - accounts
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up account at Airbnb."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The account_id to look up." 
          call: "salesforce.get-account_id"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce_account_info
              method: GET

Queries Salesforce for a partner or enterprise account by account ID, returning account details, owner, and recent activity for business development workflows.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Queries Salesforce for a partner or enterprise account by account ID, returning account details, owner, and recent activity for business development workflows."
  tags:
    - business-development
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up a Salesforce account by ID. Returns account name, owner, industry, and recent activities."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account identifier."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Triggers a full rebuild of the listing search index by reading listings from PostgreSQL, transforming documents with Apache NiFi, and bulk-indexing into Elasticsearch.

naftiko: "0.5"
info:
  label: "Search Index Rebuild Orchestrator"
  description: "Triggers a full rebuild of the listing search index by reading listings from PostgreSQL, transforming documents with Apache NiFi, and bulk-indexing into Elasticsearch."
  tags:
    - search
    - platform-ops
    - postgresql
    - apache-nifi
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: search-ops
      port: 8080
      tools:
        - name: rebuild-search-index
          description: "Orchestrate a full listing search index rebuild from source of truth through transformation to indexing."
          inputParameters:
            - name: index_name
              in: body
              type: string
              description: "Target Elasticsearch index name."
            - name: batch_size
              in: body
              type: string
              description: "Number of listings per batch."
          steps:
            - name: export-listings
              type: call
              call: "postgresql.export-listings"
              with:
                batch_size: "{{batch_size}}"
            - name: transform-docs
              type: call
              call: "nifi.trigger-processor"
              with:
                processor_group: "listing-search-transform"
                input: "{{export-listings.batch_url}}"
            - name: bulk-index
              type: call
              call: "elasticsearch.bulk-index"
              with:
                index: "{{index_name}}"
                docs: "{{transform-docs.output_url}}"
  consumes:
    - type: http
      namespace: postgresql
      baseUri: "https://listing-db.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.listing_db_token"
      resources:
        - name: exports
          path: "/listings/export"
          operations:
            - name: export-listings
              method: POST
    - type: http
      namespace: nifi
      baseUri: "https://nifi.airbnb.internal/nifi-api"
      authentication:
        type: bearer
        token: "$secrets.nifi_token"
      resources:
        - name: processors
          path: "/process-groups/{{processor_group}}/process-processors"
          inputParameters:
            - name: processor_group
              in: path
          operations:
            - name: trigger-processor
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: bulk
          path: "/{{index}}/_bulk"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: bulk-index
              method: POST

Launches A/B experiments on search ranking, collects metrics in Snowflake, analyzes statistical significance, creates Jira review, and notifies product.

naftiko: "0.5"
info:
  label: "Search Ranking Experiment Pipeline"
  description: "Launches A/B experiments on search ranking, collects metrics in Snowflake, analyzes statistical significance, creates Jira review, and notifies product."
  tags:
    - experimentation
    - snowflake
    - jira
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: experimentation
      port: 8080
      tools:
        - name: search_ranking_experiment_pipeline
          description: "Orchestrate search ranking experiment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-datadog
              type: call
              call: "datadog.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Builds demand models from historical data in Snowflake, generates forecasts by market, updates pricing recommendations, and notifies revenue team.

naftiko: "0.5"
info:
  label: "Seasonal Demand Forecasting Pipeline"
  description: "Builds demand models from historical data in Snowflake, generates forecasts by market, updates pricing recommendations, and notifies revenue team."
  tags:
    - revenue
    - snowflake
    - grafana
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: revenue
      port: 8080
      tools:
        - name: seasonal_demand_forecasting_pipeline
          description: "Orchestrate seasonal demand forecasting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-grafana
              type: call
              call: "grafana.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Checks ServiceNow incident status for Airbnb IT operations.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Check"
  description: "Checks ServiceNow incident status for Airbnb IT operations."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up incident at Airbnb."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The incident_id to look up." 
          call: "servicenow.get-incident_id"
          with:
            incident_id: "{{incident_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://airbnb.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow_incident_status_che
              method: GET

Sends a message to a Slack channel for Airbnb notifications.

naftiko: "0.5"
info:
  label: "Slack Channel Post"
  description: "Sends a message to a Slack channel for Airbnb notifications."
  tags:
    - collaboration
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: send-message
          description: "Post to Slack at Airbnb."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The channel to look up." 
          call: "slack.get-channel"
          with:
            channel: "{{channel}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack_channel_post
              method: GET

Executes SQL queries against Airbnb Snowflake warehouse.

naftiko: "0.5"
info:
  label: "Snowflake Query Executor"
  description: "Executes SQL queries against Airbnb Snowflake warehouse."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Run query at Airbnb."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The sql_query to look up." 
          call: "snowflake.get-sql_query"
          with:
            sql_query: "{{sql_query}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake_query_executor
              method: GET

Fetches engagement metrics from Instagram and Facebook for Airbnb brand posts, aggregates them, and stores results in Elasticsearch for marketing analytics.

naftiko: "0.5"
info:
  label: "Social Media Engagement Tracker"
  description: "Fetches engagement metrics from Instagram and Facebook for Airbnb brand posts, aggregates them, and stores results in Elasticsearch for marketing analytics."
  tags:
    - marketing
    - social
    - instagram
    - facebook
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: social-analytics
      port: 8080
      tools:
        - name: track-engagement
          description: "Collect and aggregate social media engagement metrics from Instagram and Facebook for a campaign."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Marketing campaign identifier."
            - name: date_range
              in: body
              type: string
              description: "Date range for metrics in YYYY-MM-DD/YYYY-MM-DD format."
          steps:
            - name: get-instagram
              type: call
              call: "instagram.get-media-insights"
              with:
                campaign_tag: "{{campaign_id}}"
            - name: get-facebook
              type: call
              call: "facebook.get-post-insights"
              with:
                campaign_tag: "{{campaign_id}}"
            - name: store-metrics
              type: call
              call: "elasticsearch.index-engagement"
              with:
                index: "social-engagement"
                campaign_id: "{{campaign_id}}"
                instagram: "{{get-instagram.data}}"
                facebook: "{{get-facebook.data}}"
  consumes:
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: insights
          path: "/{{media_id}}/insights"
          inputParameters:
            - name: media_id
              in: path
          operations:
            - name: get-media-insights
              method: GET
    - type: http
      namespace: facebook
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_token"
      resources:
        - name: insights
          path: "/{{post_id}}/insights"
          inputParameters:
            - name: post_id
              in: path
          operations:
            - name: get-post-insights
              method: GET
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-cluster.airbnb.internal:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: engagement
          path: "/{{index}}/_doc"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: index-engagement
              method: POST

Checks the quality gate status for a project in SonarQube and returns pass/fail with metric breakdown for bugs, vulnerabilities, and code smells.

naftiko: "0.5"
info:
  label: "SonarQube Code Quality Gate Check"
  description: "Checks the quality gate status for a project in SonarQube and returns pass/fail with metric breakdown for bugs, vulnerabilities, and code smells."
  tags:
    - engineering
    - code-quality
    - sonarqube
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: check-quality-gate
          description: "Check the SonarQube quality gate status for a project key."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "SonarQube project key."
          call: "sonarqube.get-quality-gate"
          with:
            projectKey: "{{project_key}}"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonar.airbnb.internal/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{projectKey}}"
          inputParameters:
            - name: projectKey
              in: query
          operations:
            - name: get-quality-gate
              method: GET

Searches Splunk indexes for log entries at Airbnb.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk indexes for log entries at Airbnb."
  tags:
    - devops
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: logging
      port: 8080
      tools:
        - name: search-logs
          description: "Search Splunk logs for Airbnb."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The query to look up." 
          call: "splunk.get-query"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://airbnb-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk_log_search
              method: GET

Monitors listing supply quality metrics in Snowflake, identifies market gaps, creates recruitment campaigns in Salesforce, and notifies growth.

naftiko: "0.5"
info:
  label: "Supply Quality Assurance Pipeline"
  description: "Monitors listing supply quality metrics in Snowflake, identifies market gaps, creates recruitment campaigns in Salesforce, and notifies growth."
  tags:
    - supply
    - snowflake
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: supply
      port: 8080
      tools:
        - name: supply_quality_assurance_pipeline
          description: "Orchestrate supply quality assurance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://airbnb.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Calculates environmental impact metrics in Snowflake, generates sustainability reports, publishes to Confluence, and notifies corporate responsibility.

naftiko: "0.5"
info:
  label: "Sustainability Impact Reporter"
  description: "Calculates environmental impact metrics in Snowflake, generates sustainability reports, publishes to Confluence, and notifies corporate responsibility."
  tags:
    - sustainability
    - snowflake
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: sustainability_impact_reporter
          description: "Orchestrate sustainability impact reporter workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-jira
              type: call
              call: "jira.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://airbnb.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://airbnb.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers a Terraform plan for a given workspace, fetches the plan output, and posts a summary to the pull request on GitHub for review.

naftiko: "0.5"
info:
  label: "Terraform Plan Validator"
  description: "Triggers a Terraform plan for a given workspace, fetches the plan output, and posts a summary to the pull request on GitHub for review."
  tags:
    - infrastructure
    - terraform
    - github
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: infra-automation
      port: 8080
      tools:
        - name: validate-terraform-plan
          description: "Run a Terraform plan against a workspace and post the summary to the associated GitHub PR."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace identifier."
            - name: pr_number
              in: body
              type: string
              description: "GitHub pull request number."
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
          steps:
            - name: create-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                plan_only: true
            - name: get-plan
              type: call
              call: "terraform.get-plan"
              with:
                run_id: "{{create-run.id}}"
            - name: post-comment
              type: call
              call: "github.create-pr-comment"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                body: "Terraform Plan Summary:\n{{get-plan.resource_changes_summary}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_cloud_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
        - name: plan-details
          path: "/runs/{{run_id}}/plan"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-plan
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-comments
          path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST

Aggregates trust signals from multiple sources in Snowflake, calculates host and guest trust scores, updates profiles, and logs changes.

naftiko: "0.5"
info:
  label: "Trust Score Calculation Pipeline"
  description: "Aggregates trust signals from multiple sources in Snowflake, calculates host and guest trust scores, updates profiles, and logs changes."
  tags:
    - trust-safety
    - snowflake
    - elasticsearch
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trust-safety
      port: 8080
      tools:
        - name: trust_score_calculation_pipeline
          description: "Orchestrate trust score calculation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-elasticsearch
              type: call
              call: "elasticsearch.process-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: notify-slack
              type: call
              call: "slack.notify-resource"
              with:
                resource_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://airbnb.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://airbnb-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://airbnb-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries the Vitess VTGate endpoint for cluster topology and tablet health, returning shard status and replication lag for database operations teams.

naftiko: "0.5"
info:
  label: "Vitess Cluster Health Check"
  description: "Queries the Vitess VTGate endpoint for cluster topology and tablet health, returning shard status and replication lag for database operations teams."
  tags:
    - databases
    - vitess
    - platform-ops
capability:
  exposes:
    - type: mcp
      namespace: database-ops
      port: 8080
      tools:
        - name: check-vitess-health
          description: "Check Vitess cluster health including shard topology and replication lag."
          inputParameters:
            - name: keyspace
              in: body
              type: string
              description: "Vitess keyspace name."
          call: "vitess.get-topology"
          with:
            keyspace: "{{keyspace}}"
  consumes:
    - type: http
      namespace: vitess
      baseUri: "https://vtgate.airbnb.internal/api/v1"
      authentication:
        type: bearer
        token: "$secrets.vitess_token"
      resources:
        - name: topology
          path: "/keyspaces/{{keyspace}}/topology"
          inputParameters:
            - name: keyspace
              in: path
          operations:
            - name: get-topology
              method: GET

Retrieves employee details from Workday by employee ID, returning name, department, manager, and office location for internal tooling.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Retrieves employee details from Workday by employee ID, returning name, department, manager, and office location for internal tooling."
  tags:
    - hr
    - workday
    - operations
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an Airbnb employee in Workday by worker ID and retrieve their organizational hierarchy."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker identifier."
          steps:
            - name: fetch-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: fetch-org
              type: call
              call: "workday.get-org-chart"
              with:
                worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/airbnb"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
        - name: org-chart
          path: "/workers/{{worker_id}}/organizationHierarchy"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-org-chart
              method: GET

Retrieves employee profile from Workday at Airbnb.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile from Workday at Airbnb."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up Workday employee at Airbnb."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee_id to look up." 
          call: "workday.get-employee_id"
          with:
            employee_id: "{{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/airbnb"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday_employee_lookup
              method: GET

When a new Zendesk ticket arrives, classifies it using a Hugging Face intent model, applies the category tag, and routes to the appropriate support queue.

naftiko: "0.5"
info:
  label: "Zendesk Ticket Auto-Categorizer"
  description: "When a new Zendesk ticket arrives, classifies it using a Hugging Face intent model, applies the category tag, and routes to the appropriate support queue."
  tags:
    - support
    - machine-learning
    - zendesk
    - hugging-face
capability:
  exposes:
    - type: mcp
      namespace: support-automation
      port: 8080
      tools:
        - name: categorize-ticket
          description: "Auto-categorize a Zendesk ticket using ML classification and route to the correct queue."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Zendesk ticket identifier."
          steps:
            - name: get-ticket
              type: call
              call: "zendesk.get-ticket"
              with:
                ticket_id: "{{ticket_id}}"
            - name: classify-intent
              type: call
              call: "huggingface.text-classification"
              with:
                model: "airbnb/support-intent-v3"
                inputs: "{{get-ticket.ticket.subject}} {{get-ticket.ticket.description}}"
            - name: update-ticket
              type: call
              call: "zendesk.update-ticket"
              with:
                ticket_id: "{{ticket_id}}"
                tags: "{{classify-intent.label}}"
                group_id: "{{classify-intent.routing_group}}"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}.json"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET
            - name: update-ticket
              method: PUT
    - type: http
      namespace: huggingface
      baseUri: "https://api-inference.huggingface.co/models"
      authentication:
        type: bearer
        token: "$secrets.huggingface_token"
      resources:
        - name: classification
          path: "/{{model}}"
          inputParameters:
            - name: model
              in: path
          operations:
            - name: text-classification
              method: POST

Retrieves a Zendesk support ticket by ID, returning subject, status, assignee, priority, and latest comment for customer support agents.

naftiko: "0.5"
info:
  label: "Zendesk Ticket Lookup"
  description: "Retrieves a Zendesk support ticket by ID, returning subject, status, assignee, priority, and latest comment for customer support agents."
  tags:
    - support
    - zendesk
capability:
  exposes:
    - type: mcp
      namespace: support-ops
      port: 8080
      tools:
        - name: get-ticket
          description: "Look up a Zendesk support ticket by ticket ID."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Zendesk ticket identifier."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://airbnb.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}.json"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET