Condé Nast Capabilities

Naftiko 0.5 capability definitions for Condé Nast - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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