Spotify Capabilities
Naftiko 0.5 capability definitions for Spotify - 100 capabilities showing integration workflows and service orchestrations.
Pulls experiment results from the internal experimentation platform, fetches segment metrics from BigQuery, and posts a statistical summary with recommendation to the data science Slack channel.
naftiko: "0.5"
info:
label: "A/B Test Experiment Analysis"
description: "Pulls experiment results from the internal experimentation platform, fetches segment metrics from BigQuery, and posts a statistical summary with recommendation to the data science Slack channel."
tags:
- machine-learning
- google-cloud-platform
- slack
- experimentation
- data-science
capability:
exposes:
- type: mcp
namespace: experimentation
port: 8080
tools:
- name: analyze-experiment
description: "Given an experiment ID, pull results from the experimentation platform, enrich with BigQuery segment data, and post analysis to Slack."
inputParameters:
- name: experiment_id
in: body
type: string
description: "The internal experiment ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for experiment results."
steps:
- name: get-experiment
type: call
call: "experiment-api.get-results"
with:
experiment_id: "{{experiment_id}}"
- name: get-segments
type: call
call: "bigquery.run-query"
with:
query: "SELECT segment, AVG(metric_value) as avg_metric, COUNT(*) as n FROM experiments.{{experiment_id}}_results GROUP BY segment"
- name: post-results
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Experiment {{experiment_id}} Results:\nControl: {{get-experiment.control_mean}} (n={{get-experiment.control_n}})\nTreatment: {{get-experiment.treatment_mean}} (n={{get-experiment.treatment_n}})\nP-value: {{get-experiment.p_value}}\nRecommendation: {{get-experiment.recommendation}}"
consumes:
- type: http
namespace: experiment-api
baseUri: "https://experiment-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_experiment_token"
resources:
- name: experiments
path: "/experiments/{{experiment_id}}/results"
inputParameters:
- name: experiment_id
in: path
operations:
- name: get-results
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
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 Google Ads campaign metrics, cross-references with Spotify listener conversion data in BigQuery, and posts an optimization recommendation to the advertising team's Slack channel.
naftiko: "0.5"
info:
label: "Ad Campaign Performance and Optimization"
description: "Fetches Google Ads campaign metrics, cross-references with Spotify listener conversion data in BigQuery, and posts an optimization recommendation to the advertising team's Slack channel."
tags:
- advertising
- google-ads
- google-cloud-platform
- slack
- marketing-analytics
capability:
exposes:
- type: mcp
namespace: ad-optimization
port: 8080
tools:
- name: analyze-ad-campaign
description: "Given a Google Ads campaign ID and customer ID, pull ad metrics, join with Spotify conversion data, and deliver an optimization summary to Slack."
inputParameters:
- name: customer_id
in: body
type: string
description: "The Google Ads customer ID."
- name: campaign_id
in: body
type: string
description: "The Google Ads campaign ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for optimization reports."
steps:
- name: get-campaign
type: call
call: "google-ads.get-campaign"
with:
customer_id: "{{customer_id}}"
campaign_id: "{{campaign_id}}"
- name: get-conversions
type: call
call: "bigquery.run-query"
with:
query: "SELECT COUNT(*) as conversions, AVG(listen_duration_sec) as avg_listen FROM spotify_ads.campaign_conversions WHERE campaign_id='{{campaign_id}}'"
- name: post-analysis
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Ad Campaign {{campaign_id}} Analysis:\nImpressions: {{get-campaign.impressions}}\nClicks: {{get-campaign.clicks}}\nSpotify Conversions: {{get-conversions.conversions}}\nAvg Listen Duration: {{get-conversions.avg_listen}}s\nRecommendation: Adjust targeting if CTR < 1%."
consumes:
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v16/customers"
authentication:
type: bearer
token: "$secrets.google_ads_token"
inputParameters:
- name: developer-token
in: header
value: "$secrets.google_ads_developer_token"
resources:
- name: campaigns
path: "/{{customer_id}}/campaigns/{{campaign_id}}"
inputParameters:
- name: customer_id
in: path
- name: campaign_id
in: path
operations:
- name: get-campaign
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
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
Orchestrates ad targeting segment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Ad Targeting Segment Pipeline"
description: "Orchestrates ad targeting segment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- ad
- spotify
- pagerduty
- confluence
- grafana
capability:
exposes:
- type: mcp
namespace: ad
port: 8080
tools:
- name: ad-targeting-segment-pipeline
description: "Orchestrates ad targeting segment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "pagerduty.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "confluence.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "grafana.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/ad"
operations:
- name: execute-1
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/ad"
operations:
- name: execute-2
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/ad"
operations:
- name: execute-3
method: POST
Pulls ad impression and click data from the internal ad server, cross-references with Google Ads billing, reconciles discrepancies in BigQuery, and sends a variance report to the finance Slack channel.
naftiko: "0.5"
info:
label: "Advertising Revenue Reconciliation"
description: "Pulls ad impression and click data from the internal ad server, cross-references with Google Ads billing, reconciles discrepancies in BigQuery, and sends a variance report to the finance Slack channel."
tags:
- advertising
- google-ads
- google-cloud-platform
- slack
- finance
capability:
exposes:
- type: mcp
namespace: ad-revenue-recon
port: 8080
tools:
- name: reconcile-ad-revenue
description: "Given a date range and advertiser account, reconcile internal ad data with Google Ads billing and report variances."
inputParameters:
- name: start_date
in: body
type: string
description: "Start date for reconciliation (YYYY-MM-DD)."
- name: end_date
in: body
type: string
description: "End date for reconciliation (YYYY-MM-DD)."
- name: customer_id
in: body
type: string
description: "The Google Ads customer ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for finance reports."
steps:
- name: get-internal-data
type: call
call: "ad-server.get-revenue-report"
with:
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: get-google-billing
type: call
call: "google-ads.get-billing"
with:
customer_id: "{{customer_id}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: store-reconciliation
type: call
call: "bigquery.insert-rows"
with:
dataset_id: "finance_ops"
table_id: "ad_reconciliation"
rows: "{\"period\":\"{{start_date}}_{{end_date}}\",\"internal_revenue\":{{get-internal-data.total_revenue}},\"google_billed\":{{get-google-billing.total_cost}}}"
- name: post-report
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Ad Revenue Reconciliation ({{start_date}} to {{end_date}}):\nInternal Revenue: ${{get-internal-data.total_revenue}}\nGoogle Ads Billed: ${{get-google-billing.total_cost}}\nVariance: ${{get-internal-data.total_revenue}} - ${{get-google-billing.total_cost}}"
consumes:
- type: http
namespace: ad-server
baseUri: "https://ad-server.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_adserver_token"
resources:
- name: revenue-reports
path: "/reports/revenue"
inputParameters:
- name: start_date
in: query
- name: end_date
in: query
operations:
- name: get-revenue-report
method: GET
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v16/customers"
authentication:
type: bearer
token: "$secrets.google_ads_token"
inputParameters:
- name: developer-token
in: header
value: "$secrets.google_ads_developer_token"
resources:
- name: billing
path: "/{{customer_id}}/billingSetup"
inputParameters:
- name: customer_id
in: path
- name: start_date
in: query
- name: end_date
in: query
operations:
- name: get-billing
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: tabledata
path: "/projects/spotify-analytics/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
inputParameters:
- name: dataset_id
in: path
- name: table_id
in: path
operations:
- name: insert-rows
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
Orchestrates artist analytics dashboard pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Analytics Dashboard Pipeline"
description: "Orchestrates artist analytics dashboard pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- confluence
- grafana
- spotify
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-analytics-dashboard-pipeline
description: "Orchestrates artist analytics dashboard pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "confluence.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "grafana.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "spotify.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Orchestrates artist fan engagement pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Fan Engagement Pipeline"
description: "Orchestrates artist fan engagement pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- jira
- datadog
- github
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-fan-engagement-pipeline
description: "Orchestrates artist fan engagement pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "github.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Orchestrates artist marketing toolkit pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Marketing Toolkit Pipeline"
description: "Orchestrates artist marketing toolkit pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- datadog
- github
- google-bigquery
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-marketing-toolkit-pipeline
description: "Orchestrates artist marketing toolkit pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "github.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "google-bigquery.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Fetches artist data from the Spotify Web API, creates a Marquee promotional campaign via the Spotify for Artists API, and tracks campaign creation in JIRA for the artist partnerships team.
naftiko: "0.5"
info:
label: "Artist Marquee Campaign Setup"
description: "Fetches artist data from the Spotify Web API, creates a Marquee promotional campaign via the Spotify for Artists API, and tracks campaign creation in JIRA for the artist partnerships team."
tags:
- creator-tools
- spotify-web-api
- spotify-for-artists
- jira
- advertising
capability:
exposes:
- type: mcp
namespace: artist-marquee
port: 8080
tools:
- name: create-marquee-campaign
description: "Given an artist ID and release URI, set up a Marquee campaign and log it in JIRA."
inputParameters:
- name: artist_id
in: body
type: string
description: "The Spotify artist ID."
- name: release_uri
in: body
type: string
description: "The Spotify release URI to promote."
- name: budget_usd
in: body
type: number
description: "Campaign budget in USD."
- name: target_countries
in: body
type: string
description: "Comma-separated ISO country codes for targeting."
steps:
- name: get-artist
type: call
call: "spotify-api.get-artist"
with:
artist_id: "{{artist_id}}"
- name: create-campaign
type: call
call: "s4a-api.create-marquee"
with:
artist_id: "{{artist_id}}"
release_uri: "{{release_uri}}"
budget: "{{budget_usd}}"
countries: "{{target_countries}}"
- name: log-campaign
type: call
call: "jira.create-issue"
with:
project_key: "PARTNER"
summary: "Marquee Campaign: {{get-artist.name}} - {{release_uri}}"
description: "Budget: ${{budget_usd}}\nCountries: {{target_countries}}\nCampaign ID: {{create-campaign.campaign_id}}"
issue_type: "Task"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: artists
path: "/artists/{{artist_id}}"
inputParameters:
- name: artist_id
in: path
operations:
- name: get-artist
method: GET
- type: http
namespace: s4a-api
baseUri: "https://provider-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_s4a_token"
resources:
- name: marquee
path: "/marquee/campaigns"
operations:
- name: create-marquee
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Orchestrates artist merch integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Merch Integration Pipeline"
description: "Orchestrates artist merch integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- google-bigquery
- pagerduty
- confluence
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-merch-integration-pipeline
description: "Orchestrates artist merch integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "google-bigquery.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "pagerduty.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "confluence.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Orchestrates artist release day orchestrator across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Release Day Orchestrator"
description: "Orchestrates artist release day orchestrator across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- spotify
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-release-day-orchestrator
description: "Orchestrates artist release day orchestrator across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "spotify.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Pulls an artist's latest album from Spotify, fetches stream counts from the Spotify for Artists API, queries BigQuery for revenue data, and sends a consolidated performance report to Slack.
naftiko: "0.5"
info:
label: "Artist Release Performance Report"
description: "Pulls an artist's latest album from Spotify, fetches stream counts from the Spotify for Artists API, queries BigQuery for revenue data, and sends a consolidated performance report to Slack."
tags:
- creator-tools
- spotify-web-api
- spotify-for-artists
- google-cloud-platform
- slack
- analytics
capability:
exposes:
- type: mcp
namespace: creator-reporting
port: 8080
tools:
- name: generate-release-report
description: "Given an artist ID and Slack channel, compile a performance report for the artist's latest album with streaming and revenue data."
inputParameters:
- name: artist_id
in: body
type: string
description: "The Spotify artist ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for report delivery."
steps:
- name: get-artist
type: call
call: "spotify-api.get-artist"
with:
artist_id: "{{artist_id}}"
- name: get-albums
type: call
call: "spotify-api.get-artist-albums"
with:
artist_id: "{{artist_id}}"
- name: get-streams
type: call
call: "s4a-api.get-album-stats"
with:
album_uri: "{{get-albums.items_0_uri}}"
- name: get-revenue
type: call
call: "bigquery.run-query"
with:
query: "SELECT SUM(revenue) as total_revenue FROM spotify_analytics.royalties WHERE album_uri='{{get-albums.items_0_uri}}'"
- name: send-report
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Release Report: *{{get-artist.name}}* - {{get-albums.items_0_name}}\nStreams: {{get-streams.total_streams}}\nListeners: {{get-streams.unique_listeners}}\nRevenue: ${{get-revenue.total_revenue}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: artists
path: "/artists/{{artist_id}}"
inputParameters:
- name: artist_id
in: path
operations:
- name: get-artist
method: GET
- name: artist-albums
path: "/artists/{{artist_id}}/albums"
inputParameters:
- name: artist_id
in: path
operations:
- name: get-artist-albums
method: GET
- type: http
namespace: s4a-api
baseUri: "https://provider-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_s4a_token"
resources:
- name: album-stats
path: "/analytics/albums/{{album_uri}}"
inputParameters:
- name: album_uri
in: path
operations:
- name: get-album-stats
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
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
Orchestrates artist tour promotion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Artist Tour Promotion Pipeline"
description: "Orchestrates artist tour promotion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- artist
- spotify
- grafana
- spotify
- snowflake
capability:
exposes:
- type: mcp
namespace: artist
port: 8080
tools:
- name: artist-tour-promotion-pipeline
description: "Orchestrates artist tour promotion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "grafana.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "spotify.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/artist"
operations:
- name: execute-1
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/artist"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/artist"
operations:
- name: execute-3
method: POST
Orchestrates audio ad insertion optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Audio Ad Insertion Optimization Pipeline"
description: "Orchestrates audio ad insertion optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- audio
- spotify
- datadog
- github
- google-bigquery
capability:
exposes:
- type: mcp
namespace: audio
port: 8080
tools:
- name: audio-ad-insertion-optimization-pipeline
description: "Orchestrates audio ad insertion optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "github.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "google-bigquery.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/audio"
operations:
- name: execute-1
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/audio"
operations:
- name: execute-2
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/audio"
operations:
- name: execute-3
method: POST
Orchestrates audio fingerprinting pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Audio Fingerprinting Pipeline"
description: "Orchestrates audio fingerprinting pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- audio
- spotify
- github
- google-bigquery
- pagerduty
capability:
exposes:
- type: mcp
namespace: audio
port: 8080
tools:
- name: audio-fingerprinting-pipeline
description: "Orchestrates audio fingerprinting pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "github.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "google-bigquery.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "pagerduty.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/audio"
operations:
- name: execute-1
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/audio"
operations:
- name: execute-2
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/audio"
operations:
- name: execute-3
method: POST
Orchestrates audio loudness normalization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Audio Loudness Normalization Pipeline"
description: "Orchestrates audio loudness normalization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- audio
- spotify
- spotify
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: audio
port: 8080
tools:
- name: audio-loudness-normalization-pipeline
description: "Orchestrates audio loudness normalization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "spotify.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/audio"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/audio"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/audio"
operations:
- name: execute-3
method: POST
Orchestrates audio quality monitoring pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Audio Quality Monitoring Pipeline"
description: "Orchestrates audio quality monitoring pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- audio
- spotify
- confluence
- grafana
- spotify
capability:
exposes:
- type: mcp
namespace: audio
port: 8080
tools:
- name: audio-quality-monitoring-pipeline
description: "Orchestrates audio quality monitoring pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "confluence.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "grafana.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "spotify.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/audio"
operations:
- name: execute-1
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/audio"
operations:
- name: execute-2
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/audio"
operations:
- name: execute-3
method: POST
Runs a SonarQube quality gate check for a Spotify project, fetches the GitHub PR context, and posts the quality report as a PR comment and to the engineering Slack channel.
naftiko: "0.5"
info:
label: "Automated Code Quality Gate"
description: "Runs a SonarQube quality gate check for a Spotify project, fetches the GitHub PR context, and posts the quality report as a PR comment and to the engineering Slack channel."
tags:
- platform-engineering
- sonarqube
- github
- slack
- code-quality
capability:
exposes:
- type: mcp
namespace: code-quality
port: 8080
tools:
- name: check-quality-gate
description: "Given a SonarQube project key and GitHub PR, run the quality gate and post results as a PR comment and Slack message."
inputParameters:
- name: project_key
in: body
type: string
description: "The SonarQube project key."
- name: repo
in: body
type: string
description: "The GitHub repository (org/repo format)."
- name: pr_number
in: body
type: string
description: "The GitHub pull request number."
- name: slack_channel
in: body
type: string
description: "The Slack channel for quality reports."
steps:
- name: get-quality-gate
type: call
call: "sonarqube.get-quality-gate"
with:
project_key: "{{project_key}}"
- name: post-pr-comment
type: call
call: "github.create-comment"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
body: "SonarQube Quality Gate: {{get-quality-gate.projectStatus_status}}\nBugs: {{get-quality-gate.projectStatus_conditions_bugs}}\nVulnerabilities: {{get-quality-gate.projectStatus_conditions_vulnerabilities}}\nCode Smells: {{get-quality-gate.projectStatus_conditions_code_smells}}\nCoverage: {{get-quality-gate.projectStatus_conditions_coverage}}%"
- name: notify-slack
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Quality Gate for *{{project_key}}* (PR #{{pr_number}}): {{get-quality-gate.projectStatus_status}}"
consumes:
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.spotify.net/api"
authentication:
type: basic
username: "$secrets.sonarqube_token"
password: ""
resources:
- name: quality-gates
path: "/qualitygates/project_status"
inputParameters:
- name: project_key
in: query
operations:
- name: get-quality-gate
method: GET
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pr-comments
path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: create-comment
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 Datadog for the current health status of a Spotify microservice by service tag, returning monitor state and alert counts for platform engineering triage.
naftiko: "0.5"
info:
label: "Check Datadog Service Health"
description: "Queries Datadog for the current health status of a Spotify microservice by service tag, returning monitor state and alert counts for platform engineering triage."
tags:
- platform-engineering
- datadog
- monitoring
capability:
exposes:
- type: mcp
namespace: platform-health
port: 8080
tools:
- name: get-service-health
description: "Check the Datadog monitor status for a given Spotify service tag. Returns overall state and triggered alert count."
inputParameters:
- name: service_tag
in: body
type: string
description: "The Datadog service tag (e.g. service:playlist-service)."
call: "datadog.query-monitors"
with:
monitor_tags: "{{service_tag}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
inputParameters:
- name: DD-APPLICATION-KEY
in: header
value: "$secrets.datadog_app_key"
resources:
- name: monitors
path: "/monitor"
inputParameters:
- name: monitor_tags
in: query
operations:
- name: query-monitors
method: GET
Checks the latest GitHub Actions workflow run for a Spotify repository, correlates with Harness deployment status, and posts a unified CI/CD status to Slack.
naftiko: "0.5"
info:
label: "CI/CD Pipeline Status Aggregator"
description: "Checks the latest GitHub Actions workflow run for a Spotify repository, correlates with Harness deployment status, and posts a unified CI/CD status to Slack."
tags:
- platform-engineering
- github
- harness
- slack
- ci-cd
capability:
exposes:
- type: mcp
namespace: cicd-status
port: 8080
tools:
- name: get-cicd-status
description: "Given a repo name and Harness pipeline ID, aggregate CI/CD status from GitHub Actions and Harness, then post to Slack."
inputParameters:
- name: repo
in: body
type: string
description: "The GitHub repository (org/repo format)."
- name: harness_pipeline_id
in: body
type: string
description: "The Harness pipeline ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for CI/CD status."
steps:
- name: get-workflow-runs
type: call
call: "github.get-workflow-runs"
with:
repo: "{{repo}}"
- name: get-harness-pipeline
type: call
call: "harness.get-pipeline"
with:
pipeline_id: "{{harness_pipeline_id}}"
- name: post-status
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "CI/CD Status for *{{repo}}*:\nGitHub Actions: {{get-workflow-runs.workflow_runs_0_conclusion}} ({{get-workflow-runs.workflow_runs_0_name}})\nHarness Pipeline: {{get-harness-pipeline.status}}\nLast Deploy: {{get-harness-pipeline.last_execution_ts}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs"
inputParameters:
- name: repo
in: path
operations:
- name: get-workflow-runs
method: GET
- type: http
namespace: harness
baseUri: "https://app.harness.io/gateway/api"
authentication:
type: bearer
token: "$secrets.harness_api_token"
resources:
- name: pipelines
path: "/pipelines/{{pipeline_id}}"
inputParameters:
- name: pipeline_id
in: path
operations:
- name: get-pipeline
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
Orchestrates content curation quality pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Content Curation Quality Pipeline"
description: "Orchestrates content curation quality pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- content
- spotify
- confluence
- grafana
- spotify
capability:
exposes:
- type: mcp
namespace: content
port: 8080
tools:
- name: content-curation-quality-pipeline
description: "Orchestrates content curation quality pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "confluence.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "grafana.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "spotify.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/content"
operations:
- name: execute-1
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/content"
operations:
- name: execute-2
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/content"
operations:
- name: execute-3
method: POST
Orchestrates content delivery optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Content Delivery Optimization Pipeline"
description: "Orchestrates content delivery optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- content
- spotify
- pagerduty
- confluence
- grafana
capability:
exposes:
- type: mcp
namespace: content
port: 8080
tools:
- name: content-delivery-optimization-pipeline
description: "Orchestrates content delivery optimization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "pagerduty.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "confluence.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "grafana.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/content"
operations:
- name: execute-1
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/content"
operations:
- name: execute-2
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/content"
operations:
- name: execute-3
method: POST
Orchestrates content geo restriction pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Content Geo Restriction Pipeline"
description: "Orchestrates content geo restriction pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- content
- spotify
- datadog
- github
- google-bigquery
capability:
exposes:
- type: mcp
namespace: content
port: 8080
tools:
- name: content-geo-restriction-pipeline
description: "Orchestrates content geo restriction pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "github.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "google-bigquery.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/content"
operations:
- name: execute-1
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/content"
operations:
- name: execute-2
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/content"
operations:
- name: execute-3
method: POST
Scans a batch of track ISRCs against the internal licensing database, cross-references with public rights registries, identifies gaps, and generates a JIRA ticket for the licensing team with a compliance summary.
naftiko: "0.5"
info:
label: "Content Licensing Compliance Audit"
description: "Scans a batch of track ISRCs against the internal licensing database, cross-references with public rights registries, identifies gaps, and generates a JIRA ticket for the licensing team with a compliance summary."
tags:
- content-management
- jira
- legal
- rights-management
- compliance
capability:
exposes:
- type: mcp
namespace: licensing-audit
port: 8080
tools:
- name: audit-licensing-compliance
description: "Given a list of ISRCs, check licensing status and create a JIRA ticket for any gaps found."
inputParameters:
- name: isrc_list
in: body
type: string
description: "Comma-separated list of ISRC codes to audit."
- name: market
in: body
type: string
description: "The market/country code to check licensing for."
steps:
- name: check-licenses
type: call
call: "licensing-api.batch-check"
with:
isrcs: "{{isrc_list}}"
market: "{{market}}"
- name: create-audit-ticket
type: call
call: "jira.create-issue"
with:
project_key: "LICENSING"
summary: "Compliance Audit: {{market}} - {{check-licenses.gap_count}} gaps found"
description: "Audited ISRCs: {{isrc_list}}\nMarket: {{market}}\nLicensed: {{check-licenses.licensed_count}}\nGaps: {{check-licenses.gap_count}}\nExpiring Soon: {{check-licenses.expiring_count}}\nDetails: {{check-licenses.gap_details}}"
issue_type: "Task"
consumes:
- type: http
namespace: licensing-api
baseUri: "https://licensing-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_licensing_token"
resources:
- name: batch-check
path: "/rights/batch-check"
operations:
- name: batch-check
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Orchestrates content moderation appeal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Content Moderation Appeal Pipeline"
description: "Orchestrates content moderation appeal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- content
- spotify
- slack
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: content
port: 8080
tools:
- name: content-moderation-appeal-pipeline
description: "Orchestrates content moderation appeal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/content"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/content"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/content"
operations:
- name: execute-3
method: POST
Fetches a podcast episode transcript, sends it to the Google Cloud Natural Language API for toxicity analysis, and if flagged, creates a JIRA ticket for the trust and safety team.
naftiko: "0.5"
info:
label: "Content Moderation Pipeline"
description: "Fetches a podcast episode transcript, sends it to the Google Cloud Natural Language API for toxicity analysis, and if flagged, creates a JIRA ticket for the trust and safety team."
tags:
- content-management
- google-cloud-platform
- jira
- trust-safety
- podcasts
capability:
exposes:
- type: mcp
namespace: content-moderation
port: 8080
tools:
- name: moderate-episode
description: "Given a podcast episode ID, analyze its transcript for toxicity and create a JIRA ticket if policy violations are detected."
inputParameters:
- name: episode_id
in: body
type: string
description: "The Spotify podcast episode ID."
- name: jira_project
in: body
type: string
description: "The JIRA project key for trust and safety tickets."
steps:
- name: get-episode
type: call
call: "spotify-api.get-episode"
with:
episode_id: "{{episode_id}}"
- name: analyze-content
type: call
call: "gcp-nlp.analyze-sentiment"
with:
content: "{{get-episode.description}}"
type: "PLAIN_TEXT"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project_key: "{{jira_project}}"
summary: "Content review: {{get-episode.name}} ({{get-episode.show_name}})"
description: "Episode flagged with sentiment score: {{analyze-content.documentSentiment_score}}. Magnitude: {{analyze-content.documentSentiment_magnitude}}. Review required."
issue_type: "Task"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: episodes
path: "/episodes/{{episode_id}}"
inputParameters:
- name: episode_id
in: path
operations:
- name: get-episode
method: GET
- type: http
namespace: gcp-nlp
baseUri: "https://language.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: documents
path: "/documents:analyzeSentiment"
operations:
- name: analyze-sentiment
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Orchestrates content safety review pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Content Safety Review Pipeline"
description: "Orchestrates content safety review pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- content
- spotify
- github
- google-bigquery
- pagerduty
capability:
exposes:
- type: mcp
namespace: content
port: 8080
tools:
- name: content-safety-review-pipeline
description: "Orchestrates content safety review pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "github.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "google-bigquery.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "pagerduty.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/content"
operations:
- name: execute-1
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/content"
operations:
- name: execute-2
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/content"
operations:
- name: execute-3
method: POST
When a copyright claim is filed, retrieves track metadata from Spotify, cross-references rights data with the internal licensing API, creates a JIRA ticket for the legal team, and notifies the artist via email through SendGrid.
naftiko: "0.5"
info:
label: "Copyright Claim Review Workflow"
description: "When a copyright claim is filed, retrieves track metadata from Spotify, cross-references rights data with the internal licensing API, creates a JIRA ticket for the legal team, and notifies the artist via email through SendGrid."
tags:
- content-management
- spotify-web-api
- jira
- sendgrid
- legal
- rights-management
capability:
exposes:
- type: mcp
namespace: rights-mgmt
port: 8080
tools:
- name: process-copyright-claim
description: "Given a track ID and claimant details, verify rights, create a legal review ticket, and notify the affected artist."
inputParameters:
- name: track_id
in: body
type: string
description: "The Spotify track ID under claim."
- name: claimant_name
in: body
type: string
description: "The name of the copyright claimant."
- name: claim_type
in: body
type: string
description: "The type of claim (composition, recording, both)."
steps:
- name: get-track
type: call
call: "spotify-api.get-track"
with:
track_id: "{{track_id}}"
- name: check-rights
type: call
call: "licensing-api.get-rights"
with:
isrc: "{{get-track.external_ids_isrc}}"
- name: create-review
type: call
call: "jira.create-issue"
with:
project_key: "LEGAL"
summary: "Copyright claim: {{get-track.name}} by {{get-track.artists_0_name}} - Claimant: {{claimant_name}}"
description: "Claim type: {{claim_type}}\nISRC: {{get-track.external_ids_isrc}}\nCurrent rights holder: {{check-rights.rights_holder}}\nLicense type: {{check-rights.license_type}}"
issue_type: "Task"
- name: notify-artist
type: call
call: "sendgrid.send-email"
with:
to: "{{check-rights.artist_contact_email}}"
subject: "Copyright Claim Notice - {{get-track.name}}"
body: "A {{claim_type}} copyright claim has been filed against your track '{{get-track.name}}' by {{claimant_name}}. Our legal team is reviewing (ticket: {{create-review.key}}). No action needed from you at this time."
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: tracks
path: "/tracks/{{track_id}}"
inputParameters:
- name: track_id
in: path
operations:
- name: get-track
method: GET
- type: http
namespace: licensing-api
baseUri: "https://licensing-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_licensing_token"
resources:
- name: rights
path: "/rights/{{isrc}}"
inputParameters:
- name: isrc
in: path
operations:
- name: get-rights
method: GET
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Orchestrates creator monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Creator Monetization Pipeline"
description: "Orchestrates creator monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- creator
- spotify
- grafana
- spotify
- snowflake
capability:
exposes:
- type: mcp
namespace: creator
port: 8080
tools:
- name: creator-monetization-pipeline
description: "Orchestrates creator monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "grafana.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "spotify.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/creator"
operations:
- name: execute-1
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/creator"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/creator"
operations:
- name: execute-3
method: POST
When a new podcast creator signs up, provisions their Spotify for Artists account, creates a JIRA onboarding ticket for the creator relations team, and sends a welcome email via SendGrid.
naftiko: "0.5"
info:
label: "Creator Onboarding Orchestrator"
description: "When a new podcast creator signs up, provisions their Spotify for Artists account, creates a JIRA onboarding ticket for the creator relations team, and sends a welcome email via SendGrid."
tags:
- creator-tools
- spotify-for-artists
- jira
- sendgrid
- onboarding
capability:
exposes:
- type: mcp
namespace: creator-onboarding
port: 8080
tools:
- name: onboard-creator
description: "Given a creator's name and email, provision their Spotify for Artists profile, open a JIRA ticket, and send a welcome email."
inputParameters:
- name: creator_name
in: body
type: string
description: "The podcast creator's display name."
- name: creator_email
in: body
type: string
description: "The creator's email address."
- name: show_uri
in: body
type: string
description: "The Spotify show URI to link to the creator account."
steps:
- name: provision-account
type: call
call: "s4a-api.provision-creator"
with:
name: "{{creator_name}}"
email: "{{creator_email}}"
show_uri: "{{show_uri}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project_key: "CREATOR"
summary: "Onboarding: {{creator_name}} ({{show_uri}})"
description: "New creator onboarded. S4A Account ID: {{provision-account.account_id}}. Ensure editorial review and feature flagging."
issue_type: "Task"
- name: send-welcome
type: call
call: "sendgrid.send-email"
with:
to: "{{creator_email}}"
subject: "Welcome to Spotify for Artists, {{creator_name}}!"
body: "Your Spotify for Artists account is ready. Track your show analytics at https://artists.spotify.com. Your onboarding ticket is {{create-ticket.key}}."
consumes:
- type: http
namespace: s4a-api
baseUri: "https://provider-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_s4a_token"
resources:
- name: creators
path: "/creators"
operations:
- name: provision-creator
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Checks the status of Apache Beam data pipelines on Google Cloud Dataflow, queries Prometheus for pipeline throughput metrics, and sends a health summary to the data engineering Slack channel.
naftiko: "0.5"
info:
label: "Data Pipeline Health Monitor"
description: "Checks the status of Apache Beam data pipelines on Google Cloud Dataflow, queries Prometheus for pipeline throughput metrics, and sends a health summary to the data engineering Slack channel."
tags:
- data-platform
- google-cloud-platform
- prometheus
- slack
- data-pipeline
capability:
exposes:
- type: mcp
namespace: data-pipeline-health
port: 8080
tools:
- name: check-pipeline-health
description: "Given a Dataflow job ID, check pipeline status and throughput, then post a health summary to Slack."
inputParameters:
- name: job_id
in: body
type: string
description: "The Google Cloud Dataflow job ID."
- name: project_id
in: body
type: string
description: "The GCP project ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for pipeline alerts."
steps:
- name: get-job
type: call
call: "dataflow.get-job"
with:
project_id: "{{project_id}}"
job_id: "{{job_id}}"
- name: get-throughput
type: call
call: "prometheus.query"
with:
query: "rate(dataflow_elements_produced_total{job_id=\"{{job_id}}\"}[5m])"
- name: post-health
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Pipeline Health: Job {{job_id}}\nState: {{get-job.currentState}}\nCreate Time: {{get-job.createTime}}\nThroughput: {{get-throughput.data_result_0_value_1}} elements/sec"
consumes:
- type: http
namespace: dataflow
baseUri: "https://dataflow.googleapis.com/v1b3"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/{{project_id}}/jobs/{{job_id}}"
inputParameters:
- name: project_id
in: path
- name: job_id
in: path
operations:
- name: get-job
method: GET
- type: http
namespace: prometheus
baseUri: "https://prometheus.spotify.net/api/v1"
authentication:
type: bearer
token: "$secrets.prometheus_token"
resources:
- name: query
path: "/query"
inputParameters:
- name: query
in: 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
After a Kubernetes canary deployment via Harness, queries Datadog for error rate and latency metrics, then posts a go/no-go recommendation to Slack for the on-call team.
naftiko: "0.5"
info:
label: "Deployment Canary Validation"
description: "After a Kubernetes canary deployment via Harness, queries Datadog for error rate and latency metrics, then posts a go/no-go recommendation to Slack for the on-call team."
tags:
- platform-engineering
- harness
- datadog
- slack
- ci-cd
capability:
exposes:
- type: mcp
namespace: deploy-validation
port: 8080
tools:
- name: validate-canary
description: "Given a Harness deployment ID and service name, check Datadog error rate and latency, then post a go/no-go to Slack."
inputParameters:
- name: deployment_id
in: body
type: string
description: "The Harness deployment execution ID."
- name: service_name
in: body
type: string
description: "The Spotify microservice name."
- name: slack_channel
in: body
type: string
description: "The Slack channel for deployment updates."
steps:
- name: get-deployment
type: call
call: "harness.get-execution"
with:
execution_id: "{{deployment_id}}"
- name: check-errors
type: call
call: "datadog.query-metrics"
with:
query: "avg:trace.error.rate{service:{{service_name}},deployment:canary}"
- name: check-latency
type: call
call: "datadog.query-metrics"
with:
query: "avg:trace.http.request.duration{service:{{service_name}},deployment:canary}"
- name: post-verdict
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Canary Validation for *{{service_name}}* (deployment: {{deployment_id}})\nError Rate: {{check-errors.series_0_pointlist_0_1}}%\nP50 Latency: {{check-latency.series_0_pointlist_0_1}}ms\nStatus: {{get-deployment.status}}\nVerdict: Review metrics before promoting."
consumes:
- type: http
namespace: harness
baseUri: "https://app.harness.io/gateway/api"
authentication:
type: bearer
token: "$secrets.harness_api_token"
resources:
- name: executions
path: "/executions/{{execution_id}}"
inputParameters:
- name: execution_id
in: path
operations:
- name: get-execution
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
inputParameters:
- name: DD-APPLICATION-KEY
in: header
value: "$secrets.datadog_app_key"
resources:
- name: metrics
path: "/query"
inputParameters:
- name: query
in: query
operations:
- name: query-metrics
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
Queries the Elasticsearch cluster for index health, shard allocation, and document count for Spotify's search indices. Used by the search infrastructure team for capacity planning.
naftiko: "0.5"
info:
label: "Elasticsearch Index Health Check"
description: "Queries the Elasticsearch cluster for index health, shard allocation, and document count for Spotify's search indices. Used by the search infrastructure team for capacity planning."
tags:
- platform-engineering
- elasticsearch
- search
capability:
exposes:
- type: mcp
namespace: search-infra
port: 8080
tools:
- name: get-index-health
description: "Check the health and stats of an Elasticsearch index including status, shard count, and document count."
inputParameters:
- name: index_name
in: body
type: string
description: "The Elasticsearch index name."
call: "elasticsearch.get-index-stats"
with:
index_name: "{{index_name}}"
outputParameters:
- name: health
type: string
mapping: "$.status"
- name: primary_shards
type: number
mapping: "$._shards.successful"
- name: doc_count
type: number
mapping: "$._all.primaries.docs.count"
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://es-cluster.spotify.net:9200"
authentication:
type: basic
username: "$secrets.es_user"
password: "$secrets.es_password"
resources:
- name: index-stats
path: "/{{index_name}}/_stats"
inputParameters:
- name: index_name
in: path
operations:
- name: get-index-stats
method: GET
Creates or updates a feature flag in the internal feature flag service, triggers a Backstage annotation update, and notifies the product team on Slack with rollout details.
naftiko: "0.5"
info:
label: "Feature Flag Rollout Coordinator"
description: "Creates or updates a feature flag in the internal feature flag service, triggers a Backstage annotation update, and notifies the product team on Slack with rollout details."
tags:
- platform-engineering
- backstage
- slack
- feature-flags
- experimentation
capability:
exposes:
- type: mcp
namespace: feature-flags
port: 8080
tools:
- name: rollout-feature-flag
description: "Given a flag name and rollout percentage, update the feature flag, annotate the Backstage component, and notify the product team."
inputParameters:
- name: flag_name
in: body
type: string
description: "The feature flag identifier."
- name: rollout_percentage
in: body
type: number
description: "The rollout percentage (0-100)."
- name: component_name
in: body
type: string
description: "The Backstage component owning the flag."
- name: slack_channel
in: body
type: string
description: "The Slack channel for rollout notifications."
steps:
- name: update-flag
type: call
call: "feature-flag-api.update-flag"
with:
flag_name: "{{flag_name}}"
rollout_percentage: "{{rollout_percentage}}"
- name: annotate-component
type: call
call: "backstage.update-annotation"
with:
component_name: "{{component_name}}"
annotation_key: "spotify.com/feature-flag-{{flag_name}}"
annotation_value: "{{rollout_percentage}}%"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Feature Flag Rollout: *{{flag_name}}*\nComponent: {{component_name}}\nRollout: {{rollout_percentage}}%\nUpdated at: {{update-flag.updated_at}}"
consumes:
- type: http
namespace: feature-flag-api
baseUri: "https://feature-flags.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_ff_token"
resources:
- name: flags
path: "/flags/{{flag_name}}"
inputParameters:
- name: flag_name
in: path
operations:
- name: update-flag
method: PUT
- type: http
namespace: backstage
baseUri: "https://backstage.spotify.net/api/catalog"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: annotations
path: "/entities/by-name/component/default/{{component_name}}/annotations"
inputParameters:
- name: component_name
in: path
operations:
- name: update-annotation
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 performance metrics for a Google Ads campaign used by Spotify's digital advertising team, including impressions, clicks, cost, and conversions.
naftiko: "0.5"
info:
label: "Fetch Google Ads Campaign Metrics"
description: "Retrieves performance metrics for a Google Ads campaign used by Spotify's digital advertising team, including impressions, clicks, cost, and conversions."
tags:
- advertising
- google-ads
- marketing-analytics
capability:
exposes:
- type: mcp
namespace: ad-analytics
port: 8080
tools:
- name: get-campaign-metrics
description: "Fetch Google Ads campaign performance by customer ID and campaign ID. Returns impressions, clicks, cost, and conversions."
inputParameters:
- name: customer_id
in: body
type: string
description: "The Google Ads customer ID."
- name: campaign_id
in: body
type: string
description: "The Google Ads campaign ID."
call: "google-ads.get-campaign"
with:
customer_id: "{{customer_id}}"
campaign_id: "{{campaign_id}}"
consumes:
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v16/customers"
authentication:
type: bearer
token: "$secrets.google_ads_token"
inputParameters:
- name: developer-token
in: header
value: "$secrets.google_ads_developer_token"
resources:
- name: campaigns
path: "/{{customer_id}}/campaigns/{{campaign_id}}"
inputParameters:
- name: customer_id
in: path
- name: campaign_id
in: path
operations:
- name: get-campaign
method: GET
Retrieves metadata for a Spotify podcast episode by ID including title, show name, duration, release date, and description.
naftiko: "0.5"
info:
label: "Fetch Podcast Episode Details"
description: "Retrieves metadata for a Spotify podcast episode by ID including title, show name, duration, release date, and description."
tags:
- content-management
- spotify-web-api
- podcasts
capability:
exposes:
- type: mcp
namespace: content-podcasts
port: 8080
tools:
- name: get-episode
description: "Look up a podcast episode by ID returning title, show name, duration, release date, and description."
inputParameters:
- name: episode_id
in: body
type: string
description: "The Spotify episode ID."
call: "spotify-api.get-episode"
with:
episode_id: "{{episode_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: show_name
type: string
mapping: "$.show.name"
- name: duration_ms
type: number
mapping: "$.duration_ms"
- name: release_date
type: string
mapping: "$.release_date"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: episodes
path: "/episodes/{{episode_id}}"
inputParameters:
- name: episode_id
in: path
operations:
- name: get-episode
method: GET
Retrieves get album metadata data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Album Metadata"
description: "Retrieves get album metadata data from the Spotify music streaming systems."
tags:
- get
- spotify
- metadata
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-album-metadata
description: "Retrieves get album metadata data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-album-metadata"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/album/metadata/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-album-metadata
method: GET
Looks up a Spotify artist by ID returning name, genres, follower count, and popularity index for creator analytics dashboards.
naftiko: "0.5"
info:
label: "Get Artist Profile"
description: "Looks up a Spotify artist by ID returning name, genres, follower count, and popularity index for creator analytics dashboards."
tags:
- creator-tools
- spotify-web-api
- artists
capability:
exposes:
- type: mcp
namespace: creator-analytics
port: 8080
tools:
- name: get-artist
description: "Retrieve an artist profile by ID with name, genres, followers, and popularity."
inputParameters:
- name: artist_id
in: body
type: string
description: "The Spotify artist ID."
call: "spotify-api.get-artist"
with:
artist_id: "{{artist_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: genres
type: string
mapping: "$.genres"
- name: followers
type: number
mapping: "$.followers.total"
- name: popularity
type: number
mapping: "$.popularity"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: artists
path: "/artists/{{artist_id}}"
inputParameters:
- name: artist_id
in: path
operations:
- name: get-artist
method: GET
Retrieves Spotify audio features for a track including danceability, energy, tempo, valence, and acousticness. Used by recommendation and ML teams for feature engineering.
naftiko: "0.5"
info:
label: "Get Audio Features"
description: "Retrieves Spotify audio features for a track including danceability, energy, tempo, valence, and acousticness. Used by recommendation and ML teams for feature engineering."
tags:
- machine-learning
- spotify-web-api
- audio-analysis
capability:
exposes:
- type: mcp
namespace: ml-audio
port: 8080
tools:
- name: get-audio-features
description: "Return audio features for a track: danceability, energy, tempo, valence, acousticness, instrumentalness."
inputParameters:
- name: track_id
in: body
type: string
description: "The Spotify track ID."
call: "spotify-api.get-audio-features"
with:
track_id: "{{track_id}}"
outputParameters:
- name: danceability
type: number
mapping: "$.danceability"
- name: energy
type: number
mapping: "$.energy"
- name: tempo
type: number
mapping: "$.tempo"
- name: valence
type: number
mapping: "$.valence"
- name: acousticness
type: number
mapping: "$.acousticness"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: audio-features
path: "/audio-features/{{track_id}}"
inputParameters:
- name: track_id
in: path
operations:
- name: get-audio-features
method: GET
Retrieves get audiobook details data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Audiobook Details"
description: "Retrieves get audiobook details data from the Spotify music streaming systems."
tags:
- get
- spotify
- details
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-audiobook-details
description: "Retrieves get audiobook details data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-audiobook-details"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/audiobook/details/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-audiobook-details
method: GET
Retrieves get available devices data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Available Devices"
description: "Retrieves get available devices data from the Spotify music streaming systems."
tags:
- get
- spotify
- devices
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-available-devices
description: "Retrieves get available devices data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-available-devices"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/available/devices/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-available-devices
method: GET
Retrieves get available genres data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Available Genres"
description: "Retrieves get available genres data from the Spotify music streaming systems."
tags:
- get
- spotify
- genres
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-available-genres
description: "Retrieves get available genres data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-available-genres"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/available/genres/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-available-genres
method: GET
Queries the Backstage service catalog for a Spotify component by name, returning owner team, lifecycle phase, and system membership.
naftiko: "0.5"
info:
label: "Get Backstage Service Catalog Entry"
description: "Queries the Backstage service catalog for a Spotify component by name, returning owner team, lifecycle phase, and system membership."
tags:
- platform-engineering
- backstage
- developer-experience
capability:
exposes:
- type: mcp
namespace: service-catalog
port: 8080
tools:
- name: get-component
description: "Look up a Backstage catalog component by name. Returns owner, lifecycle, system, and description."
inputParameters:
- name: component_name
in: body
type: string
description: "The Backstage component name."
call: "backstage.get-entity"
with:
component_name: "{{component_name}}"
outputParameters:
- name: owner
type: string
mapping: "$.spec.owner"
- name: lifecycle
type: string
mapping: "$.spec.lifecycle"
- name: system
type: string
mapping: "$.spec.system"
consumes:
- type: http
namespace: backstage
baseUri: "https://backstage.spotify.net/api/catalog"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: entities
path: "/entities/by-name/component/default/{{component_name}}"
inputParameters:
- name: component_name
in: path
operations:
- name: get-entity
method: GET
Retrieves get category playlists data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Category Playlists"
description: "Retrieves get category playlists data from the Spotify music streaming systems."
tags:
- get
- spotify
- playlists
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-category-playlists
description: "Retrieves get category playlists data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-category-playlists"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/category/playlists/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-category-playlists
method: GET
Retrieves get episode chapters data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Episode Chapters"
description: "Retrieves get episode chapters data from the Spotify music streaming systems."
tags:
- get
- spotify
- chapters
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-episode-chapters
description: "Retrieves get episode chapters data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-episode-chapters"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/episode/chapters/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-episode-chapters
method: GET
Retrieves get featured playlists data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Featured Playlists"
description: "Retrieves get featured playlists data from the Spotify music streaming systems."
tags:
- get
- spotify
- playlists
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-featured-playlists
description: "Retrieves get featured playlists data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-featured-playlists"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/featured/playlists/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-featured-playlists
method: GET
Retrieves get followed artists data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Followed Artists"
description: "Retrieves get followed artists data from the Spotify music streaming systems."
tags:
- get
- spotify
- artists
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-followed-artists
description: "Retrieves get followed artists data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-followed-artists"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/followed/artists/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-followed-artists
method: GET
Retrieves get market availability data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Market Availability"
description: "Retrieves get market availability data from the Spotify music streaming systems."
tags:
- get
- spotify
- availability
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-market-availability
description: "Retrieves get market availability data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-market-availability"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/market/availability/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-market-availability
method: GET
Retrieves get new releases data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get New Releases"
description: "Retrieves get new releases data from the Spotify music streaming systems."
tags:
- get
- spotify
- releases
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-new-releases
description: "Retrieves get new releases data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-new-releases"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/new/releases/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-new-releases
method: GET
Retrieves get player state data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Player State"
description: "Retrieves get player state data from the Spotify music streaming systems."
tags:
- get
- spotify
- state
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-player-state
description: "Retrieves get player state data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-player-state"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/player/state/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-player-state
method: GET
Fetches a Spotify playlist by ID including name, description, owner, follower count, and track listing for editorial or curation review.
naftiko: "0.5"
info:
label: "Get Playlist Details"
description: "Fetches a Spotify playlist by ID including name, description, owner, follower count, and track listing for editorial or curation review."
tags:
- content-management
- spotify-web-api
- playlists
capability:
exposes:
- type: mcp
namespace: content-playlists
port: 8080
tools:
- name: get-playlist
description: "Retrieve a playlist by ID with name, description, owner, follower count, and tracks."
inputParameters:
- name: playlist_id
in: body
type: string
description: "The Spotify playlist ID."
call: "spotify-api.get-playlist"
with:
playlist_id: "{{playlist_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: description
type: string
mapping: "$.description"
- name: owner
type: string
mapping: "$.owner.display_name"
- name: followers
type: number
mapping: "$.followers.total"
- name: total_tracks
type: number
mapping: "$.tracks.total"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: playlists
path: "/playlists/{{playlist_id}}"
inputParameters:
- name: playlist_id
in: path
operations:
- name: get-playlist
method: GET
Retrieves get recently played data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Recently Played"
description: "Retrieves get recently played data from the Spotify music streaming systems."
tags:
- get
- spotify
- played
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-recently-played
description: "Retrieves get recently played data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-recently-played"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/recently/played/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-recently-played
method: GET
Retrieves get saved tracks data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Saved Tracks"
description: "Retrieves get saved tracks data from the Spotify music streaming systems."
tags:
- get
- spotify
- tracks
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-saved-tracks
description: "Retrieves get saved tracks data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-saved-tracks"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/saved/tracks/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-saved-tracks
method: GET
Retrieves get show details data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Show Details"
description: "Retrieves get show details data from the Spotify music streaming systems."
tags:
- get
- spotify
- details
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-show-details
description: "Retrieves get show details data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-show-details"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/show/details/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-show-details
method: GET
Queries the Spotify for Artists API for streaming stats on a given track within a date range, returning total streams, listeners, and saves.
naftiko: "0.5"
info:
label: "Get Spotify for Artists Stream Count"
description: "Queries the Spotify for Artists API for streaming stats on a given track within a date range, returning total streams, listeners, and saves."
tags:
- creator-tools
- spotify-for-artists
- analytics
capability:
exposes:
- type: mcp
namespace: creator-stats
port: 8080
tools:
- name: get-track-streams
description: "Retrieve streaming statistics for a track within a date range. Returns total streams, unique listeners, and saves."
inputParameters:
- name: track_uri
in: body
type: string
description: "The Spotify track URI."
- name: start_date
in: body
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "End date in YYYY-MM-DD format."
call: "s4a-api.get-track-stats"
with:
track_uri: "{{track_uri}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
consumes:
- type: http
namespace: s4a-api
baseUri: "https://provider-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_s4a_token"
resources:
- name: track-stats
path: "/analytics/tracks/{{track_uri}}"
inputParameters:
- name: track_uri
in: path
- name: start_date
in: query
- name: end_date
in: query
operations:
- name: get-track-stats
method: GET
Retrieves get top items data from the Spotify music streaming systems.
naftiko: "0.5"
info:
label: "Get Top Items"
description: "Retrieves get top items data from the Spotify music streaming systems."
tags:
- get
- spotify
- items
capability:
exposes:
- type: mcp
namespace: get
port: 8080
tools:
- name: get-top-items
description: "Retrieves get top items data from the Spotify music streaming systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "spotify.get-top-items"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: resource
path: "/get/top/items/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: get-top-items
method: GET
Retrieves detailed metadata for a Spotify track by ID, including title, artist, album, duration, and popularity score.
naftiko: "0.5"
info:
label: "Get Track Metadata"
description: "Retrieves detailed metadata for a Spotify track by ID, including title, artist, album, duration, and popularity score."
tags:
- content-management
- spotify-web-api
capability:
exposes:
- type: mcp
namespace: content-catalog
port: 8080
tools:
- name: get-track
description: "Look up a Spotify track by its ID and return title, artist, album, duration, and popularity."
inputParameters:
- name: track_id
in: body
type: string
description: "The Spotify track ID."
call: "spotify-api.get-track"
with:
track_id: "{{track_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: artist
type: string
mapping: "$.artists[0].name"
- name: album
type: string
mapping: "$.album.name"
- name: duration_ms
type: number
mapping: "$.duration_ms"
- name: popularity
type: number
mapping: "$.popularity"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: tracks
path: "/tracks/{{track_id}}"
inputParameters:
- name: track_id
in: path
operations:
- name: get-track
method: GET
Fetches the status and review state of a GitHub pull request in a Spotify repository. Used by platform engineering to check CI/CD gate readiness.
naftiko: "0.5"
info:
label: "GitHub Pull Request Status"
description: "Fetches the status and review state of a GitHub pull request in a Spotify repository. Used by platform engineering to check CI/CD gate readiness."
tags:
- platform-engineering
- github
- ci-cd
capability:
exposes:
- type: mcp
namespace: dev-workflow
port: 8080
tools:
- name: get-pr-status
description: "Look up a GitHub pull request by repo and PR number. Returns title, state, mergeable status, and review decision."
inputParameters:
- name: repo
in: body
type: string
description: "The repository name (org/repo format)."
- name: pr_number
in: body
type: string
description: "The pull request number."
call: "github.get-pull"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: state
type: string
mapping: "$.state"
- name: mergeable
type: string
mapping: "$.mergeable"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pulls
path: "/repos/{{repo}}/pulls/{{pr_number}}"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: get-pull
method: GET
On a Datadog alert, creates a PagerDuty incident, opens a dedicated Slack channel for war-room coordination, and files a GitHub issue for post-incident tracking.
naftiko: "0.5"
info:
label: "Incident Response Orchestrator"
description: "On a Datadog alert, creates a PagerDuty incident, opens a dedicated Slack channel for war-room coordination, and files a GitHub issue for post-incident tracking."
tags:
- platform-engineering
- datadog
- pagerduty
- slack
- github
- incident-response
capability:
exposes:
- type: mcp
namespace: incident-mgmt
port: 8080
tools:
- name: trigger-incident-response
description: "Given a Datadog alert ID and severity, create a PagerDuty incident, open a Slack war-room channel, and file a GitHub issue."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Datadog alert/event ID."
- name: severity
in: body
type: string
description: "Incident severity level (SEV1, SEV2, SEV3)."
- name: service_name
in: body
type: string
description: "The affected Spotify service name."
steps:
- name: get-alert
type: call
call: "datadog.get-event"
with:
event_id: "{{alert_id}}"
- name: create-incident
type: call
call: "pagerduty.create-incident"
with:
title: "{{severity}}: {{service_name}} - {{get-alert.title}}"
urgency: "high"
service_id: "{{service_name}}"
- name: create-war-room
type: call
call: "slack.create-channel"
with:
name: "inc-{{service_name}}-{{alert_id}}"
- name: post-context
type: call
call: "slack.post-message"
with:
channel: "{{create-war-room.channel_id}}"
text: "Incident opened for *{{service_name}}*\nSeverity: {{severity}}\nDatadog Alert: {{get-alert.url}}\nPagerDuty: {{create-incident.html_url}}"
- name: file-issue
type: call
call: "github.create-issue"
with:
repo: "spotify/{{service_name}}"
title: "Incident: {{severity}} - {{get-alert.title}}"
body: "PagerDuty: {{create-incident.html_url}}\nSlack Channel: #inc-{{service_name}}-{{alert_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
inputParameters:
- name: DD-APPLICATION-KEY
in: header
value: "$secrets.datadog_app_key"
resources:
- name: events
path: "/events/{{event_id}}"
inputParameters:
- name: event_id
in: path
operations:
- name: get-event
method: GET
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
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: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: issues
path: "/repos/{{repo}}/issues"
inputParameters:
- name: repo
in: path
operations:
- name: create-issue
method: POST
Queries Prometheus for Kubernetes cluster CPU and memory utilization, checks current replica counts via the Kubernetes API, and posts a scaling recommendation to the platform team on Slack.
naftiko: "0.5"
info:
label: "Kubernetes Cluster Scaling Report"
description: "Queries Prometheus for Kubernetes cluster CPU and memory utilization, checks current replica counts via the Kubernetes API, and posts a scaling recommendation to the platform team on Slack."
tags:
- platform-engineering
- prometheus
- kubernetes
- slack
- autoscaling
capability:
exposes:
- type: mcp
namespace: k8s-scaling
port: 8080
tools:
- name: generate-scaling-report
description: "Given a Kubernetes namespace and deployment name, check resource utilization and post a scaling recommendation to Slack."
inputParameters:
- name: namespace
in: body
type: string
description: "The Kubernetes namespace."
- name: deployment_name
in: body
type: string
description: "The Kubernetes deployment name."
- name: slack_channel
in: body
type: string
description: "The Slack channel for scaling reports."
steps:
- name: get-cpu
type: call
call: "prometheus.query"
with:
query: "avg(rate(container_cpu_usage_seconds_total{namespace=\"{{namespace}}\",pod=~\"{{deployment_name}}.*\"}[5m]))"
- name: get-memory
type: call
call: "prometheus.query"
with:
query: "avg(container_memory_working_set_bytes{namespace=\"{{namespace}}\",pod=~\"{{deployment_name}}.*\"})"
- name: get-replicas
type: call
call: "k8s.get-deployment"
with:
namespace: "{{namespace}}"
deployment: "{{deployment_name}}"
- name: post-report
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Scaling Report: *{{deployment_name}}* ({{namespace}})\nCurrent Replicas: {{get-replicas.spec_replicas}}\nAvg CPU: {{get-cpu.data_result_0_value_1}} cores\nAvg Memory: {{get-memory.data_result_0_value_1}} bytes\nRecommendation: Review if utilization exceeds 70%."
consumes:
- type: http
namespace: prometheus
baseUri: "https://prometheus.spotify.net/api/v1"
authentication:
type: bearer
token: "$secrets.prometheus_token"
resources:
- name: query
path: "/query"
inputParameters:
- name: query
in: query
operations:
- name: query
method: GET
- type: http
namespace: k8s
baseUri: "https://k8s-api.spotify.net/apis/apps/v1"
authentication:
type: bearer
token: "$secrets.k8s_token"
resources:
- name: deployments
path: "/namespaces/{{namespace}}/deployments/{{deployment}}"
inputParameters:
- name: namespace
in: path
- name: deployment
in: path
operations:
- name: get-deployment
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
Retrieves metadata for a BigQuery dataset used by Spotify's data platform, including table count, location, and default partition expiration.
naftiko: "0.5"
info:
label: "Lookup Google Cloud BigQuery Dataset"
description: "Retrieves metadata for a BigQuery dataset used by Spotify's data platform, including table count, location, and default partition expiration."
tags:
- data-platform
- google-cloud-platform
- bigquery
capability:
exposes:
- type: mcp
namespace: data-catalog
port: 8080
tools:
- name: get-dataset
description: "Look up a BigQuery dataset by project and dataset ID. Returns location, table count, and default expiration."
inputParameters:
- name: project_id
in: body
type: string
description: "The GCP project ID."
- name: dataset_id
in: body
type: string
description: "The BigQuery dataset ID."
call: "bigquery.get-dataset"
with:
project_id: "{{project_id}}"
dataset_id: "{{dataset_id}}"
outputParameters:
- name: location
type: string
mapping: "$.location"
- name: default_table_expiration_ms
type: string
mapping: "$.defaultTableExpirationMs"
consumes:
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: datasets
path: "/projects/{{project_id}}/datasets/{{dataset_id}}"
inputParameters:
- name: project_id
in: path
- name: dataset_id
in: path
operations:
- name: get-dataset
method: GET
Reads SLO definitions from Backstage, queries Datadog for current SLI metrics, and updates a Google Sheets dashboard with compliance status for platform engineering review.
naftiko: "0.5"
info:
label: "Microservice SLO Dashboard Sync"
description: "Reads SLO definitions from Backstage, queries Datadog for current SLI metrics, and updates a Google Sheets dashboard with compliance status for platform engineering review."
tags:
- platform-engineering
- backstage
- datadog
- google-sheets
- observability
capability:
exposes:
- type: mcp
namespace: slo-dashboard
port: 8080
tools:
- name: sync-slo-dashboard
description: "Given a Backstage component name and Google Sheet ID, pull SLO definitions, measure SLIs from Datadog, and update the dashboard."
inputParameters:
- name: component_name
in: body
type: string
description: "The Backstage component name."
- name: spreadsheet_id
in: body
type: string
description: "The Google Sheets spreadsheet ID."
steps:
- name: get-slo-config
type: call
call: "backstage.get-entity"
with:
component_name: "{{component_name}}"
- name: get-availability
type: call
call: "datadog.query-slo"
with:
slo_id: "{{get-slo-config.metadata_annotations_datadog_slo_id}}"
- name: update-sheet
type: call
call: "google-sheets.append-row"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "SLO Dashboard!A:F"
values: "{{component_name}},{{get-availability.overall_status_0_sli_value}},{{get-availability.overall_status_0_target}},{{get-availability.overall_status_0_timeframe}}"
consumes:
- type: http
namespace: backstage
baseUri: "https://backstage.spotify.net/api/catalog"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: entities
path: "/entities/by-name/component/default/{{component_name}}"
inputParameters:
- name: component_name
in: path
operations:
- name: get-entity
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
name: "DD-API-KEY"
in: header
value: "$secrets.datadog_api_key"
inputParameters:
- name: DD-APPLICATION-KEY
in: header
value: "$secrets.datadog_app_key"
resources:
- name: slos
path: "/slo/{{slo_id}}"
inputParameters:
- name: slo_id
in: path
operations:
- name: query-slo
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}:append"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: append-row
method: POST
Queries the Google Cloud Vertex AI model registry for a deployed model's metadata including version, endpoint, and serving status. Used by ML engineers for model lifecycle management.
naftiko: "0.5"
info:
label: "ML Model Registry Lookup"
description: "Queries the Google Cloud Vertex AI model registry for a deployed model's metadata including version, endpoint, and serving status. Used by ML engineers for model lifecycle management."
tags:
- machine-learning
- google-cloud-platform
- model-registry
capability:
exposes:
- type: mcp
namespace: ml-registry
port: 8080
tools:
- name: get-model-info
description: "Look up a Vertex AI model by ID. Returns display name, version, endpoint URI, and deployment state."
inputParameters:
- name: model_id
in: body
type: string
description: "The Vertex AI model ID."
call: "vertex-ai.get-model"
with:
model_id: "{{model_id}}"
outputParameters:
- name: display_name
type: string
mapping: "$.displayName"
- name: version_id
type: string
mapping: "$.versionId"
- name: artifact_uri
type: string
mapping: "$.artifactUri"
- name: deployment_state
type: string
mapping: "$.deployedModels[0].deployedModelId"
consumes:
- type: http
namespace: vertex-ai
baseUri: "https://us-central1-aiplatform.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: models
path: "/projects/spotify-ml/locations/us-central1/models/{{model_id}}"
inputParameters:
- name: model_id
in: path
operations:
- name: get-model
method: GET
Triggers a recommendation model training job on Google Cloud Vertex AI, monitors the run, and posts training completion status with metrics to the ML team's Slack channel.
naftiko: "0.5"
info:
label: "ML Model Training Pipeline Trigger"
description: "Triggers a recommendation model training job on Google Cloud Vertex AI, monitors the run, and posts training completion status with metrics to the ML team's Slack channel."
tags:
- machine-learning
- google-cloud-platform
- slack
- recommendation
capability:
exposes:
- type: mcp
namespace: ml-training
port: 8080
tools:
- name: trigger-model-training
description: "Given a training pipeline ID and Slack channel, launch a Vertex AI training run and notify the team upon completion."
inputParameters:
- name: pipeline_id
in: body
type: string
description: "The Vertex AI training pipeline ID."
- name: model_name
in: body
type: string
description: "The model display name for the training run."
- name: slack_channel
in: body
type: string
description: "The Slack channel for training notifications."
steps:
- name: start-training
type: call
call: "vertex-ai.create-training-job"
with:
pipeline_id: "{{pipeline_id}}"
display_name: "{{model_name}}"
- name: get-job-status
type: call
call: "vertex-ai.get-training-job"
with:
job_id: "{{start-training.name}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "ML Training Complete: *{{model_name}}*\nPipeline: {{pipeline_id}}\nStatus: {{get-job-status.state}}\nModel Artifact: {{get-job-status.modelToUpload_artifactUri}}"
consumes:
- type: http
namespace: vertex-ai
baseUri: "https://us-central1-aiplatform.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: training-pipelines
path: "/projects/spotify-ml/locations/us-central1/trainingPipelines"
operations:
- name: create-training-job
method: POST
- name: training-jobs
path: "/projects/spotify-ml/locations/us-central1/trainingPipelines/{{job_id}}"
inputParameters:
- name: job_id
in: path
operations:
- name: get-training-job
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
Orchestrates music catalog dedup pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Music Catalog Dedup Pipeline"
description: "Orchestrates music catalog dedup pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- music
- spotify
- spotify
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: music
port: 8080
tools:
- name: music-catalog-dedup-pipeline
description: "Orchestrates music catalog dedup pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "spotify.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/music"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/music"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/music"
operations:
- name: execute-3
method: POST
Orchestrates music licensing renewal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Music Licensing Renewal Pipeline"
description: "Orchestrates music licensing renewal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- music
- spotify
- google-bigquery
- pagerduty
- confluence
capability:
exposes:
- type: mcp
namespace: music
port: 8080
tools:
- name: music-licensing-renewal-pipeline
description: "Orchestrates music licensing renewal pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "google-bigquery.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "pagerduty.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "confluence.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/music"
operations:
- name: execute-1
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/music"
operations:
- name: execute-2
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/music"
operations:
- name: execute-3
method: POST
Orchestrates music recommendation model pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Music Recommendation Model Pipeline"
description: "Orchestrates music recommendation model pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- music
- spotify
- slack
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: music
port: 8080
tools:
- name: music-recommendation-model-pipeline
description: "Orchestrates music recommendation model pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/music"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/music"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/music"
operations:
- name: execute-3
method: POST
Orchestrates music rights ingestion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Music Rights Ingestion Pipeline"
description: "Orchestrates music rights ingestion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- music
- spotify
- jira
- datadog
- github
capability:
exposes:
- type: mcp
namespace: music
port: 8080
tools:
- name: music-rights-ingestion-pipeline
description: "Orchestrates music rights ingestion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "github.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/music"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/music"
operations:
- name: execute-2
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/music"
operations:
- name: execute-3
method: POST
Orchestrates music video integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Music Video Integration Pipeline"
description: "Orchestrates music video integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- music
- spotify
- slack
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: music
port: 8080
tools:
- name: music-video-integration-pipeline
description: "Orchestrates music video integration pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/music"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/music"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/music"
operations:
- name: execute-3
method: POST
When a new album is released, fetches album metadata from the Spotify Web API, creates a Backstage catalog entry for the release campaign, and sends a Slack notification to the editorial team.
naftiko: "0.5"
info:
label: "New Release Content Sync"
description: "When a new album is released, fetches album metadata from the Spotify Web API, creates a Backstage catalog entry for the release campaign, and sends a Slack notification to the editorial team."
tags:
- content-management
- spotify-web-api
- backstage
- slack
- editorial
capability:
exposes:
- type: mcp
namespace: content-releases
port: 8080
tools:
- name: sync-new-release
description: "Given a Spotify album ID, fetch album metadata, register a Backstage catalog entity for the release campaign, and notify the editorial Slack channel."
inputParameters:
- name: album_id
in: body
type: string
description: "The Spotify album ID for the new release."
- name: editorial_channel
in: body
type: string
description: "The Slack channel ID for editorial notifications."
steps:
- name: fetch-album
type: call
call: "spotify-api.get-album"
with:
album_id: "{{album_id}}"
- name: register-campaign
type: call
call: "backstage.register-entity"
with:
kind: "Component"
name: "release-{{album_id}}"
description: "Release campaign for {{fetch-album.name}} by {{fetch-album.artists_0_name}}"
owner: "editorial-team"
- name: notify-editorial
type: call
call: "slack.post-message"
with:
channel: "{{editorial_channel}}"
text: "New release registered: *{{fetch-album.name}}* by {{fetch-album.artists_0_name}} ({{fetch-album.total_tracks}} tracks, {{fetch-album.release_date}}). Backstage entry: {{register-campaign.metadata_uid}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: albums
path: "/albums/{{album_id}}"
inputParameters:
- name: album_id
in: path
operations:
- name: get-album
method: GET
- type: http
namespace: backstage
baseUri: "https://backstage.spotify.net/api/catalog"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: entities
path: "/entities"
operations:
- name: register-entity
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 the current on-call rotation from PagerDuty and posts a daily summary to the platform engineering Slack channel with the active responders and escalation policy.
naftiko: "0.5"
info:
label: "On-Call Rotation Sync"
description: "Fetches the current on-call rotation from PagerDuty and posts a daily summary to the platform engineering Slack channel with the active responders and escalation policy."
tags:
- platform-engineering
- pagerduty
- slack
- on-call
capability:
exposes:
- type: mcp
namespace: oncall-mgmt
port: 8080
tools:
- name: sync-oncall-rotation
description: "Given a PagerDuty schedule ID and Slack channel, fetch the current on-call and post a summary."
inputParameters:
- name: schedule_id
in: body
type: string
description: "The PagerDuty schedule ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for on-call updates."
steps:
- name: get-oncall
type: call
call: "pagerduty.get-oncall"
with:
schedule_id: "{{schedule_id}}"
- name: post-rotation
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "On-Call Rotation Update:\nCurrent Primary: {{get-oncall.oncalls_0_user_summary}}\nSchedule: {{get-oncall.oncalls_0_schedule_summary}}\nEscalation: {{get-oncall.oncalls_0_escalation_policy_summary}}\nShift Ends: {{get-oncall.oncalls_0_end}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: oncalls
path: "/oncalls"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-oncall
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
Queries OpenTelemetry trace data for a Spotify service via the collector API, identifies slow spans, and posts a latency breakdown to the platform engineering Slack channel.
naftiko: "0.5"
info:
label: "OpenTelemetry Trace Analysis"
description: "Queries OpenTelemetry trace data for a Spotify service via the collector API, identifies slow spans, and posts a latency breakdown to the platform engineering Slack channel."
tags:
- platform-engineering
- opentelemetry
- slack
- observability
- tracing
capability:
exposes:
- type: mcp
namespace: trace-analysis
port: 8080
tools:
- name: analyze-traces
description: "Given a service name and time window, fetch trace data, identify slow spans, and post a latency breakdown to Slack."
inputParameters:
- name: service_name
in: body
type: string
description: "The Spotify service name."
- name: time_window
in: body
type: string
description: "The time window for trace query (e.g. 1h, 30m)."
- name: slack_channel
in: body
type: string
description: "The Slack channel for trace analysis."
steps:
- name: get-traces
type: call
call: "otel-collector.query-traces"
with:
service: "{{service_name}}"
lookback: "{{time_window}}"
- name: post-analysis
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Trace Analysis: *{{service_name}}* (last {{time_window}})\nTotal Traces: {{get-traces.total_traces}}\nAvg Duration: {{get-traces.avg_duration_ms}}ms\nP99 Duration: {{get-traces.p99_duration_ms}}ms\nSlowest Span: {{get-traces.slowest_span_name}} ({{get-traces.slowest_span_duration_ms}}ms)"
consumes:
- type: http
namespace: otel-collector
baseUri: "https://otel-query.spotify.net/api/v1"
authentication:
type: bearer
token: "$secrets.otel_token"
resources:
- name: traces
path: "/traces"
inputParameters:
- name: service
in: query
- name: lookback
in: query
operations:
- name: query-traces
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 a user's top tracks and listening history from Spotify, generates seed recommendations using the recommendations API, creates a new personalized playlist, and logs the generation event to BigQuery.
naftiko: "0.5"
info:
label: "Personalized Playlist Generation Pipeline"
description: "Fetches a user's top tracks and listening history from Spotify, generates seed recommendations using the recommendations API, creates a new personalized playlist, and logs the generation event to BigQuery."
tags:
- recommendation
- spotify-web-api
- google-cloud-platform
- personalization
- machine-learning
capability:
exposes:
- type: mcp
namespace: recommendation-engine
port: 8080
tools:
- name: generate-personalized-playlist
description: "Given a user ID, generate a personalized playlist from their listening history and seed recommendations, then log the event."
inputParameters:
- name: user_id
in: body
type: string
description: "The Spotify user ID."
- name: playlist_name
in: body
type: string
description: "The name for the generated playlist."
steps:
- name: get-top-tracks
type: call
call: "spotify-api.get-user-top-tracks"
with:
user_id: "{{user_id}}"
time_range: "medium_term"
limit: "5"
- name: get-recommendations
type: call
call: "spotify-api.get-recommendations"
with:
seed_tracks: "{{get-top-tracks.items_0_id}},{{get-top-tracks.items_1_id}},{{get-top-tracks.items_2_id}}"
limit: "30"
- name: create-playlist
type: call
call: "spotify-api.create-playlist"
with:
user_id: "{{user_id}}"
name: "{{playlist_name}}"
description: "Auto-generated personalized playlist"
- name: add-tracks
type: call
call: "spotify-api.add-playlist-tracks"
with:
playlist_id: "{{create-playlist.id}}"
uris: "{{get-recommendations.tracks}}"
- name: log-event
type: call
call: "bigquery.insert-rows"
with:
dataset_id: "recommendation_events"
table_id: "playlist_generations"
rows: "{\"user_id\":\"{{user_id}}\",\"playlist_id\":\"{{create-playlist.id}}\",\"track_count\":30}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: user-top-tracks
path: "/me/top/tracks"
inputParameters:
- name: time_range
in: query
- name: limit
in: query
operations:
- name: get-user-top-tracks
method: GET
- name: recommendations
path: "/recommendations"
inputParameters:
- name: seed_tracks
in: query
- name: limit
in: query
operations:
- name: get-recommendations
method: GET
- name: playlists
path: "/users/{{user_id}}/playlists"
inputParameters:
- name: user_id
in: path
operations:
- name: create-playlist
method: POST
- name: playlist-tracks
path: "/playlists/{{playlist_id}}/tracks"
inputParameters:
- name: playlist_id
in: path
operations:
- name: add-playlist-tracks
method: POST
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: tabledata
path: "/projects/spotify-ml/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
inputParameters:
- name: dataset_id
in: path
- name: table_id
in: path
operations:
- name: insert-rows
method: POST
For a given playlist, fetches current track listing from Spotify, adds a new track, then posts a promotional update to Twitter and Slack to drive listener engagement.
naftiko: "0.5"
info:
label: "Playlist Curation and Promotion Workflow"
description: "For a given playlist, fetches current track listing from Spotify, adds a new track, then posts a promotional update to Twitter and Slack to drive listener engagement."
tags:
- content-management
- spotify-web-api
- twitter
- slack
- marketing
capability:
exposes:
- type: mcp
namespace: playlist-promotion
port: 8080
tools:
- name: curate-and-promote-playlist
description: "Given a playlist ID and a track URI, add the track to the playlist, then post promotion to Twitter and Slack."
inputParameters:
- name: playlist_id
in: body
type: string
description: "The Spotify playlist ID."
- name: track_uri
in: body
type: string
description: "The Spotify track URI to add."
- name: slack_channel
in: body
type: string
description: "The Slack channel for the promotion post."
steps:
- name: get-playlist
type: call
call: "spotify-api.get-playlist"
with:
playlist_id: "{{playlist_id}}"
- name: add-track
type: call
call: "spotify-api.add-tracks"
with:
playlist_id: "{{playlist_id}}"
uris: "{{track_uri}}"
- name: post-twitter
type: call
call: "twitter.create-tweet"
with:
text: "Fresh addition to {{get-playlist.name}}! Listen now on Spotify: https://open.spotify.com/playlist/{{playlist_id}}"
- name: notify-slack
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Added track to *{{get-playlist.name}}*. Total tracks now: {{get-playlist.tracks_total}}. Twitter promo posted."
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: playlists
path: "/playlists/{{playlist_id}}"
inputParameters:
- name: playlist_id
in: path
operations:
- name: get-playlist
method: GET
- name: playlist-tracks
path: "/playlists/{{playlist_id}}/tracks"
inputParameters:
- name: playlist_id
in: path
- name: uris
in: body
operations:
- name: add-tracks
method: POST
- type: http
namespace: twitter
baseUri: "https://api.twitter.com/2"
authentication:
type: bearer
token: "$secrets.twitter_bearer_token"
resources:
- name: tweets
path: "/tweets"
operations:
- name: create-tweet
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
Orchestrates playlist editorial curation pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Playlist Editorial Curation Pipeline"
description: "Orchestrates playlist editorial curation pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- playlist
- spotify
- slack
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: playlist
port: 8080
tools:
- name: playlist-editorial-curation-pipeline
description: "Orchestrates playlist editorial curation pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/playlist"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/playlist"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/playlist"
operations:
- name: execute-3
method: POST
Takes an ad insertion order, validates the advertiser in the CRM, schedules ad slots via the podcast ad server, and confirms the booking to the sales team on Slack.
naftiko: "0.5"
info:
label: "Podcast Ad Insertion Order Processing"
description: "Takes an ad insertion order, validates the advertiser in the CRM, schedules ad slots via the podcast ad server, and confirms the booking to the sales team on Slack."
tags:
- advertising
- salesforce
- slack
- podcasts
- ad-insertion
capability:
exposes:
- type: mcp
namespace: podcast-ads
port: 8080
tools:
- name: process-insertion-order
description: "Given an advertiser account ID and campaign details, validate the advertiser, schedule ad slots, and confirm on Slack."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID for the advertiser."
- name: show_uri
in: body
type: string
description: "The Spotify show URI for ad placement."
- name: impressions_target
in: body
type: number
description: "Target impression count."
- name: start_date
in: body
type: string
description: "Campaign start date (YYYY-MM-DD)."
- name: slack_channel
in: body
type: string
description: "The Slack channel for sales confirmations."
steps:
- name: get-advertiser
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: schedule-ads
type: call
call: "ad-server.create-order"
with:
show_uri: "{{show_uri}}"
impressions: "{{impressions_target}}"
start_date: "{{start_date}}"
advertiser_name: "{{get-advertiser.Name}}"
- name: confirm-booking
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Ad Insertion Order Confirmed:\nAdvertiser: {{get-advertiser.Name}}\nShow: {{show_uri}}\nImpressions: {{impressions_target}}\nStart: {{start_date}}\nOrder ID: {{schedule-ads.order_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://spotify.my.salesforce.com/services/data/v59.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: ad-server
baseUri: "https://ad-server.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_adserver_token"
resources:
- name: orders
path: "/orders"
operations:
- name: create-order
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
Orchestrates podcast analytics pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Podcast Analytics Pipeline"
description: "Orchestrates podcast analytics pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- podcast
- spotify
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: podcast
port: 8080
tools:
- name: podcast-analytics-pipeline
description: "Orchestrates podcast analytics pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/podcast"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/podcast"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/podcast"
operations:
- name: execute-3
method: POST
Queries the Spotify for Artists API for podcast listener demographics, enriches with geographic data from BigQuery, and delivers a formatted report to the creator's email via SendGrid.
naftiko: "0.5"
info:
label: "Podcast Audience Demographics Report"
description: "Queries the Spotify for Artists API for podcast listener demographics, enriches with geographic data from BigQuery, and delivers a formatted report to the creator's email via SendGrid."
tags:
- creator-tools
- spotify-for-artists
- google-cloud-platform
- sendgrid
- analytics
capability:
exposes:
- type: mcp
namespace: podcast-demographics
port: 8080
tools:
- name: generate-demographics-report
description: "Given a show URI and creator email, pull listener demographics, enrich with geo data, and email the report."
inputParameters:
- name: show_uri
in: body
type: string
description: "The Spotify show URI."
- name: creator_email
in: body
type: string
description: "The podcast creator's email address."
steps:
- name: get-demographics
type: call
call: "s4a-api.get-show-demographics"
with:
show_uri: "{{show_uri}}"
- name: get-geo-data
type: call
call: "bigquery.run-query"
with:
query: "SELECT country, city, COUNT(*) as listeners FROM spotify_analytics.podcast_listeners WHERE show_uri='{{show_uri}}' GROUP BY country, city ORDER BY listeners DESC LIMIT 10"
- name: send-report
type: call
call: "sendgrid.send-email"
with:
to: "{{creator_email}}"
subject: "Your Podcast Audience Report"
body: "Listener Demographics:\nAge 18-24: {{get-demographics.age_18_24_pct}}%\nAge 25-34: {{get-demographics.age_25_34_pct}}%\nAge 35-44: {{get-demographics.age_35_44_pct}}%\nTop Markets: {{get-geo-data}}"
consumes:
- type: http
namespace: s4a-api
baseUri: "https://provider-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_s4a_token"
resources:
- name: demographics
path: "/analytics/shows/{{show_uri}}/demographics"
inputParameters:
- name: show_uri
in: path
operations:
- name: get-show-demographics
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: mail
path: "/mail/send"
operations:
- name: send-email
method: POST
Orchestrates podcast discovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Podcast Discovery Pipeline"
description: "Orchestrates podcast discovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- podcast
- spotify
- github
- google-bigquery
- pagerduty
capability:
exposes:
- type: mcp
namespace: podcast
port: 8080
tools:
- name: podcast-discovery-pipeline
description: "Orchestrates podcast discovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "github.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "google-bigquery.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "pagerduty.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/podcast"
operations:
- name: execute-1
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/podcast"
operations:
- name: execute-2
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/podcast"
operations:
- name: execute-3
method: POST
When a new podcast RSS feed is submitted, parses the feed, creates a Spotify show entry via the internal content API, indexes episodes in Elasticsearch, and notifies the content team on Slack.
naftiko: "0.5"
info:
label: "Podcast Ingestion and Catalog Registration"
description: "When a new podcast RSS feed is submitted, parses the feed, creates a Spotify show entry via the internal content API, indexes episodes in Elasticsearch, and notifies the content team on Slack."
tags:
- content-management
- elasticsearch
- slack
- podcasts
- ingestion
capability:
exposes:
- type: mcp
namespace: content-ingestion
port: 8080
tools:
- name: ingest-podcast-feed
description: "Given an RSS feed URL and Slack channel, parse the feed, register the show, index episodes in Elasticsearch, and notify the content team."
inputParameters:
- name: feed_url
in: body
type: string
description: "The podcast RSS feed URL."
- name: publisher_name
in: body
type: string
description: "The podcast publisher name."
- name: slack_channel
in: body
type: string
description: "The Slack channel for content ingestion alerts."
steps:
- name: register-show
type: call
call: "content-api.create-show"
with:
feed_url: "{{feed_url}}"
publisher: "{{publisher_name}}"
- name: index-episodes
type: call
call: "elasticsearch.bulk-index"
with:
index: "podcast-episodes"
body: "{{register-show.episodes}}"
- name: notify-content
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Podcast Ingested: *{{register-show.show_name}}* by {{publisher_name}}\nEpisodes indexed: {{register-show.episode_count}}\nShow URI: {{register-show.show_uri}}"
consumes:
- type: http
namespace: content-api
baseUri: "https://content-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_content_api_token"
resources:
- name: shows
path: "/shows"
operations:
- name: create-show
method: POST
- type: http
namespace: elasticsearch
baseUri: "https://es-cluster.spotify.net:9200"
authentication:
type: basic
username: "$secrets.es_user"
password: "$secrets.es_password"
resources:
- name: bulk
path: "/{{index}}/_bulk"
inputParameters:
- name: index
in: path
operations:
- name: bulk-index
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
Orchestrates podcast launch campaign pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Podcast Launch Campaign Pipeline"
description: "Orchestrates podcast launch campaign pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- podcast
- spotify
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: podcast
port: 8080
tools:
- name: podcast-launch-campaign-pipeline
description: "Orchestrates podcast launch campaign pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/podcast"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/podcast"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/podcast"
operations:
- name: execute-3
method: POST
Orchestrates podcast monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Podcast Monetization Pipeline"
description: "Orchestrates podcast monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- podcast
- spotify
- jira
- datadog
- github
capability:
exposes:
- type: mcp
namespace: podcast
port: 8080
tools:
- name: podcast-monetization-pipeline
description: "Orchestrates podcast monetization pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "github.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/podcast"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/podcast"
operations:
- name: execute-2
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/podcast"
operations:
- name: execute-3
method: POST
Fetches a podcast episode from Spotify, sends the audio to Google Cloud Speech-to-Text for transcription, indexes the transcript in Elasticsearch for search, and stores the raw transcript in GCS.
naftiko: "0.5"
info:
label: "Podcast Transcript Generation and Indexing"
description: "Fetches a podcast episode from Spotify, sends the audio to Google Cloud Speech-to-Text for transcription, indexes the transcript in Elasticsearch for search, and stores the raw transcript in GCS."
tags:
- content-management
- google-cloud-platform
- elasticsearch
- podcasts
- transcription
capability:
exposes:
- type: mcp
namespace: podcast-transcription
port: 8080
tools:
- name: transcribe-and-index-episode
description: "Given an episode ID, transcribe the audio via Google Speech-to-Text, index in Elasticsearch, and store in GCS."
inputParameters:
- name: episode_id
in: body
type: string
description: "The Spotify podcast episode ID."
- name: audio_url
in: body
type: string
description: "The episode audio file URL."
steps:
- name: get-episode
type: call
call: "spotify-api.get-episode"
with:
episode_id: "{{episode_id}}"
- name: transcribe
type: call
call: "gcp-speech.recognize"
with:
audio_uri: "{{audio_url}}"
language_code: "en-US"
- name: index-transcript
type: call
call: "elasticsearch.index-document"
with:
index: "podcast-transcripts"
id: "{{episode_id}}"
body: "{\"episode_id\":\"{{episode_id}}\",\"show_name\":\"{{get-episode.show_name}}\",\"episode_name\":\"{{get-episode.name}}\",\"transcript\":\"{{transcribe.results}}\"}"
- name: store-raw
type: call
call: "gcs.upload-object"
with:
bucket: "spotify-transcripts"
object_name: "{{episode_id}}/transcript.json"
body: "{{transcribe.results}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: episodes
path: "/episodes/{{episode_id}}"
inputParameters:
- name: episode_id
in: path
operations:
- name: get-episode
method: GET
- type: http
namespace: gcp-speech
baseUri: "https://speech.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: speech
path: "/speech:recognize"
operations:
- name: recognize
method: POST
- type: http
namespace: elasticsearch
baseUri: "https://es-cluster.spotify.net:9200"
authentication:
type: basic
username: "$secrets.es_user"
password: "$secrets.es_password"
resources:
- name: documents
path: "/{{index}}/_doc/{{id}}"
inputParameters:
- name: index
in: path
- name: id
in: path
operations:
- name: index-document
method: PUT
- type: http
namespace: gcs
baseUri: "https://storage.googleapis.com/upload/storage/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: objects
path: "/b/{{bucket}}/o"
inputParameters:
- name: bucket
in: path
- name: object_name
in: query
operations:
- name: upload-object
method: POST
Orchestrates podcast transcript search pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Podcast Transcript Search Pipeline"
description: "Orchestrates podcast transcript search pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- podcast
- spotify
- grafana
- spotify
- snowflake
capability:
exposes:
- type: mcp
namespace: podcast
port: 8080
tools:
- name: podcast-transcript-search-pipeline
description: "Orchestrates podcast transcript search pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "grafana.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "spotify.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/podcast"
operations:
- name: execute-1
method: POST
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/podcast"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/podcast"
operations:
- name: execute-3
method: POST
Extracts audio features from the Spotify Web API for a batch of tracks, transforms them, and writes the feature vectors to a BigQuery feature store table for the recommendation ML pipeline.
naftiko: "0.5"
info:
label: "Recommendation Feature Store Update"
description: "Extracts audio features from the Spotify Web API for a batch of tracks, transforms them, and writes the feature vectors to a BigQuery feature store table for the recommendation ML pipeline."
tags:
- machine-learning
- spotify-web-api
- google-cloud-platform
- recommendation
- data-pipeline
capability:
exposes:
- type: mcp
namespace: ml-features
port: 8080
tools:
- name: update-feature-store
description: "Given a list of track IDs, fetch audio features from Spotify and upsert them into the BigQuery feature store."
inputParameters:
- name: track_ids
in: body
type: string
description: "Comma-separated list of Spotify track IDs."
- name: dataset_id
in: body
type: string
description: "The BigQuery dataset ID for the feature store."
steps:
- name: get-features
type: call
call: "spotify-api.get-several-audio-features"
with:
ids: "{{track_ids}}"
- name: insert-features
type: call
call: "bigquery.insert-rows"
with:
dataset_id: "{{dataset_id}}"
table_id: "audio_features"
rows: "{{get-features.audio_features}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: audio-features
path: "/audio-features"
inputParameters:
- name: ids
in: query
operations:
- name: get-several-audio-features
method: GET
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: tabledata
path: "/projects/spotify-ml/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
inputParameters:
- name: dataset_id
in: path
- name: table_id
in: path
operations:
- name: insert-rows
method: POST
Orchestrates regional content expansion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Regional Content Expansion Pipeline"
description: "Orchestrates regional content expansion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- regional
- spotify
- spotify
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: regional
port: 8080
tools:
- name: regional-content-expansion-pipeline
description: "Orchestrates regional content expansion pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "spotify.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: spotify
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_access_token"
resources:
- name: spotify-resource
path: "/api/regional"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/regional"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/regional"
operations:
- name: execute-3
method: POST
Calculates royalty payments from BigQuery streaming data, cross-references with the licensing API for payment splits, generates a payment batch via the internal payments API, and notifies the finance team on Slack.
naftiko: "0.5"
info:
label: "Royalty Payment Processing Pipeline"
description: "Calculates royalty payments from BigQuery streaming data, cross-references with the licensing API for payment splits, generates a payment batch via the internal payments API, and notifies the finance team on Slack."
tags:
- finance
- google-cloud-platform
- slack
- rights-management
- payments
capability:
exposes:
- type: mcp
namespace: royalty-payments
port: 8080
tools:
- name: process-royalty-batch
description: "Given a reporting period, calculate royalties from streaming data, determine splits, create a payment batch, and notify finance."
inputParameters:
- name: period_start
in: body
type: string
description: "Reporting period start date (YYYY-MM-DD)."
- name: period_end
in: body
type: string
description: "Reporting period end date (YYYY-MM-DD)."
- name: slack_channel
in: body
type: string
description: "The Slack channel for finance notifications."
steps:
- name: calculate-royalties
type: call
call: "bigquery.run-query"
with:
query: "SELECT rights_holder_id, SUM(streams * per_stream_rate) as payment_amount FROM spotify_analytics.royalty_streams WHERE stream_date BETWEEN '{{period_start}}' AND '{{period_end}}' GROUP BY rights_holder_id"
- name: create-batch
type: call
call: "payments-api.create-batch"
with:
period_start: "{{period_start}}"
period_end: "{{period_end}}"
payment_data: "{{calculate-royalties}}"
- name: notify-finance
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Royalty Payment Batch Created:\nPeriod: {{period_start}} to {{period_end}}\nBatch ID: {{create-batch.batch_id}}\nTotal Payees: {{create-batch.payee_count}}\nTotal Amount: ${{create-batch.total_amount}}"
consumes:
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
method: POST
- type: http
namespace: payments-api
baseUri: "https://payments-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_payments_token"
resources:
- name: batches
path: "/batches"
operations:
- name: create-batch
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
Performs a free-text search across the Spotify catalog for tracks, artists, albums, or playlists. Used by editorial and content teams to discover and verify catalog entries.
naftiko: "0.5"
info:
label: "Search Content Catalog"
description: "Performs a free-text search across the Spotify catalog for tracks, artists, albums, or playlists. Used by editorial and content teams to discover and verify catalog entries."
tags:
- content-management
- spotify-web-api
- search
capability:
exposes:
- type: mcp
namespace: content-search
port: 8080
tools:
- name: search-catalog
description: "Search the Spotify catalog by query and type (track, artist, album, playlist). Returns top results."
inputParameters:
- name: query
in: body
type: string
description: "The search query string."
- name: content_type
in: body
type: string
description: "The type of content to search: track, artist, album, or playlist."
call: "spotify-api.search"
with:
q: "{{query}}"
type: "{{content_type}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: search
path: "/search"
inputParameters:
- name: q
in: query
- name: type
in: query
operations:
- name: search
method: GET
Marks a Backstage component as deprecated, creates a JIRA epic for migration tracking, sends notifications to dependent teams via Slack, and updates the Terraform configuration to remove associated infrastructure.
naftiko: "0.5"
info:
label: "Service Deprecation Coordinator"
description: "Marks a Backstage component as deprecated, creates a JIRA epic for migration tracking, sends notifications to dependent teams via Slack, and updates the Terraform configuration to remove associated infrastructure."
tags:
- platform-engineering
- backstage
- jira
- slack
- terraform
- service-lifecycle
capability:
exposes:
- type: mcp
namespace: service-lifecycle
port: 8080
tools:
- name: deprecate-service
description: "Given a Backstage component name, mark it deprecated, create a JIRA migration epic, notify dependent teams, and flag infrastructure for removal."
inputParameters:
- name: component_name
in: body
type: string
description: "The Backstage component name to deprecate."
- name: migration_deadline
in: body
type: string
description: "Deadline for dependent teams to migrate (YYYY-MM-DD)."
- name: replacement_service
in: body
type: string
description: "The replacement service name."
- name: slack_channel
in: body
type: string
description: "The Slack channel for deprecation announcements."
steps:
- name: update-lifecycle
type: call
call: "backstage.update-annotation"
with:
component_name: "{{component_name}}"
annotation_key: "backstage.io/lifecycle"
annotation_value: "deprecated"
- name: create-epic
type: call
call: "jira.create-issue"
with:
project_key: "PLATFORM"
summary: "Migration: {{component_name}} -> {{replacement_service}}"
description: "{{component_name}} is deprecated. All dependent services must migrate to {{replacement_service}} by {{migration_deadline}}."
issue_type: "Epic"
- name: announce-deprecation
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Service Deprecation Notice: *{{component_name}}* is now deprecated.\nReplacement: {{replacement_service}}\nMigration Deadline: {{migration_deadline}}\nTracking Epic: {{create-epic.key}}\nPlease plan your migration accordingly."
consumes:
- type: http
namespace: backstage
baseUri: "https://backstage.spotify.net/api/catalog"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: annotations
path: "/entities/by-name/component/default/{{component_name}}/annotations"
inputParameters:
- name: component_name
in: path
operations:
- name: update-annotation
method: PATCH
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: 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 Twitter for brand mentions, analyzes sentiment via Google Cloud NLP, stores results in BigQuery, and posts a daily digest to the marketing Slack channel.
naftiko: "0.5"
info:
label: "Social Media Listening and Sentiment Tracker"
description: "Searches Twitter for brand mentions, analyzes sentiment via Google Cloud NLP, stores results in BigQuery, and posts a daily digest to the marketing Slack channel."
tags:
- marketing
- twitter
- google-cloud-platform
- slack
- social-media
capability:
exposes:
- type: mcp
namespace: social-listening
port: 8080
tools:
- name: track-brand-sentiment
description: "Search Twitter for brand mentions, analyze sentiment, log to BigQuery, and post a digest to Slack."
inputParameters:
- name: search_query
in: body
type: string
description: "The Twitter search query (e.g. 'Spotify OR #SpotifyWrapped')."
- name: slack_channel
in: body
type: string
description: "The Slack channel for sentiment digest."
steps:
- name: search-tweets
type: call
call: "twitter.search-recent"
with:
query: "{{search_query}}"
max_results: "100"
- name: analyze-sentiment
type: call
call: "gcp-nlp.analyze-sentiment"
with:
content: "{{search-tweets.data_0_text}}"
type: "PLAIN_TEXT"
- name: log-results
type: call
call: "bigquery.insert-rows"
with:
dataset_id: "marketing_analytics"
table_id: "social_sentiment"
rows: "{\"query\":\"{{search_query}}\",\"tweet_count\":{{search-tweets.meta_result_count}},\"avg_sentiment\":{{analyze-sentiment.documentSentiment_score}}}"
- name: post-digest
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Social Sentiment Digest for '{{search_query}}':\nTweets analyzed: {{search-tweets.meta_result_count}}\nAvg Sentiment: {{analyze-sentiment.documentSentiment_score}}\nMagnitude: {{analyze-sentiment.documentSentiment_magnitude}}"
consumes:
- type: http
namespace: twitter
baseUri: "https://api.twitter.com/2"
authentication:
type: bearer
token: "$secrets.twitter_bearer_token"
resources:
- name: tweets-search
path: "/tweets/search/recent"
inputParameters:
- name: query
in: query
- name: max_results
in: query
operations:
- name: search-recent
method: GET
- type: http
namespace: gcp-nlp
baseUri: "https://language.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: documents
path: "/documents:analyzeSentiment"
operations:
- name: analyze-sentiment
method: POST
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: tabledata
path: "/projects/spotify-analytics/datasets/{{dataset_id}}/tables/{{table_id}}/insertAll"
inputParameters:
- name: dataset_id
in: path
- name: table_id
in: path
operations:
- name: insert-rows
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 self-serve audio ad campaign in Spotify Ad Studio, uploads the creative asset to Google Cloud Storage, and notifies the advertising ops team on Slack.
naftiko: "0.5"
info:
label: "Spotify Ad Studio Campaign Creation"
description: "Creates a self-serve audio ad campaign in Spotify Ad Studio, uploads the creative asset to Google Cloud Storage, and notifies the advertising ops team on Slack."
tags:
- advertising
- spotify-ad-studio
- google-cloud-platform
- slack
capability:
exposes:
- type: mcp
namespace: ad-campaign-mgmt
port: 8080
tools:
- name: create-ad-campaign
description: "Given campaign details, creative asset URL, and target demographics, create an Ad Studio campaign, stage the creative in GCS, and notify ops."
inputParameters:
- name: campaign_name
in: body
type: string
description: "The ad campaign name."
- name: creative_url
in: body
type: string
description: "URL of the audio creative asset."
- name: target_age_min
in: body
type: number
description: "Minimum target age."
- name: target_age_max
in: body
type: number
description: "Maximum target age."
- name: budget_usd
in: body
type: number
description: "Campaign budget in USD."
- name: slack_channel
in: body
type: string
description: "Slack channel for campaign notifications."
steps:
- name: upload-creative
type: call
call: "gcs.upload-object"
with:
bucket: "spotify-ad-creatives"
object_name: "{{campaign_name}}/creative.ogg"
source_url: "{{creative_url}}"
- name: create-campaign
type: call
call: "ad-studio.create-campaign"
with:
name: "{{campaign_name}}"
creative_uri: "{{upload-creative.media_link}}"
target_age_min: "{{target_age_min}}"
target_age_max: "{{target_age_max}}"
budget: "{{budget_usd}}"
- name: notify-ops
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Ad Campaign Created: *{{campaign_name}}*\nBudget: ${{budget_usd}}\nTarget: {{target_age_min}}-{{target_age_max}}\nCampaign ID: {{create-campaign.campaign_id}}\nCreative: {{upload-creative.media_link}}"
consumes:
- type: http
namespace: gcs
baseUri: "https://storage.googleapis.com/upload/storage/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: objects
path: "/b/{{bucket}}/o"
inputParameters:
- name: bucket
in: path
- name: object_name
in: query
operations:
- name: upload-object
method: POST
- type: http
namespace: ad-studio
baseUri: "https://adstudio-api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_adstudio_token"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: create-campaign
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
Runs a Terraform plan via the Terraform Cloud API for a Spotify infrastructure workspace, checks for drift, and posts the summary to the platform engineering Slack channel.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Drift Check"
description: "Runs a Terraform plan via the Terraform Cloud API for a Spotify infrastructure workspace, checks for drift, and posts the summary to the platform engineering Slack channel."
tags:
- platform-engineering
- terraform
- slack
- infrastructure
capability:
exposes:
- type: mcp
namespace: infra-drift
port: 8080
tools:
- name: check-terraform-drift
description: "Given a Terraform Cloud workspace ID, trigger a speculative plan and post drift summary to Slack."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID."
- name: slack_channel
in: body
type: string
description: "The Slack channel for drift alerts."
steps:
- name: create-run
type: call
call: "terraform-cloud.create-run"
with:
workspace_id: "{{workspace_id}}"
is_destroy: "false"
message: "Automated drift check"
- name: get-plan
type: call
call: "terraform-cloud.get-plan"
with:
run_id: "{{create-run.id}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "{{slack_channel}}"
text: "Terraform Drift Check - Workspace: {{workspace_id}}\nResources to add: {{get-plan.resource_additions}}\nResources to change: {{get-plan.resource_changes}}\nResources to destroy: {{get-plan.resource_destructions}}\nStatus: {{get-plan.status}}"
consumes:
- type: http
namespace: terraform-cloud
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_cloud_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- name: plans
path: "/runs/{{run_id}}/plan"
inputParameters:
- name: run_id
in: path
operations:
- name: get-plan
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
Orchestrates user accessibility pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Accessibility Pipeline"
description: "Orchestrates user accessibility pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- pagerduty
- confluence
- grafana
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-accessibility-pipeline
description: "Orchestrates user accessibility pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "pagerduty.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "confluence.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "grafana.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: grafana
baseUri: "https://grafana.spotify.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: grafana-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Orchestrates user churn intervention pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Churn Intervention Pipeline"
description: "Orchestrates user churn intervention pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-churn-intervention-pipeline
description: "Orchestrates user churn intervention pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Orchestrates user family plan management pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Family Plan Management Pipeline"
description: "Orchestrates user family plan management pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- jira
- datadog
- github
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-family-plan-management-pipeline
description: "Orchestrates user family plan management pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "github.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Orchestrates user growth experiment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Growth Experiment Pipeline"
description: "Orchestrates user growth experiment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- datadog
- github
- google-bigquery
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-growth-experiment-pipeline
description: "Orchestrates user growth experiment pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "github.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "google-bigquery.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: github-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Retrieves a user's recently played tracks from the Spotify Web API, enriches each track with audio features, and exports the dataset to a Google Cloud Storage bucket for analytics.
naftiko: "0.5"
info:
label: "User Listening History Export"
description: "Retrieves a user's recently played tracks from the Spotify Web API, enriches each track with audio features, and exports the dataset to a Google Cloud Storage bucket for analytics."
tags:
- data-platform
- spotify-web-api
- google-cloud-platform
- analytics
capability:
exposes:
- type: mcp
namespace: data-export
port: 8080
tools:
- name: export-listening-history
description: "Given a user ID, fetch recently played tracks, enrich with audio features, and export to GCS."
inputParameters:
- name: user_id
in: body
type: string
description: "The Spotify user ID."
- name: gcs_bucket
in: body
type: string
description: "The GCS bucket name for export."
steps:
- name: get-recent
type: call
call: "spotify-api.get-recently-played"
with:
limit: "50"
- name: get-features
type: call
call: "spotify-api.get-several-audio-features"
with:
ids: "{{get-recent.items_track_ids}}"
- name: upload-export
type: call
call: "gcs.upload-object"
with:
bucket: "{{gcs_bucket}}"
object_name: "listening-history/{{user_id}}/export.json"
body: "{\"tracks\":{{get-recent.items}},\"features\":{{get-features.audio_features}}}"
consumes:
- type: http
namespace: spotify-api
baseUri: "https://api.spotify.com/v1"
authentication:
type: bearer
token: "$secrets.spotify_api_token"
resources:
- name: recently-played
path: "/me/player/recently-played"
inputParameters:
- name: limit
in: query
operations:
- name: get-recently-played
method: GET
- name: audio-features
path: "/audio-features"
inputParameters:
- name: ids
in: query
operations:
- name: get-several-audio-features
method: GET
- type: http
namespace: gcs
baseUri: "https://storage.googleapis.com/upload/storage/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: objects
path: "/b/{{bucket}}/o"
inputParameters:
- name: bucket
in: path
- name: object_name
in: query
operations:
- name: upload-object
method: POST
Orchestrates user privacy compliance pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Privacy Compliance Pipeline"
description: "Orchestrates user privacy compliance pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- google-bigquery
- pagerduty
- confluence
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-privacy-compliance-pipeline
description: "Orchestrates user privacy compliance pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "google-bigquery.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "pagerduty.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "confluence.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: google-bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.bigquery_token"
resources:
- name: google-bigquery-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: pagerduty-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: confluence
baseUri: "https://spotify.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: confluence-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Orchestrates user subscription recovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "User Subscription Recovery Pipeline"
description: "Orchestrates user subscription recovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
tags:
- user
- spotify
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: user
port: 8080
tools:
- name: user-subscription-recovery-pipeline
description: "Orchestrates user subscription recovery pipeline across music streaming systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://spotify.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/user"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/user"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://spotify.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/user"
operations:
- name: execute-3
method: POST
Queries the internal subscription management API for a Spotify user's plan type, billing status, and renewal date. Used by customer service teams for account lookups.
naftiko: "0.5"
info:
label: "User Subscription Status Check"
description: "Queries the internal subscription management API for a Spotify user's plan type, billing status, and renewal date. Used by customer service teams for account lookups."
tags:
- subscriptions
- customer-service
- billing
capability:
exposes:
- type: mcp
namespace: subscription-mgmt
port: 8080
tools:
- name: get-subscription-status
description: "Look up a user's subscription plan, billing status, and next renewal date."
inputParameters:
- name: user_id
in: body
type: string
description: "The Spotify user ID."
call: "subscription-api.get-subscription"
with:
user_id: "{{user_id}}"
outputParameters:
- name: plan_type
type: string
mapping: "$.plan.name"
- name: billing_status
type: string
mapping: "$.billing.status"
- name: renewal_date
type: string
mapping: "$.billing.next_renewal"
consumes:
- type: http
namespace: subscription-api
baseUri: "https://subscription-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_subscription_token"
resources:
- name: subscriptions
path: "/users/{{user_id}}/subscription"
inputParameters:
- name: user_id
in: path
operations:
- name: get-subscription
method: GET
Queries BigQuery for a user's yearly listening statistics, generates a Wrapped summary payload, stores it in Google Cloud Storage, and triggers a notification via the internal push notification service.
naftiko: "0.5"
info:
label: "Wrapped Campaign Data Export"
description: "Queries BigQuery for a user's yearly listening statistics, generates a Wrapped summary payload, stores it in Google Cloud Storage, and triggers a notification via the internal push notification service."
tags:
- content-management
- google-cloud-platform
- personalization
- marketing
capability:
exposes:
- type: mcp
namespace: wrapped-campaign
port: 8080
tools:
- name: generate-wrapped-data
description: "Given a user ID and year, query listening stats, create a Wrapped payload, store in GCS, and trigger a push notification."
inputParameters:
- name: user_id
in: body
type: string
description: "The Spotify user ID."
- name: year
in: body
type: string
description: "The Wrapped year (e.g. 2025)."
steps:
- name: get-stats
type: call
call: "bigquery.run-query"
with:
query: "SELECT top_artist, top_track, top_genre, total_minutes, total_tracks FROM spotify_analytics.user_yearly_stats WHERE user_id='{{user_id}}' AND year={{year}}"
- name: store-payload
type: call
call: "gcs.upload-object"
with:
bucket: "spotify-wrapped-payloads"
object_name: "{{year}}/{{user_id}}.json"
body: "{{get-stats}}"
- name: send-notification
type: call
call: "push-api.send-notification"
with:
user_id: "{{user_id}}"
title: "Your {{year}} Wrapped is here!"
body: "You listened to {{get-stats.total_minutes}} minutes of music this year. Check out your Wrapped!"
deeplink: "spotify://wrapped/{{year}}"
consumes:
- type: http
namespace: bigquery
baseUri: "https://bigquery.googleapis.com/bigquery/v2"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: jobs
path: "/projects/spotify-analytics/jobs"
operations:
- name: run-query
method: POST
- type: http
namespace: gcs
baseUri: "https://storage.googleapis.com/upload/storage/v1"
authentication:
type: bearer
token: "$secrets.gcp_bearer_token"
resources:
- name: objects
path: "/b/{{bucket}}/o"
inputParameters:
- name: bucket
in: path
- name: object_name
in: query
operations:
- name: upload-object
method: POST
- type: http
namespace: push-api
baseUri: "https://push-api.spotify.net/v1"
authentication:
type: bearer
token: "$secrets.spotify_push_token"
resources:
- name: notifications
path: "/notifications"
operations:
- name: send-notification
method: POST