Condé Nast Capabilities
Naftiko 0.5 capability definitions for Condé Nast - 100 capabilities showing integration workflows and service orchestrations.
Pulls A/B test results from Google Optimize, calculates statistical significance, logs findings in Google Sheets, and posts the winner to Slack.
naftiko: "0.5"
info:
label: "A/B Test Results Pipeline"
description: "Pulls A/B test results from Google Optimize, calculates statistical significance, logs findings in Google Sheets, and posts the winner to Slack."
tags:
- experimentation
- google-optimize
- google-sheets
- slack
capability:
exposes:
- type: mcp
namespace: experimentation
port: 8080
tools:
- name: evaluate-ab-test
description: "Given a Google Optimize experiment ID, pull results, determine the winner, log to Sheets, and notify via Slack."
inputParameters:
- name: experiment_id
in: body
type: string
description: "The Google Optimize experiment ID."
- name: brand
in: body
type: string
description: "The brand running the experiment."
steps:
- name: get-results
type: call
call: "optimize.get-experiment"
with:
experiment_id: "{{experiment_id}}"
- name: log-results
type: call
call: "gsheets.append-row"
with:
spreadsheet_id: "ab_test_results"
range: "Results!A:E"
values:
- "{{experiment_id}}"
- "{{brand}}"
- "{{get-results.winner_variant}}"
- "{{get-results.improvement_pct}}"
- "{{get-results.confidence}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-growth"
text: "A/B Test {{experiment_id}} results: Winner is variant {{get-results.winner_variant}} with {{get-results.improvement_pct}}% improvement ({{get-results.confidence}}% confidence)."
consumes:
- type: http
namespace: optimize
baseUri: "https://www.googleapis.com/analytics/v3"
authentication:
type: bearer
token: "$secrets.google_optimize_token"
resources:
- name: experiments
path: "/management/accounts/{{account_id}}/webproperties/{{property_id}}/experiments/{{experiment_id}}"
inputParameters:
- name: experiment_id
in: path
operations:
- name: get-experiment
method: GET
- type: http
namespace: gsheets
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
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Audits website accessibility by running automated scans, logging issues in Jira, generating compliance reports in Google Sheets, and notifying the engineering team via Slack.
naftiko: "0.5"
info:
label: "Accessibility Compliance Audit Pipeline"
description: "Audits website accessibility by running automated scans, logging issues in Jira, generating compliance reports in Google Sheets, and notifying the engineering team via Slack."
tags:
- accessibility
- compliance
- jira
- google-sheets
- slack
capability:
exposes:
- type: mcp
namespace: accessibility-audit
port: 8080
tools:
- name: run-accessibility-audit
description: "Scan website for accessibility issues, log findings, and generate compliance report."
inputParameters:
- name: site_url
in: body
type: string
description: "The website URL to audit."
- name: brand
in: body
type: string
description: "The brand being audited."
steps:
- name: run-scan
type: call
call: "axe-api.scan-page"
with:
url: "{{site_url}}"
- name: log-issues
type: call
call: "jira.create-issue"
with:
project: "A11Y"
summary: "Accessibility issues on {{brand}}: {{run-scan.violation_count}} violations"
- name: generate-report
type: call
call: "google-sheets.append-rows"
with:
spreadsheet_id: "a11y_reports"
sheet: "{{brand}}"
data: "{{run-scan.summary}}"
- name: notify-engineering
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-engineering"
text: "Accessibility audit complete: {{run-scan.violation_count}} issues found."
consumes:
- type: http
namespace: axe-api
baseUri: "https://axe-scanner.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.axe_api_token"
resources:
- name: scans
path: "/scan"
operations:
- name: scan-page
method: POST
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: spreadsheets
path: "/spreadsheets/{{spreadsheet_id}}/values/{{sheet}}:append"
inputParameters:
- name: spreadsheet_id
in: path
operations:
- name: append-rows
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves an audience segment report from Adobe Analytics, returning segment size, engagement score, and top content categories.
naftiko: "0.5"
info:
label: "Adobe Analytics Audience Report"
description: "Retrieves an audience segment report from Adobe Analytics, returning segment size, engagement score, and top content categories."
tags:
- analytics
- adobe-analytics
- audience
capability:
exposes:
- type: mcp
namespace: audience-analytics
port: 8080
tools:
- name: get-audience-report
description: "Look up an Adobe Analytics audience segment report. Returns segment size, engagement score, and top categories."
inputParameters:
- name: report_suite_id
in: body
type: string
description: "The Adobe Analytics report suite ID."
- name: segment_id
in: body
type: string
description: "The audience segment ID."
call: "adobe-analytics.get-report"
with:
rsid: "{{report_suite_id}}"
segment_id: "{{segment_id}}"
outputParameters:
- name: segment_size
type: number
mapping: "$.report.totals[0]"
- name: engagement_score
type: number
mapping: "$.report.totals[1]"
consumes:
- type: http
namespace: adobe-analytics
baseUri: "https://analytics.adobe.io/api"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
inputParameters:
- name: x-api-key
in: header
value: "$secrets.adobe_api_key"
resources:
- name: reports
path: "/{{company_id}}/reports"
operations:
- name: get-report
method: POST
Retrieves metadata and rendition URLs for a digital asset stored in Adobe Experience Manager.
naftiko: "0.5"
info:
label: "Adobe Experience Manager Asset Lookup"
description: "Retrieves metadata and rendition URLs for a digital asset stored in Adobe Experience Manager."
tags:
- content-management
- adobe
- digital-assets
capability:
exposes:
- type: mcp
namespace: aem-assets
port: 8080
tools:
- name: get-asset-metadata
description: "Look up an AEM asset by its path and return metadata."
inputParameters:
- name: asset_path
in: body
type: string
description: "The asset path in AEM."
call: "aem.get-asset"
with:
asset_path: "{{asset_path}}"
outputParameters:
- name: title
type: string
mapping: "$.properties.dc:title"
- name: format
type: string
mapping: "$.properties.dc:format"
- name: size
type: number
mapping: "$.properties.dam:size"
consumes:
- type: http
namespace: aem
baseUri: "https://aem.condenast.com/api/assets"
authentication:
type: bearer
token: "$secrets.aem_token"
resources:
- name: assets
path: "/{{asset_path}}.json"
inputParameters:
- name: asset_path
in: path
operations:
- name: get-asset
method: GET
Retrieves the configuration of an Adobe Launch property, returning extension count, rule count, and publishing status.
naftiko: "0.5"
info:
label: "Adobe Launch Tag Configuration Lookup"
description: "Retrieves the configuration of an Adobe Launch property, returning extension count, rule count, and publishing status."
tags:
- analytics
- adobe-launch
- tag-management
capability:
exposes:
- type: mcp
namespace: tag-ops
port: 8080
tools:
- name: get-launch-property
description: "Look up an Adobe Launch property configuration. Returns extension count, rule count, and publish status."
inputParameters:
- name: property_id
in: body
type: string
description: "The Adobe Launch property ID."
call: "adobe-launch.get-property"
with:
property_id: "{{property_id}}"
outputParameters:
- name: name
type: string
mapping: "$.data.attributes.name"
- name: extension_count
type: number
mapping: "$.data.relationships.extensions.meta.count"
- name: rule_count
type: number
mapping: "$.data.relationships.rules.meta.count"
consumes:
- type: http
namespace: adobe-launch
baseUri: "https://reactor.adobe.io"
authentication:
type: bearer
token: "$secrets.adobe_launch_token"
inputParameters:
- name: x-api-key
in: header
value: "$secrets.adobe_api_key"
resources:
- name: properties
path: "/properties/{{property_id}}"
inputParameters:
- name: property_id
in: path
operations:
- name: get-property
method: GET
Takes an uploaded photo, processes it through Adobe Photoshop API for color correction and resizing, stores the result in Google Drive, and notifies the photo editor via Slack.
naftiko: "0.5"
info:
label: "Adobe Photoshop Image Processing Pipeline"
description: "Takes an uploaded photo, processes it through Adobe Photoshop API for color correction and resizing, stores the result in Google Drive, and notifies the photo editor via Slack."
tags:
- creative
- adobe-photoshop
- google-drive
- slack
- image-processing
capability:
exposes:
- type: mcp
namespace: creative-ops
port: 8080
tools:
- name: process-editorial-image
description: "Given a source image URL, apply Photoshop processing, store result in Google Drive, and notify the editor."
inputParameters:
- name: source_url
in: body
type: string
description: "The source image URL."
- name: preset
in: body
type: string
description: "The processing preset (e.g., cover, feature, thumbnail)."
- name: brand
in: body
type: string
description: "The brand the image is for."
steps:
- name: process-image
type: call
call: "photoshop-api.apply-preset"
with:
input_url: "{{source_url}}"
preset: "{{preset}}"
- name: upload-result
type: call
call: "gdrive.upload-file"
with:
name: "processed_{{preset}}_{{brand}}"
content_url: "{{process-image.output_url}}"
parent_id: "{{brand}}_images_folder"
- name: notify-editor
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-photo"
text: "Image processed ({{preset}}): {{upload-result.webViewLink}}"
consumes:
- type: http
namespace: photoshop-api
baseUri: "https://image.adobe.io/sensei"
authentication:
type: bearer
token: "$secrets.adobe_photoshop_token"
inputParameters:
- name: x-api-key
in: header
value: "$secrets.adobe_api_key"
resources:
- name: presets
path: "/cutout"
operations:
- name: apply-preset
method: POST
- type: http
namespace: gdrive
baseUri: "https://www.googleapis.com/upload/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files"
operations:
- name: upload-file
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Triggers a video export from Adobe Premiere Pro, uploads the rendered file to YouTube, updates the video library in Airtable, and notifies the video team via Slack.
naftiko: "0.5"
info:
label: "Adobe Premiere Pro Video Export Pipeline"
description: "Triggers a video export from Adobe Premiere Pro, uploads the rendered file to YouTube, updates the video library in Airtable, and notifies the video team via Slack."
tags:
- video
- adobe-premiere-pro
- youtube
- airtable
- slack
capability:
exposes:
- type: mcp
namespace: video-production
port: 8080
tools:
- name: export-and-publish-video
description: "Given a Premiere Pro project ID, export the video, upload to YouTube, and update tracking."
inputParameters:
- name: project_id
in: body
type: string
description: "The Premiere Pro project identifier."
- name: title
in: body
type: string
description: "The video title."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
steps:
- name: export-video
type: call
call: "premiere-api.export"
with:
project_id: "{{project_id}}"
format: "h264"
quality: "high"
- name: upload-youtube
type: call
call: "youtube.upload-video"
with:
title: "{{title}}"
video_url: "{{export-video.output_url}}"
channel_id: "{{brand}}_channel"
- name: update-library
type: call
call: "airtable.create-record"
with:
base_id: "video_library"
table_name: "Videos"
fields:
title: "{{title}}"
youtube_id: "{{upload-youtube.video_id}}"
brand: "{{brand}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-video"
text: "Video published: \"{{title}}\" - https://youtube.com/watch?v={{upload-youtube.video_id}}"
consumes:
- type: http
namespace: premiere-api
baseUri: "https://video.adobe.io/api/v1"
authentication:
type: bearer
token: "$secrets.adobe_premiere_token"
resources:
- name: exports
path: "/projects/{{project_id}}/export"
inputParameters:
- name: project_id
in: path
operations:
- name: export
method: POST
- type: http
namespace: youtube
baseUri: "https://www.googleapis.com/upload/youtube/v3"
authentication:
type: bearer
token: "$secrets.youtube_upload_token"
resources:
- name: videos
path: "/videos"
operations:
- name: upload-video
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Compiles a comprehensive advertising campaign report by pulling data from Google Ads, Facebook Ads, and Salesforce, then publishes the report to Tableau and emails the advertiser.
naftiko: "0.5"
info:
label: "Advertiser Campaign Report Pipeline"
description: "Compiles a comprehensive advertising campaign report by pulling data from Google Ads, Facebook Ads, and Salesforce, then publishes the report to Tableau and emails the advertiser."
tags:
- advertising
- google-ads
- facebook-ads
- salesforce
- tableau
capability:
exposes:
- type: mcp
namespace: ad-campaign-report
port: 8080
tools:
- name: generate-campaign-report
description: "Generate a multi-platform advertising campaign report and distribute it."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The internal campaign identifier."
- name: advertiser_email
in: body
type: string
description: "The advertiser contact email."
steps:
- name: get-google-ads-data
type: call
call: "google-ads.get-campaign-metrics"
with:
campaign_id: "{{campaign_id}}"
- name: get-facebook-ads-data
type: call
call: "facebook-ads.get-campaign-insights"
with:
campaign_id: "{{campaign_id}}"
- name: get-salesforce-deal
type: call
call: "salesforce.get-opportunity"
with:
campaign_id: "{{campaign_id}}"
- name: publish-to-tableau
type: call
call: "tableau.refresh-datasource"
with:
datasource_id: "campaign_reports"
- name: send-report-email
type: call
call: "sendgrid.send-email"
with:
to: "{{advertiser_email}}"
subject: "Campaign Report - {{campaign_id}}"
template: "campaign_report"
consumes:
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v14"
authentication:
type: bearer
token: "$secrets.google_ads_token"
resources:
- name: campaigns
path: "/customers/{{customer_id}}/campaigns/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-metrics
method: GET
- type: http
namespace: facebook-ads
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.facebook_ads_token"
resources:
- name: insights
path: "/{{campaign_id}}/insights"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-insights
method: GET
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: get-opportunity
method: GET
- type: http
namespace: tableau
baseUri: "https://tableau.condenast.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: datasources
path: "/sites/{{site_id}}/datasources/{{datasource_id}}/refresh"
operations:
- name: refresh-datasource
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
Retrieves a specific editorial record from an Airtable base, returning story status, assigned editor, and deadline.
naftiko: "0.5"
info:
label: "Airtable Editorial Record Lookup"
description: "Retrieves a specific editorial record from an Airtable base, returning story status, assigned editor, and deadline."
tags:
- editorial
- airtable
- content-management
capability:
exposes:
- type: mcp
namespace: airtable-editorial
port: 8080
tools:
- name: get-editorial-record
description: "Fetch an editorial record from Airtable by record ID."
inputParameters:
- name: base_id
in: body
type: string
description: "The Airtable base identifier."
- name: record_id
in: body
type: string
description: "The Airtable record identifier."
call: "airtable.get-record"
with:
base_id: "{{base_id}}"
record_id: "{{record_id}}"
outputParameters:
- name: story_status
type: string
mapping: "$.fields.Status"
- name: editor
type: string
mapping: "$.fields.Editor"
- name: deadline
type: string
mapping: "$.fields.Deadline"
consumes:
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/Editorial/{{record_id}}"
inputParameters:
- name: base_id
in: path
- name: record_id
in: path
operations:
- name: get-record
method: GET
Retrieves readership metrics for an article published on Apple News.
naftiko: "0.5"
info:
label: "Apple News Article Metrics"
description: "Retrieves readership metrics for an article published on Apple News."
tags:
- publishing
- apple-news
- analytics
capability:
exposes:
- type: mcp
namespace: apple-news-metrics
port: 8080
tools:
- name: get-article-metrics
description: "Look up Apple News article performance metrics."
inputParameters:
- name: article_id
in: body
type: string
description: "The Apple News article identifier."
call: "apple-news.get-article-metrics"
with:
article_id: "{{article_id}}"
outputParameters:
- name: unique_visitors
type: number
mapping: "$.data.uniqueVisitors"
- name: shares
type: number
mapping: "$.data.shares"
consumes:
- type: http
namespace: apple-news
baseUri: "https://news-api.apple.com"
authentication:
type: bearer
token: "$secrets.apple_news_token"
resources:
- name: articles
path: "/articles/{{article_id}}/metrics"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article-metrics
method: GET
Creates audience segments by pulling subscriber data from Snowflake, enriching with behavioral data from Adobe Analytics, building segments in Salesforce Marketing Cloud, and activating in Google Ads.
naftiko: "0.5"
info:
label: "Audience Segmentation Pipeline"
description: "Creates audience segments by pulling subscriber data from Snowflake, enriching with behavioral data from Adobe Analytics, building segments in Salesforce Marketing Cloud, and activating in Google Ads."
tags:
- audience
- segmentation
- snowflake
- adobe-analytics
- salesforce
- google-ads
capability:
exposes:
- type: mcp
namespace: audience-segmentation
port: 8080
tools:
- name: create-audience-segment
description: "Build and activate audience segments across analytics and advertising platforms."
inputParameters:
- name: segment_name
in: body
type: string
description: "The audience segment name."
- name: criteria
in: body
type: string
description: "The segmentation criteria query."
steps:
- name: pull-subscriber-data
type: call
call: "snowflake.run-query"
with:
query: "{{criteria}}"
- name: enrich-with-behavior
type: call
call: "adobe-analytics.get-segment-data"
with:
segment: "{{segment_name}}"
- name: create-sfmc-segment
type: call
call: "sfmc.create-data-extension"
with:
name: "{{segment_name}}"
data: "{{pull-subscriber-data.results}}"
- name: activate-google-ads
type: call
call: "google-ads.create-audience"
with:
audience_name: "{{segment_name}}"
members: "{{pull-subscriber-data.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://condenast.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: adobe-analytics
baseUri: "https://analytics.adobe.io/api/v2.0"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: segments
path: "/segments"
operations:
- name: get-segment-data
method: GET
- type: http
namespace: sfmc
baseUri: "https://rest.marketingcloudapis.com/v1"
authentication:
type: bearer
token: "$secrets.sfmc_token"
resources:
- name: data-extensions
path: "/data/v1/customobjects"
operations:
- name: create-data-extension
method: POST
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v14"
authentication:
type: bearer
token: "$secrets.google_ads_token"
resources:
- name: audiences
path: "/customers/{{customer_id}}/userLists"
operations:
- name: create-audience
method: POST
Evaluates brand ambassador performance by pulling Instagram engagement data, YouTube metrics, affiliate sales from Shopify, and compiling a report in Google Sheets.
naftiko: "0.5"
info:
label: "Brand Ambassador Performance Pipeline"
description: "Evaluates brand ambassador performance by pulling Instagram engagement data, YouTube metrics, affiliate sales from Shopify, and compiling a report in Google Sheets."
tags:
- influencer
- instagram
- youtube
- shopify
- google-sheets
capability:
exposes:
- type: mcp
namespace: ambassador-performance
port: 8080
tools:
- name: evaluate-ambassador
description: "Compile brand ambassador performance across social and sales channels."
inputParameters:
- name: ambassador_handle
in: body
type: string
description: "The ambassador social media handle."
- name: affiliate_code
in: body
type: string
description: "The ambassador affiliate code."
steps:
- name: get-ig-engagement
type: call
call: "instagram.get-user-insights"
with:
handle: "{{ambassador_handle}}"
- name: get-yt-metrics
type: call
call: "youtube.get-channel-stats"
with:
handle: "{{ambassador_handle}}"
- name: get-affiliate-sales
type: call
call: "shopify.get-orders-by-discount"
with:
discount_code: "{{affiliate_code}}"
- name: compile-report
type: call
call: "google-sheets.append-rows"
with:
spreadsheet_id: "ambassador_reports"
data: "{{ambassador_handle}},{{get-ig-engagement.reach}},{{get-yt-metrics.views}},{{get-affiliate-sales.total}}"
consumes:
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.instagram_token"
resources:
- name: insights
path: "/{{ig_user_id}}/insights"
operations:
- name: get-user-insights
method: GET
- type: http
namespace: youtube
baseUri: "https://www.googleapis.com/youtube/v3"
authentication:
type: bearer
token: "$secrets.youtube_token"
resources:
- name: channels
path: "/channels?part=statistics"
operations:
- name: get-channel-stats
method: GET
- type: http
namespace: shopify
baseUri: "https://shop.condenast.com/admin/api/2024-01"
authentication:
type: bearer
token: "$secrets.shopify_access_token"
resources:
- name: orders
path: "/orders.json?discount_code={{discount_code}}"
operations:
- name: get-orders-by-discount
method: GET
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: spreadsheets
path: "/spreadsheets/{{spreadsheet_id}}/values/Sheet1:append"
inputParameters:
- name: spreadsheet_id
in: path
operations:
- name: append-rows
method: POST
Republishes an article across multiple brand sites by fetching from CMS, adapting for each brand, publishing to WordPress, and notifying editors via Slack.
naftiko: "0.5"
info:
label: "Brand Content Republication Pipeline"
description: "Republishes an article across multiple brand sites by fetching from CMS, adapting for each brand, publishing to WordPress, and notifying editors via Slack."
tags:
- editorial
- publishing
- wordpress
- slack
capability:
exposes:
- type: mcp
namespace: content-republication
port: 8080
tools:
- name: republish-article
description: "Republish a CMS article across multiple Conde Nast brand sites."
inputParameters:
- name: article_id
in: body
type: string
description: "The source article ID in the CMS."
- name: target_brands
in: body
type: string
description: "Comma-separated brand slugs to publish to."
steps:
- name: fetch-article
type: call
call: "cms.get-article"
with:
article_id: "{{article_id}}"
- name: publish-to-brands
type: call
call: "wordpress.create-post"
with:
title: "{{fetch-article.title}}"
content: "{{fetch-article.body}}"
status: "publish"
- name: notify-editors
type: call
call: "slack.post-message"
with:
channel: "#cross-brand-publishing"
text: "Article '{{fetch-article.title}}' republished to {{target_brands}}."
consumes:
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: wordpress
baseUri: "https://publish.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Reviews article content for brand voice compliance by fetching from CMS, analyzing tone via AI, flagging issues in Jira, and reporting results to the editorial team in Slack.
naftiko: "0.5"
info:
label: "Brand Voice Compliance Review Pipeline"
description: "Reviews article content for brand voice compliance by fetching from CMS, analyzing tone via AI, flagging issues in Jira, and reporting results to the editorial team in Slack."
tags:
- editorial
- compliance
- ai
- jira
- slack
capability:
exposes:
- type: mcp
namespace: brand-voice-compliance
port: 8080
tools:
- name: review-brand-voice
description: "Analyze article content for brand voice compliance and flag issues."
inputParameters:
- name: article_id
in: body
type: string
description: "The CMS article identifier."
- name: brand
in: body
type: string
description: "The brand whose voice guidelines apply."
steps:
- name: fetch-article
type: call
call: "cms.get-article"
with:
article_id: "{{article_id}}"
- name: analyze-tone
type: call
call: "openai.analyze-text"
with:
text: "{{fetch-article.body}}"
guidelines: "{{brand}}_voice_guide"
- name: create-issues
type: call
call: "jira.create-issue"
with:
project: "EDITORIAL"
summary: "Brand voice issues: {{article_id}}"
description: "{{analyze-tone.findings}}"
- name: notify-editor
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-editorial"
text: "Brand voice review complete for {{article_id}}. Score: {{analyze-tone.score}}/100."
consumes:
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: analyze-text
method: POST
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a Canva design template by ID, returning template name, dimensions, page count, and thumbnail URL.
naftiko: "0.5"
info:
label: "Canva Template Lookup"
description: "Retrieves a Canva design template by ID, returning template name, dimensions, page count, and thumbnail URL."
tags:
- design
- canva
- creative
capability:
exposes:
- type: mcp
namespace: design-templates
port: 8080
tools:
- name: get-canva-template
description: "Look up a Canva design template by ID. Returns name, dimensions, page count, and thumbnail."
inputParameters:
- name: design_id
in: body
type: string
description: "The Canva design ID."
call: "canva.get-design"
with:
design_id: "{{design_id}}"
outputParameters:
- name: title
type: string
mapping: "$.design.title"
- name: width
type: number
mapping: "$.design.width"
- name: height
type: number
mapping: "$.design.height"
- name: thumbnail_url
type: string
mapping: "$.design.thumbnail.url"
consumes:
- type: http
namespace: canva
baseUri: "https://api.canva.com/rest/v1"
authentication:
type: bearer
token: "$secrets.canva_token"
resources:
- name: designs
path: "/designs/{{design_id}}"
inputParameters:
- name: design_id
in: path
operations:
- name: get-design
method: GET
Monitors GitHub Actions deployments, validates build status, runs post-deployment health checks via Datadog, and notifies engineering teams via Slack with deployment details.
naftiko: "0.5"
info:
label: "CI/CD Deployment Notification Pipeline"
description: "Monitors GitHub Actions deployments, validates build status, runs post-deployment health checks via Datadog, and notifies engineering teams via Slack with deployment details."
tags:
- devops
- github
- datadog
- slack
capability:
exposes:
- type: mcp
namespace: deployment-notification
port: 8080
tools:
- name: notify-deployment
description: "Check deployment status, run health checks, and notify engineering teams."
inputParameters:
- name: repo
in: body
type: string
description: "The GitHub repository name."
- name: run_id
in: body
type: string
description: "The GitHub Actions workflow run ID."
steps:
- name: get-workflow-status
type: call
call: "github.get-workflow-run"
with:
repo: "{{repo}}"
run_id: "{{run_id}}"
- name: run-health-check
type: call
call: "datadog.check-monitor"
with:
monitor_tag: "deployment:{{repo}}"
- name: notify-engineering
type: call
call: "slack.post-message"
with:
channel: "#deployments"
text: "Deployment of {{repo}} (run {{run_id}}): {{get-workflow-status.conclusion}}. Health: {{run-health-check.status}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/condenast/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/search"
operations:
- name: check-monitor
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves DNS records for a Condé Nast domain from Cloudflare, returning record type, value, TTL, and proxy status.
naftiko: "0.5"
info:
label: "Cloudflare DNS Record Lookup"
description: "Retrieves DNS records for a Condé Nast domain from Cloudflare, returning record type, value, TTL, and proxy status."
tags:
- infrastructure
- cloudflare
- dns
capability:
exposes:
- type: mcp
namespace: dns-management
port: 8080
tools:
- name: get-dns-records
description: "Look up Cloudflare DNS records for a domain. Returns record type, value, TTL, and proxy status."
inputParameters:
- name: zone_id
in: body
type: string
description: "The Cloudflare zone ID."
- name: record_name
in: body
type: string
description: "The DNS record name to look up."
call: "cloudflare.get-dns-record"
with:
zone_id: "{{zone_id}}"
name: "{{record_name}}"
outputParameters:
- name: type
type: string
mapping: "$.result[0].type"
- name: content
type: string
mapping: "$.result[0].content"
- name: ttl
type: number
mapping: "$.result[0].ttl"
- name: proxied
type: boolean
mapping: "$.result[0].proxied"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_token"
resources:
- name: dns-records
path: "/zones/{{zone_id}}/dns_records"
inputParameters:
- name: zone_id
in: path
operations:
- name: get-dns-record
method: GET
Retrieves traffic analytics from Cloudflare for a brand domain, returning total requests, cached percentage, and threat count.
naftiko: "0.5"
info:
label: "Cloudflare Traffic Analytics Lookup"
description: "Retrieves traffic analytics from Cloudflare for a brand domain, returning total requests, cached percentage, and threat count."
tags:
- infrastructure
- cloudflare
- analytics
capability:
exposes:
- type: mcp
namespace: cloudflare-analytics
port: 8080
tools:
- name: get-traffic-analytics
description: "Look up Cloudflare traffic analytics for a domain zone."
inputParameters:
- name: zone_id
in: body
type: string
description: "The Cloudflare zone identifier."
call: "cloudflare.get-zone-analytics"
with:
zone_id: "{{zone_id}}"
outputParameters:
- name: total_requests
type: number
mapping: "$.result.totals.requests.all"
- name: cached_pct
type: number
mapping: "$.result.totals.requests.cached_pct"
- name: threats
type: number
mapping: "$.result.totals.threats.all"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_api_token"
resources:
- name: analytics
path: "/zones/{{zone_id}}/analytics/dashboard"
inputParameters:
- name: zone_id
in: path
operations:
- name: get-zone-analytics
method: GET
Searches the Condé Nast Confluence knowledge base for editorial guidelines and style guides, returning article title, URL, and last updated date.
naftiko: "0.5"
info:
label: "Confluence Knowledge Base Search"
description: "Searches the Condé Nast Confluence knowledge base for editorial guidelines and style guides, returning article title, URL, and last updated date."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: knowledge-base
port: 8080
tools:
- name: search-guidelines
description: "Search Confluence for editorial guidelines. Returns title, URL, and last updated."
inputParameters:
- name: query
in: body
type: string
description: "The search query."
call: "confluence.search"
with:
cql: "text~\"{{query}}\" and space=EDITORIAL"
outputParameters:
- name: title
type: string
mapping: "$.results[0].title"
- name: url
type: string
mapping: "$.results[0]._links.webui"
- name: last_updated
type: string
mapping: "$.results[0].version.when"
consumes:
- type: http
namespace: confluence
baseUri: "https://condenast.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: search
path: "/content/search"
operations:
- name: search
method: GET
Migrates archived content from legacy CMS to the current platform by extracting articles, transforming metadata, uploading assets to AEM, and publishing to WordPress.
naftiko: "0.5"
info:
label: "Content Archive Migration Pipeline"
description: "Migrates archived content from legacy CMS to the current platform by extracting articles, transforming metadata, uploading assets to AEM, and publishing to WordPress."
tags:
- migration
- content-management
- wordpress
- adobe
capability:
exposes:
- type: mcp
namespace: archive-migration
port: 8080
tools:
- name: migrate-archived-content
description: "Extract, transform, and migrate archived content to the current CMS platform."
inputParameters:
- name: legacy_article_id
in: body
type: string
description: "The article ID in the legacy CMS."
- name: brand
in: body
type: string
description: "The target brand for migration."
steps:
- name: extract-legacy-article
type: call
call: "legacy-cms.get-article"
with:
article_id: "{{legacy_article_id}}"
- name: upload-assets
type: call
call: "aem.upload-assets"
with:
source: "{{extract-legacy-article.assets}}"
destination: "/content/dam/{{brand}}/archive"
- name: publish-to-wordpress
type: call
call: "wordpress.create-post"
with:
title: "{{extract-legacy-article.title}}"
content: "{{extract-legacy-article.body}}"
status: "publish"
categories: "archive"
- name: log-migration
type: call
call: "airtable.create-record"
with:
base_id: "migration_tracker"
table_name: "{{brand}}_migrations"
legacy_id: "{{legacy_article_id}}"
status: "completed"
consumes:
- type: http
namespace: legacy-cms
baseUri: "https://legacy-cms.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.legacy_cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: aem
baseUri: "https://aem.condenast.com/api/assets"
authentication:
type: bearer
token: "$secrets.aem_token"
resources:
- name: assets
path: "/upload"
operations:
- name: upload-assets
method: POST
- type: http
namespace: wordpress
baseUri: "https://{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
Localizes content for international editions by fetching the source article, translating via DeepL, adapting metadata, publishing to the regional WordPress site, and updating the global content tracker.
naftiko: "0.5"
info:
label: "Content Localization Pipeline"
description: "Localizes content for international editions by fetching the source article, translating via DeepL, adapting metadata, publishing to the regional WordPress site, and updating the global content tracker."
tags:
- localization
- translation
- wordpress
- airtable
capability:
exposes:
- type: mcp
namespace: content-localization
port: 8080
tools:
- name: localize-content
description: "Translate and publish content for international editions."
inputParameters:
- name: article_id
in: body
type: string
description: "The source article ID."
- name: target_locale
in: body
type: string
description: "The target locale code (e.g., fr-FR, de-DE)."
- name: brand
in: body
type: string
description: "The brand name."
steps:
- name: fetch-source
type: call
call: "cms.get-article"
with:
article_id: "{{article_id}}"
- name: translate-content
type: call
call: "deepl.translate"
with:
text: "{{fetch-source.body}}"
target_lang: "{{target_locale}}"
- name: publish-regional
type: call
call: "wordpress.create-post"
with:
title: "{{translate-content.translated_title}}"
content: "{{translate-content.translated_text}}"
status: "draft"
- name: update-tracker
type: call
call: "airtable.create-record"
with:
base_id: "global_content"
table_name: "localizations"
article_id: "{{article_id}}"
locale: "{{target_locale}}"
consumes:
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: deepl
baseUri: "https://api-free.deepl.com/v2"
authentication:
type: bearer
token: "$secrets.deepl_api_key"
resources:
- name: translations
path: "/translate"
operations:
- name: translate
method: POST
- type: http
namespace: wordpress
baseUri: "https://{{target_locale}}.{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_intl_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
Pulls paywall conversion data from the subscription system, combines with Google Analytics content engagement, and generates a report in Looker for the revenue team.
naftiko: "0.5"
info:
label: "Content Paywall Analytics Pipeline"
description: "Pulls paywall conversion data from the subscription system, combines with Google Analytics content engagement, and generates a report in Looker for the revenue team."
tags:
- subscriptions
- paywall
- google-analytics
- looker
- revenue
capability:
exposes:
- type: mcp
namespace: paywall-analytics
port: 8080
tools:
- name: generate-paywall-report
description: "Given a brand and date range, pull paywall conversions, engagement data, and generate a Looker report."
inputParameters:
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- 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."
steps:
- name: get-conversions
type: call
call: "billing.get-paywall-conversions"
with:
brand: "{{brand}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: get-engagement
type: call
call: "ga4.get-content-engagement"
with:
brand: "{{brand}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: refresh-report
type: call
call: "looker.run-look"
with:
look_id: "paywall_report_{{brand}}"
consumes:
- type: http
namespace: billing
baseUri: "https://billing.internal.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.billing_token"
resources:
- name: paywall
path: "/paywall/conversions"
operations:
- name: get-paywall-conversions
method: GET
- type: http
namespace: ga4
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
operations:
- name: get-content-engagement
method: POST
- type: http
namespace: looker
baseUri: "https://condenast.cloud.looker.com/api/4.0"
authentication:
type: bearer
token: "$secrets.looker_token"
resources:
- name: looks
path: "/looks/{{look_id}}/run/json"
inputParameters:
- name: look_id
in: path
operations:
- name: run-look
method: GET
Generates a weekly content performance digest by aggregating metrics from Google Analytics, social engagement from Sprout Social, subscription impact from Stripe, and delivering via Slack and email.
naftiko: "0.5"
info:
label: "Content Performance Weekly Digest Pipeline"
description: "Generates a weekly content performance digest by aggregating metrics from Google Analytics, social engagement from Sprout Social, subscription impact from Stripe, and delivering via Slack and email."
tags:
- analytics
- reporting
- google-analytics
- slack
capability:
exposes:
- type: mcp
namespace: weekly-digest
port: 8080
tools:
- name: generate-weekly-digest
description: "Aggregate content metrics and deliver a weekly performance digest."
inputParameters:
- name: brand
in: body
type: string
description: "The brand to generate the digest for."
- name: week_ending
in: body
type: string
description: "The week ending date in YYYY-MM-DD."
steps:
- name: get-ga-metrics
type: call
call: "ga4.get-weekly-report"
with:
brand: "{{brand}}"
week_ending: "{{week_ending}}"
- name: get-social-metrics
type: call
call: "sprout-social.get-report"
with:
brand: "{{brand}}"
date_range: "last_7_days"
- name: get-subscription-metrics
type: call
call: "stripe.get-subscription-summary"
with:
product: "{{brand}}_digital"
- name: post-digest
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-performance"
text: "Weekly Digest ({{week_ending}}): {{get-ga-metrics.total_views}} views, {{get-social-metrics.total_engagement}} social engagements."
consumes:
- type: http
namespace: ga4
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
operations:
- name: get-weekly-report
method: POST
- type: http
namespace: sprout-social
baseUri: "https://api.sproutsocial.com/v1"
authentication:
type: bearer
token: "$secrets.sprout_social_token"
resources:
- name: reports
path: "/{{customer_id}}/analytics"
operations:
- name: get-report
method: GET
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: subscriptions
path: "/subscriptions"
operations:
- name: get-subscription-summary
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a new photo or video asset is licensed, records the rights in the DAM system, sets usage restrictions, updates the rights database in Airtable, and notifies the legal team via Slack.
naftiko: "0.5"
info:
label: "Content Rights Management Pipeline"
description: "When a new photo or video asset is licensed, records the rights in the DAM system, sets usage restrictions, updates the rights database in Airtable, and notifies the legal team via Slack."
tags:
- rights-management
- dam
- legal
- airtable
- slack
capability:
exposes:
- type: mcp
namespace: rights-management
port: 8080
tools:
- name: register-content-rights
description: "Given an asset and license details, register rights, set restrictions, update tracking, and notify legal."
inputParameters:
- name: asset_id
in: body
type: string
description: "The DAM asset identifier."
- name: license_type
in: body
type: string
description: "The license type (exclusive, non-exclusive, royalty-free)."
- name: usage_territory
in: body
type: string
description: "The licensed usage territory."
- name: expiry_date
in: body
type: string
description: "The license expiry date."
steps:
- name: register-rights
type: call
call: "dam.register-license"
with:
asset_id: "{{asset_id}}"
license_type: "{{license_type}}"
territory: "{{usage_territory}}"
expiry: "{{expiry_date}}"
- name: update-tracking
type: call
call: "airtable.create-record"
with:
base_id: "rights_management"
table_name: "Licenses"
fields:
asset_id: "{{asset_id}}"
license_type: "{{license_type}}"
territory: "{{usage_territory}}"
expiry: "{{expiry_date}}"
- name: notify-legal
type: call
call: "slack.post-message"
with:
channel: "#legal-rights"
text: "New license registered: Asset {{asset_id}}. Type: {{license_type}}. Territory: {{usage_territory}}. Expires: {{expiry_date}}."
consumes:
- type: http
namespace: dam
baseUri: "https://dam.internal.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.dam_token"
resources:
- name: licenses
path: "/assets/{{asset_id}}/licenses"
inputParameters:
- name: asset_id
in: path
operations:
- name: register-license
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Syndicates content to partner platforms by fetching from CMS, transforming to partner format, pushing via API, and tracking syndication in Airtable.
naftiko: "0.5"
info:
label: "Content Syndication Partner Pipeline"
description: "Syndicates content to partner platforms by fetching from CMS, transforming to partner format, pushing via API, and tracking syndication in Airtable."
tags:
- syndication
- content-management
- partnerships
- airtable
capability:
exposes:
- type: mcp
namespace: content-syndication
port: 8080
tools:
- name: syndicate-content
description: "Push content to syndication partners and track distribution."
inputParameters:
- name: article_id
in: body
type: string
description: "The source article identifier."
- name: partner_slug
in: body
type: string
description: "The syndication partner slug."
steps:
- name: fetch-article
type: call
call: "cms.get-article"
with:
article_id: "{{article_id}}"
- name: transform-content
type: call
call: "content-transform.adapt-for-partner"
with:
content: "{{fetch-article.body}}"
partner: "{{partner_slug}}"
- name: push-to-partner
type: call
call: "syndication-api.submit-content"
with:
partner: "{{partner_slug}}"
content: "{{transform-content.adapted_content}}"
- name: track-syndication
type: call
call: "airtable.create-record"
with:
base_id: "syndication_tracker"
table_name: "distributions"
article_id: "{{article_id}}"
partner: "{{partner_slug}}"
consumes:
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: content-transform
baseUri: "https://transform.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.content_transform_token"
resources:
- name: adaptations
path: "/adapt"
operations:
- name: adapt-for-partner
method: POST
- type: http
namespace: syndication-api
baseUri: "https://syndication.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.syndication_token"
resources:
- name: submissions
path: "/submit"
operations:
- name: submit-content
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
Checks the publication status of a content entry in Contentful CMS.
naftiko: "0.5"
info:
label: "Contentful Entry Status"
description: "Checks the publication status of a content entry in Contentful CMS."
tags:
- content-management
- contentful
- publishing
capability:
exposes:
- type: mcp
namespace: contentful-cms
port: 8080
tools:
- name: get-entry-status
description: "Look up a Contentful entry status by entry ID."
inputParameters:
- name: space_id
in: body
type: string
description: "The Contentful space identifier."
- name: entry_id
in: body
type: string
description: "The content entry identifier."
call: "contentful.get-entry"
with:
space_id: "{{space_id}}"
entry_id: "{{entry_id}}"
outputParameters:
- name: status
type: string
mapping: "$.sys.publishedVersion"
- name: updated_at
type: string
mapping: "$.sys.updatedAt"
consumes:
- type: http
namespace: contentful
baseUri: "https://cdn.contentful.com"
authentication:
type: bearer
token: "$secrets.contentful_access_token"
resources:
- name: entries
path: "/spaces/{{space_id}}/entries/{{entry_id}}"
inputParameters:
- name: space_id
in: path
- name: entry_id
in: path
operations:
- name: get-entry
method: GET
Aggregates content performance across all Conde Nast brands by querying Snowflake data warehouse, refreshing Tableau dashboards, and emailing the executive summary.
naftiko: "0.5"
info:
label: "Cross-Brand Content Analytics Pipeline"
description: "Aggregates content performance across all Conde Nast brands by querying Snowflake data warehouse, refreshing Tableau dashboards, and emailing the executive summary."
tags:
- analytics
- snowflake
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: cross-brand-analytics
port: 8080
tools:
- name: generate-cross-brand-report
description: "Aggregate multi-brand content performance and generate executive dashboards."
inputParameters:
- name: report_period
in: body
type: string
description: "The reporting period (e.g., Q1-2026)."
- name: distribution_list
in: body
type: string
description: "Comma-separated email addresses for distribution."
steps:
- name: query-snowflake
type: call
call: "snowflake.run-query"
with:
query: "SELECT brand, SUM(page_views) as views FROM content_metrics WHERE period = '{{report_period}}' GROUP BY brand"
- name: refresh-tableau
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "cross_brand_performance"
- name: distribute-report
type: call
call: "gmail.send-email"
with:
to: "{{distribution_list}}"
subject: "Cross-Brand Performance Report - {{report_period}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://condenast.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.condenast.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
operations:
- name: refresh-workbook
method: POST
- type: http
namespace: gmail
baseUri: "https://gmail.googleapis.com/gmail/v1"
authentication:
type: bearer
token: "$secrets.gmail_token"
resources:
- name: messages
path: "/users/me/messages/send"
operations:
- name: send-email
method: POST
Retrieves the status of a content recommendation ML model in Databricks MLflow, returning version, stage, and last transition date.
naftiko: "0.5"
info:
label: "Databricks Content Recommendation Model"
description: "Retrieves the status of a content recommendation ML model in Databricks MLflow, returning version, stage, and last transition date."
tags:
- machine-learning
- databricks
- content-recommendations
capability:
exposes:
- type: mcp
namespace: ml-ops
port: 8080
tools:
- name: get-recommendation-model
description: "Look up a content recommendation model in Databricks. Returns version, stage, and last transition."
inputParameters:
- name: model_name
in: body
type: string
description: "The registered model name."
call: "databricks.get-model-version"
with:
model_name: "{{model_name}}"
outputParameters:
- name: version
type: string
mapping: "$.model_version.version"
- name: stage
type: string
mapping: "$.model_version.current_stage"
consumes:
- type: http
namespace: databricks
baseUri: "https://condenast.cloud.databricks.com/api/2.0/mlflow"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: model-versions
path: "/registered-models/get-latest-versions"
operations:
- name: get-model-version
method: POST
Retrieves website performance metrics from Datadog for a brand domain, returning page load time, error count, and largest contentful paint.
naftiko: "0.5"
info:
label: "Datadog Website Performance Check"
description: "Retrieves website performance metrics from Datadog for a brand domain, returning page load time, error count, and largest contentful paint."
tags:
- monitoring
- datadog
- web-performance
capability:
exposes:
- type: mcp
namespace: web-performance
port: 8080
tools:
- name: get-site-performance
description: "Look up website performance in Datadog. Returns page load time, error count, and LCP."
inputParameters:
- name: domain
in: body
type: string
description: "The brand website domain."
call: "datadog.get-rum-metrics"
with:
domain: "{{domain}}"
outputParameters:
- name: page_load_ms
type: number
mapping: "$.series[0].page_load"
- name: error_count
type: number
mapping: "$.series[0].error_count"
- name: lcp_ms
type: number
mapping: "$.series[0].lcp"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: rum
path: "/rum/analytics/aggregate"
operations:
- name: get-rum-metrics
method: POST
Releases new design system components by exporting from Figma, publishing to the NPM registry, updating Storybook documentation, and notifying development teams via Slack.
naftiko: "0.5"
info:
label: "Design System Component Release Pipeline"
description: "Releases new design system components by exporting from Figma, publishing to the NPM registry, updating Storybook documentation, and notifying development teams via Slack."
tags:
- design-systems
- figma
- npm
- documentation
- slack
capability:
exposes:
- type: mcp
namespace: design-system-release
port: 8080
tools:
- name: release-design-component
description: "Export design tokens from Figma, publish to NPM, update docs, and notify teams."
inputParameters:
- name: component_name
in: body
type: string
description: "The design component name."
- name: version
in: body
type: string
description: "The semantic version number."
steps:
- name: export-figma-tokens
type: call
call: "figma.get-file-styles"
with:
file_key: "design_system_master"
- name: publish-npm-package
type: call
call: "npm.publish"
with:
package: "@condenast/{{component_name}}"
version: "{{version}}"
- name: update-storybook
type: call
call: "github.trigger-workflow"
with:
repo: "design-system"
workflow: "deploy-storybook.yml"
- name: notify-teams
type: call
call: "slack.post-message"
with:
channel: "#design-system-updates"
text: "Released @condenast/{{component_name}}@{{version}}. Storybook updated."
consumes:
- type: http
namespace: figma
baseUri: "https://api.figma.com/v1"
authentication:
type: bearer
token: "$secrets.figma_token"
resources:
- name: files
path: "/files/{{file_key}}/styles"
inputParameters:
- name: file_key
in: path
operations:
- name: get-file-styles
method: GET
- type: http
namespace: npm
baseUri: "https://registry.npmjs.org"
authentication:
type: bearer
token: "$secrets.npm_token"
resources:
- name: packages
path: "/@condenast/{{component_name}}"
inputParameters:
- name: component_name
in: path
operations:
- name: publish
method: PUT
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflows
path: "/repos/condenast/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Synchronizes digital advertising inventory from Google Ad Manager to Salesforce, updates pricing in the rate card system, and notifies the sales team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Digital Ad Inventory Sync Pipeline"
description: "Synchronizes digital advertising inventory from Google Ad Manager to Salesforce, updates pricing in the rate card system, and notifies the sales team via Microsoft Teams."
tags:
- advertising
- google-ad-manager
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ad-inventory-sync
port: 8080
tools:
- name: sync-ad-inventory
description: "Sync digital ad inventory from Ad Manager to CRM and notify sales."
inputParameters:
- name: order_id
in: body
type: string
description: "The Ad Manager order identifier."
- name: sales_team_channel
in: body
type: string
description: "The Teams channel for notifications."
steps:
- name: get-ad-inventory
type: call
call: "gam.get-order-details"
with:
order_id: "{{order_id}}"
- name: update-salesforce
type: call
call: "salesforce.update-opportunity"
with:
opportunity_id: "{{get-ad-inventory.opportunity_id}}"
inventory_status: "{{get-ad-inventory.status}}"
- name: notify-sales
type: call
call: "teams.send-message"
with:
channel: "{{sales_team_channel}}"
text: "Ad inventory updated for order {{order_id}}: {{get-ad-inventory.status}}"
consumes:
- type: http
namespace: gam
baseUri: "https://admanager.googleapis.com/v202308"
authentication:
type: bearer
token: "$secrets.gam_token"
resources:
- name: orders
path: "/orders/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order-details
method: GET
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: update-opportunity
method: PATCH
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Monitors subscription churn risk by querying Snowflake analytics, creating a Jira ticket for customer success, sending a retention email via Mailchimp, and logging the event in Salesforce.
naftiko: "0.5"
info:
label: "Digital Subscription Churn Alert Pipeline"
description: "Monitors subscription churn risk by querying Snowflake analytics, creating a Jira ticket for customer success, sending a retention email via Mailchimp, and logging the event in Salesforce."
tags:
- subscriptions
- snowflake
- jira
- mailchimp
- salesforce
capability:
exposes:
- type: mcp
namespace: churn-alert
port: 8080
tools:
- name: handle-churn-risk
description: "Detect and respond to subscription churn risk signals."
inputParameters:
- name: subscriber_id
in: body
type: string
description: "The subscriber identifier."
- name: risk_score
in: body
type: number
description: "The churn risk score (0-100)."
steps:
- name: get-subscriber-data
type: call
call: "snowflake.run-query"
with:
query: "SELECT * FROM subscribers WHERE id = '{{subscriber_id}}'"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "CS"
summary: "Churn risk: {{subscriber_id}}"
priority: "High"
- name: send-retention-email
type: call
call: "mailchimp.send-campaign"
with:
list_id: "retention"
subscriber_email: "{{get-subscriber-data.email}}"
- name: log-in-salesforce
type: call
call: "salesforce.create-activity"
with:
contact_id: "{{subscriber_id}}"
subject: "Churn risk alert triggered"
consumes:
- type: http
namespace: snowflake
baseUri: "https://condenast.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: bearer
token: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: send-campaign
method: POST
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: activities
path: "/sobjects/Task"
operations:
- name: create-activity
method: POST
Launches a new e-commerce product by creating the listing in Shopify, creating promotional content in WordPress, sending launch email via Mailchimp, and announcing via Instagram.
naftiko: "0.5"
info:
label: "E-Commerce Product Launch Pipeline"
description: "Launches a new e-commerce product by creating the listing in Shopify, creating promotional content in WordPress, sending launch email via Mailchimp, and announcing via Instagram."
tags:
- e-commerce
- shopify
- wordpress
- marketing
capability:
exposes:
- type: mcp
namespace: product-launch
port: 8080
tools:
- name: launch-ecommerce-product
description: "Create product listing, publish content, and promote across channels."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name."
- name: product_price
in: body
type: string
description: "The product price."
- name: brand
in: body
type: string
description: "The brand selling the product."
steps:
- name: create-shopify-product
type: call
call: "shopify.create-product"
with:
title: "{{product_name}}"
price: "{{product_price}}"
vendor: "{{brand}}"
- name: create-promo-post
type: call
call: "wordpress.create-post"
with:
title: "Introducing {{product_name}}"
status: "publish"
categories: "shop"
- name: send-launch-email
type: call
call: "mailchimp.send-campaign"
with:
list_id: "shoppers"
subject: "New: {{product_name}} from {{brand}}"
- name: post-to-instagram
type: call
call: "instagram.create-post"
with:
caption: "Now available: {{product_name}}. Shop link in bio."
brand: "{{brand}}"
consumes:
- type: http
namespace: shopify
baseUri: "https://shop.condenast.com/admin/api/2024-01"
authentication:
type: bearer
token: "$secrets.shopify_access_token"
resources:
- name: products
path: "/products.json"
operations:
- name: create-product
method: POST
- type: http
namespace: wordpress
baseUri: "https://{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: bearer
token: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: send-campaign
method: POST
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.instagram_token"
resources:
- name: media
path: "/{{ig_user_id}}/media"
operations:
- name: create-post
method: POST
When an article is approved in the CMS, publishes to WordPress, triggers SEO indexing via Google Search Console, updates the social media calendar in Airtable, and notifies the editorial team via Slack.
naftiko: "0.5"
info:
label: "Editorial Content Publishing Pipeline"
description: "When an article is approved in the CMS, publishes to WordPress, triggers SEO indexing via Google Search Console, updates the social media calendar in Airtable, and notifies the editorial team via Slack."
tags:
- editorial
- publishing
- wordpress
- google
- slack
- airtable
capability:
exposes:
- type: mcp
namespace: editorial-publishing
port: 8080
tools:
- name: publish-article
description: "Given a CMS article ID, publish to WordPress, trigger SEO indexing, update social calendar, and notify editorial."
inputParameters:
- name: article_id
in: body
type: string
description: "The CMS article identifier."
- name: brand
in: body
type: string
description: "The Condé Nast brand (e.g., Vogue, GQ, Wired, Vanity Fair)."
- name: publish_date
in: body
type: string
description: "The target publish date in YYYY-MM-DD format."
steps:
- name: get-article
type: call
call: "cms.get-article"
with:
article_id: "{{article_id}}"
- name: publish-wp
type: call
call: "wordpress.create-post"
with:
title: "{{get-article.title}}"
content: "{{get-article.body}}"
status: "publish"
categories: "{{get-article.categories}}"
- name: request-indexing
type: call
call: "google-search.request-indexing"
with:
url: "{{publish-wp.link}}"
- name: update-social-calendar
type: call
call: "airtable.create-record"
with:
base_id: "social_calendar"
table_name: "{{brand}}_posts"
fields:
title: "{{get-article.title}}"
url: "{{publish-wp.link}}"
publish_date: "{{publish_date}}"
- name: notify-editorial
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-editorial"
text: "Published: \"{{get-article.title}}\" - {{publish-wp.link}}. Social calendar updated."
consumes:
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{article_id}}"
inputParameters:
- name: article_id
in: path
operations:
- name: get-article
method: GET
- type: http
namespace: wordpress
baseUri: "https://{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: google-search
baseUri: "https://indexing.googleapis.com/v3"
authentication:
type: bearer
token: "$secrets.google_indexing_token"
resources:
- name: url-notifications
path: "/urlNotifications:publish"
operations:
- name: request-indexing
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Processes freelancer payments by verifying completed assignments in Airtable, generating invoices in QuickBooks, processing payment via Stripe, and sending confirmation via email.
naftiko: "0.5"
info:
label: "Editorial Freelancer Payment Pipeline"
description: "Processes freelancer payments by verifying completed assignments in Airtable, generating invoices in QuickBooks, processing payment via Stripe, and sending confirmation via email."
tags:
- finance
- freelancer
- airtable
- quickbooks
- stripe
capability:
exposes:
- type: mcp
namespace: freelancer-payment
port: 8080
tools:
- name: process-freelancer-payment
description: "Verify assignment completion, generate invoice, process payment, and send confirmation."
inputParameters:
- name: freelancer_id
in: body
type: string
description: "The freelancer identifier."
- name: assignment_id
in: body
type: string
description: "The assignment record identifier."
steps:
- name: verify-assignment
type: call
call: "airtable.get-record"
with:
base_id: "freelancers"
record_id: "{{assignment_id}}"
- name: create-invoice
type: call
call: "quickbooks.create-invoice"
with:
vendor_id: "{{freelancer_id}}"
amount: "{{verify-assignment.rate}}"
description: "{{verify-assignment.assignment_title}}"
- name: process-payment
type: call
call: "stripe.create-payout"
with:
amount: "{{verify-assignment.rate}}"
destination: "{{verify-assignment.stripe_account}}"
- name: send-confirmation
type: call
call: "gmail.send-email"
with:
to: "{{verify-assignment.email}}"
subject: "Payment processed for {{verify-assignment.assignment_title}}"
consumes:
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/freelancers/{{record_id}}"
inputParameters:
- name: base_id
in: path
- name: record_id
in: path
operations:
- name: get-record
method: GET
- type: http
namespace: quickbooks
baseUri: "https://quickbooks.api.intuit.com/v3"
authentication:
type: bearer
token: "$secrets.quickbooks_token"
resources:
- name: invoices
path: "/company/{{company_id}}/invoice"
operations:
- name: create-invoice
method: POST
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: payouts
path: "/payouts"
operations:
- name: create-payout
method: POST
- type: http
namespace: gmail
baseUri: "https://gmail.googleapis.com/gmail/v1"
authentication:
type: bearer
token: "$secrets.gmail_token"
resources:
- name: messages
path: "/users/me/messages/send"
operations:
- name: send-email
method: POST
On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a Google Drive folder, and sends a Slack welcome message to the new employee.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a Google Drive folder, and sends a Slack welcome message to the new employee."
tags:
- hr
- onboarding
- workday
- servicenow
- google-drive
- slack
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID, orchestrate onboarding across ServiceNow, Google Drive, and Slack."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "The employee start date in YYYY-MM-DD format."
- name: department
in: body
type: string
description: "The department the new hire is joining."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: "hr_onboarding"
assigned_group: "IT_Onboarding"
- name: provision-folder
type: call
call: "gdrive.create-folder"
with:
name: "{{get-employee.full_name}}_{{start_date}}"
parent_id: "onboarding_root_folder"
- name: send-welcome
type: call
call: "slack.post-message"
with:
channel: "#new-hires"
text: "Welcome to Condé Nast, {{get-employee.first_name}}! Your IT ticket is {{open-ticket.number}} and your docs folder is ready at {{provision-folder.webViewLink}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://condenast.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: gdrive
baseUri: "https://www.googleapis.com/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files"
operations:
- name: create-folder
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Sets up livestream coverage for events by creating a YouTube Live stream, scheduling social media teasers, and creating a Slack coordination channel.
naftiko: "0.5"
info:
label: "Event Coverage Livestream Pipeline"
description: "Sets up livestream coverage for events by creating a YouTube Live stream, scheduling social media teasers, and creating a Slack coordination channel."
tags:
- events
- youtube
- social-media
- slack
- livestream
capability:
exposes:
- type: mcp
namespace: event-livestream
port: 8080
tools:
- name: setup-event-livestream
description: "Set up livestream infrastructure and social promotion for event coverage."
inputParameters:
- name: event_name
in: body
type: string
description: "The event name."
- name: brand
in: body
type: string
description: "The brand covering the event."
- name: stream_date
in: body
type: string
description: "The scheduled stream date."
steps:
- name: create-youtube-stream
type: call
call: "youtube.create-live-broadcast"
with:
title: "{{brand}} Live: {{event_name}}"
scheduled_start: "{{stream_date}}"
- name: create-social-teaser
type: call
call: "instagram.create-post"
with:
caption: "Watch us LIVE at {{event_name}} on {{stream_date}}!"
brand: "{{brand}}"
- name: create-coordination-channel
type: call
call: "slack.create-channel"
with:
name: "live-{{event_name}}"
topic: "Livestream coordination for {{event_name}}"
consumes:
- type: http
namespace: youtube
baseUri: "https://www.googleapis.com/youtube/v3"
authentication:
type: bearer
token: "$secrets.youtube_token"
resources:
- name: broadcasts
path: "/liveBroadcasts?part=snippet,status"
operations:
- name: create-live-broadcast
method: POST
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.instagram_token"
resources:
- name: media
path: "/{{ig_user_id}}/media"
operations:
- name: create-post
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
Retrieves performance metrics for a Facebook Ads campaign, returning impressions, reach, clicks, and cost per result.
naftiko: "0.5"
info:
label: "Facebook Ads Campaign Performance"
description: "Retrieves performance metrics for a Facebook Ads campaign, returning impressions, reach, clicks, and cost per result."
tags:
- advertising
- facebook-ads
- paid-media
capability:
exposes:
- type: mcp
namespace: paid-media
port: 8080
tools:
- name: get-fb-campaign-performance
description: "Look up Facebook Ads campaign performance. Returns impressions, reach, clicks, and cost per result."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The Facebook Ads campaign ID."
call: "facebook-ads.get-insights"
with:
campaign_id: "{{campaign_id}}"
outputParameters:
- name: impressions
type: number
mapping: "$.data[0].impressions"
- name: reach
type: number
mapping: "$.data[0].reach"
- name: clicks
type: number
mapping: "$.data[0].clicks"
- name: cost_per_result
type: number
mapping: "$.data[0].cost_per_action_type[0].value"
consumes:
- type: http
namespace: facebook-ads
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.facebook_ads_token"
resources:
- name: insights
path: "/{{campaign_id}}/insights"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-insights
method: GET
Coordinates fashion week coverage by assigning photographers in Airtable, creating Slack war-room channels, setting up live blogs in WordPress, and scheduling Instagram Stories.
naftiko: "0.5"
info:
label: "Fashion Week Coverage Orchestrator"
description: "Coordinates fashion week coverage by assigning photographers in Airtable, creating Slack war-room channels, setting up live blogs in WordPress, and scheduling Instagram Stories."
tags:
- editorial
- fashion
- airtable
- slack
- wordpress
- instagram
capability:
exposes:
- type: mcp
namespace: fashion-week-coverage
port: 8080
tools:
- name: setup-fashion-week
description: "Set up full coverage infrastructure for a fashion week event."
inputParameters:
- name: event_name
in: body
type: string
description: "The fashion week event name."
- name: brand
in: body
type: string
description: "The covering brand."
- name: start_date
in: body
type: string
description: "Event start date in YYYY-MM-DD."
steps:
- name: create-assignment-board
type: call
call: "airtable.create-record"
with:
base_id: "fashion_events"
table_name: "assignments"
event: "{{event_name}}"
- name: create-war-room
type: call
call: "slack.create-channel"
with:
name: "fw-{{brand}}-{{event_name}}"
topic: "Fashion Week Coverage: {{event_name}}"
- name: setup-live-blog
type: call
call: "wordpress.create-post"
with:
title: "{{event_name}} Live Coverage"
status: "draft"
categories: "fashion-week"
- name: schedule-ig-stories
type: call
call: "instagram.create-story-draft"
with:
brand: "{{brand}}"
event: "{{event_name}}"
scheduled_date: "{{start_date}}"
consumes:
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- type: http
namespace: wordpress
baseUri: "https://{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.instagram_token"
resources:
- name: stories
path: "/{{ig_user_id}}/stories"
operations:
- name: create-story-draft
method: POST
Exports design assets from a Figma file, returning the exported image URLs, file format, and dimensions for use in editorial layouts.
naftiko: "0.5"
info:
label: "Figma Design Asset Export"
description: "Exports design assets from a Figma file, returning the exported image URLs, file format, and dimensions for use in editorial layouts."
tags:
- design
- figma
- creative
capability:
exposes:
- type: mcp
namespace: design-ops
port: 8080
tools:
- name: export-figma-assets
description: "Export design assets from a Figma file. Returns image URLs, format, and dimensions."
inputParameters:
- name: file_key
in: body
type: string
description: "The Figma file key."
- name: node_ids
in: body
type: string
description: "Comma-separated node IDs to export."
- name: format
in: body
type: string
description: "Export format (png, jpg, svg, pdf)."
call: "figma.export-images"
with:
file_key: "{{file_key}}"
ids: "{{node_ids}}"
format: "{{format}}"
outputParameters:
- name: images
type: string
mapping: "$.images"
consumes:
- type: http
namespace: figma
baseUri: "https://api.figma.com/v1"
authentication:
type: bearer
token: "$secrets.figma_token"
resources:
- name: images
path: "/images/{{file_key}}"
inputParameters:
- name: file_key
in: path
operations:
- name: export-images
method: GET
Returns the total number of design components in a Figma file for a brand design system.
naftiko: "0.5"
info:
label: "Figma Design Component Count"
description: "Returns the total number of design components in a Figma file for a brand design system."
tags:
- design
- figma
- design-systems
capability:
exposes:
- type: mcp
namespace: figma-components
port: 8080
tools:
- name: get-component-count
description: "Count the design components in a Figma file."
inputParameters:
- name: file_key
in: body
type: string
description: "The Figma file key."
call: "figma.get-file-components"
with:
file_key: "{{file_key}}"
outputParameters:
- name: component_count
type: number
mapping: "$.meta.components_count"
consumes:
- type: http
namespace: figma
baseUri: "https://api.figma.com/v1"
authentication:
type: bearer
token: "$secrets.figma_token"
resources:
- name: files
path: "/files/{{file_key}}/components"
inputParameters:
- name: file_key
in: path
operations:
- name: get-file-components
method: GET
When a freelance contributor is contracted, creates a profile in Workday, provisions Google Workspace access, shares an NDA via Adobe Acrobat Sign, and notifies the editor via Slack.
naftiko: "0.5"
info:
label: "Freelancer Onboarding Pipeline"
description: "When a freelance contributor is contracted, creates a profile in Workday, provisions Google Workspace access, shares an NDA via Adobe Acrobat Sign, and notifies the editor via Slack."
tags:
- hr
- freelancer
- workday
- google-workspace
- adobe-acrobat
- slack
capability:
exposes:
- type: mcp
namespace: freelancer-ops
port: 8080
tools:
- name: onboard-freelancer
description: "Given freelancer details, create a Workday profile, provision Google Workspace, send NDA, and notify the editor."
inputParameters:
- name: full_name
in: body
type: string
description: "The freelancer's full name."
- name: email
in: body
type: string
description: "The freelancer's email address."
- name: editor_slack_id
in: body
type: string
description: "The assigning editor's Slack user ID."
- name: brand
in: body
type: string
description: "The brand the freelancer will contribute to."
steps:
- name: create-worker
type: call
call: "workday.create-contingent-worker"
with:
full_name: "{{full_name}}"
email: "{{email}}"
worker_type: "freelancer"
- name: provision-workspace
type: call
call: "google-admin.create-user"
with:
email: "{{email}}"
org_unit: "/Freelancers/{{brand}}"
- name: send-nda
type: call
call: "adobe-sign.send-agreement"
with:
recipient_email: "{{email}}"
template_id: "freelancer_nda"
- name: notify-editor
type: call
call: "slack.post-message"
with:
channel: "{{editor_slack_id}}"
text: "Freelancer {{full_name}} onboarded for {{brand}}. Workspace provisioned. NDA sent ({{send-nda.agreement_id}})."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: contingent-workers
path: "/contingentWorkers"
operations:
- name: create-contingent-worker
method: POST
- type: http
namespace: google-admin
baseUri: "https://admin.googleapis.com/admin/directory/v1"
authentication:
type: bearer
token: "$secrets.google_admin_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: adobe-sign
baseUri: "https://api.na1.adobesign.com/api/rest/v6"
authentication:
type: bearer
token: "$secrets.adobe_sign_token"
resources:
- name: agreements
path: "/agreements"
operations:
- name: send-agreement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Processes GDPR data deletion requests by removing subscriber data from Snowflake, Salesforce, Mailchimp, and Google Analytics, then confirming completion via email to the requester.
naftiko: "0.5"
info:
label: "GDPR Data Deletion Request Pipeline"
description: "Processes GDPR data deletion requests by removing subscriber data from Snowflake, Salesforce, Mailchimp, and Google Analytics, then confirming completion via email to the requester."
tags:
- compliance
- gdpr
- privacy
- snowflake
- salesforce
capability:
exposes:
- type: mcp
namespace: gdpr-deletion
port: 8080
tools:
- name: process-deletion-request
description: "Remove user data across all systems in compliance with GDPR deletion requests."
inputParameters:
- name: user_email
in: body
type: string
description: "The email of the user requesting deletion."
- name: request_id
in: body
type: string
description: "The GDPR request tracking identifier."
steps:
- name: delete-from-snowflake
type: call
call: "snowflake.run-query"
with:
query: "DELETE FROM subscribers WHERE email = '{{user_email}}'"
- name: delete-from-salesforce
type: call
call: "salesforce.delete-contact"
with:
email: "{{user_email}}"
- name: delete-from-mailchimp
type: call
call: "mailchimp.delete-member"
with:
email: "{{user_email}}"
- name: confirm-deletion
type: call
call: "gmail.send-email"
with:
to: "{{user_email}}"
subject: "Data Deletion Confirmation - Request {{request_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://condenast.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact"
operations:
- name: delete-contact
method: DELETE
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: bearer
token: "$secrets.mailchimp_api_key"
resources:
- name: members
path: "/lists/{{list_id}}/members/{{subscriber_hash}}"
operations:
- name: delete-member
method: DELETE
- type: http
namespace: gmail
baseUri: "https://gmail.googleapis.com/gmail/v1"
authentication:
type: bearer
token: "$secrets.gmail_token"
resources:
- name: messages
path: "/users/me/messages/send"
operations:
- name: send-email
method: POST
Retrieves the latest GitHub Actions workflow run status for a given repository, returning conclusion, duration, and commit SHA.
naftiko: "0.5"
info:
label: "GitHub Actions Build Status"
description: "Retrieves the latest GitHub Actions workflow run status for a given repository, returning conclusion, duration, and commit SHA."
tags:
- ci-cd
- github-actions
- engineering
capability:
exposes:
- type: mcp
namespace: ci-cd
port: 8080
tools:
- name: get-build-status
description: "Look up the latest GitHub Actions workflow run. Returns conclusion, duration, and commit SHA."
inputParameters:
- name: repo
in: body
type: string
description: "The repository in owner/repo format."
- name: workflow_id
in: body
type: string
description: "The workflow file name or ID."
call: "github.get-workflow-run"
with:
repo: "{{repo}}"
workflow_id: "{{workflow_id}}"
outputParameters:
- name: conclusion
type: string
mapping: "$.workflow_runs[0].conclusion"
- name: duration_seconds
type: number
mapping: "$.workflow_runs[0].run_duration"
- name: head_sha
type: string
mapping: "$.workflow_runs[0].head_sha"
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/workflows/{{workflow_id}}/runs"
inputParameters:
- name: repo
in: path
- name: workflow_id
in: path
operations:
- name: get-workflow-run
method: GET
Clears content rights for global distribution by checking the rights database, requesting clearance from Getty Images, logging in the legal tracker, and updating publication permissions.
naftiko: "0.5"
info:
label: "Global Content Rights Clearance Pipeline"
description: "Clears content rights for global distribution by checking the rights database, requesting clearance from Getty Images, logging in the legal tracker, and updating publication permissions."
tags:
- legal
- rights-management
- content-management
capability:
exposes:
- type: mcp
namespace: rights-clearance
port: 8080
tools:
- name: clear-content-rights
description: "Verify and clear content rights for global distribution across brands."
inputParameters:
- name: asset_id
in: body
type: string
description: "The content asset identifier."
- name: target_territories
in: body
type: string
description: "Comma-separated target territory codes."
steps:
- name: check-rights-db
type: call
call: "rights-db.get-asset-rights"
with:
asset_id: "{{asset_id}}"
- name: request-getty-clearance
type: call
call: "getty.check-license"
with:
asset_id: "{{asset_id}}"
territories: "{{target_territories}}"
- name: log-in-tracker
type: call
call: "airtable.create-record"
with:
base_id: "legal_rights"
table_name: "clearance_requests"
asset: "{{asset_id}}"
territories: "{{target_territories}}"
- name: update-permissions
type: call
call: "cms.update-asset-permissions"
with:
asset_id: "{{asset_id}}"
territories: "{{target_territories}}"
consumes:
- type: http
namespace: rights-db
baseUri: "https://rights.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.rights_db_token"
resources:
- name: assets
path: "/assets/{{asset_id}}/rights"
inputParameters:
- name: asset_id
in: path
operations:
- name: get-asset-rights
method: GET
- type: http
namespace: getty
baseUri: "https://api.gettyimages.com/v3"
authentication:
type: bearer
token: "$secrets.getty_api_key"
resources:
- name: licenses
path: "/images/{{asset_id}}/license"
inputParameters:
- name: asset_id
in: path
operations:
- name: check-license
method: GET
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: assets
path: "/assets/{{asset_id}}/permissions"
inputParameters:
- name: asset_id
in: path
operations:
- name: update-asset-permissions
method: PATCH
Retrieves Google Ads campaign metrics for programmatic advertising, returning impressions, clicks, CTR, and average CPC.
naftiko: "0.5"
info:
label: "Google Ads Campaign Lookup"
description: "Retrieves Google Ads campaign metrics for programmatic advertising, returning impressions, clicks, CTR, and average CPC."
tags:
- advertising
- google-ads
- programmatic
capability:
exposes:
- type: mcp
namespace: programmatic-ads
port: 8080
tools:
- name: get-google-ads-performance
description: "Look up Google Ads campaign performance. Returns impressions, clicks, CTR, and average CPC."
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-metrics"
with:
customer_id: "{{customer_id}}"
campaign_id: "{{campaign_id}}"
outputParameters:
- name: impressions
type: number
mapping: "$.results[0].metrics.impressions"
- name: clicks
type: number
mapping: "$.results[0].metrics.clicks"
- name: ctr
type: number
mapping: "$.results[0].metrics.ctr"
- name: avg_cpc
type: number
mapping: "$.results[0].metrics.averageCpc"
consumes:
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v14"
authentication:
type: bearer
token: "$secrets.google_ads_token"
resources:
- name: campaigns
path: "/customers/{{customer_id}}/googleAds:searchStream"
inputParameters:
- name: customer_id
in: path
operations:
- name: get-campaign-metrics
method: POST
Retrieves content performance metrics from Google Analytics for a given article URL, returning page views, average time on page, and bounce rate.
naftiko: "0.5"
info:
label: "Google Analytics Content Performance Lookup"
description: "Retrieves content performance metrics from Google Analytics for a given article URL, returning page views, average time on page, and bounce rate."
tags:
- analytics
- google-analytics
- content-performance
capability:
exposes:
- type: mcp
namespace: content-analytics
port: 8080
tools:
- name: get-article-performance
description: "Look up Google Analytics performance for an article URL. Returns page views, avg time on page, and bounce rate."
inputParameters:
- name: property_id
in: body
type: string
description: "The Google Analytics 4 property ID."
- name: article_url
in: body
type: string
description: "The article URL path."
call: "ga4.get-page-report"
with:
property_id: "{{property_id}}"
page_path: "{{article_url}}"
outputParameters:
- name: page_views
type: number
mapping: "$.rows[0].metricValues[0].value"
- name: avg_time_on_page
type: number
mapping: "$.rows[0].metricValues[1].value"
- name: bounce_rate
type: number
mapping: "$.rows[0].metricValues[2].value"
consumes:
- type: http
namespace: ga4
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
inputParameters:
- name: property_id
in: path
operations:
- name: get-page-report
method: POST
Retrieves file metadata from Google Drive, returning file name, MIME type, size, and web view link.
naftiko: "0.5"
info:
label: "Google Drive File Lookup"
description: "Retrieves file metadata from Google Drive, returning file name, MIME type, size, and web view link."
tags:
- document-management
- google-drive
capability:
exposes:
- type: mcp
namespace: file-management
port: 8080
tools:
- name: get-drive-file
description: "Look up a Google Drive file. Returns name, MIME type, size, and web view link."
inputParameters:
- name: file_id
in: body
type: string
description: "The Google Drive file ID."
call: "gdrive.get-file"
with:
file_id: "{{file_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: mime_type
type: string
mapping: "$.mimeType"
- name: size
type: number
mapping: "$.size"
- name: web_view_link
type: string
mapping: "$.webViewLink"
consumes:
- type: http
namespace: gdrive
baseUri: "https://www.googleapis.com/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files/{{file_id}}"
inputParameters:
- name: file_id
in: path
operations:
- name: get-file
method: GET
Checks the indexing status of a URL in Google Search Console to verify article visibility.
naftiko: "0.5"
info:
label: "Google Search Console Indexing Status"
description: "Checks the indexing status of a URL in Google Search Console to verify article visibility."
tags:
- seo
- google-search-console
- content-performance
capability:
exposes:
- type: mcp
namespace: gsc-index
port: 8080
tools:
- name: get-indexing-status
description: "Check if a URL is indexed in Google Search Console."
inputParameters:
- name: site_url
in: body
type: string
description: "The site URL registered in Search Console."
- name: page_url
in: body
type: string
description: "The page URL to check indexing for."
call: "gsc.get-url-inspection"
with:
site_url: "{{site_url}}"
inspection_url: "{{page_url}}"
outputParameters:
- name: coverage_state
type: string
mapping: "$.inspectionResult.indexStatusResult.coverageState"
- name: last_crawl_time
type: string
mapping: "$.inspectionResult.indexStatusResult.lastCrawlTime"
consumes:
- type: http
namespace: gsc
baseUri: "https://searchconsole.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_search_console_token"
resources:
- name: url-inspection
path: "/urlInspection/index:inspect"
operations:
- name: get-url-inspection
method: POST
Updates a GTM container with new tracking tags, creates a workspace version, publishes the container, and notifies the analytics team via Slack.
naftiko: "0.5"
info:
label: "Google Tag Manager Container Update Pipeline"
description: "Updates a GTM container with new tracking tags, creates a workspace version, publishes the container, and notifies the analytics team via Slack."
tags:
- analytics
- google-tag-manager
- tracking
- slack
capability:
exposes:
- type: mcp
namespace: tag-management
port: 8080
tools:
- name: publish-gtm-container
description: "Given a GTM account and container, create a new version and publish, then notify the analytics team."
inputParameters:
- name: account_id
in: body
type: string
description: "The GTM account ID."
- name: container_id
in: body
type: string
description: "The GTM container ID."
- name: workspace_id
in: body
type: string
description: "The GTM workspace ID."
steps:
- name: create-version
type: call
call: "gtm.create-version"
with:
account_id: "{{account_id}}"
container_id: "{{container_id}}"
workspace_id: "{{workspace_id}}"
- name: publish-version
type: call
call: "gtm.publish-version"
with:
account_id: "{{account_id}}"
container_id: "{{container_id}}"
version_id: "{{create-version.containerVersionId}}"
- name: notify-analytics
type: call
call: "slack.post-message"
with:
channel: "#analytics-ops"
text: "GTM container {{container_id}} published. Version: {{create-version.containerVersionId}}."
consumes:
- type: http
namespace: gtm
baseUri: "https://www.googleapis.com/tagmanager/v2"
authentication:
type: bearer
token: "$secrets.gtm_token"
resources:
- name: versions
path: "/accounts/{{account_id}}/containers/{{container_id}}/workspaces/{{workspace_id}}:create_version"
inputParameters:
- name: account_id
in: path
- name: container_id
in: path
- name: workspace_id
in: path
operations:
- name: create-version
method: POST
- name: publish
path: "/accounts/{{account_id}}/containers/{{container_id}}/versions/{{version_id}}:publish"
inputParameters:
- name: account_id
in: path
- name: container_id
in: path
- name: version_id
in: path
operations:
- name: publish-version
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves trending interest data for a topic from Google Trends to inform editorial planning.
naftiko: "0.5"
info:
label: "Google Trends Topic Interest"
description: "Retrieves trending interest data for a topic from Google Trends to inform editorial planning."
tags:
- analytics
- google-trends
- editorial
capability:
exposes:
- type: mcp
namespace: google-trends
port: 8080
tools:
- name: get-topic-interest
description: "Fetch Google Trends interest over time for a topic."
inputParameters:
- name: keyword
in: body
type: string
description: "The keyword or topic to query."
- name: geo
in: body
type: string
description: "The geographic region code (e.g., US)."
call: "trends.get-interest"
with:
keyword: "{{keyword}}"
geo: "{{geo}}"
outputParameters:
- name: interest_score
type: number
mapping: "$.default.timelineData[-1].value[0]"
- name: trend_direction
type: string
mapping: "$.default.trend"
consumes:
- type: http
namespace: trends
baseUri: "https://trends.googleapis.com/trends/api"
authentication:
type: bearer
token: "$secrets.google_trends_token"
resources:
- name: explore
path: "/widgetdata/multiline"
operations:
- name: get-interest
method: GET
Retrieves contact details from HubSpot CRM for advertising and partnership relationship management.
naftiko: "0.5"
info:
label: "HubSpot Contact Lookup"
description: "Retrieves contact details from HubSpot CRM for advertising and partnership relationship management."
tags:
- crm
- hubspot
- advertising
capability:
exposes:
- type: mcp
namespace: hubspot-crm
port: 8080
tools:
- name: get-contact
description: "Look up a HubSpot contact by email address."
inputParameters:
- name: email
in: body
type: string
description: "The contact email address."
call: "hubspot.get-contact-by-email"
with:
email: "{{email}}"
outputParameters:
- name: contact_id
type: string
mapping: "$.vid"
- name: company
type: string
mapping: "$.properties.company.value"
- name: lifecycle_stage
type: string
mapping: "$.properties.lifecyclestage.value"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_api_key"
resources:
- name: contacts
path: "/contacts/v1/contact/email/{{email}}/profile"
inputParameters:
- name: email
in: path
operations:
- name: get-contact-by-email
method: GET
Onboards a new influencer collaborator by creating their profile in Salesforce, setting up a Slack channel, configuring DocuSign for contract signing, and adding them to the content calendar.
naftiko: "0.5"
info:
label: "Influencer Collaboration Onboarding Pipeline"
description: "Onboards a new influencer collaborator by creating their profile in Salesforce, setting up a Slack channel, configuring DocuSign for contract signing, and adding them to the content calendar."
tags:
- influencer
- salesforce
- slack
- docusign
- airtable
capability:
exposes:
- type: mcp
namespace: influencer-onboarding
port: 8080
tools:
- name: onboard-influencer
description: "Set up a new influencer collaboration across CRM, communications, contracts, and calendar."
inputParameters:
- name: influencer_name
in: body
type: string
description: "The influencer display name."
- name: influencer_email
in: body
type: string
description: "The influencer email address."
- name: brand
in: body
type: string
description: "The brand they will collaborate with."
steps:
- name: create-salesforce-contact
type: call
call: "salesforce.create-contact"
with:
name: "{{influencer_name}}"
email: "{{influencer_email}}"
type: "Influencer"
- name: create-slack-channel
type: call
call: "slack.create-channel"
with:
name: "collab-{{influencer_name}}"
is_private: "true"
- name: send-contract
type: call
call: "docusign.create-envelope"
with:
template_id: "influencer_agreement"
signer_email: "{{influencer_email}}"
- name: add-to-calendar
type: call
call: "airtable.create-record"
with:
base_id: "content_calendar"
table_name: "{{brand}}_influencers"
name: "{{influencer_name}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact"
operations:
- name: create-contact
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- type: http
namespace: docusign
baseUri: "https://demo.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
Retrieves Instagram audience demographics and engagement metrics for a brand account, returning follower count, engagement rate, and top audience demographics.
naftiko: "0.5"
info:
label: "Instagram Audience Insights Lookup"
description: "Retrieves Instagram audience demographics and engagement metrics for a brand account, returning follower count, engagement rate, and top audience demographics."
tags:
- social-media
- instagram
- audience-insights
capability:
exposes:
- type: mcp
namespace: social-insights
port: 8080
tools:
- name: get-instagram-insights
description: "Look up Instagram audience insights. Returns follower count, engagement rate, and demographics."
inputParameters:
- name: account_id
in: body
type: string
description: "The Instagram business account ID."
call: "instagram.get-insights"
with:
account_id: "{{account_id}}"
outputParameters:
- name: follower_count
type: number
mapping: "$.data.followers_count"
- name: engagement_rate
type: number
mapping: "$.data.engagement_rate"
consumes:
- type: http
namespace: instagram
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.instagram_token"
resources:
- name: insights
path: "/{{account_id}}/insights"
inputParameters:
- name: account_id
in: path
operations:
- name: get-insights
method: GET
Retrieves the current editorial sprint status from Jira, returning completed stories, remaining story points, and sprint burndown status.
naftiko: "0.5"
info:
label: "Jira Editorial Sprint Status"
description: "Retrieves the current editorial sprint status from Jira, returning completed stories, remaining story points, and sprint burndown status."
tags:
- project-management
- jira
- editorial
capability:
exposes:
- type: mcp
namespace: editorial-pm
port: 8080
tools:
- name: get-editorial-sprint
description: "Look up the current editorial sprint in Jira. Returns completed stories, remaining points, and burndown status."
inputParameters:
- name: board_id
in: body
type: string
description: "The Jira board ID for the editorial team."
call: "jira.get-sprint"
with:
board_id: "{{board_id}}"
outputParameters:
- name: completed_stories
type: number
mapping: "$.sprint.completedIssues"
- name: remaining_points
type: number
mapping: "$.sprint.remainingPoints"
- name: burndown_status
type: string
mapping: "$.sprint.burndownStatus"
consumes:
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
operations:
- name: get-sprint
method: GET
Retrieves LinkedIn company page analytics for a brand, returning follower count, post impressions, and engagement rate.
naftiko: "0.5"
info:
label: "LinkedIn Company Page Analytics"
description: "Retrieves LinkedIn company page analytics for a brand, returning follower count, post impressions, and engagement rate."
tags:
- social-media
- linkedin
- analytics
capability:
exposes:
- type: mcp
namespace: linkedin-analytics
port: 8080
tools:
- name: get-linkedin-analytics
description: "Look up LinkedIn company page analytics. Returns follower count, impressions, and engagement rate."
inputParameters:
- name: organization_id
in: body
type: string
description: "The LinkedIn organization ID."
call: "linkedin.get-page-stats"
with:
organization_id: "{{organization_id}}"
outputParameters:
- name: follower_count
type: number
mapping: "$.elements[0].followerCounts.organicFollowerCount"
- name: impressions
type: number
mapping: "$.elements[0].totalShareStatistics.impressionCount"
- name: engagement_rate
type: number
mapping: "$.elements[0].totalShareStatistics.engagement"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: statistics
path: "/organizationalEntityShareStatistics"
operations:
- name: get-page-stats
method: GET
Creates a newsletter campaign in MailChimp, populates it with curated content from the CMS, schedules delivery, and logs the campaign in Google Sheets for tracking.
naftiko: "0.5"
info:
label: "MailChimp Newsletter Campaign Pipeline"
description: "Creates a newsletter campaign in MailChimp, populates it with curated content from the CMS, schedules delivery, and logs the campaign in Google Sheets for tracking."
tags:
- email-marketing
- mailchimp
- newsletter
- google-sheets
capability:
exposes:
- type: mcp
namespace: email-campaigns
port: 8080
tools:
- name: create-newsletter
description: "Given content IDs and audience segment, create and schedule a MailChimp newsletter campaign."
inputParameters:
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- name: subject_line
in: body
type: string
description: "The email subject line."
- name: segment_id
in: body
type: string
description: "The MailChimp audience segment ID."
- name: send_time
in: body
type: string
description: "The scheduled send time in ISO 8601 format."
steps:
- name: create-campaign
type: call
call: "mailchimp.create-campaign"
with:
type: "regular"
list_id: "{{brand}}_subscribers"
segment_id: "{{segment_id}}"
subject_line: "{{subject_line}}"
- name: schedule-campaign
type: call
call: "mailchimp.schedule-campaign"
with:
campaign_id: "{{create-campaign.id}}"
send_time: "{{send_time}}"
- name: log-campaign
type: call
call: "gsheets.append-row"
with:
spreadsheet_id: "newsletter_tracking"
range: "Campaigns!A:D"
values:
- "{{brand}}"
- "{{subject_line}}"
- "{{create-campaign.id}}"
- "{{send_time}}"
consumes:
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: create-campaign
method: POST
- name: schedule
path: "/campaigns/{{campaign_id}}/actions/schedule"
inputParameters:
- name: campaign_id
in: path
operations:
- name: schedule-campaign
method: POST
- type: http
namespace: gsheets
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
Checks the health of a MuleSoft API integration, returning deployment status, request count, error rate, and average response time.
naftiko: "0.5"
info:
label: "MuleSoft API Integration Health"
description: "Checks the health of a MuleSoft API integration, returning deployment status, request count, error rate, and average response time."
tags:
- integration
- mulesoft
- api-management
capability:
exposes:
- type: mcp
namespace: integration-health
port: 8080
tools:
- name: get-mulesoft-api-health
description: "Look up MuleSoft API health metrics. Returns deployment status, request count, error rate, and response time."
inputParameters:
- name: environment_id
in: body
type: string
description: "The Anypoint environment ID."
- name: api_id
in: body
type: string
description: "The API instance ID."
call: "mulesoft.get-api-analytics"
with:
environment_id: "{{environment_id}}"
api_id: "{{api_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: request_count
type: number
mapping: "$.analytics.requestCount"
- name: error_rate
type: number
mapping: "$.analytics.errorRate"
consumes:
- type: http
namespace: mulesoft
baseUri: "https://anypoint.mulesoft.com/analytics/1.0"
authentication:
type: bearer
token: "$secrets.mulesoft_token"
resources:
- name: analytics
path: "/{{organization_id}}/environments/{{environment_id}}/apis/{{api_id}}"
inputParameters:
- name: environment_id
in: path
- name: api_id
in: path
operations:
- name: get-api-analytics
method: GET
Runs a New Relic Synthetics availability check for a brand website and returns uptime percentage and response time.
naftiko: "0.5"
info:
label: "New Relic Synthetics Site Check"
description: "Runs a New Relic Synthetics availability check for a brand website and returns uptime percentage and response time."
tags:
- monitoring
- new-relic
- website-performance
capability:
exposes:
- type: mcp
namespace: synthetics-check
port: 8080
tools:
- name: check-site-availability
description: "Check website availability via New Relic Synthetics."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The New Relic Synthetics monitor identifier."
call: "new-relic.get-monitor-results"
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: uptime_pct
type: number
mapping: "$.data.uptime_percentage"
- name: avg_response_ms
type: number
mapping: "$.data.avg_response_time"
consumes:
- type: http
namespace: new-relic
baseUri: "https://synthetics.newrelic.com/synthetics/api/v3"
authentication:
type: bearer
token: "$secrets.new_relic_api_key"
resources:
- name: monitors
path: "/monitors/{{monitor_id}}/results"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor-results
method: GET
Retrieves website application performance from New Relic, returning Apdex score, throughput, and error rate.
naftiko: "0.5"
info:
label: "New Relic Website Performance Check"
description: "Retrieves website application performance from New Relic, returning Apdex score, throughput, and error rate."
tags:
- monitoring
- new-relic
- apm
capability:
exposes:
- type: mcp
namespace: apm
port: 8080
tools:
- name: get-newrelic-performance
description: "Look up New Relic application performance. Returns Apdex score, throughput, and error rate."
inputParameters:
- name: app_id
in: body
type: string
description: "The New Relic application ID."
call: "newrelic.get-app-summary"
with:
app_id: "{{app_id}}"
outputParameters:
- name: apdex_score
type: number
mapping: "$.application_summary.apdex_score"
- name: throughput
type: number
mapping: "$.application_summary.throughput"
- name: error_rate
type: number
mapping: "$.application_summary.error_rate"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apiKey
key: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-summary
method: GET
Retrieves the editorial calendar from Notion for a given brand, returning upcoming article titles, authors, publish dates, and statuses.
naftiko: "0.5"
info:
label: "Notion Editorial Calendar Lookup"
description: "Retrieves the editorial calendar from Notion for a given brand, returning upcoming article titles, authors, publish dates, and statuses."
tags:
- editorial
- notion
- planning
capability:
exposes:
- type: mcp
namespace: editorial-calendar
port: 8080
tools:
- name: get-editorial-calendar
description: "Look up the editorial calendar in Notion for a brand. Returns upcoming articles with titles, authors, and dates."
inputParameters:
- name: database_id
in: body
type: string
description: "The Notion database ID for the editorial calendar."
- name: brand
in: body
type: string
description: "The brand to filter by."
call: "notion.query-database"
with:
database_id: "{{database_id}}"
filter_brand: "{{brand}}"
outputParameters:
- name: results
type: string
mapping: "$.results"
consumes:
- type: http
namespace: notion
baseUri: "https://api.notion.com/v1"
authentication:
type: bearer
token: "$secrets.notion_token"
inputParameters:
- name: Notion-Version
in: header
value: "2022-06-28"
resources:
- name: databases
path: "/databases/{{database_id}}/query"
inputParameters:
- name: database_id
in: path
operations:
- name: query-database
method: POST
When a photo shoot is completed, imports raw assets from cloud storage, processes them in Adobe Lightroom, uploads finals to AEM, and updates the editorial calendar in Airtable.
naftiko: "0.5"
info:
label: "Photo Shoot Asset Delivery Pipeline"
description: "When a photo shoot is completed, imports raw assets from cloud storage, processes them in Adobe Lightroom, uploads finals to AEM, and updates the editorial calendar in Airtable."
tags:
- photography
- adobe
- airtable
- content-management
capability:
exposes:
- type: mcp
namespace: photo-asset-delivery
port: 8080
tools:
- name: deliver-photo-assets
description: "Import, process, and deliver photo shoot assets to AEM and update editorial calendar."
inputParameters:
- name: shoot_id
in: body
type: string
description: "The photo shoot identifier."
- name: brand
in: body
type: string
description: "The brand the shoot is for."
steps:
- name: fetch-raw-assets
type: call
call: "cloud-storage.list-assets"
with:
folder: "shoots/{{shoot_id}}"
- name: process-images
type: call
call: "lightroom.batch-edit"
with:
preset: "editorial-standard"
source_folder: "shoots/{{shoot_id}}"
- name: upload-to-aem
type: call
call: "aem.upload-assets"
with:
destination: "/content/dam/{{brand}}/{{shoot_id}}"
- name: update-calendar
type: call
call: "airtable.update-record"
with:
base_id: "editorial_calendar"
table_name: "{{brand}}_shoots"
fields_status: "Assets Delivered"
consumes:
- type: http
namespace: cloud-storage
baseUri: "https://storage.googleapis.com/storage/v1"
authentication:
type: bearer
token: "$secrets.gcs_token"
resources:
- name: objects
path: "/b/condenast-shoots/o"
operations:
- name: list-assets
method: GET
- type: http
namespace: lightroom
baseUri: "https://lr.adobe.io/v2"
authentication:
type: bearer
token: "$secrets.adobe_lightroom_token"
resources:
- name: edits
path: "/catalogs/{{catalog_id}}/assets"
operations:
- name: batch-edit
method: POST
- type: http
namespace: aem
baseUri: "https://aem.condenast.com/api/assets"
authentication:
type: bearer
token: "$secrets.aem_token"
resources:
- name: assets
path: "/upload"
operations:
- name: upload-assets
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: update-record
method: PATCH
Retrieves performance metrics for a Pinterest pin including impressions, saves, and clicks.
naftiko: "0.5"
info:
label: "Pinterest Pin Performance"
description: "Retrieves performance metrics for a Pinterest pin including impressions, saves, and clicks."
tags:
- social-media
- pinterest
- analytics
capability:
exposes:
- type: mcp
namespace: pinterest-analytics
port: 8080
tools:
- name: get-pin-metrics
description: "Look up Pinterest pin performance metrics."
inputParameters:
- name: pin_id
in: body
type: string
description: "The Pinterest pin identifier."
call: "pinterest.get-pin-analytics"
with:
pin_id: "{{pin_id}}"
outputParameters:
- name: impressions
type: number
mapping: "$.data.impressions"
- name: saves
type: number
mapping: "$.data.saves"
- name: clicks
type: number
mapping: "$.data.clicks"
consumes:
- type: http
namespace: pinterest
baseUri: "https://api.pinterest.com/v5"
authentication:
type: bearer
token: "$secrets.pinterest_token"
resources:
- name: pins
path: "/pins/{{pin_id}}/analytics"
inputParameters:
- name: pin_id
in: path
operations:
- name: get-pin-analytics
method: GET
When a podcast episode is finalized, uploads to the hosting platform, distributes to Apple Podcasts and Spotify, updates the show notes in the CMS, and notifies the audio team via Slack.
naftiko: "0.5"
info:
label: "Podcast Distribution Pipeline"
description: "When a podcast episode is finalized, uploads to the hosting platform, distributes to Apple Podcasts and Spotify, updates the show notes in the CMS, and notifies the audio team via Slack."
tags:
- podcast
- audio
- distribution
- slack
capability:
exposes:
- type: mcp
namespace: podcast-ops
port: 8080
tools:
- name: distribute-podcast-episode
description: "Given an episode file and metadata, upload to hosting, distribute to platforms, update CMS, and notify team."
inputParameters:
- name: episode_title
in: body
type: string
description: "The episode title."
- name: audio_url
in: body
type: string
description: "The finalized audio file URL."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- name: show_notes
in: body
type: string
description: "The episode show notes."
steps:
- name: upload-episode
type: call
call: "podcast-host.upload-episode"
with:
title: "{{episode_title}}"
audio_url: "{{audio_url}}"
show_notes: "{{show_notes}}"
- name: update-cms
type: call
call: "cms.create-podcast-page"
with:
title: "{{episode_title}}"
embed_url: "{{upload-episode.embed_url}}"
show_notes: "{{show_notes}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-audio"
text: "Podcast episode published: \"{{episode_title}}\". Listen: {{upload-episode.episode_url}}. CMS page: {{update-cms.url}}."
consumes:
- type: http
namespace: podcast-host
baseUri: "https://api.internal.condenast.com/podcasts/v1"
authentication:
type: bearer
token: "$secrets.podcast_token"
resources:
- name: episodes
path: "/episodes"
operations:
- name: upload-episode
method: POST
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: podcasts
path: "/podcasts"
operations:
- name: create-podcast-page
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Manages podcast episode release by uploading audio to Megaphone, creating show notes in WordPress, distributing to Apple Podcasts and Spotify, and promoting on social media.
naftiko: "0.5"
info:
label: "Podcast Episode Release Pipeline"
description: "Manages podcast episode release by uploading audio to Megaphone, creating show notes in WordPress, distributing to Apple Podcasts and Spotify, and promoting on social media."
tags:
- podcast
- audio
- wordpress
- social-media
capability:
exposes:
- type: mcp
namespace: podcast-release
port: 8080
tools:
- name: release-podcast-episode
description: "Upload, distribute, and promote a podcast episode across platforms."
inputParameters:
- name: episode_id
in: body
type: string
description: "The podcast episode identifier."
- name: show_name
in: body
type: string
description: "The podcast show name."
- name: release_date
in: body
type: string
description: "The release date in YYYY-MM-DD."
steps:
- name: upload-audio
type: call
call: "megaphone.upload-episode"
with:
episode_id: "{{episode_id}}"
show: "{{show_name}}"
- name: create-show-notes
type: call
call: "wordpress.create-post"
with:
title: "{{show_name}} - Episode {{episode_id}}"
status: "publish"
categories: "podcasts"
- name: distribute-apple
type: call
call: "apple-podcasts.submit-episode"
with:
episode_id: "{{episode_id}}"
- name: promote-social
type: call
call: "sprout-social.create-post"
with:
text: "New episode of {{show_name}} is live! Listen now."
scheduled_time: "{{release_date}}"
consumes:
- type: http
namespace: megaphone
baseUri: "https://cms.megaphone.fm/api/v1"
authentication:
type: bearer
token: "$secrets.megaphone_token"
resources:
- name: episodes
path: "/podcasts/{{podcast_id}}/episodes"
operations:
- name: upload-episode
method: POST
- type: http
namespace: wordpress
baseUri: "https://podcasts.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts"
operations:
- name: create-post
method: POST
- type: http
namespace: apple-podcasts
baseUri: "https://api.podcastsconnect.apple.com/v1"
authentication:
type: bearer
token: "$secrets.apple_podcasts_token"
resources:
- name: episodes
path: "/episodes"
operations:
- name: submit-episode
method: POST
- type: http
namespace: sprout-social
baseUri: "https://api.sproutsocial.com/v1"
authentication:
type: bearer
token: "$secrets.sprout_social_token"
resources:
- name: posts
path: "/{{customer_id}}/messages"
operations:
- name: create-post
method: POST
Manages print magazine production by collecting approved layouts from InDesign, generating print-ready PDFs, uploading to the print vendor portal, and updating the production schedule in Airtable.
naftiko: "0.5"
info:
label: "Print Magazine Production Pipeline"
description: "Manages print magazine production by collecting approved layouts from InDesign, generating print-ready PDFs, uploading to the print vendor portal, and updating the production schedule in Airtable."
tags:
- production
- print
- adobe
- airtable
capability:
exposes:
- type: mcp
namespace: print-production
port: 8080
tools:
- name: process-print-issue
description: "Collect layouts, generate PDFs, submit to print vendor, and update schedule."
inputParameters:
- name: issue_id
in: body
type: string
description: "The magazine issue identifier."
- name: brand
in: body
type: string
description: "The magazine brand."
steps:
- name: get-approved-layouts
type: call
call: "indesign-server.export-layouts"
with:
issue_id: "{{issue_id}}"
format: "pdf"
- name: upload-to-print-vendor
type: call
call: "ftp.upload-file"
with:
host: "print.vendor.com"
path: "/issues/{{issue_id}}/"
- name: update-production-schedule
type: call
call: "airtable.update-record"
with:
base_id: "production"
table_name: "{{brand}}_schedule"
status: "Sent to Print"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#{{brand}}-production"
text: "Issue {{issue_id}} sent to print vendor."
consumes:
- type: http
namespace: indesign-server
baseUri: "https://indesign-server.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.indesign_server_token"
resources:
- name: exports
path: "/documents/{{issue_id}}/export"
inputParameters:
- name: issue_id
in: path
operations:
- name: export-layouts
method: POST
- type: http
namespace: ftp
baseUri: "https://ftp-gateway.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.ftp_gateway_token"
resources:
- name: uploads
path: "/upload"
operations:
- name: upload-file
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: update-record
method: PATCH
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Collects reader survey responses from Typeform, analyzes sentiment via natural language processing, generates a summary report in Google Sheets, and shares insights with editorial leadership via email.
naftiko: "0.5"
info:
label: "Reader Survey Analysis Pipeline"
description: "Collects reader survey responses from Typeform, analyzes sentiment via natural language processing, generates a summary report in Google Sheets, and shares insights with editorial leadership via email."
tags:
- analytics
- typeform
- google-sheets
- sentiment-analysis
capability:
exposes:
- type: mcp
namespace: survey-analysis
port: 8080
tools:
- name: analyze-reader-survey
description: "Collect survey responses, analyze sentiment, and generate insights report."
inputParameters:
- name: survey_id
in: body
type: string
description: "The Typeform survey identifier."
- name: brand
in: body
type: string
description: "The brand the survey pertains to."
steps:
- name: get-responses
type: call
call: "typeform.get-responses"
with:
form_id: "{{survey_id}}"
- name: analyze-sentiment
type: call
call: "openai.analyze-sentiment"
with:
responses: "{{get-responses.items}}"
- name: create-report
type: call
call: "google-sheets.append-rows"
with:
spreadsheet_id: "survey_reports"
sheet: "{{brand}}"
data: "{{analyze-sentiment.summary}}"
- name: email-leadership
type: call
call: "gmail.send-email"
with:
to: "editorial-leadership@condenast.com"
subject: "{{brand}} Reader Survey Results"
body: "{{analyze-sentiment.executive_summary}}"
consumes:
- type: http
namespace: typeform
baseUri: "https://api.typeform.com"
authentication:
type: bearer
token: "$secrets.typeform_token"
resources:
- name: responses
path: "/forms/{{form_id}}/responses"
inputParameters:
- name: form_id
in: path
operations:
- name: get-responses
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: analyze-sentiment
method: POST
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: spreadsheets
path: "/spreadsheets/{{spreadsheet_id}}/values/{{sheet}}:append"
inputParameters:
- name: spreadsheet_id
in: path
operations:
- name: append-rows
method: POST
- type: http
namespace: gmail
baseUri: "https://gmail.googleapis.com/gmail/v1"
authentication:
type: bearer
token: "$secrets.gmail_token"
resources:
- name: messages
path: "/users/me/messages/send"
operations:
- name: send-email
method: POST
When a new advertising deal is created in Salesforce, pulls advertiser details, creates a campaign setup task in Jira, provisions ad tags via Google Ad Manager, and notifies sales via Slack.
naftiko: "0.5"
info:
label: "Salesforce Advertising Deal Pipeline"
description: "When a new advertising deal is created in Salesforce, pulls advertiser details, creates a campaign setup task in Jira, provisions ad tags via Google Ad Manager, and notifies sales via Slack."
tags:
- advertising
- salesforce
- jira
- google-ads
- slack
capability:
exposes:
- type: mcp
namespace: ad-ops
port: 8080
tools:
- name: setup-ad-deal
description: "Given a Salesforce opportunity ID, set up the advertising campaign across Jira, ad server, and notify sales."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID for the ad deal."
steps:
- name: get-deal
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: create-jira-task
type: call
call: "jira.create-issue"
with:
project: "ADOPS"
summary: "Campaign setup: {{get-deal.Name}}"
description: "Advertiser: {{get-deal.Account.Name}}. Budget: {{get-deal.Amount}}. Start: {{get-deal.CloseDate}}."
issue_type: "Task"
- name: setup-ad-tags
type: call
call: "google-ads.create-campaign"
with:
name: "{{get-deal.Name}}"
budget: "{{get-deal.Amount}}"
- name: notify-sales
type: call
call: "slack.post-message"
with:
channel: "#ad-sales"
text: "New ad deal setup: {{get-deal.Name}} (${{get-deal.Amount}}). Jira: {{create-jira-task.key}}. Ad tags provisioned."
consumes:
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: jira
baseUri: "https://condenast.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: google-ads
baseUri: "https://googleads.googleapis.com/v14"
authentication:
type: bearer
token: "$secrets.google_ads_token"
resources:
- name: campaigns
path: "/customers/{{customer_id}}/campaigns"
operations:
- name: create-campaign
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves a Salesforce contact by ID, returning name, email, account name, and title.
naftiko: "0.5"
info:
label: "Salesforce Contact Lookup"
description: "Retrieves a Salesforce contact by ID, returning name, email, account name, and title."
tags:
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-contact
description: "Look up a Salesforce contact by ID. Returns name, email, account name, and title."
inputParameters:
- name: contact_id
in: body
type: string
description: "The Salesforce contact ID."
call: "salesforce.get-contact"
with:
contact_id: "{{contact_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: email
type: string
mapping: "$.Email"
- name: account_name
type: string
mapping: "$.Account.Name"
- name: title
type: string
mapping: "$.Title"
consumes:
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/{{contact_id}}"
inputParameters:
- name: contact_id
in: path
operations:
- name: get-contact
method: GET
Creates a marketing journey in Salesforce Marketing Cloud for a subscriber segment, configures email and push touchpoints, and logs the journey in Airtable for tracking.
naftiko: "0.5"
info:
label: "Salesforce Marketing Cloud Journey Pipeline"
description: "Creates a marketing journey in Salesforce Marketing Cloud for a subscriber segment, configures email and push touchpoints, and logs the journey in Airtable for tracking."
tags:
- marketing
- salesforce-marketing-cloud
- email-marketing
- airtable
capability:
exposes:
- type: mcp
namespace: marketing-automation
port: 8080
tools:
- name: create-marketing-journey
description: "Given a segment and journey configuration, create a Salesforce Marketing Cloud journey and log for tracking."
inputParameters:
- name: journey_name
in: body
type: string
description: "The marketing journey name."
- name: segment_id
in: body
type: string
description: "The audience segment ID."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
steps:
- name: create-journey
type: call
call: "sfmc.create-journey"
with:
name: "{{journey_name}}"
segment_id: "{{segment_id}}"
- name: activate-journey
type: call
call: "sfmc.activate-journey"
with:
journey_id: "{{create-journey.id}}"
- name: log-journey
type: call
call: "airtable.create-record"
with:
base_id: "marketing_tracking"
table_name: "Journeys"
fields:
name: "{{journey_name}}"
brand: "{{brand}}"
journey_id: "{{create-journey.id}}"
status: "active"
consumes:
- type: http
namespace: sfmc
baseUri: "https://condenast.rest.marketingcloudapis.com/interaction/v1"
authentication:
type: bearer
token: "$secrets.sfmc_token"
resources:
- name: journeys
path: "/interactions"
operations:
- name: create-journey
method: POST
- name: activation
path: "/interactions/{{journey_id}}/start"
inputParameters:
- name: journey_id
in: path
operations:
- name: activate-journey
method: POST
- type: http
namespace: airtable
baseUri: "https://api.airtable.com/v0"
authentication:
type: bearer
token: "$secrets.airtable_token"
resources:
- name: records
path: "/{{base_id}}/{{table_name}}"
inputParameters:
- name: base_id
in: path
- name: table_name
in: path
operations:
- name: create-record
method: POST
When a new digital subscription is created, provisions the subscription in SAP BRIM, creates a billing document, and syncs the subscriber to MailChimp for onboarding emails.
naftiko: "0.5"
info:
label: "SAP BRIM Subscription Billing Pipeline"
description: "When a new digital subscription is created, provisions the subscription in SAP BRIM, creates a billing document, and syncs the subscriber to MailChimp for onboarding emails."
tags:
- subscriptions
- billing
- sap-brim
- mailchimp
capability:
exposes:
- type: mcp
namespace: subscription-billing
port: 8080
tools:
- name: provision-subscription
description: "Given subscriber details and plan, create the subscription in SAP BRIM, generate a billing document, and add to MailChimp."
inputParameters:
- name: subscriber_email
in: body
type: string
description: "The subscriber's email address."
- name: plan_id
in: body
type: string
description: "The subscription plan identifier."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
steps:
- name: create-subscription
type: call
call: "sap-brim.create-subscription"
with:
email: "{{subscriber_email}}"
plan_id: "{{plan_id}}"
brand: "{{brand}}"
- name: create-billing-doc
type: call
call: "sap-brim.create-billing-document"
with:
subscription_id: "{{create-subscription.subscription_id}}"
- name: add-to-mailchimp
type: call
call: "mailchimp.add-subscriber"
with:
list_id: "{{brand}}_subscribers"
email: "{{subscriber_email}}"
tags:
- "{{plan_id}}"
- "new_subscriber"
consumes:
- type: http
namespace: sap-brim
baseUri: "https://condenast-brim.sap.com/api/v1"
authentication:
type: basic
username: "$secrets.sap_brim_user"
password: "$secrets.sap_brim_password"
resources:
- name: subscriptions
path: "/subscriptions"
operations:
- name: create-subscription
method: POST
- name: billing
path: "/billing-documents"
operations:
- name: create-billing-document
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: members
path: "/lists/{{list_id}}/members"
inputParameters:
- name: list_id
in: path
operations:
- name: add-subscriber
method: POST
Automates expense report approval by fetching from SAP Concur, validating against budget in Workday Financials, routing for manager approval via Slack, and recording the decision.
naftiko: "0.5"
info:
label: "SAP Concur Expense Approval Pipeline"
description: "Automates expense report approval by fetching from SAP Concur, validating against budget in Workday Financials, routing for manager approval via Slack, and recording the decision."
tags:
- finance
- sap-concur
- workday
- slack
capability:
exposes:
- type: mcp
namespace: expense-approval
port: 8080
tools:
- name: approve-expense-report
description: "Validate and route expense reports through budget check and manager approval."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: approver_slack_id
in: body
type: string
description: "The Slack user ID of the approver."
steps:
- name: get-expense-report
type: call
call: "concur.get-report"
with:
report_id: "{{report_id}}"
- name: check-budget
type: call
call: "workday.get-budget-remaining"
with:
cost_center: "{{get-expense-report.cost_center}}"
- name: request-approval
type: call
call: "slack.post-message"
with:
channel: "{{approver_slack_id}}"
text: "Expense report {{report_id}} for ${{get-expense-report.total}} needs approval. Budget remaining: ${{check-budget.remaining}}."
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-report
method: GET
- type: http
namespace: workday
baseUri: "https://wd5-services.condenast.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: budgets
path: "/budgets"
operations:
- name: get-budget-remaining
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the status of an expense report from SAP Concur, returning total amount, approval status, and payment status.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Status"
description: "Retrieves the status of an expense report from SAP Concur, returning total amount, approval status, and payment status."
tags:
- expense-management
- sap-concur
- finance
capability:
exposes:
- type: mcp
namespace: expense-management
port: 8080
tools:
- name: get-expense-report
description: "Look up a SAP Concur expense report. Returns total amount, approval status, and payment status."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
call: "concur.get-report"
with:
report_id: "{{report_id}}"
outputParameters:
- name: total_amount
type: number
mapping: "$.Total"
- name: approval_status
type: string
mapping: "$.ApprovalStatusName"
- name: payment_status
type: string
mapping: "$.PaymentStatusName"
consumes:
- type: http
namespace: concur
baseUri: "https://us2.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-report
method: GET
Retrieves error details from Sentry for a brand website, returning error title, count, affected users, and first/last seen timestamps.
naftiko: "0.5"
info:
label: "Sentry Error Tracking Lookup"
description: "Retrieves error details from Sentry for a brand website, returning error title, count, affected users, and first/last seen timestamps."
tags:
- monitoring
- sentry-system
- error-tracking
capability:
exposes:
- type: mcp
namespace: error-tracking
port: 8080
tools:
- name: get-sentry-issue
description: "Look up a Sentry error issue. Returns title, count, affected users, and timestamps."
inputParameters:
- name: issue_id
in: body
type: string
description: "The Sentry issue ID."
call: "sentry.get-issue"
with:
issue_id: "{{issue_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: count
type: number
mapping: "$.count"
- name: users_affected
type: number
mapping: "$.userCount"
consumes:
- type: http
namespace: sentry
baseUri: "https://sentry.io/api/0"
authentication:
type: bearer
token: "$secrets.sentry_token"
resources:
- name: issues
path: "/issues/{{issue_id}}/"
inputParameters:
- name: issue_id
in: path
operations:
- name: get-issue
method: GET
Pulls top-performing pages from Google Search Console, cross-references with content freshness from the CMS, identifies stale content, and creates Jira tasks for content updates.
naftiko: "0.5"
info:
label: "SEO Content Audit Pipeline"
description: "Pulls top-performing pages from Google Search Console, cross-references with content freshness from the CMS, identifies stale content, and creates Jira tasks for content updates."
tags:
- seo
- google
- cms
- jira
- content-strategy
capability:
exposes:
- type: mcp
namespace: seo-ops
port: 8080
tools:
- name: audit-seo-content
description: "Given a brand's Search Console property, identify stale high-traffic content and create Jira tasks for updates."
inputParameters:
- name: site_url
in: body
type: string
description: "The Google Search Console site URL."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- name: stale_days
in: body
type: number
description: "Number of days before content is considered stale."
steps:
- name: get-top-pages
type: call
call: "search-console.get-analytics"
with:
site_url: "{{site_url}}"
dimensions: "page"
row_limit: 50
- name: check-freshness
type: call
call: "cms.check-content-freshness"
with:
urls: "{{get-top-pages.rows}}"
stale_days: "{{stale_days}}"
- name: create-tasks
type: call
call: "jira.create-issue"
with:
project: "CONTENT"
summary: "SEO content refresh: {{check-freshness.stale_count}} stale articles for {{brand}}"
description: "Top stale pages: {{check-freshness.stale_urls}}. These pages have not been updated in {{stale_days}} days but receive significant search traffic."
issue_type: "Task"
consumes:
- type: http
namespace: search-console
baseUri: "https://www.googleapis.com/webmasters/v3"
authentication:
type: bearer
token: "$secrets.search_console_token"
resources:
- name: analytics
path: "/sites/{{site_url}}/searchAnalytics/query"
inputParameters:
- name: site_url
in: path
operations:
- name: get-analytics
method: POST
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: freshness
path: "/content/freshness"
operations:
- name: check-content-freshness
method: POST
- type: http
namespace: jira
baseUri: "https://condenast.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
Retrieves an IT incident from ServiceNow, returning short description, priority, state, and assigned group.
naftiko: "0.5"
info:
label: "ServiceNow IT Incident Lookup"
description: "Retrieves an IT incident from ServiceNow, returning short description, priority, state, and assigned group."
tags:
- it-service
- servicenow
- incident-management
capability:
exposes:
- type: mcp
namespace: it-service
port: 8080
tools:
- name: get-it-incident
description: "Look up a ServiceNow IT incident. Returns description, priority, state, and assigned group."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number."
call: "servicenow.get-incident"
with:
number: "{{incident_number}}"
outputParameters:
- name: short_description
type: string
mapping: "$.result.short_description"
- name: priority
type: string
mapping: "$.result.priority"
- name: state
type: string
mapping: "$.result.state"
- name: assigned_group
type: string
mapping: "$.result.assignment_group.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://condenast.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
Retrieves product details from a Conde Nast brand Shopify storefront including price and availability.
naftiko: "0.5"
info:
label: "Shopify Storefront Product Lookup"
description: "Retrieves product details from a Conde Nast brand Shopify storefront including price and availability."
tags:
- e-commerce
- shopify
- retail
capability:
exposes:
- type: mcp
namespace: shopify-products
port: 8080
tools:
- name: get-product
description: "Look up a product by handle from Shopify storefront."
inputParameters:
- name: product_handle
in: body
type: string
description: "The product handle slug."
call: "shopify.get-product-by-handle"
with:
handle: "{{product_handle}}"
outputParameters:
- name: title
type: string
mapping: "$.product.title"
- name: price
type: string
mapping: "$.product.variants[0].price"
- name: available
type: boolean
mapping: "$.product.variants[0].available"
consumes:
- type: http
namespace: shopify
baseUri: "https://shop.condenast.com/admin/api/2024-01"
authentication:
type: bearer
token: "$secrets.shopify_access_token"
resources:
- name: products
path: "/products.json?handle={{product_handle}}"
inputParameters:
- name: product_handle
in: path
operations:
- name: get-product-by-handle
method: GET
Retrieves Slack channel usage analytics, returning message count, active members, and files shared for a given channel.
naftiko: "0.5"
info:
label: "Slack Channel Analytics"
description: "Retrieves Slack channel usage analytics, returning message count, active members, and files shared for a given channel."
tags:
- collaboration
- slack
- analytics
capability:
exposes:
- type: mcp
namespace: collaboration-analytics
port: 8080
tools:
- name: get-channel-stats
description: "Look up Slack channel usage statistics. Returns message count, active members, and files shared."
inputParameters:
- name: channel_id
in: body
type: string
description: "The Slack channel ID."
call: "slack.get-channel-info"
with:
channel: "{{channel_id}}"
outputParameters:
- name: message_count
type: number
mapping: "$.channel.num_messages"
- name: member_count
type: number
mapping: "$.channel.num_members"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.info"
operations:
- name: get-channel-info
method: GET
Retrieves the number of members in a specified Slack channel for team coordination.
naftiko: "0.5"
info:
label: "Slack Channel Member Count"
description: "Retrieves the number of members in a specified Slack channel for team coordination."
tags:
- communications
- slack
- team-management
capability:
exposes:
- type: mcp
namespace: slack-info
port: 8080
tools:
- name: get-channel-members
description: "Look up the member count for a Slack channel."
inputParameters:
- name: channel_id
in: body
type: string
description: "The Slack channel identifier."
call: "slack.get-channel-info"
with:
channel_id: "{{channel_id}}"
outputParameters:
- name: member_count
type: number
mapping: "$.channel.num_members"
- name: channel_name
type: string
mapping: "$.channel.name"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.info?channel={{channel_id}}"
inputParameters:
- name: channel_id
in: path
operations:
- name: get-channel-info
method: GET
Executes a SQL query against the Snowflake content data warehouse and returns the result set and execution time.
naftiko: "0.5"
info:
label: "Snowflake Content Warehouse Query"
description: "Executes a SQL query against the Snowflake content data warehouse and returns the result set and execution time."
tags:
- data-warehouse
- snowflake
- content-analytics
capability:
exposes:
- type: mcp
namespace: content-warehouse
port: 8080
tools:
- name: run-content-query
description: "Execute a SQL query on the Snowflake content warehouse. Returns row count and execution time."
inputParameters:
- name: sql
in: body
type: string
description: "The SQL query."
call: "snowflake.execute-query"
with:
statement: "{{sql}}"
outputParameters:
- name: rows_returned
type: number
mapping: "$.resultSetMetaData.numRows"
consumes:
- type: http
namespace: snowflake
baseUri: "https://condenast.us-east-1.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
When a new article is published, creates social media posts for Instagram, Twitter, LinkedIn, and Facebook with brand-appropriate messaging and tracks campaign in Google Sheets.
naftiko: "0.5"
info:
label: "Social Media Cross-Post Pipeline"
description: "When a new article is published, creates social media posts for Instagram, Twitter, LinkedIn, and Facebook with brand-appropriate messaging and tracks campaign in Google Sheets."
tags:
- social-media
- instagram
- twitter
- linkedin
- facebook
- google-sheets
capability:
exposes:
- type: mcp
namespace: social-distribution
port: 8080
tools:
- name: cross-post-article
description: "Given an article URL and headline, create social posts across Instagram, Twitter, LinkedIn, and Facebook and log to tracking sheet."
inputParameters:
- name: article_url
in: body
type: string
description: "The published article URL."
- name: headline
in: body
type: string
description: "The article headline."
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- name: image_url
in: body
type: string
description: "The hero image URL for social cards."
steps:
- name: post-twitter
type: call
call: "twitter.create-tweet"
with:
text: "{{headline}} {{article_url}}"
- name: post-linkedin
type: call
call: "linkedin.create-post"
with:
text: "{{headline}}"
url: "{{article_url}}"
- name: post-facebook
type: call
call: "facebook.create-post"
with:
message: "{{headline}}"
link: "{{article_url}}"
- name: log-to-sheet
type: call
call: "gsheets.append-row"
with:
spreadsheet_id: "social_tracking_{{brand}}"
range: "Posts!A:F"
values:
- "{{headline}}"
- "{{article_url}}"
- "{{post-twitter.id}}"
- "{{post-linkedin.id}}"
- "{{post-facebook.id}}"
consumes:
- type: http
namespace: twitter
baseUri: "https://api.twitter.com/2"
authentication:
type: bearer
token: "$secrets.twitter_token"
resources:
- name: tweets
path: "/tweets"
operations:
- name: create-tweet
method: POST
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: posts
path: "/ugcPosts"
operations:
- name: create-post
method: POST
- type: http
namespace: facebook
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.facebook_token"
resources:
- name: feed
path: "/{{page_id}}/feed"
operations:
- name: create-post
method: POST
- type: http
namespace: gsheets
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 Splunk for CDN performance metrics related to content delivery, returning cache hit rate, origin response time, and error rate.
naftiko: "0.5"
info:
label: "Splunk Content Delivery Monitoring"
description: "Queries Splunk for CDN performance metrics related to content delivery, returning cache hit rate, origin response time, and error rate."
tags:
- monitoring
- splunk
- cdn
- performance
capability:
exposes:
- type: mcp
namespace: cdn-monitoring
port: 8080
tools:
- name: get-cdn-metrics
description: "Query Splunk for CDN performance metrics. Returns cache hit rate, origin response time, and error rate."
inputParameters:
- name: domain
in: body
type: string
description: "The domain to query metrics for."
- name: time_range
in: body
type: string
description: "The time range (e.g., -1h, -24h)."
call: "splunk.search-cdn"
with:
search: "index=cdn sourcetype=cloudflare host={{domain}}"
earliest_time: "{{time_range}}"
outputParameters:
- name: cache_hit_rate
type: number
mapping: "$.results.cache_hit_rate"
- name: origin_response_ms
type: number
mapping: "$.results.origin_response_time"
- name: error_rate
type: number
mapping: "$.results.error_rate"
consumes:
- type: http
namespace: splunk
baseUri: "https://splunk.internal.condenast.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs/export"
operations:
- name: search-cdn
method: POST
Routes sponsored content through the approval process by submitting to legal review in Jira, collecting brand safety scores, obtaining client sign-off via DocuSign, and publishing the approved content.
naftiko: "0.5"
info:
label: "Sponsored Content Approval Pipeline"
description: "Routes sponsored content through the approval process by submitting to legal review in Jira, collecting brand safety scores, obtaining client sign-off via DocuSign, and publishing the approved content."
tags:
- sponsored-content
- legal
- jira
- docusign
- publishing
capability:
exposes:
- type: mcp
namespace: sponsored-content-approval
port: 8080
tools:
- name: approve-sponsored-content
description: "Route sponsored content through legal, brand safety, client approval, and publication."
inputParameters:
- name: content_id
in: body
type: string
description: "The sponsored content identifier."
- name: client_email
in: body
type: string
description: "The client approver email."
- name: brand
in: body
type: string
description: "The publishing brand."
steps:
- name: submit-legal-review
type: call
call: "jira.create-issue"
with:
project: "LEGAL"
summary: "Sponsored content review: {{content_id}}"
priority: "High"
- name: check-brand-safety
type: call
call: "brand-safety.analyze-content"
with:
content_id: "{{content_id}}"
- name: request-client-signoff
type: call
call: "docusign.create-envelope"
with:
template_id: "sponsored_content_approval"
signer_email: "{{client_email}}"
- name: schedule-publication
type: call
call: "cms.update-article-status"
with:
article_id: "{{content_id}}"
status: "approved_for_publish"
consumes:
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: brand-safety
baseUri: "https://brand-safety.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.brand_safety_token"
resources:
- name: analysis
path: "/analyze"
operations:
- name: analyze-content
method: POST
- type: http
namespace: docusign
baseUri: "https://demo.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: cms
baseUri: "https://cms.condenast.com/api/v2"
authentication:
type: bearer
token: "$secrets.cms_token"
resources:
- name: articles
path: "/articles/{{content_id}}"
inputParameters:
- name: content_id
in: path
operations:
- name: update-article-status
method: PATCH
Retrieves subscription revenue data from Stripe for a given product, returning MRR and active subscriber count.
naftiko: "0.5"
info:
label: "Stripe Subscription Revenue Lookup"
description: "Retrieves subscription revenue data from Stripe for a given product, returning MRR and active subscriber count."
tags:
- revenue
- stripe
- subscriptions
capability:
exposes:
- type: mcp
namespace: stripe-revenue
port: 8080
tools:
- name: get-subscription-revenue
description: "Look up subscription revenue for a Stripe product."
inputParameters:
- name: product_id
in: body
type: string
description: "The Stripe product identifier."
call: "stripe.get-subscriptions"
with:
product_id: "{{product_id}}"
outputParameters:
- name: mrr
type: number
mapping: "$.data.mrr"
- name: active_subscribers
type: number
mapping: "$.data.active_count"
consumes:
- type: http
namespace: stripe
baseUri: "https://api.stripe.com/v1"
authentication:
type: bearer
token: "$secrets.stripe_secret_key"
resources:
- name: subscriptions
path: "/subscriptions?product={{product_id}}"
inputParameters:
- name: product_id
in: path
operations:
- name: get-subscriptions
method: GET
Pulls subscription metrics from the billing system, enriches with Google Analytics engagement data, generates a Looker dashboard refresh, and emails the summary to leadership via Gmail.
naftiko: "0.5"
info:
label: "Subscription Revenue Dashboard Pipeline"
description: "Pulls subscription metrics from the billing system, enriches with Google Analytics engagement data, generates a Looker dashboard refresh, and emails the summary to leadership via Gmail."
tags:
- subscriptions
- revenue
- looker
- google-analytics
- gmail
capability:
exposes:
- type: mcp
namespace: subscription-analytics
port: 8080
tools:
- name: refresh-subscription-dashboard
description: "Pull subscription data, combine with engagement metrics, refresh the Looker dashboard, and email leadership."
inputParameters:
- name: brand
in: body
type: string
description: "The Condé Nast brand."
- name: period
in: body
type: string
description: "The reporting period (e.g., last30days)."
steps:
- name: get-subscription-metrics
type: call
call: "billing.get-metrics"
with:
brand: "{{brand}}"
period: "{{period}}"
- name: get-engagement
type: call
call: "ga4.get-engagement"
with:
brand: "{{brand}}"
period: "{{period}}"
- name: refresh-looker
type: call
call: "looker.run-look"
with:
look_id: "subscription_overview_{{brand}}"
- name: send-email
type: call
call: "gmail.send-email"
with:
to: "leadership-{{brand}}@condenast.com"
subject: "Subscription Dashboard: {{brand}} - {{period}}"
body: "Active subscribers: {{get-subscription-metrics.active_count}}. MRR: ${{get-subscription-metrics.mrr}}. Churn: {{get-subscription-metrics.churn_rate}}%. Engagement: {{get-engagement.avg_session_duration}}s avg session. Dashboard: {{refresh-looker.url}}."
consumes:
- type: http
namespace: billing
baseUri: "https://billing.internal.condenast.com/api/v1"
authentication:
type: bearer
token: "$secrets.billing_token"
resources:
- name: metrics
path: "/metrics"
operations:
- name: get-metrics
method: GET
- type: http
namespace: ga4
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
operations:
- name: get-engagement
method: POST
- type: http
namespace: looker
baseUri: "https://condenast.cloud.looker.com/api/4.0"
authentication:
type: bearer
token: "$secrets.looker_token"
resources:
- name: looks
path: "/looks/{{look_id}}/run/json"
inputParameters:
- name: look_id
in: path
operations:
- name: run-look
method: GET
- type: http
namespace: gmail
baseUri: "https://gmail.googleapis.com/gmail/v1"
authentication:
type: bearer
token: "$secrets.gmail_token"
resources:
- name: messages
path: "/users/me/messages/send"
operations:
- name: send-email
method: POST
Triggers a Tableau dashboard refresh for editorial content reporting and returns the refresh status and last data update time.
naftiko: "0.5"
info:
label: "Tableau Content Dashboard Refresh"
description: "Triggers a Tableau dashboard refresh for editorial content reporting and returns the refresh status and last data update time."
tags:
- analytics
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-content-dashboard
description: "Trigger a Tableau dashboard refresh. Returns refresh status and last update time."
inputParameters:
- name: workbook_id
in: body
type: string
description: "The Tableau workbook ID."
call: "tableau.refresh-workbook"
with:
workbook_id: "{{workbook_id}}"
outputParameters:
- name: status
type: string
mapping: "$.extractRefreshJob.status"
- name: last_updated
type: string
mapping: "$.extractRefreshJob.endedAt"
consumes:
- type: http
namespace: tableau
baseUri: "https://tableau.internal.condenast.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Screens job applicants by pulling candidate data from Greenhouse ATS, running background checks, scheduling interviews via Calendly, and notifying the hiring manager via Slack.
naftiko: "0.5"
info:
label: "Talent Acquisition Screening Pipeline"
description: "Screens job applicants by pulling candidate data from Greenhouse ATS, running background checks, scheduling interviews via Calendly, and notifying the hiring manager via Slack."
tags:
- hr
- talent-acquisition
- greenhouse
- slack
capability:
exposes:
- type: mcp
namespace: talent-screening
port: 8080
tools:
- name: screen-candidate
description: "Pull candidate data, run checks, schedule interviews, and notify hiring manager."
inputParameters:
- name: candidate_id
in: body
type: string
description: "The Greenhouse candidate identifier."
- name: hiring_manager_slack
in: body
type: string
description: "The hiring manager Slack user ID."
steps:
- name: get-candidate
type: call
call: "greenhouse.get-candidate"
with:
candidate_id: "{{candidate_id}}"
- name: schedule-interview
type: call
call: "calendly.create-event"
with:
event_type: "screening_interview"
invitee_email: "{{get-candidate.email}}"
- name: notify-hiring-manager
type: call
call: "slack.post-message"
with:
channel: "{{hiring_manager_slack}}"
text: "Candidate {{get-candidate.name}} screened for {{get-candidate.position}}. Interview scheduled: {{schedule-interview.event_url}}"
consumes:
- type: http
namespace: greenhouse
baseUri: "https://harvest.greenhouse.io/v1"
authentication:
type: bearer
token: "$secrets.greenhouse_api_key"
resources:
- name: candidates
path: "/candidates/{{candidate_id}}"
inputParameters:
- name: candidate_id
in: path
operations:
- name: get-candidate
method: GET
- type: http
namespace: calendly
baseUri: "https://api.calendly.com"
authentication:
type: bearer
token: "$secrets.calendly_token"
resources:
- name: events
path: "/scheduled_events"
operations:
- name: create-event
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves performance analytics for a TikTok video including views, likes, and shares.
naftiko: "0.5"
info:
label: "TikTok Video Analytics"
description: "Retrieves performance analytics for a TikTok video including views, likes, and shares."
tags:
- social-media
- tiktok
- video-analytics
capability:
exposes:
- type: mcp
namespace: tiktok-analytics
port: 8080
tools:
- name: get-video-stats
description: "Look up TikTok video performance by video ID."
inputParameters:
- name: video_id
in: body
type: string
description: "The TikTok video identifier."
call: "tiktok.get-video-data"
with:
video_id: "{{video_id}}"
outputParameters:
- name: views
type: number
mapping: "$.data.videos[0].statistics.play_count"
- name: likes
type: number
mapping: "$.data.videos[0].statistics.digg_count"
- name: shares
type: number
mapping: "$.data.videos[0].statistics.share_count"
consumes:
- type: http
namespace: tiktok
baseUri: "https://open.tiktokapis.com/v2"
authentication:
type: bearer
token: "$secrets.tiktok_access_token"
resources:
- name: videos
path: "/video/query"
operations:
- name: get-video-data
method: POST
Retrieves current follower count and engagement rate for a Conde Nast brand Twitter account.
naftiko: "0.5"
info:
label: "Twitter Follower Count Lookup"
description: "Retrieves current follower count and engagement rate for a Conde Nast brand Twitter account."
tags:
- social-media
- twitter
- analytics
capability:
exposes:
- type: mcp
namespace: twitter-analytics
port: 8080
tools:
- name: get-follower-count
description: "Look up Twitter follower count and engagement rate for a brand handle."
inputParameters:
- name: handle
in: body
type: string
description: "The Twitter handle for the brand."
call: "twitter.get-user-metrics"
with:
handle: "{{handle}}"
outputParameters:
- name: followers_count
type: number
mapping: "$.data.public_metrics.followers_count"
- name: engagement_rate
type: number
mapping: "$.data.engagement_rate"
consumes:
- type: http
namespace: twitter
baseUri: "https://api.twitter.com/2"
authentication:
type: bearer
token: "$secrets.twitter_bearer_token"
resources:
- name: users
path: "/users/by/username/{{handle}}"
inputParameters:
- name: handle
in: path
operations:
- name: get-user-metrics
method: GET
Manages vendor contract renewals by checking expiration dates in SAP Ariba, generating renewal documents in DocuSign, updating records in Salesforce, and alerting procurement via Slack.
naftiko: "0.5"
info:
label: "Vendor Contract Renewal Pipeline"
description: "Manages vendor contract renewals by checking expiration dates in SAP Ariba, generating renewal documents in DocuSign, updating records in Salesforce, and alerting procurement via Slack."
tags:
- procurement
- sap-ariba
- docusign
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: vendor-renewal
port: 8080
tools:
- name: process-vendor-renewal
description: "Check vendor contract expiry, generate renewal docs, and update CRM."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The vendor identifier."
- name: contract_id
in: body
type: string
description: "The contract identifier."
steps:
- name: get-contract-details
type: call
call: "ariba.get-contract"
with:
contract_id: "{{contract_id}}"
- name: create-renewal-doc
type: call
call: "docusign.create-envelope"
with:
template_id: "vendor_renewal"
vendor_id: "{{vendor_id}}"
- name: update-salesforce
type: call
call: "salesforce.update-account"
with:
account_id: "{{vendor_id}}"
renewal_status: "In Progress"
- name: alert-procurement
type: call
call: "slack.post-message"
with:
channel: "#procurement"
text: "Vendor {{vendor_id}} contract {{contract_id}} renewal initiated."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: docusign
baseUri: "https://demo.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: salesforce
baseUri: "https://condenast.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the deployment status of a Condé Nast brand website on Vercel, returning deployment state, URL, and build duration.
naftiko: "0.5"
info:
label: "Vercel Deployment Status"
description: "Retrieves the deployment status of a Condé Nast brand website on Vercel, returning deployment state, URL, and build duration."
tags:
- deployment
- vercel
- web-platform
capability:
exposes:
- type: mcp
namespace: web-deployments
port: 8080
tools:
- name: get-vercel-deployment
description: "Look up a Vercel deployment. Returns state, URL, and build duration."
inputParameters:
- name: deployment_id
in: body
type: string
description: "The Vercel deployment ID."
call: "vercel.get-deployment"
with:
deployment_id: "{{deployment_id}}"
outputParameters:
- name: state
type: string
mapping: "$.state"
- name: url
type: string
mapping: "$.url"
- name: build_duration_ms
type: number
mapping: "$.buildDuration"
consumes:
- type: http
namespace: vercel
baseUri: "https://api.vercel.com/v13"
authentication:
type: bearer
token: "$secrets.vercel_token"
resources:
- name: deployments
path: "/deployments/{{deployment_id}}"
inputParameters:
- name: deployment_id
in: path
operations:
- name: get-deployment
method: GET
Orchestrates video content production by importing footage from cloud storage, triggering transcoding in AWS MediaConvert, uploading to YouTube, and scheduling promotion via social media.
naftiko: "0.5"
info:
label: "Video Content Production Pipeline"
description: "Orchestrates video content production by importing footage from cloud storage, triggering transcoding in AWS MediaConvert, uploading to YouTube, and scheduling promotion via social media."
tags:
- video
- aws
- youtube
- social-media
capability:
exposes:
- type: mcp
namespace: video-production
port: 8080
tools:
- name: produce-video-content
description: "Process raw video footage through transcoding, upload to YouTube, and schedule social promotion."
inputParameters:
- name: project_id
in: body
type: string
description: "The video project identifier."
- name: brand
in: body
type: string
description: "The brand this video belongs to."
- name: publish_date
in: body
type: string
description: "The target publish date."
steps:
- name: get-source-footage
type: call
call: "s3.get-object-list"
with:
bucket: "cn-video-raw"
prefix: "{{project_id}}/"
- name: transcode-video
type: call
call: "mediaconvert.create-job"
with:
source_key: "{{get-source-footage.objects[0].key}}"
output_preset: "web-hd"
- name: upload-to-youtube
type: call
call: "youtube.upload-video"
with:
title: "{{project_id}}"
channel_id: "{{brand}}_channel"
- name: schedule-social-posts
type: call
call: "sprout-social.create-post"
with:
text: "New video from {{brand}}: {{upload-to-youtube.video_url}}"
scheduled_time: "{{publish_date}}"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_access_token"
resources:
- name: objects
path: "/{{bucket}}"
inputParameters:
- name: bucket
in: path
operations:
- name: get-object-list
method: GET
- type: http
namespace: mediaconvert
baseUri: "https://mediaconvert.us-east-1.amazonaws.com/2017-08-29"
authentication:
type: bearer
token: "$secrets.aws_mediaconvert_token"
resources:
- name: jobs
path: "/jobs"
operations:
- name: create-job
method: POST
- type: http
namespace: youtube
baseUri: "https://www.googleapis.com/upload/youtube/v3"
authentication:
type: bearer
token: "$secrets.youtube_token"
resources:
- name: videos
path: "/videos?part=snippet,status"
operations:
- name: upload-video
method: POST
- type: http
namespace: sprout-social
baseUri: "https://api.sproutsocial.com/v1"
authentication:
type: bearer
token: "$secrets.sprout_social_token"
resources:
- name: posts
path: "/{{customer_id}}/messages"
operations:
- name: create-post
method: POST
Responds to website incidents by checking status in Datadog, creating a PagerDuty incident, posting updates to Slack, and creating a Jira post-mortem ticket.
naftiko: "0.5"
info:
label: "Website Incident Response Pipeline"
description: "Responds to website incidents by checking status in Datadog, creating a PagerDuty incident, posting updates to Slack, and creating a Jira post-mortem ticket."
tags:
- incident-response
- datadog
- pagerduty
- slack
- jira
capability:
exposes:
- type: mcp
namespace: website-incident
port: 8080
tools:
- name: handle-website-incident
description: "Detect, escalate, communicate, and track website incidents."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Datadog alert identifier."
- name: severity
in: body
type: string
description: "The incident severity level (P1-P4)."
steps:
- name: get-alert-details
type: call
call: "datadog.get-alert"
with:
alert_id: "{{alert_id}}"
- name: create-pagerduty-incident
type: call
call: "pagerduty.create-incident"
with:
title: "Website incident: {{get-alert-details.title}}"
urgency: "{{severity}}"
- name: notify-slack
type: call
call: "slack.post-message"
with:
channel: "#incident-response"
text: "INCIDENT {{severity}}: {{get-alert-details.title}}. PagerDuty: {{create-pagerduty-incident.incident_url}}"
- name: create-postmortem-ticket
type: call
call: "jira.create-issue"
with:
project: "SRE"
summary: "Post-mortem: {{get-alert-details.title}}"
priority: "{{severity}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: alerts
path: "/monitor/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert
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_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: jira
baseUri: "https://condenast.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Checks the current publication status of a WordPress post for a specified brand site.
naftiko: "0.5"
info:
label: "WordPress Post Status Check"
description: "Checks the current publication status of a WordPress post for a specified brand site."
tags:
- publishing
- wordpress
- content-management
capability:
exposes:
- type: mcp
namespace: wp-status
port: 8080
tools:
- name: get-post-status
description: "Look up the status of a WordPress post by post ID."
inputParameters:
- name: brand
in: body
type: string
description: "The brand slug (e.g., vogue, gq, wired)."
- name: post_id
in: body
type: string
description: "The WordPress post ID."
call: "wordpress.get-post"
with:
post_id: "{{post_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: title
type: string
mapping: "$.title.rendered"
- name: modified
type: string
mapping: "$.modified"
consumes:
- type: http
namespace: wordpress
baseUri: "https://{{brand}}.condenast.com/wp-json/wp/v2"
authentication:
type: bearer
token: "$secrets.wordpress_token"
resources:
- name: posts
path: "/posts/{{post_id}}"
inputParameters:
- name: post_id
in: path
operations:
- name: get-post
method: GET
Retrieves an employee's current compensation details from Workday, returning base pay, bonus target, and total compensation.
naftiko: "0.5"
info:
label: "Workday Compensation Lookup"
description: "Retrieves an employee's current compensation details from Workday, returning base pay, bonus target, and total compensation."
tags:
- hr
- compensation
- workday
capability:
exposes:
- type: mcp
namespace: hr-compensation
port: 8080
tools:
- name: get-employee-compensation
description: "Look up an employee's compensation in Workday. Returns base pay, bonus target, and total compensation."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: "workday.get-compensation"
with:
worker_id: "{{employee_id}}"
outputParameters:
- name: base_pay
type: number
mapping: "$.compensationPlans[0].amount"
- name: bonus_target
type: number
mapping: "$.compensationPlans[1].targetAmount"
- name: total_compensation
type: number
mapping: "$.totalBasePayAnnualized"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: compensation
path: "/workers/{{worker_id}}/compensation"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-compensation
method: GET
Searches the Workday employee directory by name or department, returning employee details including title, manager, and location.
naftiko: "0.5"
info:
label: "Workday Employee Directory Search"
description: "Searches the Workday employee directory by name or department, returning employee details including title, manager, and location."
tags:
- hr
- workday
- employee-directory
capability:
exposes:
- type: mcp
namespace: workday-directory
port: 8080
tools:
- name: search-employees
description: "Search the Workday employee directory."
inputParameters:
- name: search_term
in: body
type: string
description: "The name or department to search for."
call: "workday.search-workers"
with:
search: "{{search_term}}"
outputParameters:
- name: employee_name
type: string
mapping: "$.workers[0].name"
- name: title
type: string
mapping: "$.workers[0].title"
- name: department
type: string
mapping: "$.workers[0].department"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-services.condenast.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers?search={{search}}"
inputParameters:
- name: search
in: path
operations:
- name: search-workers
method: GET
Retrieves an invoice from Workday Financials, returning invoice number, vendor, amount, payment status, and due date.
naftiko: "0.5"
info:
label: "Workday Financials Invoice Lookup"
description: "Retrieves an invoice from Workday Financials, returning invoice number, vendor, amount, payment status, and due date."
tags:
- finance
- workday-financials
- accounts-payable
capability:
exposes:
- type: mcp
namespace: finance-ap
port: 8080
tools:
- name: get-invoice
description: "Look up a Workday Financials invoice. Returns invoice number, vendor, amount, payment status, and due date."
inputParameters:
- name: invoice_id
in: body
type: string
description: "The Workday invoice identifier."
call: "workday-fin.get-invoice"
with:
invoice_id: "{{invoice_id}}"
outputParameters:
- name: invoice_number
type: string
mapping: "$.invoiceNumber"
- name: vendor
type: string
mapping: "$.vendor.name"
- name: amount
type: number
mapping: "$.totalAmount"
- name: payment_status
type: string
mapping: "$.paymentStatus"
- name: due_date
type: string
mapping: "$.dueDate"
consumes:
- type: http
namespace: workday-fin
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/financialManagement/v1"
authentication:
type: bearer
token: "$secrets.workday_financials_token"
resources:
- name: invoices
path: "/invoices/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
Retrieves headcount by department from Workday for organizational planning, returning total headcount, open positions, and attrition rate.
naftiko: "0.5"
info:
label: "Workday Headcount Report"
description: "Retrieves headcount by department from Workday for organizational planning, returning total headcount, open positions, and attrition rate."
tags:
- hr
- headcount
- workday
- workforce-planning
capability:
exposes:
- type: mcp
namespace: hr-analytics
port: 8080
tools:
- name: get-headcount-report
description: "Look up department headcount in Workday. Returns total, open positions, and attrition rate."
inputParameters:
- name: department
in: body
type: string
description: "The department name."
call: "workday.get-headcount"
with:
department: "{{department}}"
outputParameters:
- name: total_headcount
type: number
mapping: "$.department.totalHeadcount"
- name: open_positions
type: number
mapping: "$.department.openPositions"
- name: attrition_rate
type: number
mapping: "$.department.attritionRate"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/departments/{{department}}/headcount"
inputParameters:
- name: department
in: path
operations:
- name: get-headcount
method: GET
When a time-off request is submitted in Workday, checks team coverage in Google Calendar, approves or flags the request, and notifies the manager via Slack.
naftiko: "0.5"
info:
label: "Workday Time-Off Request Pipeline"
description: "When a time-off request is submitted in Workday, checks team coverage in Google Calendar, approves or flags the request, and notifies the manager via Slack."
tags:
- hr
- time-off
- workday
- google-workspace
- slack
capability:
exposes:
- type: mcp
namespace: hr-time-off
port: 8080
tools:
- name: process-time-off-request
description: "Given a Workday time-off request, check team coverage and notify the manager."
inputParameters:
- name: request_id
in: body
type: string
description: "The Workday time-off request ID."
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
steps:
- name: get-request
type: call
call: "workday.get-time-off-request"
with:
request_id: "{{request_id}}"
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: check-calendar
type: call
call: "gcalendar.get-events"
with:
calendar_id: "{{get-employee.team_calendar}}"
time_min: "{{get-request.start_date}}"
time_max: "{{get-request.end_date}}"
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "{{get-employee.manager_slack_id}}"
text: "Time-off request from {{get-employee.full_name}}: {{get-request.start_date}} to {{get-request.end_date}}. Team members already off: {{check-calendar.conflict_count}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: time-off
path: "/workers/{{worker_id}}/timeOffRequests/{{request_id}}"
inputParameters:
- name: worker_id
in: path
- name: request_id
in: path
operations:
- name: get-time-off-request
method: GET
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: gcalendar
baseUri: "https://www.googleapis.com/calendar/v3"
authentication:
type: bearer
token: "$secrets.google_calendar_token"
resources:
- name: events
path: "/calendars/{{calendar_id}}/events"
inputParameters:
- name: calendar_id
in: path
operations:
- name: get-events
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves video performance metrics from YouTube Analytics for a given video ID, returning views, watch time, likes, and subscriber gain.
naftiko: "0.5"
info:
label: "YouTube Video Performance Lookup"
description: "Retrieves video performance metrics from YouTube Analytics for a given video ID, returning views, watch time, likes, and subscriber gain."
tags:
- video
- youtube
- analytics
capability:
exposes:
- type: mcp
namespace: video-analytics
port: 8080
tools:
- name: get-video-performance
description: "Look up YouTube video performance. Returns views, watch time, likes, and subscriber gain."
inputParameters:
- name: video_id
in: body
type: string
description: "The YouTube video ID."
call: "youtube.get-video-analytics"
with:
video_id: "{{video_id}}"
outputParameters:
- name: views
type: number
mapping: "$.rows[0][0]"
- name: watch_time_minutes
type: number
mapping: "$.rows[0][1]"
- name: likes
type: number
mapping: "$.rows[0][2]"
- name: subscriber_gain
type: number
mapping: "$.rows[0][3]"
consumes:
- type: http
namespace: youtube
baseUri: "https://youtubeanalytics.googleapis.com/v2"
authentication:
type: bearer
token: "$secrets.youtube_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-video-analytics
method: GET