Deliveroo Capabilities
Naftiko 0.5 capability definitions for Deliveroo - 100 capabilities showing integration workflows and service orchestrations.
Retrieves a funnel analysis from Amplitude for a given event sequence and posts the conversion rates to Slack.
naftiko: "0.5"
info:
label: "Amplitude Funnel Analysis Report"
description: "Retrieves a funnel analysis from Amplitude for a given event sequence and posts the conversion rates to Slack."
tags:
- analytics
- product
- amplitude
- slack
capability:
exposes:
- type: mcp
namespace: product-analytics
port: 8080
tools:
- name: get-funnel-report
description: "Given an Amplitude funnel ID, fetch conversion rates and post to the product analytics Slack channel."
inputParameters:
- name: funnel_id
in: body
type: string
description: "Amplitude funnel chart ID."
steps:
- name: get-funnel
type: call
call: amplitude.get-funnel
with:
chart_id: "{{funnel_id}}"
- name: post-report
type: call
call: slack.post-message
with:
channel: "product-analytics"
text: "Funnel report: {{get-funnel.conversion_rate}}% overall conversion"
consumes:
- type: http
namespace: amplitude
baseUri: "https://amplitude.com/api/3"
authentication:
type: basic
username: "$secrets.amplitude_api_key"
password: "$secrets.amplitude_secret_key"
resources:
- name: funnels
path: "/chart/{{chart_id}}/query"
inputParameters:
- name: chart_id
in: path
operations:
- name: get-funnel
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When AWS cost anomaly detection fires, annotates Datadog, creates a Jira cost-review task, and posts an alert to the FinOps Slack channel.
naftiko: "0.5"
info:
label: "AWS Cloud Cost Anomaly Alert"
description: "When AWS cost anomaly detection fires, annotates Datadog, creates a Jira cost-review task, and posts an alert to the FinOps Slack channel."
tags:
- finops
- cloud
- aws
- datadog
- jira
- slack
capability:
exposes:
- type: mcp
namespace: finops
port: 8080
tools:
- name: handle-aws-cost-anomaly
description: "Given an AWS cost anomaly alert with service and overage amount, create a Datadog event, open a Jira cost-review task, and notify the FinOps Slack channel."
inputParameters:
- name: anomaly_id
in: body
type: string
description: "AWS Cost Anomaly Detection anomaly ID."
- name: aws_service
in: body
type: string
description: "AWS service name with the anomalous spend (e.g. EC2, RDS)."
- name: estimated_overage_usd
in: body
type: number
description: "Estimated overage amount in USD."
steps:
- name: annotate-datadog
type: call
call: datadog.create-event
with:
title: "AWS Cost Anomaly: {{aws_service}}"
text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}}"
alert_type: warning
- name: create-review-task
type: call
call: jira.create-issue
with:
project_key: FIN
issuetype: Task
summary: "AWS cost anomaly review: {{aws_service}} — ${{estimated_overage_usd}}"
description: "Anomaly ID: {{anomaly_id}}\nService: {{aws_service}}\nEstimated overage: ${{estimated_overage_usd}}\nDatadog: {{annotate-datadog.url}}"
- name: notify-finops
type: call
call: slack.post-message
with:
channel: finops-alerts
text: "AWS Cost Anomaly: {{aws_service}} | Overage: ${{estimated_overage_usd}} | Jira: {{create-review-task.key}} | Datadog: {{annotate-datadog.url}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the current state of an AWS CloudWatch alarm by alarm name.
naftiko: "0.5"
info:
label: "AWS CloudWatch Alarm Status"
description: "Retrieves the current state of an AWS CloudWatch alarm by alarm name."
tags:
- monitoring
- cloud
- aws
- cloudwatch
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: get-alarm-status
description: "Given a CloudWatch alarm name, return the current state, reason, and last updated timestamp."
inputParameters:
- name: alarm_name
in: body
type: string
description: "CloudWatch alarm name."
call: cloudwatch.describe-alarm
with:
alarm_name: "{{alarm_name}}"
outputParameters:
- name: state
type: string
mapping: "$.MetricAlarms[0].StateValue"
- name: reason
type: string
mapping: "$.MetricAlarms[0].StateReason"
consumes:
- type: http
namespace: cloudwatch
baseUri: "https://monitoring.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: alarms
path: "/"
operations:
- name: describe-alarm
method: POST
Retrieves AWS cost data for a given service and time period from Cost Explorer.
naftiko: "0.5"
info:
label: "AWS Cost Explorer Report"
description: "Retrieves AWS cost data for a given service and time period from Cost Explorer."
tags:
- finops
- cloud
- aws
capability:
exposes:
- type: mcp
namespace: finops
port: 8080
tools:
- name: get-cost-report
description: "Given a service name and date range, return the AWS cost breakdown from Cost Explorer."
inputParameters:
- name: service
in: body
type: string
description: "AWS service name filter."
- name: start_date
in: body
type: string
description: "Start date (YYYY-MM-DD)."
- name: end_date
in: body
type: string
description: "End date (YYYY-MM-DD)."
call: cost-explorer.get-cost
with:
service: "{{service}}"
start: "{{start_date}}"
end: "{{end_date}}"
outputParameters:
- name: total_cost
type: string
mapping: "$.ResultsByTime[0].Total.UnblendedCost.Amount"
- name: currency
type: string
mapping: "$.ResultsByTime[0].Total.UnblendedCost.Unit"
consumes:
- type: http
namespace: cost-explorer
baseUri: "https://ce.us-east-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: costs
path: "/"
operations:
- name: get-cost
method: POST
Retrieves an order record from DynamoDB by order ID, returning status, restaurant, and delivery details.
naftiko: "0.5"
info:
label: "AWS DynamoDB Order Lookup"
description: "Retrieves an order record from DynamoDB by order ID, returning status, restaurant, and delivery details."
tags:
- data
- orders
- aws
- dynamodb
capability:
exposes:
- type: mcp
namespace: order-ops
port: 8080
tools:
- name: get-order
description: "Given an order ID, fetch the order record from DynamoDB. Returns status, restaurant name, and delivery ETA."
inputParameters:
- name: order_id
in: body
type: string
description: "Deliveroo order ID."
call: dynamodb.get-item
with:
table: "Orders"
key:
order_id: "{{order_id}}"
outputParameters:
- name: status
type: string
mapping: "$.Item.status.S"
- name: restaurant
type: string
mapping: "$.Item.restaurant_name.S"
- name: delivery_eta
type: string
mapping: "$.Item.delivery_eta.S"
consumes:
- type: http
namespace: dynamodb
baseUri: "https://dynamodb.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: items
path: "/"
operations:
- name: get-item
method: POST
Retrieves the status of an Amazon ECS service, returning running task count, desired count, and deployment status.
naftiko: "0.5"
info:
label: "AWS ECS Service Status"
description: "Retrieves the status of an Amazon ECS service, returning running task count, desired count, and deployment status."
tags:
- infrastructure
- containers
- aws
- amazon-ecs
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: get-ecs-service-status
description: "Given an ECS cluster and service name, return the running task count, desired count, and latest deployment status."
inputParameters:
- name: cluster
in: body
type: string
description: "ECS cluster name."
- name: service
in: body
type: string
description: "ECS service name."
call: ecs.describe-service
with:
cluster: "{{cluster}}"
service: "{{service}}"
outputParameters:
- name: running_count
type: integer
mapping: "$.services[0].runningCount"
- name: desired_count
type: integer
mapping: "$.services[0].desiredCount"
- name: deployment_status
type: string
mapping: "$.services[0].deployments[0].rolloutState"
consumes:
- type: http
namespace: ecs
baseUri: "https://ecs.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: services
path: "/"
operations:
- name: describe-service
method: POST
Invokes an AWS Lambda function to reprocess a failed order and returns the processing result.
naftiko: "0.5"
info:
label: "AWS Lambda Order Processor Invoke"
description: "Invokes an AWS Lambda function to reprocess a failed order and returns the processing result."
tags:
- engineering
- serverless
- aws
- aws-lambda
capability:
exposes:
- type: mcp
namespace: order-ops
port: 8080
tools:
- name: reprocess-order
description: "Given an order ID, invoke the order reprocessing Lambda function and return the result."
inputParameters:
- name: order_id
in: body
type: string
description: "Order ID to reprocess."
call: lambda.invoke-function
with:
function_name: "order-reprocessor"
payload: "{\"order_id\": \"{{order_id}}\"}"
outputParameters:
- name: status_code
type: integer
mapping: "$.StatusCode"
- name: result
type: string
mapping: "$.Payload"
consumes:
- type: http
namespace: lambda
baseUri: "https://lambda.eu-west-1.amazonaws.com/2015-03-31"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: functions
path: "/functions/order-reprocessor/invocations"
operations:
- name: invoke-function
method: POST
Creates an on-demand snapshot of an AWS RDS database instance and posts confirmation to the DBA Slack channel.
naftiko: "0.5"
info:
label: "AWS RDS Snapshot Creation"
description: "Creates an on-demand snapshot of an AWS RDS database instance and posts confirmation to the DBA Slack channel."
tags:
- data
- database
- aws
- slack
capability:
exposes:
- type: mcp
namespace: dba-ops
port: 8080
tools:
- name: create-rds-snapshot
description: "Given an RDS instance ID, create a manual snapshot and notify the DBA Slack channel."
inputParameters:
- name: db_instance_id
in: body
type: string
description: "RDS instance identifier."
- name: snapshot_suffix
in: body
type: string
description: "Suffix for snapshot identifier."
steps:
- name: create-snapshot
type: call
call: rds.create-snapshot
with:
db_instance_id: "{{db_instance_id}}"
snapshot_id: "{{db_instance_id}}-{{snapshot_suffix}}"
- name: notify-dba
type: call
call: slack.post-message
with:
channel: "dba-ops"
text: "RDS snapshot created: {{db_instance_id}}-{{snapshot_suffix}}"
consumes:
- type: http
namespace: rds
baseUri: "https://rds.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: snapshots
path: "/"
operations:
- name: create-snapshot
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Generates a pre-signed S3 URL for a data export file and sends it to the requester via Slack direct message.
naftiko: "0.5"
info:
label: "AWS S3 Data Export"
description: "Generates a pre-signed S3 URL for a data export file and sends it to the requester via Slack direct message."
tags:
- data
- cloud
- amazon-s3
- slack
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: share-data-export
description: "Given an S3 bucket, key, and Slack user ID, generate a pre-signed download URL and send it as a Slack DM."
inputParameters:
- name: bucket
in: body
type: string
description: "S3 bucket name."
- name: key
in: body
type: string
description: "S3 object key."
- name: slack_user_id
in: body
type: string
description: "Slack user ID for the DM."
steps:
- name: generate-url
type: call
call: s3.get-presigned-url
with:
bucket: "{{bucket}}"
key: "{{key}}"
expires_in: 3600
- name: send-dm
type: call
call: slack.post-message
with:
channel: "{{slack_user_id}}"
text: "Your data export is ready: {{generate-url.url}} (expires in 1 hour)"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: get-presigned-url
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Triggers rotation for an AWS Secrets Manager secret and posts confirmation to the security Slack channel.
naftiko: "0.5"
info:
label: "AWS Secrets Manager Rotation"
description: "Triggers rotation for an AWS Secrets Manager secret and posts confirmation to the security Slack channel."
tags:
- security
- cloud
- aws
- slack
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: rotate-secret
description: "Given a Secrets Manager secret name, trigger rotation and notify the security Slack channel."
inputParameters:
- name: secret_name
in: body
type: string
description: "AWS Secrets Manager secret name."
steps:
- name: trigger-rotation
type: call
call: secretsmanager.rotate-secret
with:
secret_id: "{{secret_name}}"
- name: notify-security
type: call
call: slack.post-message
with:
channel: "security-ops"
text: "Secret rotation triggered for: {{secret_name}} | Version: {{trigger-rotation.version_id}}"
consumes:
- type: http
namespace: secretsmanager
baseUri: "https://secretsmanager.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: secrets
path: "/"
operations:
- name: rotate-secret
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Checks the approximate message count in an SQS queue and returns the depth for monitoring.
naftiko: "0.5"
info:
label: "AWS SQS Queue Depth Monitor"
description: "Checks the approximate message count in an SQS queue and returns the depth for monitoring."
tags:
- engineering
- messaging
- aws
- amazon-sqs
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: get-queue-depth
description: "Given an SQS queue URL, return the approximate number of messages available and in-flight."
inputParameters:
- name: queue_url
in: body
type: string
description: "SQS queue URL."
call: sqs.get-queue-attributes
with:
queue_url: "{{queue_url}}"
outputParameters:
- name: messages_available
type: integer
mapping: "$.Attributes.ApproximateNumberOfMessages"
- name: messages_in_flight
type: integer
mapping: "$.Attributes.ApproximateNumberOfMessagesNotVisible"
consumes:
- type: http
namespace: sqs
baseUri: "https://sqs.eu-west-1.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: queues
path: "/"
operations:
- name: get-queue-attributes
method: POST
Sends a targeted push notification to a customer segment via Braze and logs delivery metrics to Snowflake.
naftiko: "0.5"
info:
label: "Braze Push Notification Send"
description: "Sends a targeted push notification to a customer segment via Braze and logs delivery metrics to Snowflake."
tags:
- marketing
- customer-engagement
- braze
- snowflake
capability:
exposes:
- type: mcp
namespace: marketing-ops
port: 8080
tools:
- name: send-push-notification
description: "Given a Braze segment ID and message content, send a push notification and log metrics to Snowflake."
inputParameters:
- name: segment_id
in: body
type: string
description: "Braze segment ID."
- name: title
in: body
type: string
description: "Push notification title."
- name: body
in: body
type: string
description: "Push notification body."
steps:
- name: send-push
type: call
call: braze.send-campaign
with:
segment_id: "{{segment_id}}"
title: "{{title}}"
body: "{{body}}"
- name: log-metrics
type: call
call: snowflake.insert-row
with:
table: "PUSH_NOTIFICATION_LOG"
values:
segment_id: "{{segment_id}}"
dispatch_id: "{{send-push.dispatch_id}}"
consumes:
- type: http
namespace: braze
baseUri: "https://rest.fra-02.braze.eu"
authentication:
type: bearer
token: "$secrets.braze_api_key"
resources:
- name: campaigns
path: "/campaigns/trigger/send"
operations:
- name: send-campaign
method: POST
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-row
method: POST
Updates a Cloudflare rate limiting rule for a zone and notifies the security team via Slack.
naftiko: "0.5"
info:
label: "Cloudflare Rate Limit Update"
description: "Updates a Cloudflare rate limiting rule for a zone and notifies the security team via Slack."
tags:
- security
- infrastructure
- cloudflare
- slack
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: update-rate-limit
description: "Given a Cloudflare zone ID, rule ID, and new threshold, update the rate limit rule and notify security Slack."
inputParameters:
- name: zone_id
in: body
type: string
description: "Cloudflare zone ID."
- name: rule_id
in: body
type: string
description: "Rate limiting rule ID."
- name: threshold
in: body
type: integer
description: "New requests-per-second threshold."
steps:
- name: update-rule
type: call
call: cloudflare.update-rate-limit
with:
zone_id: "{{zone_id}}"
rule_id: "{{rule_id}}"
threshold: "{{threshold}}"
- name: notify-security
type: call
call: slack.post-message
with:
channel: "security-ops"
text: "Cloudflare rate limit updated: zone {{zone_id}}, rule {{rule_id}}, new threshold: {{threshold}} rps"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_token"
resources:
- name: rate-limits
path: "/zones/{{zone_id}}/rate_limits/{{rule_id}}"
inputParameters:
- name: zone_id
in: path
- name: rule_id
in: path
operations:
- name: update-rate-limit
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Searches Confluence for a runbook by title keyword and returns the page URL and last updated date.
naftiko: "0.5"
info:
label: "Confluence Runbook Lookup"
description: "Searches Confluence for a runbook by title keyword and returns the page URL and last updated date."
tags:
- engineering
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: docs-ops
port: 8080
tools:
- name: find-runbook
description: "Given a search keyword, find matching runbook pages in Confluence and return titles and URLs."
inputParameters:
- name: keyword
in: body
type: string
description: "Search keyword for runbook title."
call: confluence.search-content
with:
cql: "type=page AND title~'{{keyword}}' AND space=RUNBOOKS"
outputParameters:
- name: results
type: array
mapping: "$.results[*]"
consumes:
- type: http
namespace: confluence
baseUri: "https://deliveroo.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: search
path: "/search"
operations:
- name: search-content
method: GET
Checks Kafka consumer group lag via Datadog and, if above threshold, creates a PagerDuty alert and notifies Slack.
naftiko: "0.5"
info:
label: "Confluent Kafka Consumer Lag Alert"
description: "Checks Kafka consumer group lag via Datadog and, if above threshold, creates a PagerDuty alert and notifies Slack."
tags:
- engineering
- messaging
- datadog
- pagerduty
- slack
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: check-consumer-lag
description: "Given a Kafka consumer group and lag threshold, check current lag in Datadog. If exceeded, trigger PagerDuty and Slack alerts."
inputParameters:
- name: consumer_group
in: body
type: string
description: "Kafka consumer group name."
- name: lag_threshold
in: body
type: integer
description: "Maximum acceptable consumer lag."
steps:
- name: query-lag
type: call
call: datadog.query-timeseries
with:
query: "avg:kafka.consumer.lag{consumer_group:{{consumer_group}}}"
- name: alert-pagerduty
type: call
call: pagerduty.create-event
with:
routing_key: "$secrets.pagerduty_routing_key"
summary: "Kafka consumer lag for {{consumer_group}} exceeds {{lag_threshold}}"
severity: "error"
- name: notify-slack
type: call
call: slack.post-message
with:
channel: "platform-alerts"
text: "Kafka consumer lag alert: {{consumer_group}} lag exceeded {{lag_threshold}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: query
path: "/query"
operations:
- name: query-timeseries
method: GET
- type: http
namespace: pagerduty
baseUri: "https://events.pagerduty.com/v2"
authentication:
type: none
resources:
- name: events
path: "/enqueue"
operations:
- name: create-event
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a GitHub Actions pipeline fails on the main branch, creates a Datadog deployment marker, opens a Jira bug, and alerts the mobile engineering Slack channel.
naftiko: "0.5"
info:
label: "Consumer App Deployment Pipeline Failure Handler"
description: "When a GitHub Actions pipeline fails on the main branch, creates a Datadog deployment marker, opens a Jira bug, and alerts the mobile engineering Slack channel."
tags:
- devops
- cicd
- github
- datadog
- jira
- slack
capability:
exposes:
- type: mcp
namespace: mobile-devops
port: 8080
tools:
- name: handle-app-pipeline-failure
description: "Given a GitHub Actions run failure on the consumer app repo, annotate Datadog, create a Jira bug, and alert the mobile engineering Slack channel."
inputParameters:
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID that failed."
- name: commit_sha
in: body
type: string
description: "Git commit SHA that triggered the failing run."
- name: branch
in: body
type: string
description: "Git branch name where the failure occurred."
- name: workflow_name
in: body
type: string
description: "Name of the failed GitHub Actions workflow."
steps:
- name: create-dd-event
type: call
call: datadog.create-event
with:
title: "CI failure: {{workflow_name}} on {{branch}}"
text: "Run {{run_id}} failed at commit {{commit_sha}}"
alert_type: error
tags: "env:ci,repo:consumer-app"
- name: create-bug
type: call
call: jira.create-issue
with:
project_key: MOB
issuetype: Bug
summary: "[CI Failure] {{workflow_name}} — {{branch}} — {{commit_sha}}"
description: "GitHub run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nDatadog event: {{create-dd-event.id}}"
- name: alert-channel
type: call
call: slack.post-message
with:
channel: mobile-engineering
text: "Pipeline failure: {{workflow_name}} on {{branch}} | Commit: {{commit_sha}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a Zendesk ticket exceeds SLA thresholds, escalates to a Salesforce case, creates a PagerDuty alert for the support manager, and notifies the support Slack channel.
naftiko: "0.5"
info:
label: "Customer Support Ticket Escalation"
description: "When a Zendesk ticket exceeds SLA thresholds, escalates to a Salesforce case, creates a PagerDuty alert for the support manager, and notifies the support Slack channel."
tags:
- customer-support
- escalation
- zendesk
- salesforce
- pagerduty
- slack
capability:
exposes:
- type: mcp
namespace: support-ops
port: 8080
tools:
- name: escalate-support-ticket
description: "Given a Zendesk ticket ID that has breached SLA, create a Salesforce case, page the support manager via PagerDuty, and post to the support Slack channel."
inputParameters:
- name: zendesk_ticket_id
in: body
type: string
description: "The Zendesk ticket ID that has breached its SLA."
- name: sla_breach_minutes
in: body
type: integer
description: "Number of minutes the ticket has exceeded the SLA target."
- name: customer_email
in: body
type: string
description: "Customer email address associated with the ticket."
steps:
- name: get-ticket
type: call
call: zendesk.get-ticket
with:
ticket_id: "{{zendesk_ticket_id}}"
- name: create-case
type: call
call: salesforce.create-case
with:
subject: "SLA breach: Zendesk ticket {{zendesk_ticket_id}}"
description: "SLA breached by {{sla_breach_minutes}} minutes. Customer: {{customer_email}}\nOriginal subject: {{get-ticket.subject}}"
priority: High
origin: Zendesk
- name: page-manager
type: call
call: pagerduty.create-incident
with:
title: "Support SLA breach — ticket {{zendesk_ticket_id}} — {{sla_breach_minutes}}min over"
urgency: high
service_id: "$secrets.pagerduty_support_service_id"
- name: notify-support
type: call
call: slack.post-message
with:
channel: customer-support
text: "SLA breach: Ticket {{zendesk_ticket_id}} is {{sla_breach_minutes}}min overdue | Customer: {{customer_email}} | SF Case: {{create-case.case_number}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: Authorization
value: "$secrets.pagerduty_api_key"
placement: header
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Monitors Datadog APM for p99 latency threshold breaches on the order API service and creates a PagerDuty incident when thresholds are exceeded.
naftiko: "0.5"
info:
label: "Datadog APM Latency Threshold Alert"
description: "Monitors Datadog APM for p99 latency threshold breaches on the order API service and creates a PagerDuty incident when thresholds are exceeded."
tags:
- observability
- monitoring
- datadog
- pagerduty
- operations
capability:
exposes:
- type: mcp
namespace: apm-monitoring
port: 8080
tools:
- name: handle-latency-breach
description: "Given a Datadog monitor alert for p99 latency breach on a service endpoint, create a PagerDuty incident and notify the SRE Slack channel."
inputParameters:
- name: service_name
in: body
type: string
description: "Name of the service with the latency breach (e.g. order-api)."
- name: p99_latency_ms
in: body
type: number
description: "Measured p99 latency in milliseconds."
- name: threshold_ms
in: body
type: number
description: "Configured latency threshold in milliseconds."
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID that triggered the alert."
steps:
- name: create-pd-incident
type: call
call: pagerduty.create-incident
with:
title: "Latency breach: {{service_name}} p99={{p99_latency_ms}}ms (threshold: {{threshold_ms}}ms)"
urgency: high
service_id: "$secrets.pagerduty_sre_service_id"
- name: notify-sre
type: call
call: slack.post-message
with:
channel: sre-alerts
text: "Latency breach: {{service_name}} p99={{p99_latency_ms}}ms vs threshold {{threshold_ms}}ms | Monitor: {{monitor_id}} | PD: {{create-pd-incident.html_url}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: Authorization
value: "$secrets.pagerduty_api_key"
placement: header
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries a Datadog custom metric time series and returns the latest data points for operational dashboards.
naftiko: "0.5"
info:
label: "Datadog Custom Metric Query"
description: "Queries a Datadog custom metric time series and returns the latest data points for operational dashboards."
tags:
- monitoring
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: query-metric
description: "Given a Datadog metric query string and time range, return the latest data points."
inputParameters:
- name: query
in: body
type: string
description: "Datadog metric query (e.g., avg:system.cpu.user{service:orders})."
- name: from_ts
in: body
type: integer
description: "Start timestamp (epoch seconds)."
- name: to_ts
in: body
type: integer
description: "End timestamp (epoch seconds)."
call: datadog.query-timeseries
with:
query: "{{query}}"
from: "{{from_ts}}"
to: "{{to_ts}}"
outputParameters:
- name: series
type: array
mapping: "$.series"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: query
path: "/query"
operations:
- name: query-timeseries
method: GET
Searches Datadog logs by query string and returns matching log entries for debugging.
naftiko: "0.5"
info:
label: "Datadog Log Search"
description: "Searches Datadog logs by query string and returns matching log entries for debugging."
tags:
- engineering
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: search-logs
description: "Given a Datadog log query and time range, return matching log entries."
inputParameters:
- name: query
in: body
type: string
description: "Datadog log search query."
- name: from_ts
in: body
type: string
description: "Start time (ISO 8601)."
- name: to_ts
in: body
type: string
description: "End time (ISO 8601)."
call: datadog.search-logs
with:
query: "{{query}}"
from: "{{from_ts}}"
to: "{{to_ts}}"
outputParameters:
- name: logs
type: array
mapping: "$.data"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: logs
path: "/logs/events/search"
operations:
- name: search-logs
method: POST
Retrieves current monitor statuses for Deliveroo's core order processing services from Datadog and returns a structured health summary.
naftiko: "0.5"
info:
label: "Datadog Service Health Check"
description: "Retrieves current monitor statuses for Deliveroo's core order processing services from Datadog and returns a structured health summary."
tags:
- observability
- monitoring
- datadog
- operations
capability:
exposes:
- type: mcp
namespace: service-health
port: 8080
tools:
- name: get-service-health
description: "Given a Datadog monitor tag, retrieve all monitor statuses for the matching services and return a structured health summary. Use to check the live health of Deliveroo's core services."
inputParameters:
- name: monitor_tag
in: body
type: string
description: "Datadog monitor tag to filter services (e.g. service:order-processor)."
call: datadog.get-monitors
with:
monitor_tags: "{{monitor_tag}}"
outputParameters:
- name: monitors
type: array
mapping: "$.monitors"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor"
inputParameters:
- name: monitor_tags
in: query
operations:
- name: get-monitors
method: GET
Triggers a Datadog synthetic test by public ID and posts the result to the QA Slack channel.
naftiko: "0.5"
info:
label: "Datadog Synthetic Test Trigger"
description: "Triggers a Datadog synthetic test by public ID and posts the result to the QA Slack channel."
tags:
- monitoring
- testing
- datadog
- slack
capability:
exposes:
- type: mcp
namespace: qa-ops
port: 8080
tools:
- name: trigger-synthetic-test
description: "Given a Datadog synthetic test public ID, trigger a test run and post the result to Slack."
inputParameters:
- name: public_id
in: body
type: string
description: "Datadog synthetic test public ID."
steps:
- name: trigger-test
type: call
call: datadog.trigger-ci-tests
with:
public_ids: "{{public_id}}"
- name: post-result
type: call
call: slack.post-message
with:
channel: "qa-alerts"
text: "Synthetic test {{public_id}} triggered. Batch ID: {{trigger-test.batch_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: synthetics
path: "/synthetics/tests/trigger/ci"
operations:
- name: trigger-ci-tests
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Snowflake for delivery time metrics by zone and refreshes the Tableau SLA dashboard used by operations leadership.
naftiko: "0.5"
info:
label: "Delivery Time SLA Dashboard Refresh"
description: "Queries Snowflake for delivery time metrics by zone and refreshes the Tableau SLA dashboard used by operations leadership."
tags:
- analytics
- operations
- snowflake
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: ops-reporting
port: 8080
tools:
- name: refresh-delivery-sla-dashboard
description: "Given a report date, query Snowflake for zone-level delivery time SLA metrics and trigger a Tableau workbook refresh."
inputParameters:
- name: report_date
in: body
type: string
description: "ISO 8601 date for the SLA report period."
- name: tableau_workbook_id
in: body
type: string
description: "Tableau workbook ID to refresh after data is updated."
steps:
- name: get-sla-metrics
type: call
call: snowflake.execute-query
with:
statement: "SELECT zone_id, AVG(delivery_minutes) as avg_delivery, COUNT(*) as order_count FROM deliveries WHERE delivery_date = '{{report_date}}' GROUP BY zone_id"
- name: refresh-workbook
type: call
call: tableau.refresh-workbook
with:
workbook_id: "{{tableau_workbook_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: tableau
baseUri: "https://10ax.online.tableau.com/api/2.8"
authentication:
type: apikey
key: X-Tableau-Auth
value: "$secrets.tableau_token"
placement: header
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: site_id
in: path
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Searches the order index in Elasticsearch by customer email or order ID and returns matching order records.
naftiko: "0.5"
info:
label: "Elasticsearch Order Search"
description: "Searches the order index in Elasticsearch by customer email or order ID and returns matching order records."
tags:
- data
- search
- elasticsearch
capability:
exposes:
- type: mcp
namespace: order-ops
port: 8080
tools:
- name: search-orders
description: "Given a customer email or order ID, search the Elasticsearch orders index and return matching records."
inputParameters:
- name: query
in: body
type: string
description: "Customer email or order ID to search."
call: elasticsearch.search
with:
index: "orders"
q: "{{query}}"
outputParameters:
- name: hits
type: array
mapping: "$.hits.hits[*]._source"
- name: total
type: integer
mapping: "$.hits.total.value"
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://deliveroo-es.eu-west-1.es.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: search
path: "/orders/_search"
operations:
- name: search
method: POST
When a Figma file is marked ready for development, posts the handoff link to the engineering Slack channel.
naftiko: "0.5"
info:
label: "Figma Design Handoff Notification"
description: "When a Figma file is marked ready for development, posts the handoff link to the engineering Slack channel."
tags:
- design
- collaboration
- figma
- slack
capability:
exposes:
- type: mcp
namespace: design-ops
port: 8080
tools:
- name: notify-handoff
description: "Given a Figma file key, fetch file metadata and post a handoff notification to the engineering Slack channel."
inputParameters:
- name: file_key
in: body
type: string
description: "Figma file key."
- name: slack_channel
in: body
type: string
description: "Engineering Slack channel."
steps:
- name: get-file
type: call
call: figma.get-file
with:
file_key: "{{file_key}}"
- name: notify-eng
type: call
call: slack.post-message
with:
channel: "{{slack_channel}}"
text: "Design handoff ready: {{get-file.name}} — https://www.figma.com/file/{{file_key}}"
consumes:
- type: http
namespace: figma
baseUri: "https://api.figma.com/v1"
authentication:
type: bearer
token: "$secrets.figma_token"
resources:
- name: files
path: "/files/{{file_key}}"
inputParameters:
- name: file_key
in: path
operations:
- name: get-file
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a GitHub Actions deployment workflow completes, posts the deployment status and commit details to the releases Slack channel.
naftiko: "0.5"
info:
label: "GitHub Actions Deployment Notification"
description: "When a GitHub Actions deployment workflow completes, posts the deployment status and commit details to the releases Slack channel."
tags:
- engineering
- cicd
- github-actions
- slack
capability:
exposes:
- type: mcp
namespace: deploy-ops
port: 8080
tools:
- name: notify-deployment
description: "Given a GitHub repo, workflow run ID, and environment, fetch the run details and post the deployment status to Slack."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in org/repo format."
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: environment
in: body
type: string
description: "Deployment environment (staging, production)."
steps:
- name: get-run
type: call
call: github.get-workflow-run
with:
repo: "{{repo}}"
run_id: "{{run_id}}"
- name: post-notification
type: call
call: slack.post-message
with:
channel: "releases"
text: "Deployment to {{environment}}: {{get-run.conclusion}} | {{repo}} @ {{get-run.head_sha}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- 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
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches open Dependabot alerts for a repository and posts a severity summary to the security Slack channel.
naftiko: "0.5"
info:
label: "GitHub Dependabot Alert Digest"
description: "Fetches open Dependabot alerts for a repository and posts a severity summary to the security Slack channel."
tags:
- security
- engineering
- github
- slack
capability:
exposes:
- type: mcp
namespace: appsec
port: 8080
tools:
- name: digest-dependabot-alerts
description: "Given a GitHub repo, fetch open Dependabot alerts and post a grouped summary to Slack."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in org/repo format."
steps:
- name: get-alerts
type: call
call: github.list-dependabot-alerts
with:
repo: "{{repo}}"
state: "open"
- name: post-digest
type: call
call: slack.post-message
with:
channel: "security-alerts"
text: "Dependabot digest for {{repo}}: {{get-alerts.total}} open alerts"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repo}}/dependabot/alerts"
inputParameters:
- name: repo
in: path
operations:
- name: list-dependabot-alerts
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches open GitHub pull requests without reviews older than 24 hours and posts reminders to the engineering Slack channel.
naftiko: "0.5"
info:
label: "GitHub PR Review Reminder"
description: "Fetches open GitHub pull requests without reviews older than 24 hours and posts reminders to the engineering Slack channel."
tags:
- engineering
- code-review
- github
- slack
capability:
exposes:
- type: mcp
namespace: eng-ops
port: 8080
tools:
- name: remind-stale-prs
description: "Given a GitHub repository, find open PRs without reviews older than a threshold and post reminders to Slack."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in org/repo format."
- name: hours_threshold
in: body
type: integer
description: "Hours since PR creation to flag."
steps:
- name: get-open-prs
type: call
call: github.list-pulls
with:
repo: "{{repo}}"
state: "open"
- name: post-reminder
type: call
call: slack.post-message
with:
channel: "engineering"
text: "PR review reminder for {{repo}}: {{get-open-prs.stale_count}} PRs awaiting review for >{{hours_threshold}}h"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pulls
path: "/repos/{{repo}}/pulls"
inputParameters:
- name: repo
in: path
operations:
- name: list-pulls
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a pull request is opened on a core service repository, triggers a Datadog security scan event and creates a Jira security review task if vulnerabilities are detected.
naftiko: "0.5"
info:
label: "GitHub Pull Request Security Scan"
description: "When a pull request is opened on a core service repository, triggers a Datadog security scan event and creates a Jira security review task if vulnerabilities are detected."
tags:
- devops
- security
- github
- datadog
- jira
capability:
exposes:
- type: mcp
namespace: security-devops
port: 8080
tools:
- name: run-pr-security-scan
description: "Given a GitHub pull request number and repository, trigger a Datadog security event and create a Jira security task if the scan detects high-severity vulnerabilities."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name (e.g. consumer-app)."
- name: pr_number
in: body
type: integer
description: "Pull request number in the repository."
- name: vulnerability_count
in: body
type: integer
description: "Number of high-severity vulnerabilities detected by the scanner."
- name: commit_sha
in: body
type: string
description: "Git commit SHA for the PR head."
steps:
- name: log-scan-event
type: call
call: datadog.create-event
with:
title: "Security scan: {{repo_name}} PR #{{pr_number}}"
text: "{{vulnerability_count}} high-severity vulnerabilities detected at {{commit_sha}}"
alert_type: warning
tags: "repo:{{repo_name}},scan:pr"
- name: create-security-task
type: call
call: jira.create-issue
with:
project_key: SEC
issuetype: Task
summary: "Security review: {{repo_name}} PR #{{pr_number}} — {{vulnerability_count}} vulnerabilities"
description: "Commit: {{commit_sha}}\nVulnerabilities: {{vulnerability_count}}\nDatadog: {{log-scan-event.url}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
When a new GitHub release is published on a core service, posts a deployment announcement to the engineering Slack channel and creates a Datadog deployment marker.
naftiko: "0.5"
info:
label: "GitHub Release Deployment Notification"
description: "When a new GitHub release is published on a core service, posts a deployment announcement to the engineering Slack channel and creates a Datadog deployment marker."
tags:
- devops
- deployment
- github
- datadog
- slack
capability:
exposes:
- type: mcp
namespace: release-management
port: 8080
tools:
- name: announce-service-release
description: "Given a GitHub release tag, repository name, and release notes URL, create a Datadog deployment marker and post a deployment announcement to the engineering Slack channel."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name for the released service."
- name: release_tag
in: body
type: string
description: "Git release tag (e.g. v2.4.1)."
- name: release_notes_url
in: body
type: string
description: "URL to the GitHub release notes page."
- name: deployed_by
in: body
type: string
description: "GitHub username of the person who triggered the release."
steps:
- name: create-dd-marker
type: call
call: datadog.create-deployment-marker
with:
entity_name: "{{repo_name}}"
version: "{{release_tag}}"
user: "{{deployed_by}}"
description: "Release {{release_tag}} deployed from {{repo_name}}"
- name: announce-release
type: call
call: slack.post-message
with:
channel: engineering-releases
text: "Release deployed: {{repo_name}} {{release_tag}} by @{{deployed_by}} | Notes: {{release_notes_url}} | Datadog: {{create-dd-marker.url}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: deployments
path: "/deployments"
operations:
- name: create-deployment-marker
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Audits GitHub repositories in the Deliveroo org for branch protection policy compliance and opens Jira tasks for any repositories that are non-compliant.
naftiko: "0.5"
info:
label: "GitHub Repository Security Policy Enforcement"
description: "Audits GitHub repositories in the Deliveroo org for branch protection policy compliance and opens Jira tasks for any repositories that are non-compliant."
tags:
- security
- devops
- github
- jira
- compliance
capability:
exposes:
- type: mcp
namespace: repo-compliance
port: 8080
tools:
- name: audit-repo-branch-protection
description: "Given a GitHub repository name, check its default branch protection rules and open a Jira security task if required protections are missing."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name to audit for branch protection compliance."
steps:
- name: get-branch-protection
type: call
call: github.get-branch-protection
with:
owner: deliveroo
repo: "{{repo_name}}"
branch: main
- name: create-compliance-task
type: call
call: jira.create-issue
with:
project_key: SEC
issuetype: Task
summary: "Branch protection missing: {{repo_name}}"
description: "Repository {{repo_name}} is missing required branch protection on main. Enforce: required reviews, status checks, and signed commits."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/{{owner}}/{{repo}}/branches/{{branch}}/protection"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: branch
in: path
operations:
- name: get-branch-protection
method: GET
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Executes a SQL query against Google BigQuery and returns the result for analytics lookups.
naftiko: "0.5"
info:
label: "Google BigQuery Analytics Query"
description: "Executes a SQL query against Google BigQuery and returns the result for analytics lookups."
tags:
- data
- analytics
- google-cloud-platform
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: run-bigquery
description: "Given a SQL query, execute it against BigQuery and return results."
inputParameters:
- name: sql
in: body
type: string
description: "BigQuery SQL query."
- name: project_id
in: body
type: string
description: "GCP project ID."
call: bigquery.query
with:
query: "{{sql}}"
project_id: "{{project_id}}"
outputParameters:
- name: rows
type: array
mapping: "$.rows"
- name: total_rows
type: string
mapping: "$.totalRows"
consumes:
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_token"
resources:
- name: queries
path: "/projects/{{project_id}}/queries"
inputParameters:
- name: project_id
in: path
operations:
- name: query
method: POST
Geocodes a delivery address using Google Maps API, returning latitude, longitude, and formatted address.
naftiko: "0.5"
info:
label: "Google Maps Geocoding Lookup"
description: "Geocodes a delivery address using Google Maps API, returning latitude, longitude, and formatted address."
tags:
- logistics
- geolocation
- google-maps
capability:
exposes:
- type: mcp
namespace: logistics-ops
port: 8080
tools:
- name: geocode-address
description: "Given an address string, return the geocoded latitude, longitude, and formatted address from Google Maps."
inputParameters:
- name: address
in: body
type: string
description: "Delivery address to geocode."
call: gmaps.geocode
with:
address: "{{address}}"
outputParameters:
- name: latitude
type: number
mapping: "$.results[0].geometry.location.lat"
- name: longitude
type: number
mapping: "$.results[0].geometry.location.lng"
- name: formatted_address
type: string
mapping: "$.results[0].formatted_address"
consumes:
- type: http
namespace: gmaps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: apikey
key: "key"
value: "$secrets.google_maps_api_key"
placement: query
resources:
- name: geocode
path: "/geocode/json"
operations:
- name: geocode
method: GET
Updates a Google Sheets KPI tracker with the latest weekly metrics from Snowflake and notifies the ops team via Slack.
naftiko: "0.5"
info:
label: "Google Sheets Weekly KPI Update"
description: "Updates a Google Sheets KPI tracker with the latest weekly metrics from Snowflake and notifies the ops team via Slack."
tags:
- analytics
- reporting
- google-sheets
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: ops-analytics
port: 8080
tools:
- name: update-kpi-sheet
description: "Fetch weekly KPIs from Snowflake, update the Google Sheets tracker, and notify the ops Slack channel."
inputParameters:
- name: spreadsheet_id
in: body
type: string
description: "Google Sheets spreadsheet ID."
- name: sheet_name
in: body
type: string
description: "Sheet tab name."
steps:
- name: fetch-kpis
type: call
call: snowflake.execute-statement
with:
statement: "SELECT metric_name, value FROM weekly_kpis WHERE week = CURRENT_DATE - 7"
- name: update-sheet
type: call
call: gsheets.append-values
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "{{sheet_name}}!A:B"
values: "{{fetch-kpis.data}}"
- name: notify-ops
type: call
call: slack.post-message
with:
channel: "ops-analytics"
text: "Weekly KPI sheet updated: {{sheet_name}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: gsheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}:append"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: append-values
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates an annotation on a Grafana dashboard to mark a deployment or incident event for operational context.
naftiko: "0.5"
info:
label: "Grafana Dashboard Annotation"
description: "Creates an annotation on a Grafana dashboard to mark a deployment or incident event for operational context."
tags:
- monitoring
- observability
- grafana
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: create-annotation
description: "Given a Grafana dashboard ID and event description, create a time-stamped annotation."
inputParameters:
- name: dashboard_id
in: body
type: integer
description: "Grafana dashboard ID."
- name: text
in: body
type: string
description: "Annotation text."
- name: tags
in: body
type: string
description: "Comma-separated tags."
call: grafana.create-annotation
with:
dashboardId: "{{dashboard_id}}"
text: "{{text}}"
tags: "{{tags}}"
outputParameters:
- name: annotation_id
type: integer
mapping: "$.id"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.deliveroo.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: annotations
path: "/annotations"
operations:
- name: create-annotation
method: POST
Pulls current headcount data from Workday and writes a department-level snapshot to Snowflake for workforce planning and finance reporting.
naftiko: "0.5"
info:
label: "Headcount and Workforce Snapshot"
description: "Pulls current headcount data from Workday and writes a department-level snapshot to Snowflake for workforce planning and finance reporting."
tags:
- hr
- workforce-planning
- workday
- snowflake
- reporting
capability:
exposes:
- type: mcp
namespace: workforce-reporting
port: 8080
tools:
- name: snapshot-headcount
description: "Retrieve active headcount from Workday across all departments and write the snapshot to Snowflake for workforce planning dashboards."
inputParameters:
- name: snapshot_date
in: body
type: string
description: "ISO 8601 date for the headcount snapshot."
steps:
- name: get-workers
type: call
call: workday.list-workers
with:
effective_date: "{{snapshot_date}}"
employment_status: active
- name: write-snapshot
type: call
call: snowflake.execute-query
with:
statement: "INSERT INTO headcount_snapshots SELECT '{{snapshot_date}}' as snapshot_date, department, COUNT(*) as headcount FROM (VALUES {{get-workers.data}}) GROUP BY department"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers"
inputParameters:
- name: effective_date
in: query
- name: employment_status
in: query
operations:
- name: list-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves recent customer conversations from Intercom by customer email for support context.
naftiko: "0.5"
info:
label: "Intercom Customer Conversation Lookup"
description: "Retrieves recent customer conversations from Intercom by customer email for support context."
tags:
- support
- customer-engagement
- intercom
capability:
exposes:
- type: mcp
namespace: support-ops
port: 8080
tools:
- name: get-conversations
description: "Given a customer email, return recent Intercom conversations with message previews."
inputParameters:
- name: email
in: body
type: string
description: "Customer email."
call: intercom.search-conversations
with:
email: "{{email}}"
outputParameters:
- name: conversations
type: array
mapping: "$.conversations"
consumes:
- type: http
namespace: intercom
baseUri: "https://api.intercom.io"
authentication:
type: bearer
token: "$secrets.intercom_token"
resources:
- name: conversations
path: "/conversations/search"
operations:
- name: search-conversations
method: POST
Produces a weekly backlog digest by querying Jira for unestimated and stale issues across engineering projects and posting the summary to the relevant Slack channel.
naftiko: "0.5"
info:
label: "Jira Backlog Grooming Digest"
description: "Produces a weekly backlog digest by querying Jira for unestimated and stale issues across engineering projects and posting the summary to the relevant Slack channel."
tags:
- devops
- engineering
- jira
- slack
- reporting
capability:
exposes:
- type: mcp
namespace: backlog-reporting
port: 8080
tools:
- name: digest-backlog-health
description: "Given a Jira project key, retrieve unestimated and stale issues older than 14 days, then post a digest summary to the engineering Slack channel for grooming prioritisation."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key to analyse (e.g. ENG, MOB, DATA)."
- name: slack_channel
in: body
type: string
description: "Slack channel to post the backlog digest to."
steps:
- name: search-issues
type: call
call: jira.search-issues
with:
jql: "project = {{project_key}} AND status = Backlog AND (story_points is EMPTY OR updated <= -14d) ORDER BY created ASC"
maxResults: 50
- name: post-digest
type: call
call: slack.post-message
with:
channel: "{{slack_channel}}"
text: "Backlog health — {{project_key}}: {{search-issues.total}} issues need grooming (unestimated or stale >14d). Review: https://deliveroo.atlassian.net/jira/software/projects/{{project_key}}/boards"
consumes:
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/search"
inputParameters:
- name: jql
in: query
- name: maxResults
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a customer-reported bug lands in Jira, enriches it with Zendesk ticket data and routes to the appropriate engineering team via Slack.
naftiko: "0.5"
info:
label: "Jira Customer Bug Triage"
description: "When a customer-reported bug lands in Jira, enriches it with Zendesk ticket data and routes to the appropriate engineering team via Slack."
tags:
- engineering
- support
- jira
- zendesk
- slack
capability:
exposes:
- type: mcp
namespace: eng-triage
port: 8080
tools:
- name: triage-customer-bug
description: "Given a Jira issue key and linked Zendesk ticket ID, enrich the Jira issue with customer context and notify the owning team Slack channel."
inputParameters:
- name: issue_key
in: body
type: string
description: "Jira issue key."
- name: zendesk_ticket_id
in: body
type: string
description: "Linked Zendesk ticket ID."
steps:
- name: get-zendesk-ticket
type: call
call: zendesk.get-ticket
with:
ticket_id: "{{zendesk_ticket_id}}"
- name: update-jira
type: call
call: jira.update-issue
with:
issue_key: "{{issue_key}}"
description: "Customer context: {{get-zendesk-ticket.description}}"
- name: notify-team
type: call
call: slack.post-message
with:
channel: "eng-triage"
text: "Customer bug triaged: {{issue_key}} | Zendesk: {{zendesk_ticket_id}} | Priority: {{get-zendesk-ticket.priority}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.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
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: update-issue
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches completed Jira issues for a version and publishes release notes as a Confluence page.
naftiko: "0.5"
info:
label: "Jira Release Notes to Confluence"
description: "Fetches completed Jira issues for a version and publishes release notes as a Confluence page."
tags:
- engineering
- release-management
- jira
- confluence
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: publish-release-notes
description: "Given a Jira project and version, fetch resolved issues and create a Confluence release notes page."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key."
- name: version
in: body
type: string
description: "Fix version name."
steps:
- name: get-issues
type: call
call: jira.search-issues
with:
jql: "project={{project_key}} AND fixVersion='{{version}}' AND status=Done"
- name: create-page
type: call
call: confluence.create-content
with:
space_key: "RELEASES"
title: "Release Notes — {{version}}"
body: "{{get-issues.formatted}}"
consumes:
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: search
path: "/search"
operations:
- name: search-issues
method: POST
- type: http
namespace: confluence
baseUri: "https://deliveroo.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: content
path: "/content"
operations:
- name: create-content
method: POST
Pulls completed sprint data from Jira and generates a velocity report stored in Snowflake for engineering leadership review.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "Pulls completed sprint data from Jira and generates a velocity report stored in Snowflake for engineering leadership review."
tags:
- devops
- reporting
- jira
- snowflake
- engineering
capability:
exposes:
- type: mcp
namespace: eng-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Given a Jira board ID and sprint ID, retrieve completed story points and issue counts, then write the velocity summary to Snowflake for engineering analytics."
inputParameters:
- name: board_id
in: body
type: string
description: "Jira board ID for the engineering squad."
- name: sprint_id
in: body
type: string
description: "Jira sprint ID to report on."
steps:
- name: get-sprint-report
type: call
call: jira.get-sprint
with:
board_id: "{{board_id}}"
sprint_id: "{{sprint_id}}"
- name: store-velocity
type: call
call: snowflake.execute-query
with:
statement: "INSERT INTO sprint_velocity (board_id, sprint_id, completed_points, issue_count, snapshot_date) VALUES ('{{board_id}}', '{{sprint_id}}', {{get-sprint-report.completed_points}}, {{get-sprint-report.issue_count}}, CURRENT_DATE)"
consumes:
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint/{{sprint_id}}"
inputParameters:
- name: board_id
in: path
- name: sprint_id
in: path
operations:
- name: get-sprint
method: GET
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Looks up any existing Jira tickets associated with a specific order ID for use in support and operations investigations.
naftiko: "0.5"
info:
label: "Jira Ticket Lookup by Order ID"
description: "Looks up any existing Jira tickets associated with a specific order ID for use in support and operations investigations."
tags:
- operations
- support
- jira
- lookup
capability:
exposes:
- type: mcp
namespace: order-ops
port: 8080
tools:
- name: get-order-tickets
description: "Given a Deliveroo order ID, search Jira for all issues referencing that order and return the list of matching tickets. Use during support escalations and incident investigations."
inputParameters:
- name: order_id
in: body
type: string
description: "The Deliveroo order ID to search for in Jira tickets."
call: jira.search-issues
with:
jql: "text ~ \"{{order_id}}\" ORDER BY created DESC"
maxResults: 20
outputParameters:
- name: issues
type: array
mapping: "$.issues"
consumes:
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/search"
inputParameters:
- name: jql
in: query
- name: maxResults
in: query
operations:
- name: search-issues
method: GET
Triggers a Kubernetes deployment rollback via the GitHub Actions workflow and notifies the platform team via Slack.
naftiko: "0.5"
info:
label: "Kubernetes Deployment Rollback"
description: "Triggers a Kubernetes deployment rollback via the GitHub Actions workflow and notifies the platform team via Slack."
tags:
- infrastructure
- containers
- kubernetes
- github-actions
- slack
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: rollback-deployment
description: "Given a service name and target revision, trigger a rollback via GitHub Actions and notify the platform Slack channel."
inputParameters:
- name: service_name
in: body
type: string
description: "Service name to roll back."
- name: target_revision
in: body
type: string
description: "Git SHA or tag to roll back to."
steps:
- name: trigger-rollback
type: call
call: github.create-workflow-dispatch
with:
repo: "deliveroo/{{service_name}}"
workflow_id: "rollback.yml"
ref: "main"
inputs:
revision: "{{target_revision}}"
- name: notify-platform
type: call
call: slack.post-message
with:
channel: "platform-ops"
text: "Rollback triggered for {{service_name}} to revision {{target_revision}}"
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: create-workflow-dispatch
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Toggles a LaunchDarkly feature flag for a given environment and notifies the engineering Slack channel.
naftiko: "0.5"
info:
label: "LaunchDarkly Feature Flag Toggle"
description: "Toggles a LaunchDarkly feature flag for a given environment and notifies the engineering Slack channel."
tags:
- engineering
- feature-management
- launchdarkly
- slack
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: toggle-feature-flag
description: "Given a LaunchDarkly feature flag key and environment, toggle the flag and notify engineering via Slack."
inputParameters:
- name: flag_key
in: body
type: string
description: "Feature flag key."
- name: environment
in: body
type: string
description: "Target environment (staging, production)."
- name: enabled
in: body
type: boolean
description: "Whether to enable or disable the flag."
steps:
- name: update-flag
type: call
call: launchdarkly.patch-flag
with:
flag_key: "{{flag_key}}"
environment: "{{environment}}"
on: "{{enabled}}"
- name: notify-eng
type: call
call: slack.post-message
with:
channel: "engineering"
text: "Feature flag {{flag_key}} set to {{enabled}} in {{environment}}"
consumes:
- type: http
namespace: launchdarkly
baseUri: "https://app.launchdarkly.com/api/v2"
authentication:
type: bearer
token: "$secrets.launchdarkly_token"
resources:
- name: flags
path: "/flags/default/{{flag_key}}"
inputParameters:
- name: flag_key
in: path
operations:
- name: patch-flag
method: PATCH
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a new issue in Linear and posts the issue link to the team Slack channel.
naftiko: "0.5"
info:
label: "Linear Issue Creation"
description: "Creates a new issue in Linear and posts the issue link to the team Slack channel."
tags:
- engineering
- project-management
- linear
- slack
capability:
exposes:
- type: mcp
namespace: eng-ops
port: 8080
tools:
- name: create-linear-issue
description: "Given a team ID, title, and description, create a Linear issue and post the link to Slack."
inputParameters:
- name: team_id
in: body
type: string
description: "Linear team ID."
- name: title
in: body
type: string
description: "Issue title."
- name: description
in: body
type: string
description: "Issue description."
steps:
- name: create-issue
type: call
call: linear.create-issue
with:
teamId: "{{team_id}}"
title: "{{title}}"
description: "{{description}}"
- name: notify-team
type: call
call: slack.post-message
with:
channel: "engineering"
text: "New Linear issue: {{title}} — {{create-issue.url}}"
consumes:
- type: http
namespace: linear
baseUri: "https://api.linear.app"
authentication:
type: bearer
token: "$secrets.linear_token"
resources:
- name: graphql
path: "/graphql"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a retention analysis from Mixpanel for a given event and cohort, returning weekly retention percentages.
naftiko: "0.5"
info:
label: "Mixpanel Retention Report"
description: "Retrieves a retention analysis from Mixpanel for a given event and cohort, returning weekly retention percentages."
tags:
- analytics
- product
- mixpanel
capability:
exposes:
- type: mcp
namespace: product-analytics
port: 8080
tools:
- name: get-retention
description: "Given a Mixpanel event name and date range, return weekly retention percentages."
inputParameters:
- name: event
in: body
type: string
description: "Mixpanel event name for retention analysis."
- name: from_date
in: body
type: string
description: "Start date (YYYY-MM-DD)."
call: mixpanel.get-retention
with:
event: "{{event}}"
from_date: "{{from_date}}"
outputParameters:
- name: data
type: object
mapping: "$.data"
consumes:
- type: http
namespace: mixpanel
baseUri: "https://mixpanel.com/api/2.0"
authentication:
type: basic
username: "$secrets.mixpanel_api_secret"
password: ""
resources:
- name: retention
path: "/retention"
operations:
- name: get-retention
method: GET
Queries MongoDB Atlas for a customer's order history by customer ID, returning recent orders with statuses.
naftiko: "0.5"
info:
label: "MongoDB Order History Query"
description: "Queries MongoDB Atlas for a customer's order history by customer ID, returning recent orders with statuses."
tags:
- data
- orders
- mongodb
capability:
exposes:
- type: mcp
namespace: order-ops
port: 8080
tools:
- name: get-order-history
description: "Given a customer ID, query MongoDB for the most recent orders with statuses and totals."
inputParameters:
- name: customer_id
in: body
type: string
description: "Customer ID."
- name: limit
in: body
type: integer
description: "Number of recent orders to return."
call: mongodb.find-documents
with:
collection: "orders"
filter:
customer_id: "{{customer_id}}"
limit: "{{limit}}"
outputParameters:
- name: orders
type: array
mapping: "$.documents"
consumes:
- type: http
namespace: mongodb
baseUri: "https://data.mongodb-api.com/app/data-deliveroo/endpoint/data/v1"
authentication:
type: bearer
token: "$secrets.mongodb_api_key"
resources:
- name: find
path: "/action/find"
operations:
- name: find-documents
method: POST
When a new engineering hire is created in Workday, provisions GitHub access, creates a Jira onboarding ticket, and sends a Slack welcome message to the engineering team channel.
naftiko: "0.5"
info:
label: "New Hire Engineering Onboarding"
description: "When a new engineering hire is created in Workday, provisions GitHub access, creates a Jira onboarding ticket, and sends a Slack welcome message to the engineering team channel."
tags:
- hr
- onboarding
- workday
- github
- jira
- slack
capability:
exposes:
- type: mcp
namespace: eng-onboarding
port: 8080
tools:
- name: onboard-engineer
description: "Given a Workday employee ID and GitHub username, provision GitHub org membership, create a Jira onboarding ticket, and post a Slack welcome message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new engineering hire."
- name: github_username
in: body
type: string
description: "The new hire's GitHub username to add to the Deliveroo org."
- name: team_slug
in: body
type: string
description: "GitHub team slug for the new hire's engineering squad."
steps:
- name: get-employee
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: add-to-github
type: call
call: github.add-org-member
with:
org: deliveroo
username: "{{github_username}}"
role: member
- name: add-to-team
type: call
call: github-teams.add-team-member
with:
org: deliveroo
team_slug: "{{team_slug}}"
username: "{{github_username}}"
- name: create-ticket
type: call
call: jira.create-issue
with:
project_key: ENG
issuetype: Task
summary: "Engineer onboarding: {{get-employee.full_name}}"
description: "New engineer {{get-employee.full_name}} joined {{get-employee.department}}. GitHub: {{github_username}}, Team: {{team_slug}}"
- name: welcome-message
type: call
call: slack.post-message
with:
channel: engineering
text: "Welcome to Deliveroo Engineering, {{get-employee.first_name}}! Jira ticket: {{create-ticket.key}} | GitHub: @{{github_username}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: org-members
path: "/orgs/deliveroo/memberships/{{username}}"
inputParameters:
- name: username
in: path
operations:
- name: add-org-member
method: PUT
- type: http
namespace: github-teams
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: team-members
path: "/orgs/deliveroo/teams/{{team_slug}}/memberships/{{username}}"
inputParameters:
- name: team_slug
in: path
- name: username
in: path
operations:
- name: add-team-member
method: PUT
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a new meeting notes page in Notion with an agenda template and posts the link to the Slack channel.
naftiko: "0.5"
info:
label: "Notion Meeting Notes Creation"
description: "Creates a new meeting notes page in Notion with an agenda template and posts the link to the Slack channel."
tags:
- collaboration
- documentation
- notion
- slack
capability:
exposes:
- type: mcp
namespace: collab-ops
port: 8080
tools:
- name: create-meeting-notes
description: "Given a meeting title and Notion database ID, create a meeting notes page and share the link in Slack."
inputParameters:
- name: title
in: body
type: string
description: "Meeting title."
- name: database_id
in: body
type: string
description: "Notion database ID."
- name: slack_channel
in: body
type: string
description: "Slack channel to share the link."
steps:
- name: create-page
type: call
call: notion.create-page
with:
parent_database_id: "{{database_id}}"
title: "{{title}}"
- name: share-link
type: call
call: slack.post-message
with:
channel: "{{slack_channel}}"
text: "Meeting notes created: {{title}} — {{create-page.url}}"
consumes:
- type: http
namespace: notion
baseUri: "https://api.notion.com/v1"
authentication:
type: bearer
token: "$secrets.notion_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a new Okta user account with group assignments based on department and role, then notifies IT via Slack.
naftiko: "0.5"
info:
label: "Okta User Provisioning"
description: "Creates a new Okta user account with group assignments based on department and role, then notifies IT via Slack."
tags:
- identity
- provisioning
- okta
- slack
capability:
exposes:
- type: mcp
namespace: iam-ops
port: 8080
tools:
- name: provision-okta-user
description: "Given employee details, create an Okta user, assign to department groups, and notify the IT Slack channel."
inputParameters:
- name: email
in: body
type: string
description: "Employee email address."
- name: first_name
in: body
type: string
description: "First name."
- name: last_name
in: body
type: string
description: "Last name."
- name: department
in: body
type: string
description: "Department name for group assignment."
steps:
- name: create-user
type: call
call: okta.create-user
with:
email: "{{email}}"
firstName: "{{first_name}}"
lastName: "{{last_name}}"
- name: notify-it
type: call
call: slack.post-message
with:
channel: "it-provisioning"
text: "Okta user created: {{email}} ({{department}}). User ID: {{create-user.id}}"
consumes:
- type: http
namespace: okta
baseUri: "https://deliveroo.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Uses OpenAI to summarize a customer order issue from Zendesk ticket notes, then updates the Zendesk ticket with the AI summary.
naftiko: "0.5"
info:
label: "OpenAI Order Issue Summarization"
description: "Uses OpenAI to summarize a customer order issue from Zendesk ticket notes, then updates the Zendesk ticket with the AI summary."
tags:
- ai
- support
- openai
- zendesk
capability:
exposes:
- type: mcp
namespace: support-ai
port: 8080
tools:
- name: summarize-order-issue
description: "Given a Zendesk ticket ID, fetch the conversation, summarize via OpenAI, and update the ticket with the summary."
inputParameters:
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID."
steps:
- name: get-ticket
type: call
call: zendesk.get-ticket
with:
ticket_id: "{{ticket_id}}"
- name: summarize
type: call
call: openai.create-completion
with:
model: "gpt-4"
prompt: "Summarize this customer order issue: {{get-ticket.description}}"
- name: update-ticket
type: call
call: zendesk.update-ticket
with:
ticket_id: "{{ticket_id}}"
internal_note: "AI Summary: {{summarize.text}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.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: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
Acknowledges an OpsGenie alert and posts the acknowledgement details to the on-call Slack channel.
naftiko: "0.5"
info:
label: "OpsGenie Alert Acknowledgement"
description: "Acknowledges an OpsGenie alert and posts the acknowledgement details to the on-call Slack channel."
tags:
- incident-management
- operations
- opsgenie
- slack
capability:
exposes:
- type: mcp
namespace: incident-ops
port: 8080
tools:
- name: acknowledge-alert
description: "Given an OpsGenie alert ID and responder, acknowledge the alert and notify the on-call Slack channel."
inputParameters:
- name: alert_id
in: body
type: string
description: "OpsGenie alert ID."
- name: responder
in: body
type: string
description: "Name of the acknowledging responder."
steps:
- name: ack-alert
type: call
call: opsgenie.acknowledge-alert
with:
alert_id: "{{alert_id}}"
user: "{{responder}}"
- name: notify-oncall
type: call
call: slack.post-message
with:
channel: "oncall-alerts"
text: "Alert {{alert_id}} acknowledged by {{responder}}"
consumes:
- type: http
namespace: opsgenie
baseUri: "https://api.opsgenie.com/v2"
authentication:
type: bearer
token: "$secrets.opsgenie_token"
resources:
- name: alerts
path: "/alerts/{{alert_id}}/acknowledge"
inputParameters:
- name: alert_id
in: path
operations:
- name: acknowledge-alert
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When Datadog detects elevated order failure rates, creates a PagerDuty incident, opens a Jira bug, and posts a Slack alert to the engineering on-call channel.
naftiko: "0.5"
info:
label: "Order Fulfilment Incident Response"
description: "When Datadog detects elevated order failure rates, creates a PagerDuty incident, opens a Jira bug, and posts a Slack alert to the engineering on-call channel."
tags:
- incident-response
- operations
- datadog
- pagerduty
- jira
- slack
capability:
exposes:
- type: mcp
namespace: fulfilment-ops
port: 8080
tools:
- name: handle-order-failure-incident
description: "Given an elevated order failure alert, create a PagerDuty incident, open a Jira bug with full context, and notify the on-call Slack channel."
inputParameters:
- name: alert_id
in: body
type: string
description: "Datadog monitor alert ID that triggered this incident."
- name: failure_rate_pct
in: body
type: number
description: "Current order failure rate as a percentage."
- name: zone_id
in: body
type: string
description: "Affected Deliveroo zone ID."
- name: service_name
in: body
type: string
description: "Name of the failing backend service."
steps:
- name: create-incident
type: call
call: pagerduty.create-incident
with:
title: "Order failure spike: {{service_name}} in zone {{zone_id}}"
urgency: high
service_id: "$secrets.pagerduty_order_service_id"
- name: create-jira-bug
type: call
call: jira.create-issue
with:
project_key: ENG
issuetype: Bug
summary: "[Incident] Order failure rate {{failure_rate_pct}}% — {{service_name}} / zone {{zone_id}}"
description: "Datadog alert: {{alert_id}}\nFailure rate: {{failure_rate_pct}}%\nZone: {{zone_id}}\nPagerDuty incident: {{create-incident.id}}"
- name: notify-oncall
type: call
call: slack.post-message
with:
channel: engineering-oncall
text: "Incident: Order failures at {{failure_rate_pct}}% in zone {{zone_id}} | Service: {{service_name}} | PD: {{create-incident.html_url}} | Jira: {{create-jira-bug.key}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: Authorization
value: "$secrets.pagerduty_api_key"
placement: header
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a PagerDuty incident by ID and returns the title, status, urgency, and assigned responders.
naftiko: "0.5"
info:
label: "PagerDuty Incident Summary"
description: "Retrieves a PagerDuty incident by ID and returns the title, status, urgency, and assigned responders."
tags:
- engineering
- incident-management
- pagerduty
capability:
exposes:
- type: mcp
namespace: incident-ops
port: 8080
tools:
- name: get-incident-summary
description: "Given a PagerDuty incident ID, return the title, status, urgency, and assigned users."
inputParameters:
- name: incident_id
in: body
type: string
description: "PagerDuty incident ID."
call: pagerduty.get-incident
with:
incident_id: "{{incident_id}}"
outputParameters:
- name: title
type: string
mapping: "$.incident.title"
- name: status
type: string
mapping: "$.incident.status"
- name: urgency
type: string
mapping: "$.incident.urgency"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents/{{incident_id}}"
inputParameters:
- name: incident_id
in: path
operations:
- name: get-incident
method: GET
Retrieves the current on-call engineer for a given PagerDuty schedule and returns their name and contact details for incident coordination.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer for a given PagerDuty schedule and returns their name and contact details for incident coordination."
tags:
- operations
- incident-response
- pagerduty
- on-call
capability:
exposes:
- type: mcp
namespace: oncall-lookup
port: 8080
tools:
- name: get-current-oncall
description: "Given a PagerDuty schedule ID, return the name and contact information of the currently on-call engineer. Use at the start of any incident response workflow."
inputParameters:
- name: schedule_id
in: body
type: string
description: "PagerDuty schedule ID to query for the current on-call."
call: pagerduty.get-oncall
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: user_name
type: string
mapping: "$.oncalls[0].user.name"
- name: user_email
type: string
mapping: "$.oncalls[0].user.email"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: Authorization
value: "$secrets.pagerduty_api_key"
placement: header
resources:
- name: oncalls
path: "/oncalls"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-oncall
method: GET
Triggers a Postman collection run via the Postman API and returns pass/fail results.
naftiko: "0.5"
info:
label: "Postman API Test Run"
description: "Triggers a Postman collection run via the Postman API and returns pass/fail results."
tags:
- engineering
- api-testing
- postman
capability:
exposes:
- type: mcp
namespace: api-ops
port: 8080
tools:
- name: run-api-tests
description: "Given a Postman collection ID and environment ID, trigger a collection run and return pass/fail counts."
inputParameters:
- name: collection_id
in: body
type: string
description: "Postman collection ID."
- name: environment_id
in: body
type: string
description: "Postman environment ID."
call: postman.run-collection
with:
collection: "{{collection_id}}"
environment: "{{environment_id}}"
outputParameters:
- name: total
type: integer
mapping: "$.run.stats.assertions.total"
- name: passed
type: integer
mapping: "$.run.stats.assertions.passed"
- name: failed
type: integer
mapping: "$.run.stats.assertions.failed"
consumes:
- type: http
namespace: postman
baseUri: "https://api.getpostman.com"
authentication:
type: apikey
key: "X-Api-Key"
value: "$secrets.postman_api_key"
placement: header
resources:
- name: runs
path: "/collections/{{collection}}/runs"
inputParameters:
- name: collection
in: path
operations:
- name: run-collection
method: POST
Triggers a Power BI dataset refresh for the zone performance dashboard and notifies the ops team via Slack.
naftiko: "0.5"
info:
label: "Power BI Zone Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the zone performance dashboard and notifies the ops team via Slack."
tags:
- analytics
- reporting
- power-bi
- slack
capability:
exposes:
- type: mcp
namespace: bi-ops
port: 8080
tools:
- name: refresh-zone-dashboard
description: "Trigger a Power BI dataset refresh for the zone performance dataset and notify the ops Slack channel."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
- name: group_id
in: body
type: string
description: "Power BI workspace group ID."
steps:
- name: refresh-dataset
type: call
call: powerbi.refresh-dataset
with:
group_id: "{{group_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-ops
type: call
call: slack.post-message
with:
channel: "ops-analytics"
text: "Zone performance dashboard refreshing. Dataset: {{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/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Prometheus for currently firing alert rules and returns active alerts with labels and values.
naftiko: "0.5"
info:
label: "Prometheus Alert Rule Check"
description: "Queries Prometheus for currently firing alert rules and returns active alerts with labels and values."
tags:
- monitoring
- observability
- prometheus
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: check-firing-alerts
description: "Query Prometheus for all currently firing alerts and return their names, labels, and values."
inputParameters:
- name: severity
in: body
type: string
description: "Alert severity filter (critical, warning)."
call: prometheus.get-alerts
with:
severity: "{{severity}}"
outputParameters:
- name: alerts
type: array
mapping: "$.data.alerts"
consumes:
- type: http
namespace: prometheus
baseUri: "https://prometheus.deliveroo.net/api/v1"
authentication:
type: bearer
token: "$secrets.prometheus_token"
resources:
- name: alerts
path: "/alerts"
operations:
- name: get-alerts
method: GET
Flushes a specific Redis cache key pattern and notifies the engineering team via Slack about the cache invalidation.
naftiko: "0.5"
info:
label: "Redis Cache Flush"
description: "Flushes a specific Redis cache key pattern and notifies the engineering team via Slack about the cache invalidation."
tags:
- engineering
- caching
- redis
- slack
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: flush-cache-pattern
description: "Given a Redis key pattern, invalidate matching keys and notify the engineering Slack channel."
inputParameters:
- name: key_pattern
in: body
type: string
description: "Redis key pattern to flush (e.g., restaurant:menu:*)."
steps:
- name: flush-keys
type: call
call: redis.delete-pattern
with:
pattern: "{{key_pattern}}"
- name: notify-eng
type: call
call: slack.post-message
with:
channel: "engineering"
text: "Redis cache flushed: pattern '{{key_pattern}}' — {{flush-keys.deleted_count}} keys removed"
consumes:
- type: http
namespace: redis
baseUri: "https://redis-api.deliveroo.net"
authentication:
type: bearer
token: "$secrets.redis_api_token"
resources:
- name: keys
path: "/keys/delete"
operations:
- name: delete-pattern
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Fetches menu updates from a restaurant partner's POS system and syncs them to the Deliveroo platform catalog, then notifies the partner success Slack channel.
naftiko: "0.5"
info:
label: "Restaurant Menu Item Sync"
description: "Fetches menu updates from a restaurant partner's POS system and syncs them to the Deliveroo platform catalog, then notifies the partner success Slack channel."
tags:
- marketplace
- partner-management
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: partner-ops
port: 8080
tools:
- name: sync-menu-items
description: "Given a restaurant partner ID, fetch updated menu items and sync to the Deliveroo catalog. Notify partner success via Slack."
inputParameters:
- name: partner_id
in: body
type: string
description: "Restaurant partner ID."
steps:
- name: get-partner-menu
type: call
call: salesforce.get-partner-menu
with:
partner_id: "{{partner_id}}"
- name: notify-partner-success
type: call
call: slack.post-message
with:
channel: "partner-success"
text: "Menu sync complete for partner {{partner_id}}: {{get-partner-menu.item_count}} items updated."
consumes:
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: partners
path: "/sobjects/Partner__c/{{partner_id}}"
inputParameters:
- name: partner_id
in: path
operations:
- name: get-partner-menu
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a new restaurant partner is approved in Salesforce, creates a Zendesk account, provisions a Stripe Connect account, and sends a Slack notification to the partner success team.
naftiko: "0.5"
info:
label: "Restaurant Partner Onboarding"
description: "When a new restaurant partner is approved in Salesforce, creates a Zendesk account, provisions a Stripe Connect account, and sends a Slack notification to the partner success team."
tags:
- crm
- onboarding
- salesforce
- zendesk
- stripe
- slack
capability:
exposes:
- type: mcp
namespace: partner-onboarding
port: 8080
tools:
- name: onboard-restaurant-partner
description: "Given a Salesforce account ID for a newly approved restaurant partner, create a Zendesk organization, provision a Stripe Connect account, and notify the partner success Slack channel."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "The Salesforce account ID of the approved restaurant partner."
- name: partner_name
in: body
type: string
description: "The legal name of the restaurant partner."
- name: partner_email
in: body
type: string
description: "Primary contact email for the restaurant partner."
steps:
- name: get-account
type: call
call: salesforce-lookup.get-account
with:
account_id: "{{salesforce_account_id}}"
- name: create-zendesk-org
type: call
call: zendesk.create-organization
with:
name: "{{partner_name}}"
external_id: "{{salesforce_account_id}}"
- name: create-stripe-account
type: call
call: stripe.create-connect-account
with:
email: "{{partner_email}}"
business_type: company
country: GB
- name: notify-team
type: call
call: slack.post-message
with:
channel: partner-success
text: "New partner onboarded: {{partner_name}} | Zendesk: {{create-zendesk-org.id}} | Stripe: {{create-stripe-account.id}}"
consumes:
- type: http
namespace: salesforce-lookup
baseUri: "https://deliveroo.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
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: organizations
path: "/organizations"
operations:
- name: create-organization
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: connect-accounts
path: "/accounts"
operations:
- name: create-connect-account
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Generates a weekly performance report for a restaurant partner by querying Snowflake for order metrics and sending the summary via Salesforce email and Slack.
naftiko: "0.5"
info:
label: "Restaurant Partner Performance Report"
description: "Generates a weekly performance report for a restaurant partner by querying Snowflake for order metrics and sending the summary via Salesforce email and Slack."
tags:
- analytics
- partners
- reporting
- snowflake
- salesforce
capability:
exposes:
- type: mcp
namespace: partner-reporting
port: 8080
tools:
- name: digest-partner-performance
description: "Given a Salesforce account ID and report week, query Snowflake for order volume, acceptance rate, and average prep time, then update the Salesforce account with the summary."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID of the restaurant partner."
- name: week_ending_date
in: body
type: string
description: "ISO 8601 date for the end of the reporting week."
steps:
- name: get-metrics
type: call
call: snowflake.execute-query
with:
statement: "SELECT COUNT(*) as order_count, AVG(acceptance_rate) as avg_acceptance, AVG(prep_time_minutes) as avg_prep FROM restaurant_metrics WHERE account_id = '{{salesforce_account_id}}' AND week_ending = '{{week_ending_date}}'"
- name: update-account
type: call
call: salesforce.update-account
with:
account_id: "{{salesforce_account_id}}"
weekly_order_count: "{{get-metrics.order_count}}"
weekly_acceptance_rate: "{{get-metrics.avg_acceptance}}"
weekly_avg_prep_minutes: "{{get-metrics.avg_prep}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Triggers a targeted rider incentive campaign by querying Snowflake for eligible riders, creating a Salesforce campaign, and dispatching notifications via Twilio SMS.
naftiko: "0.5"
info:
label: "Rider Incentive Campaign Launch"
description: "Triggers a targeted rider incentive campaign by querying Snowflake for eligible riders, creating a Salesforce campaign, and dispatching notifications via Twilio SMS."
tags:
- marketing
- riders
- snowflake
- salesforce
- twilio
- campaigns
capability:
exposes:
- type: mcp
namespace: rider-marketing
port: 8080
tools:
- name: launch-rider-incentive-campaign
description: "Given a campaign name, incentive amount, and target zone ID, query Snowflake for eligible riders, create a Salesforce marketing campaign, and dispatch SMS notifications via Twilio."
inputParameters:
- name: campaign_name
in: body
type: string
description: "Name of the incentive campaign."
- name: incentive_amount_gbp
in: body
type: number
description: "Bonus amount in GBP offered per qualifying delivery."
- name: zone_id
in: body
type: string
description: "Deliveroo zone ID to target for the campaign."
steps:
- name: query-eligible-riders
type: call
call: snowflake.execute-query
with:
statement: "SELECT rider_id, phone_number FROM rider_profiles WHERE zone_id = '{{zone_id}}' AND status = 'active'"
- name: create-campaign
type: call
call: salesforce-campaigns.create-campaign
with:
name: "{{campaign_name}}"
status: Active
type: Rider_Incentive
- name: send-sms
type: call
call: twilio.send-message
with:
from: "$secrets.twilio_from_number"
body: "You qualify for a £{{incentive_amount_gbp}} bonus this week! Complete qualifying deliveries to earn. T&Cs apply."
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce-campaigns
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign"
operations:
- name: create-campaign
method: POST
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Accounts/{{account_sid}}/Messages"
inputParameters:
- name: account_sid
in: path
operations:
- name: send-message
method: POST
When a rider's Workday record is terminated, deactivates their Stripe account, closes their Zendesk profile, and notifies the rider operations Slack channel.
naftiko: "0.5"
info:
label: "Rider Offboarding Workflow"
description: "When a rider's Workday record is terminated, deactivates their Stripe account, closes their Zendesk profile, and notifies the rider operations Slack channel."
tags:
- hr
- offboarding
- workday
- stripe
- zendesk
- slack
capability:
exposes:
- type: mcp
namespace: rider-offboarding
port: 8080
tools:
- name: offboard-rider
description: "Given a Workday employee ID for a terminated rider, deactivate their Stripe account, close their Zendesk profile, and notify the rider operations team in Slack."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the terminated rider."
- name: stripe_account_id
in: body
type: string
description: "Stripe Connect account ID associated with the rider."
- name: zendesk_user_id
in: body
type: string
description: "Zendesk user ID of the rider."
steps:
- name: deactivate-stripe
type: call
call: stripe.reject-account
with:
account_id: "{{stripe_account_id}}"
reason: "fraud"
- name: suspend-zendesk-user
type: call
call: zendesk.update-user
with:
user_id: "{{zendesk_user_id}}"
suspended: true
- name: notify-rider-ops
type: call
call: slack.post-message
with:
channel: rider-operations
text: "Rider offboarded: Workday {{workday_employee_id}} | Stripe {{stripe_account_id}} deactivated | Zendesk {{zendesk_user_id}} suspended"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: account-reject
path: "/accounts/{{account_id}}/reject"
inputParameters:
- name: account_id
in: path
operations:
- name: reject-account
method: POST
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Pulls weekly rider earnings from Snowflake, reconciles against Stripe payouts, and flags discrepancies in a Jira task for finance review.
naftiko: "0.5"
info:
label: "Rider Payouts Weekly Reconciliation"
description: "Pulls weekly rider earnings from Snowflake, reconciles against Stripe payouts, and flags discrepancies in a Jira task for finance review."
tags:
- finance
- payroll
- riders
- snowflake
- stripe
- jira
capability:
exposes:
- type: mcp
namespace: rider-finance
port: 8080
tools:
- name: reconcile-rider-payouts
description: "Given a week ending date, query Snowflake for rider earnings, retrieve Stripe payout data, and create a Jira task if discrepancies exceed the threshold."
inputParameters:
- name: week_ending_date
in: body
type: string
description: "ISO 8601 date of the week ending period (e.g. 2026-03-16)."
- name: discrepancy_threshold_gbp
in: body
type: number
description: "GBP amount above which a discrepancy is flagged in Jira."
steps:
- name: get-earnings
type: call
call: snowflake-finance.execute-query
with:
statement: "SELECT SUM(earnings) as total FROM rider_earnings WHERE week_ending = '{{week_ending_date}}'"
- name: get-payouts
type: call
call: stripe-payouts.list-payouts
with:
arrival_date: "{{week_ending_date}}"
limit: 100
- name: flag-discrepancy
type: call
call: jira-finance.create-issue
with:
project_key: FIN
issuetype: Task
summary: "Rider payout discrepancy detected for week ending {{week_ending_date}}"
description: "Earnings from Snowflake: {{get-earnings.total}}\nStripe payouts: {{get-payouts.total_amount}}\nReview required."
consumes:
- type: http
namespace: snowflake-finance
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: stripe-payouts
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payouts
path: "/payouts"
operations:
- name: list-payouts
method: GET
- type: http
namespace: jira-finance
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Computes a partner health score from Snowflake order and acceptance rate data and updates the corresponding Salesforce account record for the partner success team.
naftiko: "0.5"
info:
label: "Salesforce Account Health Score Update"
description: "Computes a partner health score from Snowflake order and acceptance rate data and updates the corresponding Salesforce account record for the partner success team."
tags:
- crm
- analytics
- salesforce
- snowflake
- partner-success
capability:
exposes:
- type: mcp
namespace: partner-health
port: 8080
tools:
- name: update-partner-health-score
description: "Given a Salesforce account ID, compute the partner health score from Snowflake metrics (order volume, acceptance rate, CSAT) and write the score back to the Salesforce account record."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID of the restaurant partner."
- name: score_period_days
in: body
type: integer
description: "Number of trailing days to use for the health score calculation."
steps:
- name: compute-score
type: call
call: snowflake.execute-query
with:
statement: "SELECT ROUND((AVG(acceptance_rate) * 0.4 + AVG(csat_score) * 0.3 + LEAST(order_count / 100.0, 1) * 0.3) * 100) as health_score FROM restaurant_metrics WHERE account_id = '{{salesforce_account_id}}' AND metric_date >= DATEADD(day, -{{score_period_days}}, CURRENT_DATE)"
- name: update-account
type: call
call: salesforce.update-account
with:
account_id: "{{salesforce_account_id}}"
partner_health_score: "{{compute-score.health_score}}"
health_score_updated_at: "{{snapshot_date}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Enriches a Salesforce lead with restaurant performance data from Snowflake to give the sales team context during prospecting calls.
naftiko: "0.5"
info:
label: "Salesforce Lead Enrichment from Snowflake"
description: "Enriches a Salesforce lead with restaurant performance data from Snowflake to give the sales team context during prospecting calls."
tags:
- sales
- crm
- salesforce
- snowflake
- enrichment
capability:
exposes:
- type: mcp
namespace: sales-intelligence
port: 8080
tools:
- name: enrich-lead-with-data
description: "Given a Salesforce lead ID and the restaurant's external identifier, pull performance benchmarks from Snowflake and update the Salesforce lead with enriched context for the sales team."
inputParameters:
- name: lead_id
in: body
type: string
description: "Salesforce lead ID to enrich."
- name: restaurant_external_id
in: body
type: string
description: "External restaurant identifier used in the Snowflake data warehouse."
steps:
- name: get-benchmarks
type: call
call: snowflake.execute-query
with:
statement: "SELECT category, avg_rating, estimated_weekly_orders FROM restaurant_benchmarks WHERE external_id = '{{restaurant_external_id}}' LIMIT 1"
- name: update-lead
type: call
call: salesforce.update-lead
with:
lead_id: "{{lead_id}}"
restaurant_category: "{{get-benchmarks.category}}"
avg_rating: "{{get-benchmarks.avg_rating}}"
estimated_weekly_orders: "{{get-benchmarks.estimated_weekly_orders}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: update-lead
method: PATCH
Queries Salesforce for the current quarter pipeline forecast by stage and posts the summary to Slack.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Forecast"
description: "Queries Salesforce for the current quarter pipeline forecast by stage and posts the summary to Slack."
tags:
- sales
- reporting
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: post-forecast
description: "Run a Salesforce pipeline query and post the quarterly forecast summary to the sales Slack channel."
inputParameters:
- name: slack_channel
in: body
type: string
description: "Slack channel for the forecast."
steps:
- name: query-pipeline
type: call
call: salesforce.query
with:
q: "SELECT StageName, SUM(Amount) total FROM Opportunity WHERE CloseDate = THIS_QUARTER GROUP BY StageName"
- name: post-summary
type: call
call: slack.post-message
with:
channel: "{{slack_channel}}"
text: "Pipeline forecast: {{query-pipeline.records}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
operations:
- name: query
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a Salesforce opportunity reaches Closed Won stage, creates a matching partner record in Zendesk and notifies the account manager in Slack.
naftiko: "0.5"
info:
label: "Salesforce Opportunity to Partner Sync"
description: "When a Salesforce opportunity reaches Closed Won stage, creates a matching partner record in Zendesk and notifies the account manager in Slack."
tags:
- sales
- crm
- salesforce
- zendesk
- slack
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: sync-won-opportunity
description: "Given a Salesforce opportunity ID that has reached Closed Won, create a Zendesk organization for the new partner and notify the account manager via Slack."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID that has reached Closed Won stage."
- name: account_manager_slack_id
in: body
type: string
description: "Slack user ID of the account manager to notify."
steps:
- name: get-opportunity
type: call
call: salesforce.get-opportunity
with:
opportunity_id: "{{opportunity_id}}"
- name: create-zendesk-org
type: call
call: zendesk.create-organization
with:
name: "{{get-opportunity.account_name}}"
external_id: "{{opportunity_id}}"
- name: notify-am
type: call
call: slack.post-message
with:
channel: "{{account_manager_slack_id}}"
text: "Opportunity won: {{get-opportunity.name}} | Account: {{get-opportunity.account_name}} | Zendesk org created: {{create-zendesk-org.id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: organizations
path: "/organizations"
operations:
- name: create-organization
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Updates a restaurant partner's tier in Salesforce based on performance metrics and notifies the partner success team via Slack.
naftiko: "0.5"
info:
label: "Salesforce Partner Tier Update"
description: "Updates a restaurant partner's tier in Salesforce based on performance metrics and notifies the partner success team via Slack."
tags:
- partner-management
- crm
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: partner-ops
port: 8080
tools:
- name: update-partner-tier
description: "Given a Salesforce account ID and new tier, update the partner record and notify the partner success Slack channel."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID."
- name: new_tier
in: body
type: string
description: "New partner tier (Gold, Silver, Bronze)."
steps:
- name: update-account
type: call
call: salesforce.update-account
with:
account_id: "{{account_id}}"
tier: "{{new_tier}}"
- name: notify-team
type: call
call: slack.post-message
with:
channel: "partner-success"
text: "Partner tier updated: {{account_id}} moved to {{new_tier}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a restaurant partner contract from Salesforce by account ID, returning contract terms, commission rate, and renewal date.
naftiko: "0.5"
info:
label: "Salesforce Restaurant Contract Lookup"
description: "Retrieves a restaurant partner contract from Salesforce by account ID, returning contract terms, commission rate, and renewal date."
tags:
- sales
- partner-management
- salesforce
capability:
exposes:
- type: mcp
namespace: partner-ops
port: 8080
tools:
- name: get-restaurant-contract
description: "Given a Salesforce account ID, return the active contract terms, commission rate, and renewal date."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID for the restaurant partner."
call: salesforce.get-contract
with:
account_id: "{{account_id}}"
outputParameters:
- name: contract_status
type: string
mapping: "$.records[0].Status"
- name: commission_rate
type: number
mapping: "$.records[0].Commission_Rate__c"
- name: renewal_date
type: string
mapping: "$.records[0].EndDate"
consumes:
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
operations:
- name: get-contract
method: GET
Retrieves event delivery statistics from Segment for a given source, returning success rate and error counts.
naftiko: "0.5"
info:
label: "Segment Event Tracking Check"
description: "Retrieves event delivery statistics from Segment for a given source, returning success rate and error counts."
tags:
- analytics
- data-pipeline
- segment
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: check-event-delivery
description: "Given a Segment source slug, return delivery success rate and error count for the last 24 hours."
inputParameters:
- name: source_slug
in: body
type: string
description: "Segment source slug."
call: segment.get-delivery-overview
with:
source_slug: "{{source_slug}}"
outputParameters:
- name: success_rate
type: number
mapping: "$.metrics.successRate"
- name: error_count
type: integer
mapping: "$.metrics.errors"
consumes:
- type: http
namespace: segment
baseUri: "https://api.segmentapis.com/v2"
authentication:
type: bearer
token: "$secrets.segment_token"
resources:
- name: delivery
path: "/sources/{{source_slug}}/delivery-overview"
inputParameters:
- name: source_slug
in: path
operations:
- name: get-delivery-overview
method: GET
When Sentry detects a new error spike, creates a Jira bug ticket and posts the error details to the engineering Slack channel.
naftiko: "0.5"
info:
label: "Sentry Error Alert Handler"
description: "When Sentry detects a new error spike, creates a Jira bug ticket and posts the error details to the engineering Slack channel."
tags:
- engineering
- monitoring
- sentry
- jira
- slack
capability:
exposes:
- type: mcp
namespace: eng-ops
port: 8080
tools:
- name: handle-sentry-error
description: "Given a Sentry issue ID, fetch error details, create a Jira bug, and notify the engineering Slack channel."
inputParameters:
- name: issue_id
in: body
type: string
description: "Sentry issue ID."
steps:
- name: get-issue
type: call
call: sentry.get-issue
with:
issue_id: "{{issue_id}}"
- name: create-bug
type: call
call: jira.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "Sentry: {{get-issue.title}}"
description: "Error count: {{get-issue.count}} | First seen: {{get-issue.firstSeen}}"
- name: notify-eng
type: call
call: slack.post-message
with:
channel: "engineering"
text: "Sentry error spike: {{get-issue.title}} ({{get-issue.count}} events) | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: sentry
baseUri: "https://sentry.io/api/0"
authentication:
type: bearer
token: "$secrets.sentry_token"
resources:
- name: issues
path: "/issues/{{issue_id}}/"
inputParameters:
- name: issue_id
in: path
operations:
- name: get-issue
method: GET
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a dedicated Slack incident channel, invites the on-call team, and posts the incident summary.
naftiko: "0.5"
info:
label: "Slack Incident Channel Creation"
description: "Creates a dedicated Slack incident channel, invites the on-call team, and posts the incident summary."
tags:
- incident-management
- collaboration
- slack
- pagerduty
capability:
exposes:
- type: mcp
namespace: incident-ops
port: 8080
tools:
- name: create-incident-channel
description: "Given an incident title and PagerDuty incident ID, create a Slack channel, invite on-call responders, and post the incident brief."
inputParameters:
- name: incident_title
in: body
type: string
description: "Short incident title for channel name."
- name: pd_incident_id
in: body
type: string
description: "PagerDuty incident ID."
steps:
- name: get-pd-incident
type: call
call: pagerduty.get-incident
with:
incident_id: "{{pd_incident_id}}"
- name: create-channel
type: call
call: slack.create-channel
with:
name: "inc-{{incident_title}}"
- name: post-brief
type: call
call: slack.post-message
with:
channel: "{{create-channel.id}}"
text: "Incident: {{get-pd-incident.title}} | Status: {{get-pd-incident.status}} | PagerDuty: {{pd_incident_id}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents/{{incident_id}}"
inputParameters:
- name: incident_id
in: path
operations:
- name: get-incident
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Runs data quality checks on core Deliveroo data pipeline tables in Snowflake and creates a Jira data quality task when anomalies are detected.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Quality Check"
description: "Runs data quality checks on core Deliveroo data pipeline tables in Snowflake and creates a Jira data quality task when anomalies are detected."
tags:
- data
- analytics
- snowflake
- jira
- data-quality
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-pipeline-quality-check
description: "Given a Snowflake table name and expected row count threshold, execute a data quality check and open a Jira task if the table fails validation."
inputParameters:
- name: table_name
in: body
type: string
description: "Fully qualified Snowflake table name (e.g. raw.orders.deliveries)."
- name: expected_min_rows
in: body
type: integer
description: "Minimum expected row count for the quality check to pass."
- name: check_date
in: body
type: string
description: "ISO 8601 date for the data partition being checked."
steps:
- name: run-quality-query
type: call
call: snowflake.execute-query
with:
statement: "SELECT COUNT(*) as row_count FROM {{table_name}} WHERE DATE(created_at) = '{{check_date}}'"
- name: raise-quality-issue
type: call
call: jira.create-issue
with:
project_key: DATA
issuetype: Bug
summary: "Data quality failure: {{table_name}} on {{check_date}}"
description: "Table {{table_name}} returned {{run-quality-query.row_count}} rows, below minimum threshold of {{expected_min_rows}} for date {{check_date}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Executes a read-only SQL query against the Snowflake order analytics warehouse and returns the result set.
naftiko: "0.5"
info:
label: "Snowflake Order Analytics Query"
description: "Executes a read-only SQL query against the Snowflake order analytics warehouse and returns the result set."
tags:
- data
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: run-order-query
description: "Given a SQL query, execute it against the Snowflake order analytics warehouse and return results."
inputParameters:
- name: sql
in: body
type: string
description: "Read-only SQL query."
call: snowflake.execute-statement
with:
statement: "{{sql}}"
warehouse: "ORDER_ANALYTICS_WH"
outputParameters:
- name: rows
type: array
mapping: "$.data"
- name: row_count
type: integer
mapping: "$.resultSetMetaData.numRows"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Checks the SonarQube quality gate status for a project and returns pass/fail with metric details.
naftiko: "0.5"
info:
label: "SonarQube Quality Gate Check"
description: "Checks the SonarQube quality gate status for a project and returns pass/fail with metric details."
tags:
- engineering
- code-quality
- sonarqube
capability:
exposes:
- type: mcp
namespace: code-quality
port: 8080
tools:
- name: check-quality-gate
description: "Given a SonarQube project key, return the quality gate status and key metrics."
inputParameters:
- name: project_key
in: body
type: string
description: "SonarQube project key."
call: sonarqube.get-quality-gate
with:
project_key: "{{project_key}}"
outputParameters:
- name: status
type: string
mapping: "$.projectStatus.status"
- name: conditions
type: array
mapping: "$.projectStatus.conditions"
consumes:
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.deliveroo.net/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality-gates
path: "/qualitygates/project_status"
operations:
- name: get-quality-gate
method: GET
Runs a Splunk search for delivery latency metrics across zones and posts P95 latency to the ops Slack channel.
naftiko: "0.5"
info:
label: "Splunk Delivery Latency Analysis"
description: "Runs a Splunk search for delivery latency metrics across zones and posts P95 latency to the ops Slack channel."
tags:
- operations
- analytics
- splunk
- slack
capability:
exposes:
- type: mcp
namespace: ops-analytics
port: 8080
tools:
- name: analyze-delivery-latency
description: "Run a Splunk search for delivery latency metrics and post P95 values to the ops Slack channel."
inputParameters:
- name: zone
in: body
type: string
description: "Delivery zone identifier."
- name: time_range
in: body
type: string
description: "Time range (e.g., -1h, -24h)."
steps:
- name: run-search
type: call
call: splunk.search
with:
search: "search index=delivery zone={{zone}} | stats p95(latency_seconds) as p95_latency"
earliest_time: "{{time_range}}"
- name: post-results
type: call
call: slack.post-message
with:
channel: "ops-analytics"
text: "Delivery latency for zone {{zone}}: P95 = {{run-search.p95_latency}}s"
consumes:
- type: http
namespace: splunk
baseUri: "https://deliveroo-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a Statuspage incident for a service degradation and posts the status page link to the communications Slack channel.
naftiko: "0.5"
info:
label: "Statuspage Incident Creation"
description: "Creates a Statuspage incident for a service degradation and posts the status page link to the communications Slack channel."
tags:
- incident-management
- communications
- statuspage
- slack
capability:
exposes:
- type: mcp
namespace: incident-comms
port: 8080
tools:
- name: create-statuspage-incident
description: "Given an incident name, status, and affected component, create a Statuspage incident and notify Slack."
inputParameters:
- name: name
in: body
type: string
description: "Incident name."
- name: status
in: body
type: string
description: "Incident status (investigating, identified, monitoring, resolved)."
- name: component_id
in: body
type: string
description: "Affected Statuspage component ID."
steps:
- name: create-incident
type: call
call: statuspage.create-incident
with:
name: "{{name}}"
status: "{{status}}"
component_ids: "{{component_id}}"
- name: notify-comms
type: call
call: slack.post-message
with:
channel: "incident-comms"
text: "Statuspage incident created: {{name}} | Status: {{status}} | URL: {{create-incident.shortlink}}"
consumes:
- type: http
namespace: statuspage
baseUri: "https://api.statuspage.io/v1/pages/$secrets.statuspage_page_id"
authentication:
type: bearer
token: "$secrets.statuspage_api_key"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a Stripe customer by email address, returning customer ID, default payment method, and account balance.
naftiko: "0.5"
info:
label: "Stripe Customer Lookup"
description: "Retrieves a Stripe customer by email address, returning customer ID, default payment method, and account balance."
tags:
- payments
- customer-data
- stripe
capability:
exposes:
- type: mcp
namespace: payments-ops
port: 8080
tools:
- name: lookup-customer
description: "Given a customer email, look up the Stripe customer record and return ID, default payment method, and balance."
inputParameters:
- name: email
in: body
type: string
description: "Customer email address."
call: stripe.list-customers
with:
email: "{{email}}"
outputParameters:
- name: customer_id
type: string
mapping: "$.data[0].id"
- name: default_payment
type: string
mapping: "$.data[0].default_source"
- name: balance
type: integer
mapping: "$.data[0].balance"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: customers
path: "/customers"
operations:
- name: list-customers
method: GET
When a Stripe dispute is created, fetches dispute details, creates a Jira finance ticket, and alerts the payments Slack channel.
naftiko: "0.5"
info:
label: "Stripe Dispute Handler"
description: "When a Stripe dispute is created, fetches dispute details, creates a Jira finance ticket, and alerts the payments Slack channel."
tags:
- finance
- payments
- stripe
- jira
- slack
capability:
exposes:
- type: mcp
namespace: payments-ops
port: 8080
tools:
- name: handle-dispute
description: "Given a Stripe dispute ID, fetch details, create a Jira ticket, and alert the payments Slack channel."
inputParameters:
- name: dispute_id
in: body
type: string
description: "Stripe dispute ID."
steps:
- name: get-dispute
type: call
call: stripe.get-dispute
with:
dispute_id: "{{dispute_id}}"
- name: create-jira
type: call
call: jira.create-issue
with:
project_key: "FIN"
issuetype: "Task"
summary: "Stripe dispute {{dispute_id}}: {{get-dispute.reason}} — {{get-dispute.amount}}"
- name: alert-payments
type: call
call: slack.post-message
with:
channel: "payments-engineering"
text: "New dispute: {{dispute_id}} | Reason: {{get-dispute.reason}} | Amount: {{get-dispute.amount}} | Jira: {{create-jira.key}}"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: disputes
path: "/disputes/{{dispute_id}}"
inputParameters:
- name: dispute_id
in: path
operations:
- name: get-dispute
method: GET
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When Stripe reports elevated payment failure rates, creates a Datadog alert event and notifies the payments engineering Slack channel for immediate investigation.
naftiko: "0.5"
info:
label: "Stripe Payment Failure Alert"
description: "When Stripe reports elevated payment failure rates, creates a Datadog alert event and notifies the payments engineering Slack channel for immediate investigation."
tags:
- payments
- monitoring
- stripe
- datadog
- slack
capability:
exposes:
- type: mcp
namespace: payments-ops
port: 8080
tools:
- name: handle-payment-failure-spike
description: "Given a Stripe payment failure rate alert, create a Datadog event and notify the payments engineering Slack channel with failure details."
inputParameters:
- name: failure_rate_pct
in: body
type: number
description: "Current payment failure rate as a percentage."
- name: affected_currency
in: body
type: string
description: "Currency code experiencing elevated failures (e.g. GBP, EUR)."
- name: time_window_minutes
in: body
type: integer
description: "Time window in minutes over which the failure rate was measured."
steps:
- name: create-dd-event
type: call
call: datadog.create-event
with:
title: "Stripe payment failures: {{failure_rate_pct}}% in {{affected_currency}}"
text: "Failure rate {{failure_rate_pct}}% over last {{time_window_minutes}}min for currency {{affected_currency}}"
alert_type: error
tags: "service:payments,currency:{{affected_currency}}"
- name: notify-payments-eng
type: call
call: slack.post-message
with:
channel: payments-engineering
text: "Payment failure spike: {{failure_rate_pct}}% in {{affected_currency}} over {{time_window_minutes}}min | Datadog: {{create-dd-event.url}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: DD-API-KEY
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a Stripe payout by ID and returns the amount, arrival date, and status for finance reconciliation.
naftiko: "0.5"
info:
label: "Stripe Payout Reconciliation"
description: "Retrieves a Stripe payout by ID and returns the amount, arrival date, and status for finance reconciliation."
tags:
- finance
- payments
- stripe
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: get-payout-details
description: "Given a Stripe payout ID, return the amount, currency, arrival date, and status. Use for daily payout reconciliation."
inputParameters:
- name: payout_id
in: body
type: string
description: "Stripe payout ID."
call: stripe.get-payout
with:
payout_id: "{{payout_id}}"
outputParameters:
- name: amount
type: number
mapping: "$.amount"
- name: currency
type: string
mapping: "$.currency"
- name: arrival_date
type: string
mapping: "$.arrival_date"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payouts
path: "/payouts/{{payout_id}}"
inputParameters:
- name: payout_id
in: path
operations:
- name: get-payout
method: GET
Processes a customer refund via Stripe for a failed or disputed order and updates the Zendesk support ticket with the refund confirmation.
naftiko: "0.5"
info:
label: "Stripe Refund Processing"
description: "Processes a customer refund via Stripe for a failed or disputed order and updates the Zendesk support ticket with the refund confirmation."
tags:
- payments
- customer-support
- stripe
- zendesk
capability:
exposes:
- type: mcp
namespace: refunds
port: 8080
tools:
- name: process-order-refund
description: "Given a Stripe payment intent ID and refund amount, process the refund and update the associated Zendesk ticket with the refund confirmation and reference number."
inputParameters:
- name: payment_intent_id
in: body
type: string
description: "Stripe payment intent ID for the order to be refunded."
- name: refund_amount_pence
in: body
type: integer
description: "Refund amount in pence (e.g. 1200 for £12.00)."
- name: zendesk_ticket_id
in: body
type: string
description: "Zendesk ticket ID to update with the refund confirmation."
- name: reason
in: body
type: string
description: "Refund reason code: requested_by_customer, fraudulent, or duplicate."
steps:
- name: create-refund
type: call
call: stripe.create-refund
with:
payment_intent: "{{payment_intent_id}}"
amount: "{{refund_amount_pence}}"
reason: "{{reason}}"
- name: update-ticket
type: call
call: zendesk.update-ticket
with:
ticket_id: "{{zendesk_ticket_id}}"
comment_body: "Refund processed successfully. Refund ID: {{create-refund.id}} for amount {{refund_amount_pence}}p. Status: {{create-refund.status}}"
status: solved
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: refunds
path: "/refunds"
operations:
- name: create-refund
method: POST
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: update-ticket
method: PUT
Triggers a refresh of Deliveroo's key Tableau dashboards after Snowflake pipeline loads complete, ensuring leadership always see current data.
naftiko: "0.5"
info:
label: "Tableau Dashboard Refresh on Data Load"
description: "Triggers a refresh of Deliveroo's key Tableau dashboards after Snowflake pipeline loads complete, ensuring leadership always see current data."
tags:
- analytics
- reporting
- tableau
- snowflake
- data
capability:
exposes:
- type: mcp
namespace: dashboard-refresh
port: 8080
tools:
- name: trigger-tableau-refresh
description: "Given a Tableau workbook ID and a Snowflake pipeline completion signal, verify the data load status and trigger a Tableau workbook refresh for leadership dashboards."
inputParameters:
- name: tableau_workbook_id
in: body
type: string
description: "Tableau workbook ID to refresh."
- name: pipeline_name
in: body
type: string
description: "Name of the Snowflake pipeline that completed loading."
steps:
- name: verify-load
type: call
call: snowflake.execute-query
with:
statement: "SELECT status, loaded_at FROM pipeline_runs WHERE pipeline_name = '{{pipeline_name}}' ORDER BY loaded_at DESC LIMIT 1"
- name: refresh-workbook
type: call
call: tableau.refresh-workbook
with:
workbook_id: "{{tableau_workbook_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: tableau
baseUri: "https://10ax.online.tableau.com/api/2.8"
authentication:
type: apikey
key: X-Tableau-Auth
value: "$secrets.tableau_token"
placement: header
resources:
- name: workbook-refresh
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: site_id
in: path
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Triggers a Terraform Cloud plan for a workspace and posts the plan summary to a Slack channel.
naftiko: "0.5"
info:
label: "Terraform Workspace Plan Trigger"
description: "Triggers a Terraform Cloud plan for a workspace and posts the plan summary to a Slack channel."
tags:
- infrastructure
- iac
- terraform
- slack
capability:
exposes:
- type: mcp
namespace: infra-ops
port: 8080
tools:
- name: trigger-plan
description: "Given a Terraform Cloud workspace ID, trigger a speculative plan and post the summary to Slack."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Terraform Cloud workspace ID."
steps:
- name: create-run
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
message: "Automated plan trigger"
- name: notify-slack
type: call
call: slack.post-message
with:
channel: "infra-ops"
text: "Terraform plan triggered for workspace {{workspace_id}}: run ID {{create-run.id}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the status of a Twilio voice call by SID, returning duration, status, and direction.
naftiko: "0.5"
info:
label: "Twilio Call Status Lookup"
description: "Retrieves the status of a Twilio voice call by SID, returning duration, status, and direction."
tags:
- communications
- telephony
- twilio
capability:
exposes:
- type: mcp
namespace: comms-ops
port: 8080
tools:
- name: get-call-status
description: "Given a Twilio call SID, return the call status, duration, and direction."
inputParameters:
- name: call_sid
in: body
type: string
description: "Twilio call SID."
call: twilio.get-call
with:
call_sid: "{{call_sid}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: duration
type: string
mapping: "$.duration"
- name: direction
type: string
mapping: "$.direction"
consumes:
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: calls
path: "/Calls/{{call_sid}}.json"
inputParameters:
- name: call_sid
in: path
operations:
- name: get-call
method: GET
Sends an SMS notification to a rider via Twilio and logs the delivery status to Snowflake for analytics.
naftiko: "0.5"
info:
label: "Twilio Rider SMS Notification"
description: "Sends an SMS notification to a rider via Twilio and logs the delivery status to Snowflake for analytics."
tags:
- communications
- rider-management
- twilio
- snowflake
capability:
exposes:
- type: mcp
namespace: comms-ops
port: 8080
tools:
- name: send-rider-sms
description: "Given a rider phone number and message body, send an SMS via Twilio and log the event to Snowflake."
inputParameters:
- name: phone_number
in: body
type: string
description: "Rider phone number in E.164 format."
- name: message_body
in: body
type: string
description: "SMS message body."
steps:
- name: send-sms
type: call
call: twilio.send-message
with:
to: "{{phone_number}}"
body: "{{message_body}}"
- name: log-event
type: call
call: snowflake.insert-row
with:
table: "RIDER_SMS_LOG"
values:
phone: "{{phone_number}}"
message_sid: "{{send-sms.sid}}"
status: "{{send-sms.status}}"
consumes:
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Messages.json"
operations:
- name: send-message
method: POST
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-row
method: POST
Looks up the delivery status of a Twilio SMS message sent to a rider or customer and returns the status for support and operations teams.
naftiko: "0.5"
info:
label: "Twilio SMS Delivery Status Check"
description: "Looks up the delivery status of a Twilio SMS message sent to a rider or customer and returns the status for support and operations teams."
tags:
- operations
- communications
- twilio
- support
capability:
exposes:
- type: mcp
namespace: comms-ops
port: 8080
tools:
- name: get-sms-delivery-status
description: "Given a Twilio message SID, retrieve the current delivery status of an SMS sent to a rider or customer. Use to diagnose communication failures in support investigations."
inputParameters:
- name: message_sid
in: body
type: string
description: "The Twilio message SID (starts with SM or MM)."
call: twilio.get-message
with:
message_sid: "{{message_sid}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: to
type: string
mapping: "$.to"
- name: date_sent
type: string
mapping: "$.date_sent"
- name: error_code
type: string
mapping: "$.error_code"
consumes:
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Accounts/{{account_sid}}/Messages/{{message_sid}}"
inputParameters:
- name: account_sid
in: path
- name: message_sid
in: path
operations:
- name: get-message
method: GET
Queries Snowflake for zone-level gross merchandise value by week and writes the revenue snapshot to a Salesforce custom object for commercial leadership reporting.
naftiko: "0.5"
info:
label: "Weekly Zone Revenue Snapshot"
description: "Queries Snowflake for zone-level gross merchandise value by week and writes the revenue snapshot to a Salesforce custom object for commercial leadership reporting."
tags:
- finance
- analytics
- snowflake
- salesforce
- reporting
capability:
exposes:
- type: mcp
namespace: revenue-reporting
port: 8080
tools:
- name: snapshot-zone-revenue
description: "Given a week ending date, query Snowflake for GMV by zone and upsert the weekly revenue records to the Salesforce ZoneRevenue__c custom object."
inputParameters:
- name: week_ending_date
in: body
type: string
description: "ISO 8601 date of the week ending for the revenue snapshot."
steps:
- name: get-zone-gmv
type: call
call: snowflake.execute-query
with:
statement: "SELECT zone_id, zone_name, SUM(gmv_gbp) as total_gmv FROM zone_revenue WHERE week_ending = '{{week_ending_date}}' GROUP BY zone_id, zone_name"
- name: upsert-revenue-record
type: call
call: salesforce.create-record
with:
object_type: ZoneRevenue__c
week_ending: "{{week_ending_date}}"
gmv_data: "{{get-zone-gmv.data}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://deliveroo.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: records
path: "/sobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-record
method: POST
Sends a WhatsApp template message to a rider via the WhatsApp Business API for delivery instructions.
naftiko: "0.5"
info:
label: "WhatsApp Rider Communication"
description: "Sends a WhatsApp template message to a rider via the WhatsApp Business API for delivery instructions."
tags:
- communications
- rider-management
- whatsapp
capability:
exposes:
- type: mcp
namespace: rider-comms
port: 8080
tools:
- name: send-rider-whatsapp
description: "Given a rider phone number and template name, send a WhatsApp Business message."
inputParameters:
- name: phone_number
in: body
type: string
description: "Rider phone number in E.164 format."
- name: template_name
in: body
type: string
description: "WhatsApp template name."
call: whatsapp.send-template
with:
to: "{{phone_number}}"
template: "{{template_name}}"
outputParameters:
- name: message_id
type: string
mapping: "$.messages[0].id"
- name: status
type: string
mapping: "$.messages[0].message_status"
consumes:
- type: http
namespace: whatsapp
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.whatsapp_token"
resources:
- name: messages
path: "/{{phone_number_id}}/messages"
operations:
- name: send-template
method: POST
Retrieves an employee's PTO and sick leave balances from Workday by employee ID.
naftiko: "0.5"
info:
label: "Workday Absence Balance Lookup"
description: "Retrieves an employee's PTO and sick leave balances from Workday by employee ID."
tags:
- hr
- leave-management
- workday
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: get-absence-balance
description: "Given a Workday employee ID, return PTO balance, sick leave balance, and next accrual date."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
call: workday.get-balance
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: pto_balance
type: number
mapping: "$.Worker.TimeOff.PTO_Balance"
- name: sick_balance
type: number
mapping: "$.Worker.TimeOff.Sick_Balance"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/deliveroo"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: absence
path: "/Human_Resources/v40.0/Get_Workers"
operations:
- name: get-balance
method: GET
When a compensation change is approved in Workday, sends a confirmation email and notifies HR via Slack.
naftiko: "0.5"
info:
label: "Workday Compensation Change Alert"
description: "When a compensation change is approved in Workday, sends a confirmation email and notifies HR via Slack."
tags:
- hr
- compensation
- workday
- slack
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: notify-comp-change
description: "Given a Workday employee ID and compensation event, fetch details and notify HR via Slack."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
- name: event_id
in: body
type: string
description: "Compensation event ID."
steps:
- name: get-event
type: call
call: workday.get-comp-event
with:
employee_id: "{{employee_id}}"
event_id: "{{event_id}}"
- name: notify-hr
type: call
call: slack.post-message
with:
channel: "hr-notifications"
text: "Compensation change for {{employee_id}}: effective {{get-event.effective_date}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/deliveroo"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: compensation
path: "/Compensation/v40.0"
operations:
- name: get-comp-event
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When an employee's role changes in Workday, updates their GitHub team memberships and notifies the engineering manager in Slack.
naftiko: "0.5"
info:
label: "Workday Employee Role Change Provisioning"
description: "When an employee's role changes in Workday, updates their GitHub team memberships and notifies the engineering manager in Slack."
tags:
- hr
- access-management
- workday
- github
- slack
capability:
exposes:
- type: mcp
namespace: role-provisioning
port: 8080
tools:
- name: provision-role-change
description: "Given a Workday employee ID, their old and new GitHub team slugs, update GitHub team memberships accordingly and notify the engineering manager in Slack."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the employee changing roles."
- name: github_username
in: body
type: string
description: "GitHub username of the employee."
- name: old_team_slug
in: body
type: string
description: "GitHub team slug for the employee's previous team."
- name: new_team_slug
in: body
type: string
description: "GitHub team slug for the employee's new team."
- name: manager_slack_id
in: body
type: string
description: "Slack user ID of the new engineering manager."
steps:
- name: remove-old-team
type: call
call: github.remove-team-member
with:
org: deliveroo
team_slug: "{{old_team_slug}}"
username: "{{github_username}}"
- name: add-new-team
type: call
call: github-new-team.add-team-member
with:
org: deliveroo
team_slug: "{{new_team_slug}}"
username: "{{github_username}}"
- name: notify-manager
type: call
call: slack.post-message
with:
channel: "{{manager_slack_id}}"
text: "@{{github_username}} has been moved from team {{old_team_slug}} to {{new_team_slug}} following role change in Workday ({{workday_employee_id}})."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: team-members
path: "/orgs/deliveroo/teams/{{team_slug}}/memberships/{{username}}"
inputParameters:
- name: team_slug
in: path
- name: username
in: path
operations:
- name: remove-team-member
method: DELETE
- type: http
namespace: github-new-team
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: team-members
path: "/orgs/deliveroo/teams/{{team_slug}}/memberships/{{username}}"
inputParameters:
- name: team_slug
in: path
- name: username
in: path
operations:
- name: add-team-member
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a new position requisition in Workday and posts the job details to the recruiting Slack channel.
naftiko: "0.5"
info:
label: "Workday New Position Requisition"
description: "Creates a new position requisition in Workday and posts the job details to the recruiting Slack channel."
tags:
- hr
- recruiting
- workday
- slack
capability:
exposes:
- type: mcp
namespace: recruiting-ops
port: 8080
tools:
- name: create-requisition
description: "Given job title, department, and hiring manager, create a Workday position requisition and notify the recruiting Slack channel."
inputParameters:
- name: job_title
in: body
type: string
description: "Job title for the new position."
- name: department
in: body
type: string
description: "Department name."
- name: hiring_manager_id
in: body
type: string
description: "Workday ID of the hiring manager."
steps:
- name: create-req
type: call
call: workday.create-requisition
with:
title: "{{job_title}}"
department: "{{department}}"
manager_id: "{{hiring_manager_id}}"
- name: notify-recruiting
type: call
call: slack.post-message
with:
channel: "recruiting"
text: "New requisition created: {{job_title}} in {{department}} | Req ID: {{create-req.requisition_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/deliveroo"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: requisitions
path: "/Recruiting/v40.0"
operations:
- name: create-requisition
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the manager and direct reports for a Workday employee by employee ID.
naftiko: "0.5"
info:
label: "Workday Org Chart Lookup"
description: "Retrieves the manager and direct reports for a Workday employee by employee ID."
tags:
- hr
- workforce
- workday
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: get-org-chart
description: "Given a Workday employee ID, return manager name, title, and list of direct reports."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
call: workday.get-worker
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: manager
type: string
mapping: "$.Worker.Manager.Name"
- name: direct_reports
type: array
mapping: "$.Worker.DirectReports[*].Name"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/deliveroo"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: workers
path: "/Human_Resources/v40.0/Get_Workers"
operations:
- name: get-worker
method: GET
When a new position requisition is submitted in Workday, creates a Jira approval task for the hiring manager and notifies the talent acquisition Slack channel.
naftiko: "0.5"
info:
label: "Workday Position Requisition Approval"
description: "When a new position requisition is submitted in Workday, creates a Jira approval task for the hiring manager and notifies the talent acquisition Slack channel."
tags:
- hr
- recruiting
- workday
- jira
- slack
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: initiate-position-approval
description: "Given a Workday position requisition ID, create a Jira approval task and notify the talent acquisition Slack channel to begin the hiring workflow."
inputParameters:
- name: requisition_id
in: body
type: string
description: "Workday position requisition ID submitted for approval."
- name: job_title
in: body
type: string
description: "Job title for the open position."
- name: department
in: body
type: string
description: "Department requesting the new headcount."
- name: hiring_manager_slack_id
in: body
type: string
description: "Slack user ID of the hiring manager."
steps:
- name: create-approval-task
type: call
call: jira.create-issue
with:
project_key: HR
issuetype: Task
summary: "Position approval: {{job_title}} — {{department}}"
description: "Workday requisition {{requisition_id}} for {{job_title}} in {{department}} is pending approval."
- name: notify-ta
type: call
call: slack.post-message
with:
channel: talent-acquisition
text: "New position requisition: {{job_title}} in {{department}} | Jira: {{create-approval-task.key}} | Hiring manager: <@{{hiring_manager_slack_id}}>"
consumes:
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves CSAT scores from Zendesk for a given date range and writes the aggregated results to Snowflake for customer experience reporting.
naftiko: "0.5"
info:
label: "Zendesk Customer Satisfaction Score Tracker"
description: "Retrieves CSAT scores from Zendesk for a given date range and writes the aggregated results to Snowflake for customer experience reporting."
tags:
- customer-support
- analytics
- zendesk
- snowflake
- csat
capability:
exposes:
- type: mcp
namespace: csat-reporting
port: 8080
tools:
- name: track-csat-scores
description: "Given a date range, retrieve CSAT satisfaction ratings from Zendesk and write the aggregated score to Snowflake for CX trend analysis."
inputParameters:
- name: start_date
in: body
type: string
description: "ISO 8601 start date for the CSAT report period."
- name: end_date
in: body
type: string
description: "ISO 8601 end date for the CSAT report period."
steps:
- name: get-satisfaction-ratings
type: call
call: zendesk.list-satisfaction-ratings
with:
start_time: "{{start_date}}"
end_time: "{{end_date}}"
- name: store-scores
type: call
call: snowflake.execute-query
with:
statement: "INSERT INTO csat_scores (period_start, period_end, avg_score, total_responses) VALUES ('{{start_date}}', '{{end_date}}', {{get-satisfaction-ratings.avg_score}}, {{get-satisfaction-ratings.count}})"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: satisfaction-ratings
path: "/satisfaction_ratings"
inputParameters:
- name: start_time
in: query
- name: end_time
in: query
operations:
- name: list-satisfaction-ratings
method: GET
- type: http
namespace: snowflake
baseUri: "https://deliveroo.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves CSAT scores from Zendesk for a given period and returns the satisfaction percentage and response count.
naftiko: "0.5"
info:
label: "Zendesk Customer Satisfaction Trend"
description: "Retrieves CSAT scores from Zendesk for a given period and returns the satisfaction percentage and response count."
tags:
- support
- customer-experience
- zendesk
capability:
exposes:
- type: mcp
namespace: cx-ops
port: 8080
tools:
- name: get-csat-trend
description: "Fetch Zendesk satisfaction ratings for a date range and return the CSAT percentage."
inputParameters:
- name: start_date
in: body
type: string
description: "Start date (YYYY-MM-DD)."
call: zendesk.get-satisfaction-ratings
with:
start_time: "{{start_date}}"
outputParameters:
- name: score
type: string
mapping: "$.satisfaction_ratings[0].score"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: satisfaction-ratings
path: "/satisfaction_ratings.json"
operations:
- name: get-satisfaction-ratings
method: GET
When a Zendesk rider complaint ticket reaches high priority, creates a Jira operations ticket and alerts the rider-ops Slack channel.
naftiko: "0.5"
info:
label: "Zendesk Rider Complaint Escalation"
description: "When a Zendesk rider complaint ticket reaches high priority, creates a Jira operations ticket and alerts the rider-ops Slack channel."
tags:
- support
- operations
- zendesk
- jira
- slack
capability:
exposes:
- type: mcp
namespace: rider-ops
port: 8080
tools:
- name: escalate-rider-complaint
description: "Given a Zendesk ticket ID for a rider complaint, create a Jira ops ticket and notify the rider-ops Slack channel."
inputParameters:
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID."
steps:
- name: get-ticket
type: call
call: zendesk.get-ticket
with:
ticket_id: "{{ticket_id}}"
- name: create-jira
type: call
call: jira.create-issue
with:
project_key: "RIDEROPS"
issuetype: "Task"
summary: "Rider complaint: {{get-ticket.subject}}"
description: "Zendesk ticket {{ticket_id}}: {{get-ticket.description}}"
- name: alert-slack
type: call
call: slack.post-message
with:
channel: "rider-ops"
text: "Rider complaint escalated: {{get-ticket.subject}} | Jira: {{create-jira.key}} | Zendesk: {{ticket_id}}"
consumes:
- type: http
namespace: zendesk
baseUri: "https://deliveroo.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
- type: http
namespace: jira
baseUri: "https://deliveroo.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST