Airbnb Capabilities
Naftiko 0.5 capability definitions for Airbnb - 100 capabilities showing integration workflows and service orchestrations.
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