Apple Capabilities

Naftiko 0.5 capability definitions for Apple - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Submits an engineering specification document stored in Confluence to OpenAI for summarization and posts the structured summary to the relevant Slack channel.

naftiko: "0.5"
info:
  label: "AI Document Summarization for Engineering Specs"
  description: "Submits an engineering specification document stored in Confluence to OpenAI for summarization and posts the structured summary to the relevant Slack channel."
  tags:
    - ai
    - engineering
    - confluence
    - openai
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ai-engineering
      port: 8080
      tools:
        - name: summarize-engineering-spec
          description: "Given a Confluence page ID and Slack channel, retrieve the engineering spec, submit to OpenAI for a structured summary, and post the summary to Slack."
          inputParameters:
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID of the engineering specification."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to post the summary to."
          steps:
            - name: get-confluence-page
              type: call
              call: "confluence.get-page"
              with:
                page_id: "{{confluence_page_id}}"
            - name: generate-summary
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Summarize this engineering specification with sections: Overview, Key Requirements, Architecture Decisions, Open Questions: {{get-confluence-page.body}}"
            - name: post-summary
              type: call
              call: "slack-ai.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Engineering Spec Summary ({{confluence_page_id}}): {{generate-summary.text}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://apple.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              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: create-completion
              method: POST
    - type: http
      namespace: slack-ai
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Analyzes App Clip performance by fetching launch metrics from App Store Connect, querying analytics in Snowflake, and posting a weekly digest to the product team.

naftiko: "0.5"
info:
  label: "App Clip Performance Analysis"
  description: "Analyzes App Clip performance by fetching launch metrics from App Store Connect, querying analytics in Snowflake, and posting a weekly digest to the product team."
  tags:
    - app-store
    - analytics
    - snowflake
    - app-clips
capability:
  exposes:
    - type: mcp
      namespace: app-clip-perf
      port: 8080
      tools:
        - name: analyze-app-clip-performance
          description: "Analyze App Clip launch metrics, run analytics queries, and share a performance digest with the product team."
          inputParameters:
            - name: app_clip_id
              in: body
              type: string
              description: "The App Clip identifier."
            - name: period
              in: body
              type: string
              description: "Analysis period, e.g. last_7d, last_30d."
          steps:
            - name: fetch-metrics
              type: call
              call: "appstoreconnect.get-app-clip-metrics"
              with:
                app_clip_id: "{{app_clip_id}}"
                period: "{{period}}"
            - name: run-analytics
              type: call
              call: "snowflake.execute-query"
              with:
                query: "SELECT avg(launch_time_ms), count(*), sum(conversions) FROM app_clip_events WHERE clip_id='{{app_clip_id}}' AND event_date >= dateadd(day, -7, current_date())"
                warehouse: "ANALYTICS_WH"
            - name: generate-digest
              type: call
              call: "openai.analyze-text"
              with:
                text: "Invocations: {{fetch-metrics.total_invocations}}, Avg launch: {{run-analytics.avg_launch_time_ms}}ms, Conversions: {{run-analytics.total_conversions}}"
                instruction: "Summarize App Clip performance. Highlight trends and recommendations."
            - name: post-digest
              type: call
              call: "slack.post-message"
              with:
                channel: "#app-clips-product"
                text: "App Clip {{app_clip_id}} {{period}} digest:\n{{generate-digest.summary}}"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: app-clip-metrics
          path: "/appClips/{{app_clip_id}}/metrics"
          inputParameters:
            - name: app_clip_id
              in: path
          operations:
            - name: get-app-clip-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves metadata for an app listed on the App Store by its bundle ID, including name, version, rating, and category.

naftiko: "0.5"
info:
  label: "App Store App Metadata Lookup"
  description: "Retrieves metadata for an app listed on the App Store by its bundle ID, including name, version, rating, and category."
  tags:
    - app-store
    - developer-tools
    - metadata
capability:
  exposes:
    - type: mcp
      namespace: appstore-metadata
      port: 8080
      tools:
        - name: get-app-metadata
          description: "Look up App Store app metadata by bundle ID. Returns app name, current version, average rating, and primary category."
          inputParameters:
            - name: bundle_id
              in: body
              type: string
              description: "The iOS app bundle identifier, e.g. com.apple.Keynote."
          call: "appstoreconnect.get-app"
          with:
            bundle_id: "{{bundle_id}}"
          outputParameters:
            - name: app_name
              type: string
              mapping: "$.data.attributes.name"
            - name: version
              type: string
              mapping: "$.data.attributes.version"
            - name: rating
              type: number
              mapping: "$.data.attributes.averageUserRating"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: apps
          path: "/apps?filter[bundleId]={{bundle_id}}"
          inputParameters:
            - name: bundle_id
              in: query
          operations:
            - name: get-app
              method: GET

Reconciles in-app purchase records by fetching App Store Server receipts, comparing with internal billing, flagging discrepancies, and notifying finance.

naftiko: "0.5"
info:
  label: "App Store In-App Purchase Reconciliation"
  description: "Reconciles in-app purchase records by fetching App Store Server receipts, comparing with internal billing, flagging discrepancies, and notifying finance."
  tags:
    - app-store
    - finance
    - billing
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: iap-reconciliation
      port: 8080
      tools:
        - name: reconcile-iap
          description: "Reconcile in-app purchases: fetch receipts, compare with billing, flag discrepancies, and notify finance."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The app identifier."
            - name: date
              in: body
              type: string
              description: "The reconciliation date in YYYY-MM-DD format."
          steps:
            - name: fetch-receipts
              type: call
              call: "appstore-server.get-transactions"
              with:
                app_id: "{{app_id}}"
                date: "{{date}}"
            - name: get-billing-records
              type: call
              call: "billing-api.get-daily-records"
              with:
                app_id: "{{app_id}}"
                date: "{{date}}"
            - name: compare-records
              type: call
              call: "reconciliation-engine.compare"
              with:
                appstore_data: "{{fetch-receipts.transactions}}"
                billing_data: "{{get-billing-records.records}}"
            - name: notify-finance
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance-reconciliation"
                text: "IAP reconciliation for {{app_id}} on {{date}}: Matched={{compare-records.matched}}, Discrepancies={{compare-records.discrepancy_count}}, Total revenue: ${{compare-records.total_revenue}}."
  consumes:
    - type: http
      namespace: appstore-server
      baseUri: "https://api.storekit.itunes.apple.com/inApps/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_server_token"
      resources:
        - name: transactions
          path: "/apps/{{app_id}}/transactions?date={{date}}"
          inputParameters:
            - name: app_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-transactions
              method: GET
    - type: http
      namespace: billing-api
      baseUri: "https://billing.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: records
          path: "/apps/{{app_id}}/records?date={{date}}"
          inputParameters:
            - name: app_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-daily-records
              method: GET
    - type: http
      namespace: reconciliation-engine
      baseUri: "https://reconciliation.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reconciliation_token"
      resources:
        - name: comparisons
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Validates app release readiness by checking Xcode Cloud build status, TestFlight crash rate, and App Store review guidelines compliance before submission.

naftiko: "0.5"
info:
  label: "App Store Release Readiness Check"
  description: "Validates app release readiness by checking Xcode Cloud build status, TestFlight crash rate, and App Store review guidelines compliance before submission."
  tags:
    - app-store
    - ci-cd
    - quality-assurance
    - testflight
capability:
  exposes:
    - type: mcp
      namespace: release-readiness
      port: 8080
      tools:
        - name: check-release-readiness
          description: "Given an app ID and build number, verify CI build passed, TestFlight crash rate is acceptable, and compliance checks pass."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The App Store Connect app identifier."
            - name: build_number
              in: body
              type: string
              description: "The build version number to check."
          steps:
            - name: check-build
              type: call
              call: "appstoreconnect.get-build"
              with:
                app_id: "{{app_id}}"
                build_number: "{{build_number}}"
            - name: get-crash-rate
              type: call
              call: "appstoreconnect.get-crash-metrics"
              with:
                app_id: "{{app_id}}"
                build_number: "{{build_number}}"
            - name: run-compliance-check
              type: call
              call: "compliance-api.check-guidelines"
              with:
                app_id: "{{app_id}}"
                build_id: "{{check-build.build_id}}"
            - name: post-summary
              type: call
              call: "slack.post-message"
              with:
                channel: "#release-management"
                text: "Release readiness for {{app_id}} build {{build_number}}: Build status={{check-build.status}}, Crash rate={{get-crash-rate.crash_rate_percent}}%, Compliance={{run-compliance-check.result}}"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: builds
          path: "/apps/{{app_id}}/builds?filter[version]={{build_number}}"
          inputParameters:
            - name: app_id
              in: path
            - name: build_number
              in: query
          operations:
            - name: get-build
              method: GET
        - name: crash-metrics
          path: "/apps/{{app_id}}/builds/{{build_number}}/diagnosticSignatures"
          inputParameters:
            - name: app_id
              in: path
            - name: build_number
              in: path
          operations:
            - name: get-crash-metrics
              method: GET
    - type: http
      namespace: compliance-api
      baseUri: "https://compliance-internal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: guidelines
          path: "/checks"
          operations:
            - name: check-guidelines
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Salesforce for recent customer support cases flagged as App Store reviews, submits a batch to OpenAI for sentiment classification, and posts a digest to the product Slack channel.

naftiko: "0.5"
info:
  label: "App Store Review Sentiment Triage"
  description: "Queries Salesforce for recent customer support cases flagged as App Store reviews, submits a batch to OpenAI for sentiment classification, and posts a digest to the product Slack channel."
  tags:
    - customer-support
    - salesforce
    - openai
    - ai
    - slack
capability:
  exposes:
    - type: mcp
      namespace: review-triage
      port: 8080
      tools:
        - name: triage-app-store-reviews
          description: "Given a Salesforce queue name for App Store reviews, fetch recent cases, classify sentiment with OpenAI, and post a summary digest to the product Slack channel."
          inputParameters:
            - name: queue_name
              in: body
              type: string
              description: "The Salesforce queue name containing App Store review cases."
            - name: product_channel
              in: body
              type: string
              description: "The Slack channel to post the sentiment digest to."
          steps:
            - name: fetch-reviews
              type: call
              call: "salesforce-reviews.query-cases"
              with:
                queue: "{{queue_name}}"
                status: "New"
            - name: classify-sentiment
              type: call
              call: "openai-reviews.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Classify the following App Store reviews by sentiment (positive, neutral, negative) and identify top themes: {{fetch-reviews.cases}}"
            - name: post-digest
              type: call
              call: "slack-reviews.post-message"
              with:
                channel: "{{product_channel}}"
                text: "App Store Review Digest — {{queue_name}}: {{classify-sentiment.text}}"
  consumes:
    - type: http
      namespace: salesforce-reviews
      baseUri: "https://apple.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/query"
          operations:
            - name: query-cases
              method: GET
              inputParameters:
                - name: queue
                  in: query
                - name: status
                  in: query
    - type: http
      namespace: openai-reviews
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: slack-reviews
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a negative App Store review is detected, analyzes sentiment with OpenAI, creates a Jira bug ticket, and notifies the product team via Slack.

naftiko: "0.5"
info:
  label: "App Store Review to Jira Ticket"
  description: "When a negative App Store review is detected, analyzes sentiment with OpenAI, creates a Jira bug ticket, and notifies the product team via Slack."
  tags:
    - app-store
    - quality-assurance
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: review-to-jira
      port: 8080
      tools:
        - name: escalate-negative-review
          description: "Given an App Store review ID, analyze its sentiment, create a Jira ticket if negative, and alert the product team on Slack."
          inputParameters:
            - name: review_id
              in: body
              type: string
              description: "The App Store review identifier."
            - name: app_id
              in: body
              type: string
              description: "The App Store app identifier."
          steps:
            - name: fetch-review
              type: call
              call: "appstoreconnect.get-review"
              with:
                review_id: "{{review_id}}"
                app_id: "{{app_id}}"
            - name: analyze-sentiment
              type: call
              call: "openai.analyze-text"
              with:
                text: "{{fetch-review.body}}"
                instruction: "Classify the sentiment as positive, neutral, or negative. Return JSON with sentiment and key_issues array."
            - name: create-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "IOS"
                summary: "Negative App Store review: {{fetch-review.title}}"
                description: "Review: {{fetch-review.body}}\nSentiment: {{analyze-sentiment.sentiment}}\nIssues: {{analyze-sentiment.key_issues}}"
                issue_type: "Bug"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#app-reviews"
                text: "Negative review escalated for app {{app_id}}: {{fetch-review.title}}. Jira: {{create-jira-ticket.key}}"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: reviews
          path: "/apps/{{app_id}}/customerReviews/{{review_id}}"
          inputParameters:
            - name: app_id
              in: path
            - name: review_id
              in: path
          operations:
            - name: get-review
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Downloads a daily sales report from App Store Connect for a given vendor number and date.

naftiko: "0.5"
info:
  label: "App Store Sales Report Download"
  description: "Downloads a daily sales report from App Store Connect for a given vendor number and date."
  tags:
    - app-store
    - sales
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: appstore-sales
      port: 8080
      tools:
        - name: download-sales-report
          description: "Download a daily App Store sales report for a vendor. Returns aggregated units, proceeds, and top-selling app."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The App Store Connect vendor number."
            - name: report_date
              in: body
              type: string
              description: "The report date in YYYY-MM-DD format."
          call: "appstoreconnect.get-sales-report"
          with:
            vendor_number: "{{vendor_number}}"
            report_date: "{{report_date}}"
          outputParameters:
            - name: total_units
              type: number
              mapping: "$.summary.totalUnits"
            - name: total_proceeds
              type: number
              mapping: "$.summary.totalProceeds"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: sales-reports
          path: "/salesReports?filter[vendorNumber]={{vendor_number}}&filter[reportDate]={{report_date}}&filter[reportType]=SALES&filter[frequency]=DAILY"
          inputParameters:
            - name: vendor_number
              in: query
            - name: report_date
              in: query
          operations:
            - name: get-sales-report
              method: GET

Prevents subscription churn by detecting at-risk subscribers, generating personalized retention offers, and sending targeted notifications via APNs.

naftiko: "0.5"
info:
  label: "App Store Subscription Churn Prevention"
  description: "Prevents subscription churn by detecting at-risk subscribers, generating personalized retention offers, and sending targeted notifications via APNs."
  tags:
    - app-store
    - subscriptions
    - retention
    - machine-learning
capability:
  exposes:
    - type: mcp
      namespace: churn-prevention
      port: 8080
      tools:
        - name: prevent-subscriber-churn
          description: "Detect at-risk subscribers, generate personalized offers, and send retention notifications."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The app identifier."
            - name: subscriber_id
              in: body
              type: string
              description: "The subscriber identifier."
          steps:
            - name: assess-churn-risk
              type: call
              call: "churn-ml.score-subscriber"
              with:
                app_id: "{{app_id}}"
                subscriber_id: "{{subscriber_id}}"
            - name: generate-offer
              type: call
              call: "offers-engine.create-retention-offer"
              with:
                subscriber_id: "{{subscriber_id}}"
                churn_score: "{{assess-churn-risk.churn_probability}}"
                usage_pattern: "{{assess-churn-risk.usage_pattern}}"
            - name: send-notification
              type: call
              call: "apns.send-notification"
              with:
                subscriber_id: "{{subscriber_id}}"
                title: "Special offer just for you"
                body: "{{generate-offer.offer_message}}"
            - name: log-intervention
              type: call
              call: "snowflake.execute-query"
              with:
                query: "INSERT INTO churn_interventions VALUES ('{{subscriber_id}}', '{{app_id}}', {{assess-churn-risk.churn_probability}}, '{{generate-offer.offer_id}}', current_timestamp())"
                warehouse: "ANALYTICS_WH"
  consumes:
    - type: http
      namespace: churn-ml
      baseUri: "https://churn-prediction.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.churn_ml_token"
      resources:
        - name: scoring
          path: "/subscribers/{{subscriber_id}}/score"
          inputParameters:
            - name: subscriber_id
              in: path
          operations:
            - name: score-subscriber
              method: GET
    - type: http
      namespace: offers-engine
      baseUri: "https://offers.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.offers_engine_token"
      resources:
        - name: offers
          path: "/retention-offers"
          operations:
            - name: create-retention-offer
              method: POST
    - type: http
      namespace: apns
      baseUri: "https://api.push.apple.com/v3"
      authentication:
        type: bearer
        token: "$secrets.apns_auth_token"
      resources:
        - name: notifications
          path: "/notifications"
          operations:
            - name: send-notification
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Audits app accessibility compliance by running automated checks, comparing against WCAG guidelines, generating a report, and creating remediation tasks in Jira.

naftiko: "0.5"
info:
  label: "Apple Accessibility Compliance Audit"
  description: "Audits app accessibility compliance by running automated checks, comparing against WCAG guidelines, generating a report, and creating remediation tasks in Jira."
  tags:
    - accessibility
    - compliance
    - quality-assurance
    - jira
capability:
  exposes:
    - type: mcp
      namespace: a11y-audit
      port: 8080
      tools:
        - name: audit-accessibility
          description: "Run accessibility audit on an app build: scan for issues, check WCAG compliance, generate report, and create Jira tasks for failures."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The app identifier."
            - name: build_id
              in: body
              type: string
              description: "The build identifier to audit."
          steps:
            - name: run-scan
              type: call
              call: "a11y-scanner.scan-build"
              with:
                app_id: "{{app_id}}"
                build_id: "{{build_id}}"
            - name: check-wcag
              type: call
              call: "a11y-scanner.check-wcag-compliance"
              with:
                scan_id: "{{run-scan.scan_id}}"
                standard: "WCAG-2.1-AA"
            - name: generate-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "A11Y"
                title: "Accessibility Audit: {{app_id}} build {{build_id}}"
                body: "Issues found: {{run-scan.issue_count}}. WCAG compliance: {{check-wcag.compliance_percent}}%. Critical: {{check-wcag.critical_issues}}."
            - name: create-remediation-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "A11Y"
                summary: "Accessibility issues in {{app_id}} build {{build_id}}"
                description: "{{run-scan.issue_count}} issues found. WCAG compliance: {{check-wcag.compliance_percent}}%. Report: {{generate-report.url}}"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: a11y-scanner
      baseUri: "https://a11y-tools.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.a11y_scanner_token"
      resources:
        - name: scans
          path: "/scans"
          operations:
            - name: scan-build
              method: POST
        - name: compliance
          path: "/scans/{{scan_id}}/wcag"
          inputParameters:
            - name: scan_id
              in: path
          operations:
            - name: check-wcag-compliance
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://apple-eng.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Reviews AR content submissions by validating USDZ assets, running performance benchmarks, checking content guidelines, and routing for editorial approval.

naftiko: "0.5"
info:
  label: "Apple AR Content Review Pipeline"
  description: "Reviews AR content submissions by validating USDZ assets, running performance benchmarks, checking content guidelines, and routing for editorial approval."
  tags:
    - ar-vr
    - content-review
    - quality-assurance
    - developer-tools
capability:
  exposes:
    - type: mcp
      namespace: ar-review
      port: 8080
      tools:
        - name: review-ar-content
          description: "Review AR content: validate USDZ, run performance benchmark, check guidelines, and route for approval."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "The AR content submission identifier."
          steps:
            - name: validate-usdz
              type: call
              call: "ar-tools.validate-asset"
              with:
                submission_id: "{{submission_id}}"
            - name: run-benchmark
              type: call
              call: "ar-tools.benchmark-performance"
              with:
                asset_url: "{{validate-usdz.asset_url}}"
                target_device: "iPhone"
            - name: check-guidelines
              type: call
              call: "content-review.check-ar-guidelines"
              with:
                submission_id: "{{submission_id}}"
                asset_metadata: "{{validate-usdz.metadata}}"
            - name: route-for-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "AR"
                summary: "AR content review: {{submission_id}}"
                description: "USDZ valid: {{validate-usdz.is_valid}}. Benchmark FPS: {{run-benchmark.avg_fps}}. Guidelines: {{check-guidelines.status}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: ar-tools
      baseUri: "https://ar-tools.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ar_tools_token"
      resources:
        - name: validation
          path: "/submissions/{{submission_id}}/validate"
          inputParameters:
            - name: submission_id
              in: path
          operations:
            - name: validate-asset
              method: POST
        - name: benchmarks
          path: "/benchmarks"
          operations:
            - name: benchmark-performance
              method: POST
    - type: http
      namespace: content-review
      baseUri: "https://content-review.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.content_review_token"
      resources:
        - name: guidelines
          path: "/ar/guidelines-check"
          operations:
            - name: check-ar-guidelines
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Reviews publisher content submissions for Apple Books by validating EPUB format, checking DRM compliance, scanning for prohibited content, and routing for editorial approval.

naftiko: "0.5"
info:
  label: "Apple Books Publisher Content Review"
  description: "Reviews publisher content submissions for Apple Books by validating EPUB format, checking DRM compliance, scanning for prohibited content, and routing for editorial approval."
  tags:
    - media
    - apple-books
    - content-review
    - publishing
capability:
  exposes:
    - type: mcp
      namespace: books-review
      port: 8080
      tools:
        - name: review-book-submission
          description: "Review an Apple Books submission: validate EPUB, check DRM, scan content, and route for editorial approval."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "The book submission identifier."
            - name: publisher_id
              in: body
              type: string
              description: "The publisher identifier."
          steps:
            - name: validate-epub
              type: call
              call: "books-pipeline.validate-format"
              with:
                submission_id: "{{submission_id}}"
            - name: check-drm
              type: call
              call: "books-pipeline.check-drm-compliance"
              with:
                submission_id: "{{submission_id}}"
                publisher_id: "{{publisher_id}}"
            - name: scan-content
              type: call
              call: "content-safety.scan-text"
              with:
                content_ref: "{{validate-epub.content_ref}}"
            - name: route-for-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "BOOKS"
                summary: "Book review: {{validate-epub.title}} by {{validate-epub.author}}"
                description: "EPUB valid: {{validate-epub.is_valid}}. DRM: {{check-drm.status}}. Content scan: {{scan-content.result}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: books-pipeline
      baseUri: "https://books-pipeline.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.books_pipeline_token"
      resources:
        - name: validation
          path: "/submissions/{{submission_id}}/validate"
          inputParameters:
            - name: submission_id
              in: path
          operations:
            - name: validate-format
              method: POST
        - name: drm
          path: "/submissions/{{submission_id}}/drm-check"
          inputParameters:
            - name: submission_id
              in: path
          operations:
            - name: check-drm-compliance
              method: POST
    - type: http
      namespace: content-safety
      baseUri: "https://content-safety.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.content_safety_token"
      resources:
        - name: scanning
          path: "/scan"
          operations:
            - name: scan-text
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Remotely wipes a lost or stolen device through Apple Business Essentials by verifying ownership, issuing the wipe command, logging the action, and notifying IT.

naftiko: "0.5"
info:
  label: "Apple Business Essentials Device Wipe"
  description: "Remotely wipes a lost or stolen device through Apple Business Essentials by verifying ownership, issuing the wipe command, logging the action, and notifying IT."
  tags:
    - device-management
    - security
    - mdm
    - operations
capability:
  exposes:
    - type: mcp
      namespace: abe-device-wipe
      port: 8080
      tools:
        - name: wipe-lost-device
          description: "Remotely wipe a lost device: verify ownership, issue wipe command, log the action, and notify IT."
          inputParameters:
            - name: device_serial
              in: body
              type: string
              description: "The device serial number."
            - name: requester_email
              in: body
              type: string
              description: "The email of the person requesting the wipe."
          steps:
            - name: verify-ownership
              type: call
              call: "abm.get-device"
              with:
                serial_number: "{{device_serial}}"
            - name: issue-wipe
              type: call
              call: "mdm-api.send-wipe-command"
              with:
                device_serial: "{{device_serial}}"
                authorized_by: "{{requester_email}}"
            - name: log-action
              type: call
              call: "splunk.log-event"
              with:
                index: "device-management"
                event: "remote_wipe"
                device_serial: "{{device_serial}}"
                requester: "{{requester_email}}"
                wipe_command_id: "{{issue-wipe.command_id}}"
            - name: notify-it
              type: call
              call: "slack.post-message"
              with:
                channel: "#it-device-management"
                text: "Remote wipe issued for {{device_serial}} ({{verify-ownership.model}}). Requested by {{requester_email}}. Command: {{issue-wipe.command_id}}."
  consumes:
    - type: http
      namespace: abm
      baseUri: "https://business.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.abm_api_token"
      resources:
        - name: devices
          path: "/devices/{{serial_number}}"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-device
              method: GET
    - type: http
      namespace: mdm-api
      baseUri: "https://mdm.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.mdm_api_token"
      resources:
        - name: commands
          path: "/devices/{{device_serial}}/commands/wipe"
          inputParameters:
            - name: device_serial
              in: path
          operations:
            - name: send-wipe-command
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.apple.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/collector/event"
          operations:
            - name: log-event
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up a device in Apple Business Manager by serial number, returning enrollment status, model, and assigned MDM server.

naftiko: "0.5"
info:
  label: "Apple Business Manager Device Lookup"
  description: "Looks up a device in Apple Business Manager by serial number, returning enrollment status, model, and assigned MDM server."
  tags:
    - device-management
    - mdm
    - apple-business-manager
capability:
  exposes:
    - type: mcp
      namespace: abm-devices
      port: 8080
      tools:
        - name: get-device
          description: "Look up a device in Apple Business Manager by serial number. Returns enrollment status, device model, and MDM server assignment."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The device serial number."
          call: "abm.get-device"
          with:
            serial_number: "{{serial_number}}"
          outputParameters:
            - name: model
              type: string
              mapping: "$.device.model"
            - name: enrollment_status
              type: string
              mapping: "$.device.enrollmentStatus"
            - name: mdm_server
              type: string
              mapping: "$.device.assignedMdmServer"
  consumes:
    - type: http
      namespace: abm
      baseUri: "https://business.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.abm_api_token"
      resources:
        - name: devices
          path: "/devices/{{serial_number}}"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-device
              method: GET

Manages campus visitor registration by pre-screening, generating a temporary badge, notifying the host, and logging the visit for security.

naftiko: "0.5"
info:
  label: "Apple Campus Visitor Management"
  description: "Manages campus visitor registration by pre-screening, generating a temporary badge, notifying the host, and logging the visit for security."
  tags:
    - facilities
    - security
    - visitor-management
    - operations
capability:
  exposes:
    - type: mcp
      namespace: visitor-management
      port: 8080
      tools:
        - name: register-visitor
          description: "Register a campus visitor: pre-screen, generate temp badge, notify host, and log for security."
          inputParameters:
            - name: visitor_name
              in: body
              type: string
              description: "The visitor full name."
            - name: visitor_email
              in: body
              type: string
              description: "The visitor email."
            - name: host_email
              in: body
              type: string
              description: "The Apple employee host email."
            - name: visit_date
              in: body
              type: string
              description: "The visit date in ISO 8601 format."
          steps:
            - name: pre-screen
              type: call
              call: "security-api.pre-screen-visitor"
              with:
                visitor_name: "{{visitor_name}}"
                visitor_email: "{{visitor_email}}"
            - name: generate-badge
              type: call
              call: "badge-system.create-temp-badge"
              with:
                visitor_name: "{{visitor_name}}"
                visit_date: "{{visit_date}}"
                clearance: "{{pre-screen.clearance_level}}"
            - name: notify-host
              type: call
              call: "slack.post-message"
              with:
                channel: "{{host_email}}"
                text: "Your visitor {{visitor_name}} is registered for {{visit_date}}. Badge: {{generate-badge.badge_id}}. Please meet at reception."
            - name: log-visit
              type: call
              call: "splunk.log-event"
              with:
                index: "campus-security"
                event: "visitor_registration"
                visitor: "{{visitor_name}}"
                host: "{{host_email}}"
                badge_id: "{{generate-badge.badge_id}}"
  consumes:
    - type: http
      namespace: security-api
      baseUri: "https://campus-security.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.campus_security_token"
      resources:
        - name: screening
          path: "/visitors/pre-screen"
          operations:
            - name: pre-screen-visitor
              method: POST
    - type: http
      namespace: badge-system
      baseUri: "https://badge-system.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.badge_system_token"
      resources:
        - name: badges
          path: "/badges/temporary"
          operations:
            - name: create-temp-badge
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.apple.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/collector/event"
          operations:
            - name: log-event
              method: POST

Processes Apple Card transaction disputes by fetching transaction details, submitting a dispute to Goldman Sachs, creating a case in ServiceNow, and notifying the cardholder.

naftiko: "0.5"
info:
  label: "Apple Card Dispute Processing"
  description: "Processes Apple Card transaction disputes by fetching transaction details, submitting a dispute to Goldman Sachs, creating a case in ServiceNow, and notifying the cardholder."
  tags:
    - fintech
    - apple-card
    - dispute
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: card-disputes
      port: 8080
      tools:
        - name: process-dispute
          description: "Process an Apple Card dispute: fetch transaction, submit to bank, create support case, and notify cardholder."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "The Apple Card transaction identifier."
            - name: dispute_reason
              in: body
              type: string
              description: "The dispute reason code."
            - name: cardholder_email
              in: body
              type: string
              description: "The cardholder email address."
          steps:
            - name: get-transaction
              type: call
              call: "apple-card-api.get-transaction"
              with:
                transaction_id: "{{transaction_id}}"
            - name: submit-dispute
              type: call
              call: "apple-card-api.create-dispute"
              with:
                transaction_id: "{{transaction_id}}"
                reason: "{{dispute_reason}}"
                amount: "{{get-transaction.amount}}"
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Apple Card dispute: {{transaction_id}}"
                description: "Amount: ${{get-transaction.amount}}. Merchant: {{get-transaction.merchant_name}}. Reason: {{dispute_reason}}. Bank ref: {{submit-dispute.dispute_id}}."
                category: "financial_disputes"
            - name: notify-cardholder
              type: call
              call: "ses.send-email"
              with:
                to: "{{cardholder_email}}"
                subject: "Your Apple Card Dispute Has Been Filed"
                body: "Dispute for ${{get-transaction.amount}} at {{get-transaction.merchant_name}} has been submitted. Reference: {{submit-dispute.dispute_id}}. Case: {{create-case.number}}."
  consumes:
    - type: http
      namespace: apple-card-api
      baseUri: "https://card-services.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.apple_card_token"
      resources:
        - name: transactions
          path: "/transactions/{{transaction_id}}"
          inputParameters:
            - name: transaction_id
              in: path
          operations:
            - name: get-transaction
              method: GET
        - name: disputes
          path: "/disputes"
          operations:
            - name: create-dispute
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://apple.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: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Automates corporate travel booking by checking policy compliance in SAP Concur, booking flights, creating a calendar event, and notifying the traveler and manager.

naftiko: "0.5"
info:
  label: "Apple Corporate Travel Booking Workflow"
  description: "Automates corporate travel booking by checking policy compliance in SAP Concur, booking flights, creating a calendar event, and notifying the traveler and manager."
  tags:
    - travel
    - sap-concur
    - operations
    - workforce-management
capability:
  exposes:
    - type: mcp
      namespace: corporate-travel
      port: 8080
      tools:
        - name: book-corporate-travel
          description: "Book corporate travel: check policy, book flights, create calendar event, and notify traveler and manager."
          inputParameters:
            - name: employee_email
              in: body
              type: string
              description: "The traveling employee email."
            - name: destination
              in: body
              type: string
              description: "The travel destination city."
            - name: travel_date
              in: body
              type: string
              description: "The travel date in ISO 8601 format."
            - name: purpose
              in: body
              type: string
              description: "The business purpose of travel."
          steps:
            - name: check-policy
              type: call
              call: "concur.check-travel-policy"
              with:
                employee_email: "{{employee_email}}"
                destination: "{{destination}}"
                travel_date: "{{travel_date}}"
            - name: book-flight
              type: call
              call: "concur.book-flight"
              with:
                employee_email: "{{employee_email}}"
                destination: "{{destination}}"
                date: "{{travel_date}}"
                budget: "{{check-policy.approved_budget}}"
            - name: create-calendar-event
              type: call
              call: "google-calendar.create-event"
              with:
                attendee: "{{employee_email}}"
                title: "Business Travel: {{destination}}"
                date: "{{travel_date}}"
                description: "Flight: {{book-flight.flight_number}}. Confirmation: {{book-flight.confirmation_code}}."
            - name: notify-manager
              type: call
              call: "slack.post-message"
              with:
                channel: "#travel-approvals"
                text: "Travel booked for {{employee_email}} to {{destination}} on {{travel_date}}. Flight: {{book-flight.flight_number}}. Purpose: {{purpose}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_api_token"
      resources:
        - name: travel-policy
          path: "/travelrequest/policy"
          operations:
            - name: check-travel-policy
              method: POST
        - name: flights
          path: "/travelrequest/bookings"
          operations:
            - name: book-flight
              method: POST
    - type: http
      namespace: google-calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: events
          path: "/calendars/primary/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Plans datacenter capacity by querying current utilization from Datadog, forecasting growth with Snowflake, and generating provisioning recommendations for infrastructure teams.

naftiko: "0.5"
info:
  label: "Apple Datacenter Capacity Planning"
  description: "Plans datacenter capacity by querying current utilization from Datadog, forecasting growth with Snowflake, and generating provisioning recommendations for infrastructure teams."
  tags:
    - infrastructure
    - capacity-planning
    - datadog
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: capacity-planning
      port: 8080
      tools:
        - name: plan-datacenter-capacity
          description: "Plan datacenter capacity: query utilization, forecast growth, generate recommendations, and notify infrastructure team."
          inputParameters:
            - name: datacenter_id
              in: body
              type: string
              description: "The datacenter identifier."
            - name: forecast_months
              in: body
              type: number
              description: "Number of months to forecast, e.g. 3, 6, 12."
          steps:
            - name: get-current-utilization
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:datacenter.cpu.utilization{dc:{{datacenter_id}}},avg:datacenter.storage.utilization{dc:{{datacenter_id}}}"
                time_range: "last_30d"
            - name: forecast-growth
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL infrastructure.forecast_capacity('{{datacenter_id}}', {{forecast_months}})"
                warehouse: "INFRA_WH"
            - name: generate-recommendations
              type: call
              call: "openai.analyze-text"
              with:
                text: "Current CPU: {{get-current-utilization.cpu_avg}}%, Storage: {{get-current-utilization.storage_avg}}%. Forecast: CPU={{forecast-growth.projected_cpu}}%, Storage={{forecast-growth.projected_storage}}% in {{forecast_months}} months."
                instruction: "Generate datacenter capacity recommendations. Include server count, storage expansion, and timeline. Return JSON."
            - name: post-report
              type: call
              call: "slack.post-message"
              with:
                channel: "#infrastructure-planning"
                text: "Capacity plan for {{datacenter_id}} ({{forecast_months}}mo forecast): Current CPU={{get-current-utilization.cpu_avg}}%, Projected={{forecast-growth.projected_cpu}}%. Recommendation: {{generate-recommendations.summary}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Releases a new design system component by validating against HIG, publishing to the component library, updating documentation, and notifying design and engineering teams.

naftiko: "0.5"
info:
  label: "Apple Design System Component Release"
  description: "Releases a new design system component by validating against HIG, publishing to the component library, updating documentation, and notifying design and engineering teams."
  tags:
    - design
    - developer-tools
    - documentation
    - ui
capability:
  exposes:
    - type: mcp
      namespace: design-system
      port: 8080
      tools:
        - name: release-component
          description: "Release a design system component: validate HIG compliance, publish to library, update docs, and notify teams."
          inputParameters:
            - name: component_name
              in: body
              type: string
              description: "The component name, e.g. ActionButton, NavigationBar."
            - name: version
              in: body
              type: string
              description: "The component version."
          steps:
            - name: validate-hig
              type: call
              call: "hig-validator.check-compliance"
              with:
                component_name: "{{component_name}}"
                version: "{{version}}"
            - name: publish-to-library
              type: call
              call: "component-library.publish"
              with:
                component_name: "{{component_name}}"
                version: "{{version}}"
                hig_status: "{{validate-hig.status}}"
            - name: update-docs
              type: call
              call: "confluence.create-page"
              with:
                space_key: "DESIGN"
                title: "{{component_name}} v{{version}} Release Notes"
                body: "Component {{component_name}} v{{version}} released. HIG compliance: {{validate-hig.status}}. Library ID: {{publish-to-library.component_id}}."
            - name: notify-teams
              type: call
              call: "slack.post-message"
              with:
                channel: "#design-engineering"
                text: "Design system component {{component_name}} v{{version}} released. HIG: {{validate-hig.status}}. Docs: {{update-docs.url}}."
  consumes:
    - type: http
      namespace: hig-validator
      baseUri: "https://hig-tools.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.hig_validator_token"
      resources:
        - name: compliance
          path: "/components/{{component_name}}/check"
          inputParameters:
            - name: component_name
              in: path
          operations:
            - name: check-compliance
              method: POST
    - type: http
      namespace: component-library
      baseUri: "https://component-library.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.component_library_token"
      resources:
        - name: components
          path: "/components"
          operations:
            - name: publish
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://apple-eng.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Rotates API keys for App Store Connect integrations by generating a new key, updating secrets in Vault, deploying via Terraform, and notifying DevOps.

naftiko: "0.5"
info:
  label: "Apple Developer API Key Rotation"
  description: "Rotates API keys for App Store Connect integrations by generating a new key, updating secrets in Vault, deploying via Terraform, and notifying DevOps."
  tags:
    - developer-tools
    - security
    - secrets-management
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: api-key-rotation
      port: 8080
      tools:
        - name: rotate-api-key
          description: "Rotate an App Store Connect API key: generate new key, store in Vault, deploy config update, and notify DevOps."
          inputParameters:
            - name: key_id
              in: body
              type: string
              description: "The existing API key identifier to rotate."
            - name: issuer_id
              in: body
              type: string
              description: "The App Store Connect issuer ID."
          steps:
            - name: generate-new-key
              type: call
              call: "appstoreconnect.create-api-key"
              with:
                issuer_id: "{{issuer_id}}"
                roles: "ADMIN"
            - name: store-in-vault
              type: call
              call: "vault.write-secret"
              with:
                path: "secret/appstoreconnect/{{issuer_id}}"
                key: "api_key"
                value: "{{generate-new-key.private_key}}"
            - name: deploy-config
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "api-key-configs"
                message: "Rotated API key {{key_id}} for issuer {{issuer_id}}"
            - name: revoke-old-key
              type: call
              call: "appstoreconnect.revoke-api-key"
              with:
                key_id: "{{key_id}}"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: api-keys
          path: "/apiKeys"
          operations:
            - name: create-api-key
              method: POST
        - name: api-key-revoke
          path: "/apiKeys/{{key_id}}"
          inputParameters:
            - name: key_id
              in: path
          operations:
            - name: revoke-api-key
              method: DELETE
    - type: http
      namespace: vault
      baseUri: "https://vault.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: write-secret
              method: POST
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: trigger-run
              method: POST

Updates Apple developer documentation by detecting API changes in the SDK, generating updated docs with AI, publishing to the developer portal, and notifying DevRel.

naftiko: "0.5"
info:
  label: "Apple Developer Documentation Update Pipeline"
  description: "Updates Apple developer documentation by detecting API changes in the SDK, generating updated docs with AI, publishing to the developer portal, and notifying DevRel."
  tags:
    - developer-tools
    - documentation
    - ai
    - devrel
capability:
  exposes:
    - type: mcp
      namespace: docs-pipeline
      port: 8080
      tools:
        - name: update-api-docs
          description: "Update developer docs: detect API changes, generate updated documentation, publish to portal, and notify DevRel."
          inputParameters:
            - name: framework_name
              in: body
              type: string
              description: "The framework name, e.g. SwiftUI, UIKit, CoreML."
            - name: sdk_version
              in: body
              type: string
              description: "The SDK version with changes."
          steps:
            - name: detect-changes
              type: call
              call: "sdk-diff.compare-versions"
              with:
                framework: "{{framework_name}}"
                version: "{{sdk_version}}"
            - name: generate-docs
              type: call
              call: "openai.analyze-text"
              with:
                text: "API changes for {{framework_name}} in SDK {{sdk_version}}: {{detect-changes.diff_summary}}"
                instruction: "Generate developer documentation for these API changes. Include code examples, migration notes, and deprecation warnings. Format as structured documentation."
            - name: publish-to-portal
              type: call
              call: "developer-portal.update-docs"
              with:
                framework: "{{framework_name}}"
                version: "{{sdk_version}}"
                content: "{{generate-docs.documentation}}"
            - name: notify-devrel
              type: call
              call: "slack.post-message"
              with:
                channel: "#developer-relations"
                text: "Docs updated for {{framework_name}} SDK {{sdk_version}}. {{detect-changes.new_apis}} new APIs, {{detect-changes.deprecated_apis}} deprecations. Portal: {{publish-to-portal.url}}"
  consumes:
    - type: http
      namespace: sdk-diff
      baseUri: "https://sdk-tools.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sdk_tools_token"
      resources:
        - name: diffs
          path: "/frameworks/{{framework}}/diff"
          inputParameters:
            - name: framework
              in: path
          operations:
            - name: compare-versions
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: developer-portal
      baseUri: "https://developer-portal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.developer_portal_token"
      resources:
        - name: docs
          path: "/documentation"
          operations:
            - name: update-docs
              method: PUT
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the enrollment status and expiration date of an Apple Developer Program membership by team ID.

naftiko: "0.5"
info:
  label: "Apple Developer Membership Status"
  description: "Checks the enrollment status and expiration date of an Apple Developer Program membership by team ID."
  tags:
    - developer-tools
    - membership
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: developer-program
      port: 8080
      tools:
        - name: get-membership-status
          description: "Check Apple Developer Program membership status by team ID. Returns enrollment type, expiration date, and renewal status."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Apple Developer team identifier."
          call: "appstoreconnect.get-membership"
          with:
            team_id: "{{team_id}}"
          outputParameters:
            - name: program_type
              type: string
              mapping: "$.data.attributes.programType"
            - name: expiration_date
              type: string
              mapping: "$.data.attributes.expirationDate"
            - name: is_active
              type: boolean
              mapping: "$.data.attributes.isActive"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: memberships
          path: "/teams/{{team_id}}/membership"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: get-membership
              method: GET

Tracks environmental compliance for product materials by querying supplier declarations, checking against Apple standards, and generating compliance certificates.

naftiko: "0.5"
info:
  label: "Apple Environmental Compliance Tracker"
  description: "Tracks environmental compliance for product materials by querying supplier declarations, checking against Apple standards, and generating compliance certificates."
  tags:
    - sustainability
    - compliance
    - supply-chain
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: env-compliance
      port: 8080
      tools:
        - name: track-material-compliance
          description: "Track environmental compliance for a product material: query supplier data, check Apple standards, and generate certificate."
          inputParameters:
            - name: material_id
              in: body
              type: string
              description: "The material identifier."
            - name: product_sku
              in: body
              type: string
              description: "The product SKU the material is used in."
          steps:
            - name: get-supplier-declaration
              type: call
              call: "supplier-portal.get-material-declaration"
              with:
                material_id: "{{material_id}}"
            - name: check-standards
              type: call
              call: "env-standards.validate-material"
              with:
                material_data: "{{get-supplier-declaration}}"
                product_sku: "{{product_sku}}"
            - name: generate-certificate
              type: call
              call: "compliance-docs.generate-cert"
              with:
                material_id: "{{material_id}}"
                product_sku: "{{product_sku}}"
                compliance_result: "{{check-standards.result}}"
            - name: log-result
              type: call
              call: "snowflake.execute-query"
              with:
                query: "INSERT INTO env_compliance_log VALUES ('{{material_id}}', '{{product_sku}}', '{{check-standards.result}}', current_timestamp())"
                warehouse: "COMPLIANCE_WH"
  consumes:
    - type: http
      namespace: supplier-portal
      baseUri: "https://supplier-portal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.supplier_portal_token"
      resources:
        - name: materials
          path: "/materials/{{material_id}}/declaration"
          inputParameters:
            - name: material_id
              in: path
          operations:
            - name: get-material-declaration
              method: GET
    - type: http
      namespace: env-standards
      baseUri: "https://env-standards.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.env_standards_token"
      resources:
        - name: validation
          path: "/validate"
          operations:
            - name: validate-material
              method: POST
    - type: http
      namespace: compliance-docs
      baseUri: "https://compliance-docs.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_docs_token"
      resources:
        - name: certificates
          path: "/certificates"
          operations:
            - name: generate-cert
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Searches the Apple Fitness+ workout catalog by workout type, returning available sessions with trainer, duration, and difficulty.

naftiko: "0.5"
info:
  label: "Apple Fitness+ Workout Catalog"
  description: "Searches the Apple Fitness+ workout catalog by workout type, returning available sessions with trainer, duration, and difficulty."
  tags:
    - health
    - fitness
    - apple-fitness
capability:
  exposes:
    - type: mcp
      namespace: fitness-plus
      port: 8080
      tools:
        - name: search-workouts
          description: "Search Fitness+ workouts by type. Returns matching sessions with trainer name, duration, and difficulty level."
          inputParameters:
            - name: workout_type
              in: body
              type: string
              description: "The workout type, e.g. HIIT, Yoga, Cycling, Strength."
          call: "fitness-api.search-workouts"
          with:
            workout_type: "{{workout_type}}"
          outputParameters:
            - name: workouts
              type: array
              mapping: "$.data.workouts"
            - name: total_count
              type: number
              mapping: "$.data.totalCount"
  consumes:
    - type: http
      namespace: fitness-api
      baseUri: "https://fitness.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fitness_api_token"
      resources:
        - name: workouts
          path: "/workouts?type={{workout_type}}"
          inputParameters:
            - name: workout_type
              in: query
          operations:
            - name: search-workouts
              method: GET

Checks the status of a health records export job from the Apple Health data pipeline, returning progress and record count.

naftiko: "0.5"
info:
  label: "Apple Health Records Export Status"
  description: "Checks the status of a health records export job from the Apple Health data pipeline, returning progress and record count."
  tags:
    - health
    - data-export
    - privacy
capability:
  exposes:
    - type: mcp
      namespace: health-records
      port: 8080
      tools:
        - name: get-export-status
          description: "Check the status of an Apple Health records export job. Returns completion percentage, record count, and error summary."
          inputParameters:
            - name: export_job_id
              in: body
              type: string
              description: "The health records export job identifier."
          call: "health-data.get-export-job"
          with:
            export_job_id: "{{export_job_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.job.status"
            - name: progress_percent
              type: number
              mapping: "$.job.progressPercent"
            - name: record_count
              type: number
              mapping: "$.job.totalRecords"
  consumes:
    - type: http
      namespace: health-data
      baseUri: "https://health-data-internal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.health_data_token"
      resources:
        - name: export-jobs
          path: "/exports/{{export_job_id}}"
          inputParameters:
            - name: export_job_id
              in: path
          operations:
            - name: get-export-job
              method: GET

Handles Apple ID account lockouts by verifying identity, resetting the lockout flag, logging the event in Splunk, and notifying the user.

naftiko: "0.5"
info:
  label: "Apple ID Account Lockout Remediation"
  description: "Handles Apple ID account lockouts by verifying identity, resetting the lockout flag, logging the event in Splunk, and notifying the user."
  tags:
    - identity
    - security
    - account-management
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: account-lockout
      port: 8080
      tools:
        - name: remediate-account-lockout
          description: "Given a locked Apple ID, verify identity, reset lockout, log the event, and notify the account holder."
          inputParameters:
            - name: apple_id
              in: body
              type: string
              description: "The locked Apple ID email."
            - name: support_ticket_id
              in: body
              type: string
              description: "The associated support ticket ID."
          steps:
            - name: verify-identity
              type: call
              call: "identity.verify-user"
              with:
                apple_id: "{{apple_id}}"
            - name: reset-lockout
              type: call
              call: "identity.reset-account-lockout"
              with:
                apple_id: "{{apple_id}}"
                verification_token: "{{verify-identity.verification_token}}"
            - name: log-event
              type: call
              call: "splunk.log-event"
              with:
                index: "security-events"
                event: "account_lockout_remediation"
                apple_id: "{{apple_id}}"
                ticket_id: "{{support_ticket_id}}"
            - name: notify-user
              type: call
              call: "ses.send-email"
              with:
                to: "{{apple_id}}"
                subject: "Your Apple ID Account Has Been Unlocked"
                body: "Your account lockout has been resolved. If you did not request this, please contact Apple Support immediately. Ref: {{support_ticket_id}}."
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://idmsa.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.identity_service_token"
      resources:
        - name: verification
          path: "/users/{{apple_id}}/verify"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: verify-user
              method: POST
        - name: lockout
          path: "/users/{{apple_id}}/lockout/reset"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: reset-account-lockout
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.apple.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/collector/event"
          operations:
            - name: log-event
              method: POST
    - type: http
      namespace: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Manages progressive feature rollout for Apple Intelligence by checking feature flags, enabling for target audience segments, monitoring error rates, and reporting.

naftiko: "0.5"
info:
  label: "Apple Intelligence Feature Rollout"
  description: "Manages progressive feature rollout for Apple Intelligence by checking feature flags, enabling for target audience segments, monitoring error rates, and reporting."
  tags:
    - ai
    - feature-management
    - monitoring
    - apple-intelligence
capability:
  exposes:
    - type: mcp
      namespace: feature-rollout
      port: 8080
      tools:
        - name: rollout-intelligence-feature
          description: "Progressively roll out an Apple Intelligence feature: check flags, enable for segment, monitor errors, and report status."
          inputParameters:
            - name: feature_key
              in: body
              type: string
              description: "The feature flag key."
            - name: target_segment
              in: body
              type: string
              description: "The target audience segment, e.g. beta_users, us_ios18."
            - name: rollout_percent
              in: body
              type: number
              description: "The rollout percentage, e.g. 10, 25, 50."
          steps:
            - name: check-flag-status
              type: call
              call: "feature-flags.get-flag"
              with:
                feature_key: "{{feature_key}}"
            - name: enable-for-segment
              type: call
              call: "feature-flags.update-flag"
              with:
                feature_key: "{{feature_key}}"
                segment: "{{target_segment}}"
                rollout_percent: "{{rollout_percent}}"
            - name: monitor-errors
              type: call
              call: "datadog.query-metrics"
              with:
                query: "sum:apple_intelligence.errors{feature:{{feature_key}}}.rollup(sum, 3600)"
                time_range: "last_1h"
            - name: report-status
              type: call
              call: "slack.post-message"
              with:
                channel: "#apple-intelligence"
                text: "Feature {{feature_key}} rolled out to {{rollout_percent}}% of {{target_segment}}. Previous state: {{check-flag-status.current_percent}}%. Error rate: {{monitor-errors.error_count}} errors/hr."
  consumes:
    - type: http
      namespace: feature-flags
      baseUri: "https://feature-flags.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.feature_flags_token"
      resources:
        - name: flags
          path: "/flags/{{feature_key}}"
          inputParameters:
            - name: feature_key
              in: path
          operations:
            - name: get-flag
              method: GET
            - name: update-flag
              method: PUT
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Geocodes an address string using the Apple MapKit JS API, returning latitude, longitude, and formatted address.

naftiko: "0.5"
info:
  label: "Apple Maps Geocode Lookup"
  description: "Geocodes an address string using the Apple MapKit JS API, returning latitude, longitude, and formatted address."
  tags:
    - maps
    - geolocation
    - apple-maps
capability:
  exposes:
    - type: mcp
      namespace: apple-maps
      port: 8080
      tools:
        - name: geocode-address
          description: "Geocode a street address using Apple Maps. Returns latitude, longitude, and structured address components."
          inputParameters:
            - name: address
              in: body
              type: string
              description: "The street address to geocode."
          call: "mapkit.geocode"
          with:
            q: "{{address}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.results[0].coordinate.latitude"
            - name: longitude
              type: number
              mapping: "$.results[0].coordinate.longitude"
            - name: formatted_address
              type: string
              mapping: "$.results[0].formattedAddress"
  consumes:
    - type: http
      namespace: mapkit
      baseUri: "https://maps-api.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.mapkit_token"
      resources:
        - name: geocode
          path: "/geocode?q={{q}}"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: geocode
              method: GET

Validates Apple Maps point-of-interest data by cross-referencing with external sources, scoring quality, and flagging discrepancies for the maps data team.

naftiko: "0.5"
info:
  label: "Apple Maps POI Data Quality Check"
  description: "Validates Apple Maps point-of-interest data by cross-referencing with external sources, scoring quality, and flagging discrepancies for the maps data team."
  tags:
    - maps
    - data-quality
    - analytics
    - operations
capability:
  exposes:
    - type: mcp
      namespace: maps-data-quality
      port: 8080
      tools:
        - name: check-poi-quality
          description: "Given a POI ID, cross-reference with external data, compute quality score, and flag discrepancies for review."
          inputParameters:
            - name: poi_id
              in: body
              type: string
              description: "The Apple Maps POI identifier."
          steps:
            - name: get-poi-data
              type: call
              call: "maps-internal.get-poi"
              with:
                poi_id: "{{poi_id}}"
            - name: cross-reference
              type: call
              call: "external-data.verify-business"
              with:
                name: "{{get-poi-data.name}}"
                address: "{{get-poi-data.address}}"
                phone: "{{get-poi-data.phone}}"
            - name: compute-quality-score
              type: call
              call: "data-quality.score-poi"
              with:
                apple_data: "{{get-poi-data}}"
                external_data: "{{cross-reference}}"
            - name: flag-if-needed
              type: call
              call: "jira.create-issue"
              with:
                project: "MAPS"
                summary: "POI quality issue: {{get-poi-data.name}} ({{poi_id}})"
                description: "Quality score: {{compute-quality-score.score}}. Discrepancies: {{compute-quality-score.discrepancies}}"
                issue_type: "Task"
  consumes:
    - type: http
      namespace: maps-internal
      baseUri: "https://maps-data.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.maps_data_token"
      resources:
        - name: pois
          path: "/pois/{{poi_id}}"
          inputParameters:
            - name: poi_id
              in: path
          operations:
            - name: get-poi
              method: GET
    - type: http
      namespace: external-data
      baseUri: "https://external-data-verify.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.external_data_token"
      resources:
        - name: businesses
          path: "/verify"
          operations:
            - name: verify-business
              method: POST
    - type: http
      namespace: data-quality
      baseUri: "https://data-quality.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_quality_token"
      resources:
        - name: scoring
          path: "/pois/score"
          operations:
            - name: score-poi
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Calculates estimated travel time and distance between two locations using the Apple Maps API, returning route ETA and step-by-step directions.

naftiko: "0.5"
info:
  label: "Apple Maps Route ETA Lookup"
  description: "Calculates estimated travel time and distance between two locations using the Apple Maps API, returning route ETA and step-by-step directions."
  tags:
    - apple-maps
    - routing
    - geolocation
capability:
  exposes:
    - type: mcp
      namespace: apple-maps-route
      port: 8080
      tools:
        - name: get-route-eta
          description: "Get estimated travel time and distance between an origin and destination using Apple Maps."
          inputParameters:
            - name: origin
              in: body
              type: string
              description: "Origin coordinates as latitude,longitude."
            - name: destination
              in: body
              type: string
              description: "Destination coordinates as latitude,longitude."
            - name: transport_type
              in: body
              type: string
              description: "Transport type: Automobile, Walking, or Transit."
          call: "applemaps.get-directions"
          with:
            origin: "{{origin}}"
            destination: "{{destination}}"
            transport_type: "{{transport_type}}"
          outputParameters:
            - name: eta_minutes
              type: number
              mapping: "$.routes[0].expectedTravelTimeMinutes"
            - name: distance_km
              type: number
              mapping: "$.routes[0].distanceMeters"
  consumes:
    - type: http
      namespace: applemaps
      baseUri: "https://maps-api.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.apple_maps_token"
      resources:
        - name: directions
          path: "/directions?origin={{origin}}&destination={{destination}}&transportType={{transport_type}}"
          inputParameters:
            - name: origin
              in: query
            - name: destination
              in: query
            - name: transport_type
              in: query
          operations:
            - name: get-directions
              method: GET

Ingests new music content by validating metadata, uploading assets to S3, registering tracks in the catalog, and notifying the editorial team.

naftiko: "0.5"
info:
  label: "Apple Music Content Ingestion Pipeline"
  description: "Ingests new music content by validating metadata, uploading assets to S3, registering tracks in the catalog, and notifying the editorial team."
  tags:
    - media
    - apple-music
    - content-ingestion
    - s3
capability:
  exposes:
    - type: mcp
      namespace: music-ingestion
      port: 8080
      tools:
        - name: ingest-album
          description: "Ingest a new album: validate metadata, upload assets, register in catalog, and notify editorial team."
          inputParameters:
            - name: album_upc
              in: body
              type: string
              description: "The album UPC barcode."
            - name: label_id
              in: body
              type: string
              description: "The record label identifier."
          steps:
            - name: validate-metadata
              type: call
              call: "music-metadata.validate-album"
              with:
                album_upc: "{{album_upc}}"
                label_id: "{{label_id}}"
            - name: upload-assets
              type: call
              call: "s3.put-object"
              with:
                bucket: "apple-music-assets"
                key: "albums/{{album_upc}}/master"
                metadata_ref: "{{validate-metadata.asset_manifest}}"
            - name: register-catalog
              type: call
              call: "music-catalog.register-album"
              with:
                album_upc: "{{album_upc}}"
                asset_url: "{{upload-assets.object_url}}"
                metadata: "{{validate-metadata.metadata}}"
            - name: notify-editorial
              type: call
              call: "slack.post-message"
              with:
                channel: "#music-editorial"
                text: "New album ingested: {{validate-metadata.album_title}} (UPC: {{album_upc}}). Catalog ID: {{register-catalog.catalog_id}}."
  consumes:
    - type: http
      namespace: music-metadata
      baseUri: "https://music-metadata.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.music_metadata_token"
      resources:
        - name: albums
          path: "/albums/{{album_upc}}/validate"
          inputParameters:
            - name: album_upc
              in: path
          operations:
            - name: validate-album
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://s3.us-west-2.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{bucket}}/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: music-catalog
      baseUri: "https://music-catalog.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.music_catalog_token"
      resources:
        - name: albums
          path: "/albums"
          operations:
            - name: register-album
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves playlist details from Apple Music by playlist ID, including name, track count, curator, and description.

naftiko: "0.5"
info:
  label: "Apple Music Playlist Lookup"
  description: "Retrieves playlist details from Apple Music by playlist ID, including name, track count, curator, and description."
  tags:
    - media
    - apple-music
    - content
capability:
  exposes:
    - type: mcp
      namespace: apple-music
      port: 8080
      tools:
        - name: get-playlist
          description: "Look up an Apple Music playlist by ID. Returns playlist name, description, curator name, and track count."
          inputParameters:
            - name: playlist_id
              in: body
              type: string
              description: "The Apple Music playlist identifier."
          call: "musickit.get-playlist"
          with:
            playlist_id: "{{playlist_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data[0].attributes.name"
            - name: track_count
              type: number
              mapping: "$.data[0].attributes.trackCount"
            - name: curator
              type: string
              mapping: "$.data[0].attributes.curatorName"
  consumes:
    - type: http
      namespace: musickit
      baseUri: "https://api.music.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.musickit_token"
      resources:
        - name: playlists
          path: "/catalog/us/playlists/{{playlist_id}}"
          inputParameters:
            - name: playlist_id
              in: path
          operations:
            - name: get-playlist
              method: GET

Retrieves article performance analytics for an Apple News publisher channel, including impressions, unique viewers, and shares.

naftiko: "0.5"
info:
  label: "Apple News Publisher Analytics"
  description: "Retrieves article performance analytics for an Apple News publisher channel, including impressions, unique viewers, and shares."
  tags:
    - media
    - apple-news
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: apple-news
      port: 8080
      tools:
        - name: get-article-analytics
          description: "Get Apple News article performance metrics by article ID. Returns impressions, unique viewers, and share count."
          inputParameters:
            - name: article_id
              in: body
              type: string
              description: "The Apple News article identifier."
          call: "news-api.get-analytics"
          with:
            article_id: "{{article_id}}"
          outputParameters:
            - name: impressions
              type: number
              mapping: "$.analytics.impressions"
            - name: unique_viewers
              type: number
              mapping: "$.analytics.uniqueViewers"
            - name: shares
              type: number
              mapping: "$.analytics.shareCount"
  consumes:
    - type: http
      namespace: news-api
      baseUri: "https://news-api.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.apple_news_api_token"
      resources:
        - name: analytics
          path: "/articles/{{article_id}}/analytics"
          inputParameters:
            - name: article_id
              in: path
          operations:
            - name: get-analytics
              method: GET

Searches for prior art related to a patent application by querying patent databases, analyzing relevance with AI, and generating a prior art report for the legal team.

naftiko: "0.5"
info:
  label: "Apple Patent Prior Art Search"
  description: "Searches for prior art related to a patent application by querying patent databases, analyzing relevance with AI, and generating a prior art report for the legal team."
  tags:
    - legal
    - intellectual-property
    - ai
    - research
capability:
  exposes:
    - type: mcp
      namespace: patent-search
      port: 8080
      tools:
        - name: search-prior-art
          description: "Search for prior art: query patent databases, analyze relevance with AI, and generate a report for the legal team."
          inputParameters:
            - name: patent_title
              in: body
              type: string
              description: "The patent application title."
            - name: abstract
              in: body
              type: string
              description: "The patent application abstract."
            - name: classification_code
              in: body
              type: string
              description: "The IPC classification code."
          steps:
            - name: search-patents
              type: call
              call: "patent-db.search"
              with:
                query: "{{patent_title}}"
                classification: "{{classification_code}}"
            - name: analyze-relevance
              type: call
              call: "openai.analyze-text"
              with:
                text: "Application abstract: {{abstract}}\n\nPotential prior art results: {{search-patents.results}}"
                instruction: "Analyze each prior art result for relevance to the application. Score 0-100 for overlap. Return JSON with ranked results and analysis."
            - name: generate-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "LEGAL"
                title: "Prior Art Report: {{patent_title}}"
                body: "{{analyze-relevance.report}}. Total results: {{search-patents.total_count}}. High-relevance matches: {{analyze-relevance.high_relevance_count}}."
            - name: notify-legal
              type: call
              call: "slack.post-message"
              with:
                channel: "#ip-legal"
                text: "Prior art search complete for '{{patent_title}}'. {{analyze-relevance.high_relevance_count}} high-relevance matches found. Report: {{generate-report.url}}"
  consumes:
    - type: http
      namespace: patent-db
      baseUri: "https://patent-search.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.patent_db_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://apple-eng.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Detects potentially fraudulent Apple Pay transactions by scoring with an ML model, blocking suspicious merchants, logging to Splunk, and alerting the fraud team.

naftiko: "0.5"
info:
  label: "Apple Pay Fraud Detection Workflow"
  description: "Detects potentially fraudulent Apple Pay transactions by scoring with an ML model, blocking suspicious merchants, logging to Splunk, and alerting the fraud team."
  tags:
    - payments
    - fraud-detection
    - security
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: fraud-detection
      port: 8080
      tools:
        - name: evaluate-transaction-fraud
          description: "Given a transaction ID, score for fraud risk, block if suspicious, log the event, and alert the fraud operations team."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "The Apple Pay transaction ID to evaluate."
          steps:
            - name: get-transaction
              type: call
              call: "applepay.get-transaction"
              with:
                transaction_id: "{{transaction_id}}"
            - name: score-fraud-risk
              type: call
              call: "fraud-ml.score-transaction"
              with:
                amount: "{{get-transaction.amount}}"
                merchant_id: "{{get-transaction.merchant_id}}"
                country: "{{get-transaction.country}}"
                device_id: "{{get-transaction.device_id}}"
            - name: log-to-splunk
              type: call
              call: "splunk.log-event"
              with:
                index: "fraud-events"
                event: "fraud_score"
                transaction_id: "{{transaction_id}}"
                score: "{{score-fraud-risk.risk_score}}"
            - name: alert-fraud-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#fraud-ops"
                text: "Fraud evaluation for txn {{transaction_id}}: Risk score={{score-fraud-risk.risk_score}}, Decision={{score-fraud-risk.decision}}. Merchant: {{get-transaction.merchant_name}}."
  consumes:
    - type: http
      namespace: applepay
      baseUri: "https://apple-pay-gateway.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.apple_pay_api_token"
      resources:
        - name: transactions
          path: "/transactions/{{transaction_id}}"
          inputParameters:
            - name: transaction_id
              in: path
          operations:
            - name: get-transaction
              method: GET
    - type: http
      namespace: fraud-ml
      baseUri: "https://fraud-ml.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fraud_ml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score-transaction
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.apple.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/collector/event"
          operations:
            - name: log-event
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Onboards a new merchant to Apple Pay by validating their certificate, provisioning a payment session, registering in the merchant portal, and sending confirmation.

naftiko: "0.5"
info:
  label: "Apple Pay Merchant Onboarding"
  description: "Onboards a new merchant to Apple Pay by validating their certificate, provisioning a payment session, registering in the merchant portal, and sending confirmation."
  tags:
    - payments
    - apple-pay
    - merchant
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: merchant-onboarding
      port: 8080
      tools:
        - name: onboard-merchant
          description: "Onboard a new Apple Pay merchant: validate certificate, provision payment session, register merchant, and confirm via email."
          inputParameters:
            - name: merchant_id
              in: body
              type: string
              description: "The merchant identifier to onboard."
            - name: domain
              in: body
              type: string
              description: "The merchant web domain for domain verification."
            - name: contact_email
              in: body
              type: string
              description: "The merchant contact email address."
          steps:
            - name: validate-certificate
              type: call
              call: "applepay.validate-merchant-cert"
              with:
                merchant_id: "{{merchant_id}}"
                domain: "{{domain}}"
            - name: provision-session
              type: call
              call: "applepay.create-payment-session"
              with:
                merchant_id: "{{merchant_id}}"
                validation_url: "{{validate-certificate.validation_url}}"
            - name: register-merchant
              type: call
              call: "merchant-portal.register"
              with:
                merchant_id: "{{merchant_id}}"
                session_token: "{{provision-session.session_token}}"
                domain: "{{domain}}"
            - name: send-confirmation
              type: call
              call: "ses.send-email"
              with:
                to: "{{contact_email}}"
                subject: "Apple Pay Merchant Onboarding Complete"
                body: "Merchant {{merchant_id}} has been successfully onboarded. Portal ID: {{register-merchant.portal_id}}."
  consumes:
    - type: http
      namespace: applepay
      baseUri: "https://apple-pay-gateway.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.apple_pay_api_token"
      resources:
        - name: validation
          path: "/merchants/{{merchant_id}}/validate"
          inputParameters:
            - name: merchant_id
              in: path
          operations:
            - name: validate-merchant-cert
              method: POST
        - name: sessions
          path: "/payment-sessions"
          operations:
            - name: create-payment-session
              method: POST
    - type: http
      namespace: merchant-portal
      baseUri: "https://merchant-portal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.merchant_portal_token"
      resources:
        - name: registration
          path: "/merchants"
          operations:
            - name: register
              method: POST
    - type: http
      namespace: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Retrieves details of an Apple Pay transaction by its transaction ID, including merchant, amount, status, and timestamp.

naftiko: "0.5"
info:
  label: "Apple Pay Transaction Lookup"
  description: "Retrieves details of an Apple Pay transaction by its transaction ID, including merchant, amount, status, and timestamp."
  tags:
    - payments
    - apple-pay
    - fintech
capability:
  exposes:
    - type: mcp
      namespace: apple-pay
      port: 8080
      tools:
        - name: get-transaction
          description: "Look up an Apple Pay transaction by ID. Returns merchant name, amount, currency, status, and timestamp."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "The Apple Pay transaction identifier."
          call: "applepay.get-transaction"
          with:
            transaction_id: "{{transaction_id}}"
          outputParameters:
            - name: merchant_name
              type: string
              mapping: "$.merchantName"
            - name: amount
              type: number
              mapping: "$.amount"
            - name: status
              type: string
              mapping: "$.transactionStatus"
  consumes:
    - type: http
      namespace: applepay
      baseUri: "https://apple-pay-gateway.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.apple_pay_api_token"
      resources:
        - name: transactions
          path: "/transactions/{{transaction_id}}"
          inputParameters:
            - name: transaction_id
              in: path
          operations:
            - name: get-transaction
              method: GET

Generates a podcast performance digest by pulling analytics from Apple Podcasts Connect, summarizing with AI, and distributing to the content team via Slack.

naftiko: "0.5"
info:
  label: "Apple Podcast Analytics Digest"
  description: "Generates a podcast performance digest by pulling analytics from Apple Podcasts Connect, summarizing with AI, and distributing to the content team via Slack."
  tags:
    - media
    - apple-podcasts
    - analytics
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: podcast-analytics
      port: 8080
      tools:
        - name: generate-podcast-digest
          description: "Generate a podcast analytics digest: fetch metrics, summarize with AI, and distribute to content team."
          inputParameters:
            - name: show_id
              in: body
              type: string
              description: "The Apple Podcasts show identifier."
            - name: period
              in: body
              type: string
              description: "The reporting period, e.g. last_7d, last_30d."
          steps:
            - name: fetch-analytics
              type: call
              call: "podcasts-connect.get-analytics"
              with:
                show_id: "{{show_id}}"
                period: "{{period}}"
            - name: summarize-performance
              type: call
              call: "openai.analyze-text"
              with:
                text: "Downloads: {{fetch-analytics.total_downloads}}, Listeners: {{fetch-analytics.unique_listeners}}, Avg completion: {{fetch-analytics.avg_completion_rate}}%, Top episode: {{fetch-analytics.top_episode}}"
                instruction: "Summarize podcast performance. Highlight trends, top content, and growth recommendations."
            - name: post-to-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#podcast-content"
                text: "Podcast digest for {{show_id}} ({{period}}):\n{{summarize-performance.summary}}"
  consumes:
    - type: http
      namespace: podcasts-connect
      baseUri: "https://api.podcastsconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.podcasts_connect_token"
      resources:
        - name: analytics
          path: "/shows/{{show_id}}/analytics?period={{period}}"
          inputParameters:
            - name: show_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-analytics
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the delivery status of an Apple Push Notification by its notification UUID, returning delivery state and timestamp.

naftiko: "0.5"
info:
  label: "Apple Push Notification Delivery Status"
  description: "Checks the delivery status of an Apple Push Notification by its notification UUID, returning delivery state and timestamp."
  tags:
    - notifications
    - apns
    - mobile
capability:
  exposes:
    - type: mcp
      namespace: apns-status
      port: 8080
      tools:
        - name: get-notification-status
          description: "Check the delivery status of an APNs push notification by UUID. Returns delivery state, device token prefix, and timestamp."
          inputParameters:
            - name: notification_id
              in: body
              type: string
              description: "The APNs notification UUID."
          call: "apns.get-delivery-status"
          with:
            notification_id: "{{notification_id}}"
          outputParameters:
            - name: delivery_state
              type: string
              mapping: "$.deliveryStatus"
            - name: timestamp
              type: string
              mapping: "$.deliveredAt"
  consumes:
    - type: http
      namespace: apns
      baseUri: "https://api.push.apple.com/v3"
      authentication:
        type: bearer
        token: "$secrets.apns_auth_token"
      resources:
        - name: notifications
          path: "/notifications/{{notification_id}}/status"
          inputParameters:
            - name: notification_id
              in: path
          operations:
            - name: get-delivery-status
              method: GET

Monitors renewable energy generation across Apple facilities by querying solar and wind output, comparing against consumption, and reporting sustainability metrics.

naftiko: "0.5"
info:
  label: "Apple Renewable Energy Monitoring"
  description: "Monitors renewable energy generation across Apple facilities by querying solar and wind output, comparing against consumption, and reporting sustainability metrics."
  tags:
    - sustainability
    - energy
    - monitoring
    - operations
capability:
  exposes:
    - type: mcp
      namespace: renewable-energy
      port: 8080
      tools:
        - name: monitor-energy-output
          description: "Monitor renewable energy: query generation data, compare against consumption, calculate sustainability metrics, and report."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The Apple facility identifier."
            - name: date
              in: body
              type: string
              description: "The monitoring date in YYYY-MM-DD format."
          steps:
            - name: get-generation-data
              type: call
              call: "energy-api.get-generation"
              with:
                facility_id: "{{facility_id}}"
                date: "{{date}}"
            - name: get-consumption-data
              type: call
              call: "energy-api.get-consumption"
              with:
                facility_id: "{{facility_id}}"
                date: "{{date}}"
            - name: calculate-metrics
              type: call
              call: "sustainability-api.calculate-metrics"
              with:
                generation_kwh: "{{get-generation-data.total_kwh}}"
                consumption_kwh: "{{get-consumption-data.total_kwh}}"
                facility_id: "{{facility_id}}"
            - name: post-report
              type: call
              call: "slack.post-message"
              with:
                channel: "#sustainability"
                text: "Energy report for {{facility_id}} on {{date}}: Generated={{get-generation-data.total_kwh}}kWh, Consumed={{get-consumption-data.total_kwh}}kWh, Renewable ratio={{calculate-metrics.renewable_percent}}%."
  consumes:
    - type: http
      namespace: energy-api
      baseUri: "https://energy-monitoring.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.energy_api_token"
      resources:
        - name: generation
          path: "/facilities/{{facility_id}}/generation?date={{date}}"
          inputParameters:
            - name: facility_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-generation
              method: GET
        - name: consumption
          path: "/facilities/{{facility_id}}/consumption?date={{date}}"
          inputParameters:
            - name: facility_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-consumption
              method: GET
    - type: http
      namespace: sustainability-api
      baseUri: "https://sustainability.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sustainability_api_token"
      resources:
        - name: metrics
          path: "/metrics/calculate"
          operations:
            - name: calculate-metrics
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves details of an Apple Retail Store by store number, including address, phone, hours, and Genius Bar availability.

naftiko: "0.5"
info:
  label: "Apple Retail Store Info Lookup"
  description: "Retrieves details of an Apple Retail Store by store number, including address, phone, hours, and Genius Bar availability."
  tags:
    - retail
    - operations
    - store-management
capability:
  exposes:
    - type: mcp
      namespace: apple-retail
      port: 8080
      tools:
        - name: get-store-info
          description: "Look up an Apple Retail Store by store number. Returns address, phone, operating hours, and Genius Bar status."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The Apple Retail Store number, e.g. R001."
          call: "retail-api.get-store"
          with:
            store_number: "{{store_number}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.store.name"
            - name: address
              type: string
              mapping: "$.store.address.formattedAddress"
            - name: genius_bar_available
              type: boolean
              mapping: "$.store.geniusBarAvailable"
  consumes:
    - type: http
      namespace: retail-api
      baseUri: "https://retail-internal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.retail_api_token"
      resources:
        - name: stores
          path: "/stores/{{store_number}}"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: get-store
              method: GET

Optimizes Apple Search Ads campaigns by pulling performance data, analyzing with AI, adjusting bids, and reporting results to the marketing team.

naftiko: "0.5"
info:
  label: "Apple Search Ads Campaign Optimizer"
  description: "Optimizes Apple Search Ads campaigns by pulling performance data, analyzing with AI, adjusting bids, and reporting results to the marketing team."
  tags:
    - marketing
    - apple-search-ads
    - optimization
    - advertising
capability:
  exposes:
    - type: mcp
      namespace: search-ads-optimizer
      port: 8080
      tools:
        - name: optimize-campaign
          description: "Optimize an Apple Search Ads campaign: fetch metrics, analyze performance, adjust bids, and report to marketing."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Apple Search Ads campaign identifier."
          steps:
            - name: fetch-campaign-data
              type: call
              call: "searchads.get-campaign-report"
              with:
                campaign_id: "{{campaign_id}}"
            - name: analyze-performance
              type: call
              call: "openai.analyze-text"
              with:
                text: "Campaign {{campaign_id}}: CPA=${{fetch-campaign-data.avg_cpa}}, CTR={{fetch-campaign-data.ctr}}%, Conversions={{fetch-campaign-data.conversions}}, Spend=${{fetch-campaign-data.total_spend}}"
                instruction: "Analyze this Apple Search Ads campaign. Recommend bid adjustments and keyword changes. Return JSON with recommendations."
            - name: apply-bid-adjustments
              type: call
              call: "searchads.update-campaign-bids"
              with:
                campaign_id: "{{campaign_id}}"
                recommendations: "{{analyze-performance.recommendations}}"
            - name: report-results
              type: call
              call: "slack.post-message"
              with:
                channel: "#search-ads-marketing"
                text: "Campaign {{campaign_id}} optimized. CPA: ${{fetch-campaign-data.avg_cpa}}. Bid changes applied: {{apply-bid-adjustments.changes_count}}. AI insights: {{analyze-performance.summary}}."
  consumes:
    - type: http
      namespace: searchads
      baseUri: "https://api.searchads.apple.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.search_ads_token"
      resources:
        - name: reports
          path: "/campaigns/{{campaign_id}}/reports"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-report
              method: POST
        - name: bids
          path: "/campaigns/{{campaign_id}}/bids"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign-bids
              method: PUT
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves technical specifications for an Apple Silicon chip by model identifier, including core counts, transistor count, and process node.

naftiko: "0.5"
info:
  label: "Apple Silicon Chip Spec Lookup"
  description: "Retrieves technical specifications for an Apple Silicon chip by model identifier, including core counts, transistor count, and process node."
  tags:
    - hardware
    - silicon-design
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: silicon-specs
      port: 8080
      tools:
        - name: get-chip-spec
          description: "Look up Apple Silicon chip specifications by model ID. Returns CPU/GPU core counts, transistor count, and fabrication process node."
          inputParameters:
            - name: chip_model
              in: body
              type: string
              description: "The chip model identifier, e.g. M3-Pro."
          call: "engineering-db.get-chip"
          with:
            chip_model: "{{chip_model}}"
          outputParameters:
            - name: cpu_cores
              type: number
              mapping: "$.chip.cpuCoreCount"
            - name: gpu_cores
              type: number
              mapping: "$.chip.gpuCoreCount"
            - name: process_node_nm
              type: number
              mapping: "$.chip.processNodeNm"
  consumes:
    - type: http
      namespace: engineering-db
      baseUri: "https://engineering-data.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.engineering_db_token"
      resources:
        - name: chips
          path: "/silicon/chips/{{chip_model}}"
          inputParameters:
            - name: chip_model
              in: path
          operations:
            - name: get-chip
              method: GET

Runs thermal validation tests on Apple Silicon chips by triggering test bench execution, collecting sensor data, analyzing results, and filing deviations.

naftiko: "0.5"
info:
  label: "Apple Silicon Thermal Test Pipeline"
  description: "Runs thermal validation tests on Apple Silicon chips by triggering test bench execution, collecting sensor data, analyzing results, and filing deviations."
  tags:
    - silicon-design
    - hardware
    - testing
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: thermal-testing
      port: 8080
      tools:
        - name: run-thermal-validation
          description: "Run thermal validation on a chip: trigger tests, collect sensor data, analyze results, and file deviations if found."
          inputParameters:
            - name: chip_model
              in: body
              type: string
              description: "The chip model under test, e.g. M4-Pro."
            - name: test_profile
              in: body
              type: string
              description: "The thermal test profile, e.g. sustained_load, burst, idle."
          steps:
            - name: trigger-test
              type: call
              call: "test-bench.start-thermal-test"
              with:
                chip_model: "{{chip_model}}"
                profile: "{{test_profile}}"
            - name: collect-sensor-data
              type: call
              call: "test-bench.get-sensor-readings"
              with:
                test_run_id: "{{trigger-test.test_run_id}}"
            - name: analyze-results
              type: call
              call: "thermal-analysis.evaluate"
              with:
                sensor_data: "{{collect-sensor-data.readings}}"
                chip_model: "{{chip_model}}"
                profile: "{{test_profile}}"
            - name: file-deviation
              type: call
              call: "jira.create-issue"
              with:
                project: "SILICON"
                summary: "Thermal deviation: {{chip_model}} under {{test_profile}}"
                description: "Max temp: {{analyze-results.max_temp_c}}C. Threshold: {{analyze-results.threshold_c}}C. Deviation: {{analyze-results.deviation_c}}C."
                issue_type: "Bug"
  consumes:
    - type: http
      namespace: test-bench
      baseUri: "https://test-bench.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.test_bench_token"
      resources:
        - name: thermal-tests
          path: "/thermal/tests"
          operations:
            - name: start-thermal-test
              method: POST
        - name: sensors
          path: "/tests/{{test_run_id}}/sensors"
          inputParameters:
            - name: test_run_id
              in: path
          operations:
            - name: get-sensor-readings
              method: GET
    - type: http
      namespace: thermal-analysis
      baseUri: "https://thermal-analysis.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.thermal_analysis_token"
      resources:
        - name: evaluation
          path: "/evaluate"
          operations:
            - name: evaluate
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Rebalances retail inventory by querying store stock levels, identifying surplus and deficit locations, generating transfer orders in SAP, and notifying logistics.

naftiko: "0.5"
info:
  label: "Apple Store Inventory Rebalancing"
  description: "Rebalances retail inventory by querying store stock levels, identifying surplus and deficit locations, generating transfer orders in SAP, and notifying logistics."
  tags:
    - retail
    - supply-chain
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: inventory-rebalance
      port: 8080
      tools:
        - name: rebalance-product-inventory
          description: "Given a product SKU, check stock levels across stores, compute transfer recommendations, create SAP transfer orders, and notify logistics."
          inputParameters:
            - name: product_sku
              in: body
              type: string
              description: "The product SKU to rebalance."
            - name: region
              in: body
              type: string
              description: "The retail region code, e.g. US-WEST, EMEA."
          steps:
            - name: get-stock-levels
              type: call
              call: "retail-api.get-regional-stock"
              with:
                product_sku: "{{product_sku}}"
                region: "{{region}}"
            - name: compute-transfers
              type: call
              call: "inventory-optimizer.compute-transfers"
              with:
                stock_data: "{{get-stock-levels.stores}}"
                product_sku: "{{product_sku}}"
            - name: create-sap-orders
              type: call
              call: "sap.create-transfer-order"
              with:
                transfers: "{{compute-transfers.transfer_plan}}"
                material_number: "{{product_sku}}"
            - name: notify-logistics
              type: call
              call: "slack.post-message"
              with:
                channel: "#retail-logistics"
                text: "Inventory rebalance initiated for {{product_sku}} in {{region}}. {{compute-transfers.transfer_count}} transfers created. SAP order: {{create-sap-orders.order_id}}."
  consumes:
    - type: http
      namespace: retail-api
      baseUri: "https://retail-internal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.retail_api_token"
      resources:
        - name: stock
          path: "/inventory/{{product_sku}}/stock?region={{region}}"
          inputParameters:
            - name: product_sku
              in: path
            - name: region
              in: query
          operations:
            - name: get-regional-stock
              method: GET
    - type: http
      namespace: inventory-optimizer
      baseUri: "https://inventory-optimizer.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.inventory_optimizer_token"
      resources:
        - name: transfers
          path: "/optimize/transfers"
          operations:
            - name: compute-transfers
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.apple.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfer-orders
          path: "/transfer-orders"
          operations:
            - name: create-transfer-order
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes Apple Support cases by analyzing the issue with AI, classifying severity and product area, assigning to the right team in ServiceNow, and notifying the team lead.

naftiko: "0.5"
info:
  label: "Apple Support Case Routing AI"
  description: "Routes Apple Support cases by analyzing the issue with AI, classifying severity and product area, assigning to the right team in ServiceNow, and notifying the team lead."
  tags:
    - customer-service
    - ai
    - servicenow
    - support
capability:
  exposes:
    - type: mcp
      namespace: case-routing
      port: 8080
      tools:
        - name: route-support-case
          description: "Route a support case: analyze with AI, classify product/severity, assign in ServiceNow, and notify team lead."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The support case identifier."
            - name: issue_text
              in: body
              type: string
              description: "The customer issue description."
          steps:
            - name: classify-issue
              type: call
              call: "openai.analyze-text"
              with:
                text: "{{issue_text}}"
                instruction: "Classify this Apple Support case. Return JSON with product_area (iPhone, Mac, iPad, Services, etc.), severity (P1-P4), and suggested_team."
            - name: update-case
              type: call
              call: "servicenow.update-incident"
              with:
                sys_id: "{{case_id}}"
                category: "{{classify-issue.product_area}}"
                priority: "{{classify-issue.severity}}"
                assignment_group: "{{classify-issue.suggested_team}}"
            - name: notify-team-lead
              type: call
              call: "slack.post-message"
              with:
                channel: "#support-escalations"
                text: "Case {{case_id}} routed to {{classify-issue.suggested_team}} ({{classify-issue.severity}}). Product: {{classify-issue.product_area}}."
  consumes:
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://apple.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Searches the Apple TV+ content catalog by keyword, returning matching titles with genre, rating, and release year.

naftiko: "0.5"
info:
  label: "Apple TV+ Content Catalog Search"
  description: "Searches the Apple TV+ content catalog by keyword, returning matching titles with genre, rating, and release year."
  tags:
    - media
    - apple-tv
    - content
capability:
  exposes:
    - type: mcp
      namespace: apple-tv-plus
      port: 8080
      tools:
        - name: search-catalog
          description: "Search Apple TV+ content catalog by keyword. Returns matching show/movie titles, genres, and ratings."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search keyword or phrase."
          call: "tvservices.search-content"
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.data.results"
            - name: result_count
              type: number
              mapping: "$.data.totalCount"
  consumes:
    - type: http
      namespace: tvservices
      baseUri: "https://tv.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.tv_services_token"
      resources:
        - name: search
          path: "/search?term={{query}}&type=shows,movies"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-content
              method: GET

Manages content localization by extracting subtitles, translating via AI, uploading to the content delivery network, and notifying the localization team.

naftiko: "0.5"
info:
  label: "Apple TV+ Content Localization Workflow"
  description: "Manages content localization by extracting subtitles, translating via AI, uploading to the content delivery network, and notifying the localization team."
  tags:
    - media
    - apple-tv
    - localization
    - content-delivery
capability:
  exposes:
    - type: mcp
      namespace: tv-localization
      port: 8080
      tools:
        - name: localize-content
          description: "Localize Apple TV+ content: extract subtitles, translate to target language, upload to CDN, and notify localization team."
          inputParameters:
            - name: content_id
              in: body
              type: string
              description: "The Apple TV+ content identifier."
            - name: target_language
              in: body
              type: string
              description: "The target language code, e.g. es, fr, ja."
          steps:
            - name: extract-subtitles
              type: call
              call: "content-pipeline.extract-subtitles"
              with:
                content_id: "{{content_id}}"
            - name: translate-subtitles
              type: call
              call: "openai.translate-text"
              with:
                text: "{{extract-subtitles.subtitle_text}}"
                target_language: "{{target_language}}"
            - name: upload-to-cdn
              type: call
              call: "cdn-api.upload-asset"
              with:
                content_id: "{{content_id}}"
                asset_type: "subtitles"
                language: "{{target_language}}"
                data: "{{translate-subtitles.translated_text}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#localization"
                text: "Localized subtitles for {{content_id}} in {{target_language}} uploaded to CDN. Asset URL: {{upload-to-cdn.asset_url}}."
  consumes:
    - type: http
      namespace: content-pipeline
      baseUri: "https://content-pipeline.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.content_pipeline_token"
      resources:
        - name: subtitles
          path: "/content/{{content_id}}/subtitles"
          inputParameters:
            - name: content_id
              in: path
          operations:
            - name: extract-subtitles
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: translate-text
              method: POST
    - type: http
      namespace: cdn-api
      baseUri: "https://cdn-management.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cdn_api_token"
      resources:
        - name: assets
          path: "/assets"
          operations:
            - name: upload-asset
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the status of an Apple Wallet pass by pass type and serial number, returning validity and last update.

naftiko: "0.5"
info:
  label: "Apple Wallet Pass Status Check"
  description: "Checks the status of an Apple Wallet pass by pass type and serial number, returning validity and last update."
  tags:
    - digital-wallets
    - apple-wallet
    - mobile
capability:
  exposes:
    - type: mcp
      namespace: apple-wallet
      port: 8080
      tools:
        - name: get-pass-status
          description: "Check Apple Wallet pass validity by pass type ID and serial number. Returns pass status, last updated date, and voided flag."
          inputParameters:
            - name: pass_type_id
              in: body
              type: string
              description: "The pass type identifier."
            - name: serial_number
              in: body
              type: string
              description: "The pass serial number."
          call: "wallet-api.get-pass"
          with:
            pass_type_id: "{{pass_type_id}}"
            serial_number: "{{serial_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.pass.status"
            - name: last_updated
              type: string
              mapping: "$.pass.lastUpdated"
            - name: is_voided
              type: boolean
              mapping: "$.pass.voided"
  consumes:
    - type: http
      namespace: wallet-api
      baseUri: "https://wallet-api.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.wallet_api_token"
      resources:
        - name: passes
          path: "/passes/{{pass_type_id}}/{{serial_number}}"
          inputParameters:
            - name: pass_type_id
              in: path
            - name: serial_number
              in: path
          operations:
            - name: get-pass
              method: GET

Creates a ServiceNow change request for infrastructure changes, routes it to CAB, and notifies the requestor via Slack.

naftiko: "0.5"
info:
  label: "Change Management Approval Workflow"
  description: "Creates a ServiceNow change request for infrastructure changes, routes it to CAB, and notifies the requestor via Slack."
  tags:
    - itsm
    - change-management
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Given change details, create a ServiceNow change request and notify the requestor via Slack. Use for infrastructure and application changes requiring CAB approval."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the change."
            - name: change_type
              in: body
              type: string
              description: "Change type: normal, standard, or emergency."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, high, or critical."
            - name: requestor_slack_id
              in: body
              type: string
              description: "The Slack user ID of the change requestor."
          steps:
            - name: create-cr
              type: call
              call: "servicenow-chg.create-change"
              with:
                short_description: "{{short_description}}"
                type: "{{change_type}}"
                risk: "{{risk_level}}"
                assignment_group: "CAB"
            - name: notify-requestor
              type: call
              call: "slack-chg.post-message"
              with:
                channel: "{{requestor_slack_id}}"
                text: "Change request submitted: {{create-cr.number}}. Type: {{change_type}}. Risk: {{risk_level}}. Pending CAB review."
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://apple.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: slack-chg
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an AWS cost anomaly is detected, annotates the event in Datadog, creates a Jira FinOps issue, and posts an alert to the cloud finance Slack channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Responder"
  description: "When an AWS cost anomaly is detected, annotates the event in Datadog, creates a Jira FinOps issue, and posts an alert to the cloud finance Slack channel."
  tags:
    - finops
    - cloud
    - aws
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an AWS cost anomaly ID, affected service, and estimated overage, create a Datadog event, open a Jira FinOps issue, and notify the cloud finance Slack channel."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "The AWS Cost Anomaly Detection anomaly ID."
            - name: aws_service
              in: body
              type: string
              description: "The AWS service generating the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated dollar overage detected."
            - name: business_unit
              in: body
              type: string
              description: "The Apple business unit owning the AWS account."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog-finops.create-event"
              with:
                title: "AWS Cost Anomaly: {{aws_service}}"
                text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}} — BU: {{business_unit}}"
                alert_type: "warning"
            - name: create-finops-issue
              type: call
              call: "jira-finops.create-issue"
              with:
                project_key: "FINOPS"
                issuetype: "Task"
                summary: "AWS Cost Anomaly: {{aws_service}} — ${{estimated_overage_usd}} overage"
                description: "Anomaly {{anomaly_id}} on {{aws_service}} for {{business_unit}}. Datadog event: {{annotate-datadog.id}}."
            - name: alert-slack
              type: call
              call: "slack-finops.post-message"
              with:
                channel: "#cloud-finance-alerts"
                text: "AWS Cost Anomaly: {{aws_service}} | Overage: ${{estimated_overage_usd}} | BU: {{business_unit}} | Jira: {{create-finops-issue.key}}"
  consumes:
    - type: http
      namespace: datadog-finops
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira-finops
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-finops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When CrowdStrike detects a high-severity endpoint threat, creates a ServiceNow security incident, isolates the endpoint, and alerts the SOC team via Slack.

naftiko: "0.5"
info:
  label: "CrowdStrike Security Alert Triage"
  description: "When CrowdStrike detects a high-severity endpoint threat, creates a ServiceNow security incident, isolates the endpoint, and alerts the SOC team via Slack."
  tags:
    - security
    - crowdstrike
    - servicenow
    - incident-response
    - slack
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-endpoint-detection
          description: "Given a CrowdStrike detection ID and host ID, create a ServiceNow security incident, isolate the host, and alert the Apple SOC Slack channel."
          inputParameters:
            - name: detection_id
              in: body
              type: string
              description: "The CrowdStrike detection ID."
            - name: host_id
              in: body
              type: string
              description: "The CrowdStrike host ID for the affected endpoint."
            - name: severity
              in: body
              type: string
              description: "Detection severity: critical, high, medium, or low."
          steps:
            - name: create-security-incident
              type: call
              call: "servicenow-soc.create-incident"
              with:
                short_description: "CrowdStrike detection {{detection_id}} — {{severity}} severity"
                category: "security"
                assignment_group: "SOC"
                urgency: "1"
            - name: isolate-host
              type: call
              call: "crowdstrike.contain-host"
              with:
                host_id: "{{host_id}}"
            - name: alert-soc-slack
              type: call
              call: "slack-soc.post-message"
              with:
                channel: "#soc-alerts"
                text: "SECURITY: CrowdStrike detection {{detection_id}} ({{severity}}) on host {{host_id}}. Host isolated. SNOW: {{create-security-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow-soc
      baseUri: "https://apple.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: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: host-containment
          path: "/devices/entities/devices-actions/v2"
          operations:
            - name: contain-host
              method: POST
    - type: http
      namespace: slack-soc
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current health status of Apple's monitored infrastructure hosts and active monitors from Datadog, returning a consolidated health snapshot.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Retrieves the current health status of Apple's monitored infrastructure hosts and active monitors from Datadog, returning a consolidated health snapshot."
  tags:
    - observability
    - datadog
    - monitoring
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-infrastructure-health
          description: "Query Datadog for the current status of all monitored hosts and active alerts for a given environment. Use for ops dashboards and incident triage."
          inputParameters:
            - name: environment
              in: body
              type: string
              description: "The deployment environment: production, staging, or development."
          call: "datadog-health.list-monitors"
          with:
            tags: "env:{{environment}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  consumes:
    - type: http
      namespace: datadog-health
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: list-monitors
              method: GET
              inputParameters:
                - name: tags
                  in: query

Automates Apple Developer certificate rotation by generating a new signing certificate, updating the provisioning profile, notifying the CI pipeline, and alerting the team.

naftiko: "0.5"
info:
  label: "Developer Certificate Rotation Workflow"
  description: "Automates Apple Developer certificate rotation by generating a new signing certificate, updating the provisioning profile, notifying the CI pipeline, and alerting the team."
  tags:
    - developer-tools
    - security
    - certificates
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: cert-rotation
      port: 8080
      tools:
        - name: rotate-signing-certificate
          description: "Rotate an Apple Developer signing certificate: generate new cert, update provisioning profile, trigger CI, and alert team."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Apple Developer team ID."
            - name: certificate_type
              in: body
              type: string
              description: "Certificate type, e.g. IOS_DISTRIBUTION, DEVELOPER_ID_APPLICATION."
          steps:
            - name: create-certificate
              type: call
              call: "appstoreconnect.create-certificate"
              with:
                team_id: "{{team_id}}"
                certificate_type: "{{certificate_type}}"
            - name: update-profile
              type: call
              call: "appstoreconnect.regenerate-profile"
              with:
                certificate_id: "{{create-certificate.certificate_id}}"
                team_id: "{{team_id}}"
            - name: trigger-ci-rebuild
              type: call
              call: "github.dispatch-workflow"
              with:
                repo: "apple/ios-app"
                workflow: "build-and-sign.yml"
                ref: "main"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#ios-dev-ops"
                text: "Certificate rotated for team {{team_id}}. New cert: {{create-certificate.certificate_id}}. Profile: {{update-profile.profile_id}}. CI triggered: {{trigger-ci-rebuild.run_id}}"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: certificates
          path: "/certificates"
          operations:
            - name: create-certificate
              method: POST
        - name: profiles
          path: "/profiles/{{certificate_id}}/regenerate"
          inputParameters:
            - name: certificate_id
              in: path
          operations:
            - name: regenerate-profile
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a termination is recorded in Workday, deactivates the Okta account, closes open ServiceNow tickets, and posts a summary to the HR Slack channel.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When a termination is recorded in Workday, deactivates the Okta account, closes open ServiceNow tickets, and posts a summary to the HR Slack channel."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a Workday employee ID and termination date, deactivate the Okta account, close open ServiceNow tickets, and notify the HR Slack channel."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The termination effective date in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta-off.deactivate-user"
              with:
                user_id: "{{get-worker.okta_user_id}}"
            - name: notify-hr
              type: call
              call: "slack-off.post-message"
              with:
                channel: "#hr-ops"
                text: "Offboarding complete for {{get-worker.full_name}} (effective: {{termination_date}}). Okta account deactivated."
  consumes:
    - type: http
      namespace: workday-off
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/apple/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-off
      baseUri: "https://apple.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: slack-off
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta application access, and sends a Slack welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta application access, and sends a Slack welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: fetch worker profile, open a ServiceNow ticket, provision Okta access, and send a Slack welcome."
          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 ISO 8601 format, e.g. 2026-04-01."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: provision-okta
              type: call
              call: "okta.create-user"
              with:
                first_name: "{{get-worker.first_name}}"
                last_name: "{{get-worker.last_name}}"
                email: "{{get-worker.work_email}}"
                department: "{{get-worker.department}}"
            - name: send-slack-welcome
              type: call
              call: "slack.post-message"
              with:
                channel: "#welcome-new-hires"
                text: "Welcome to Apple, {{get-worker.first_name}} {{get-worker.last_name}}! Starting {{start_date}}. IT ticket: {{create-onboarding-ticket.number}}."
  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: "/apple/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://apple.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: okta
      baseUri: "https://apple.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team in Slack.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team in Slack."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure event, create a Datadog deployment marker, open a Jira bug, and alert the engineering Slack channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in org/repo format, e.g. apple/webkit."
            - name: workflow_name
              in: body
              type: string
              description: "The GitHub Actions workflow name that failed."
            - name: branch_name
              in: body
              type: string
              description: "The branch name where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the workflow."
            - name: run_url
              in: body
              type: string
              description: "URL to the failed GitHub Actions run."
          steps:
            - name: create-dd-marker
              type: call
              call: "datadog.create-event"
              with:
                title: "Pipeline failure: {{repo_name}}"
                text: "Workflow {{workflow_name}} failed on {{branch_name}} at {{commit_sha}}"
                alert_type: "error"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch_name}} — {{workflow_name}}"
                description: "Pipeline failure on {{branch_name}}. Commit: {{commit_sha}}. Run: {{run_url}}. Datadog event: {{create-dd-marker.id}}."
            - name: alert-slack
              type: call
              call: "slack-cicd.post-message"
              with:
                channel: "#engineering-alerts"
                text: "Pipeline Failure: {{repo_name}} | Branch: {{branch_name}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-cicd
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Runs a compliance check on a GitHub repository to verify required branch protection rules, secret scanning, and CODEOWNERS files are configured correctly.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Check"
  description: "Runs a compliance check on a GitHub repository to verify required branch protection rules, secret scanning, and CODEOWNERS files are configured correctly."
  tags:
    - devops
    - compliance
    - github
    - security
capability:
  exposes:
    - type: mcp
      namespace: repo-compliance
      port: 8080
      tools:
        - name: check-repository-compliance
          description: "Given a GitHub repository name, verify branch protection rules, secret scanning enablement, and CODEOWNERS presence. Returns a compliance report."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in org/repo format, e.g. apple/swift."
          steps:
            - name: get-branch-protection
              type: call
              call: "github-comp.get-branch-protection"
              with:
                repo: "{{repo_name}}"
                branch: "main"
            - name: get-secret-scanning
              type: call
              call: "github-comp.get-secret-scanning"
              with:
                repo: "{{repo_name}}"
  consumes:
    - type: http
      namespace: github-comp
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/{{branch}}/protection"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch-protection
              method: GET
        - name: secret-scanning
          path: "/repos/{{repo}}/secret-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-secret-scanning
              method: GET

When GitHub Advanced Security finds a critical code scanning alert in an Apple repository, creates a Jira security issue and alerts the AppSec Slack channel.

naftiko: "0.5"
info:
  label: "GitHub Security Scan to Jira"
  description: "When GitHub Advanced Security finds a critical code scanning alert in an Apple repository, creates a Jira security issue and alerts the AppSec Slack channel."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: appsec
      port: 8080
      tools:
        - name: handle-code-scanning-alert
          description: "Given a GitHub code scanning alert ID and repository, create a Jira security issue for remediation and notify the AppSec Slack channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository in org/repo format."
            - name: alert_number
              in: body
              type: integer
              description: "The GitHub code scanning alert number."
            - name: alert_severity
              in: body
              type: string
              description: "Alert severity: critical, high, medium, or low."
            - name: rule_description
              in: body
              type: string
              description: "The code scanning rule description."
          steps:
            - name: get-alert
              type: call
              call: "github.get-code-scanning-alert"
              with:
                repo: "{{repo_name}}"
                alert_number: "{{alert_number}}"
            - name: create-security-issue
              type: call
              call: "jira-appsec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Security Vulnerability"
                summary: "[{{alert_severity}}] {{rule_description}} in {{repo_name}}"
                description: "GitHub alert #{{alert_number}} in {{repo_name}}. Rule: {{rule_description}}. File: {{get-alert.file_path}}."
            - name: alert-appsec
              type: call
              call: "slack-appsec.post-message"
              with:
                channel: "#appsec-alerts"
                text: "Code Scan Alert: {{repo_name}} | {{alert_severity}} | {{rule_description}} | Jira: {{create-security-issue.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-code-scanning-alert
              method: GET
    - type: http
      namespace: jira-appsec
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-appsec
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Validates hardware product launch readiness by checking supply chain status, retail inventory staging, marketing asset completion, and generating a go/no-go report.

naftiko: "0.5"
info:
  label: "Hardware Product Launch Readiness"
  description: "Validates hardware product launch readiness by checking supply chain status, retail inventory staging, marketing asset completion, and generating a go/no-go report."
  tags:
    - hardware
    - product-launch
    - supply-chain
    - retail
capability:
  exposes:
    - type: mcp
      namespace: launch-readiness
      port: 8080
      tools:
        - name: check-launch-readiness
          description: "Validate hardware product launch readiness: check supply, retail staging, marketing assets, and generate go/no-go summary."
          inputParameters:
            - name: product_sku
              in: body
              type: string
              description: "The product SKU for the launch."
            - name: launch_date
              in: body
              type: string
              description: "The planned launch date in ISO 8601 format."
          steps:
            - name: check-supply
              type: call
              call: "supply-chain-api.get-readiness"
              with:
                product_sku: "{{product_sku}}"
                target_date: "{{launch_date}}"
            - name: check-retail-staging
              type: call
              call: "retail-api.get-staging-status"
              with:
                product_sku: "{{product_sku}}"
            - name: check-marketing
              type: call
              call: "marketing-api.get-asset-status"
              with:
                product_sku: "{{product_sku}}"
            - name: post-readiness-report
              type: call
              call: "slack.post-message"
              with:
                channel: "#product-launches"
                text: "Launch readiness for {{product_sku}} on {{launch_date}}: Supply={{check-supply.status}}, Retail={{check-retail-staging.status}}, Marketing={{check-marketing.status}}."
  consumes:
    - type: http
      namespace: supply-chain-api
      baseUri: "https://supply-chain.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.supply_chain_token"
      resources:
        - name: readiness
          path: "/products/{{product_sku}}/readiness"
          inputParameters:
            - name: product_sku
              in: path
          operations:
            - name: get-readiness
              method: GET
    - type: http
      namespace: retail-api
      baseUri: "https://retail-internal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.retail_api_token"
      resources:
        - name: staging
          path: "/products/{{product_sku}}/staging"
          inputParameters:
            - name: product_sku
              in: path
          operations:
            - name: get-staging-status
              method: GET
    - type: http
      namespace: marketing-api
      baseUri: "https://marketing-internal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.marketing_api_token"
      resources:
        - name: assets
          path: "/products/{{product_sku}}/assets/status"
          inputParameters:
            - name: product_sku
              in: path
          operations:
            - name: get-asset-status
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Orchestrates iCloud data recovery by verifying user identity, initiating a recovery snapshot, creating a support ticket, and notifying the user via email.

naftiko: "0.5"
info:
  label: "iCloud Data Recovery Orchestrator"
  description: "Orchestrates iCloud data recovery by verifying user identity, initiating a recovery snapshot, creating a support ticket, and notifying the user via email."
  tags:
    - icloud
    - data-recovery
    - support
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: icloud-recovery
      port: 8080
      tools:
        - name: initiate-data-recovery
          description: "Given an Apple ID and recovery reason, verify identity, initiate a snapshot recovery, create a support case, and email the user."
          inputParameters:
            - name: apple_id
              in: body
              type: string
              description: "The Apple ID email for the recovery request."
            - name: recovery_reason
              in: body
              type: string
              description: "Brief description of why data recovery is needed."
          steps:
            - name: verify-identity
              type: call
              call: "identity.verify-user"
              with:
                apple_id: "{{apple_id}}"
            - name: create-snapshot
              type: call
              call: "icloud.create-recovery-snapshot"
              with:
                apple_id: "{{apple_id}}"
                verified_token: "{{verify-identity.verification_token}}"
            - name: create-support-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "iCloud data recovery: {{apple_id}}"
                description: "Reason: {{recovery_reason}}. Snapshot ID: {{create-snapshot.snapshot_id}}"
                category: "data_recovery"
            - name: email-user
              type: call
              call: "ses.send-email"
              with:
                to: "{{apple_id}}"
                subject: "Your iCloud Data Recovery Request"
                body: "Your recovery has been initiated. Support case: {{create-support-case.number}}. Snapshot ID: {{create-snapshot.snapshot_id}}."
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://idmsa.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.identity_service_token"
      resources:
        - name: verification
          path: "/users/{{apple_id}}/verify"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: verify-user
              method: POST
    - type: http
      namespace: icloud
      baseUri: "https://setup.icloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.icloud_admin_token"
      resources:
        - name: recovery
          path: "/recovery/snapshots"
          operations:
            - name: create-recovery-snapshot
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://apple.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: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Checks the operational status of iCloud Private Relay for a given region, returning relay health, latency, and any active incidents.

naftiko: "0.5"
info:
  label: "iCloud Private Relay Status Check"
  description: "Checks the operational status of iCloud Private Relay for a given region, returning relay health, latency, and any active incidents."
  tags:
    - privacy
    - security
    - icloud
capability:
  exposes:
    - type: mcp
      namespace: private-relay
      port: 8080
      tools:
        - name: get-relay-status
          description: "Check iCloud Private Relay operational status for a region. Returns health status, average latency, and active incident count."
          inputParameters:
            - name: region_code
              in: body
              type: string
              description: "ISO 3166-1 alpha-2 region code, e.g. US, GB, DE."
          call: "relay-ops.get-status"
          with:
            region_code: "{{region_code}}"
          outputParameters:
            - name: health_status
              type: string
              mapping: "$.region.healthStatus"
            - name: avg_latency_ms
              type: number
              mapping: "$.region.avgLatencyMs"
            - name: active_incidents
              type: number
              mapping: "$.region.activeIncidentCount"
  consumes:
    - type: http
      namespace: relay-ops
      baseUri: "https://relay-ops.icloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.relay_ops_token"
      resources:
        - name: status
          path: "/regions/{{region_code}}/status"
          inputParameters:
            - name: region_code
              in: path
          operations:
            - name: get-status
              method: GET

Retrieves the current iCloud storage usage and quota for a given Apple ID, returning total capacity, used space, and breakdown by service.

naftiko: "0.5"
info:
  label: "iCloud Storage Quota Lookup"
  description: "Retrieves the current iCloud storage usage and quota for a given Apple ID, returning total capacity, used space, and breakdown by service."
  tags:
    - cloud-services
    - icloud
    - storage
capability:
  exposes:
    - type: mcp
      namespace: icloud-storage
      port: 8080
      tools:
        - name: get-storage-quota
          description: "Look up iCloud storage usage for an Apple ID. Returns total quota, used space, and per-service breakdown."
          inputParameters:
            - name: apple_id
              in: body
              type: string
              description: "The Apple ID email address to look up storage for."
          call: "icloud.get-storage-quota"
          with:
            apple_id: "{{apple_id}}"
          outputParameters:
            - name: total_quota_gb
              type: number
              mapping: "$.totalQuotaInGB"
            - name: used_gb
              type: number
              mapping: "$.usedSpaceInGB"
            - name: plan_name
              type: string
              mapping: "$.planName"
  consumes:
    - type: http
      namespace: icloud
      baseUri: "https://setup.icloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.icloud_admin_token"
      resources:
        - name: storage
          path: "/storage/{{apple_id}}/quota"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: get-storage-quota
              method: GET

Resolves iCloud data sync conflicts by fetching conflicting records, applying merge strategy, updating the canonical record, and notifying the user.

naftiko: "0.5"
info:
  label: "iCloud Sync Conflict Resolution"
  description: "Resolves iCloud data sync conflicts by fetching conflicting records, applying merge strategy, updating the canonical record, and notifying the user."
  tags:
    - icloud
    - data-sync
    - conflict-resolution
    - operations
capability:
  exposes:
    - type: mcp
      namespace: sync-conflict
      port: 8080
      tools:
        - name: resolve-sync-conflict
          description: "Resolve an iCloud sync conflict: fetch conflicting records, apply merge strategy, update canonical record, and notify the user."
          inputParameters:
            - name: conflict_id
              in: body
              type: string
              description: "The sync conflict identifier."
            - name: apple_id
              in: body
              type: string
              description: "The Apple ID of the affected user."
          steps:
            - name: get-conflict-details
              type: call
              call: "cloudkit.get-conflict"
              with:
                conflict_id: "{{conflict_id}}"
            - name: apply-merge
              type: call
              call: "cloudkit.merge-records"
              with:
                conflict_id: "{{conflict_id}}"
                strategy: "latest-wins"
                records: "{{get-conflict-details.conflicting_records}}"
            - name: update-canonical
              type: call
              call: "cloudkit.update-record"
              with:
                record_id: "{{get-conflict-details.record_id}}"
                data: "{{apply-merge.merged_data}}"
            - name: notify-user
              type: call
              call: "apns.send-notification"
              with:
                apple_id: "{{apple_id}}"
                title: "Sync Conflict Resolved"
                body: "A data conflict in your iCloud account has been automatically resolved."
  consumes:
    - type: http
      namespace: cloudkit
      baseUri: "https://api.apple-cloudkit.com/database/1"
      authentication:
        type: bearer
        token: "$secrets.cloudkit_admin_token"
      resources:
        - name: conflicts
          path: "/conflicts/{{conflict_id}}"
          inputParameters:
            - name: conflict_id
              in: path
          operations:
            - name: get-conflict
              method: GET
        - name: merge
          path: "/conflicts/{{conflict_id}}/merge"
          inputParameters:
            - name: conflict_id
              in: path
          operations:
            - name: merge-records
              method: POST
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: update-record
              method: PUT
    - type: http
      namespace: apns
      baseUri: "https://api.push.apple.com/v3"
      authentication:
        type: bearer
        token: "$secrets.apns_auth_token"
      resources:
        - name: notifications
          path: "/notifications"
          operations:
            - name: send-notification
              method: POST

When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and recommended resolution steps, then updates the ticket with the analysis.

naftiko: "0.5"
info:
  label: "Intelligent Incident Triage with OpenAI"
  description: "When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and recommended resolution steps, then updates the ticket with the analysis."
  tags:
    - ai
    - itsm
    - servicenow
    - openai
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ai-triage
      port: 8080
      tools:
        - name: triage-incident-with-ai
          description: "Given a ServiceNow incident number, retrieve the incident, submit to OpenAI for root cause and resolution recommendations, and update the ServiceNow record with AI analysis."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-ai.get-incident"
              with:
                number: "{{incident_number}}"
            - name: analyze-incident
              type: call
              call: "openai-triage.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Analyze this IT incident and provide: 1) Probable root cause, 2) Recommended resolution steps, 3) Priority suggestion. Incident: {{get-incident.short_description}} — {{get-incident.description}}"
            - name: update-incident
              type: call
              call: "servicenow-ai.update-incident"
              with:
                number: "{{incident_number}}"
                work_notes: "AI Triage Analysis: {{analyze-incident.text}}"
  consumes:
    - type: http
      namespace: servicenow-ai
      baseUri: "https://apple.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
              inputParameters:
                - name: number
                  in: query
            - name: update-incident
              method: PATCH
    - type: http
      namespace: openai-triage
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST

Analyzes iOS crash reports by fetching crash logs from App Store Connect, symbolizing with DSYM, classifying with OpenAI, and filing a Jira ticket.

naftiko: "0.5"
info:
  label: "iOS Crash Report Analysis Pipeline"
  description: "Analyzes iOS crash reports by fetching crash logs from App Store Connect, symbolizing with DSYM, classifying with OpenAI, and filing a Jira ticket."
  tags:
    - developer-tools
    - crash-analysis
    - openai
    - jira
capability:
  exposes:
    - type: mcp
      namespace: crash-analysis
      port: 8080
      tools:
        - name: analyze-crash-report
          description: "Given an app ID and crash signature, fetch crash logs, symbolize, classify root cause with AI, and create a Jira ticket."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The App Store Connect app identifier."
            - name: crash_signature
              in: body
              type: string
              description: "The crash signature hash."
          steps:
            - name: fetch-crash-log
              type: call
              call: "appstoreconnect.get-crash-log"
              with:
                app_id: "{{app_id}}"
                signature: "{{crash_signature}}"
            - name: symbolize-crash
              type: call
              call: "symbolication.symbolize"
              with:
                crash_data: "{{fetch-crash-log.raw_crash}}"
                dsym_url: "{{fetch-crash-log.dsym_url}}"
            - name: classify-root-cause
              type: call
              call: "openai.analyze-text"
              with:
                text: "{{symbolize-crash.symbolicated_trace}}"
                instruction: "Analyze this iOS crash stack trace. Identify the root cause, affected component, and suggested fix. Return JSON."
            - name: create-bug-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "IOS"
                summary: "Crash: {{classify-root-cause.affected_component}} - {{classify-root-cause.root_cause}}"
                description: "Stack trace: {{symbolize-crash.symbolicated_trace}}\nSuggested fix: {{classify-root-cause.suggested_fix}}"
                issue_type: "Bug"
                priority: "High"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: crashes
          path: "/apps/{{app_id}}/diagnosticSignatures?filter[signature]={{signature}}"
          inputParameters:
            - name: app_id
              in: path
            - name: signature
              in: query
          operations:
            - name: get-crash-log
              method: GET
    - type: http
      namespace: symbolication
      baseUri: "https://symbolication.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.symbolication_token"
      resources:
        - name: symbolicate
          path: "/symbolicate"
          operations:
            - name: symbolize
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat
          path: "/chat/completions"
          operations:
            - name: analyze-text
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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

Manages iOS over-the-air update rollouts by checking device eligibility, staging firmware, initiating phased rollout, and monitoring adoption rates.

naftiko: "0.5"
info:
  label: "iOS OTA Update Rollout Manager"
  description: "Manages iOS over-the-air update rollouts by checking device eligibility, staging firmware, initiating phased rollout, and monitoring adoption rates."
  tags:
    - software-updates
    - ota
    - ios
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: ios-ota
      port: 8080
      tools:
        - name: manage-ota-rollout
          description: "Manage iOS OTA update rollout: check eligibility, stage firmware, initiate phased rollout, and monitor adoption."
          inputParameters:
            - name: ios_version
              in: body
              type: string
              description: "The iOS version to roll out, e.g. 19.2."
            - name: target_devices
              in: body
              type: string
              description: "The target device models, e.g. iPhone16,1."
            - name: rollout_percent
              in: body
              type: number
              description: "The initial rollout percentage."
          steps:
            - name: check-eligibility
              type: call
              call: "ota-service.check-device-eligibility"
              with:
                ios_version: "{{ios_version}}"
                device_model: "{{target_devices}}"
            - name: stage-firmware
              type: call
              call: "ota-service.stage-firmware"
              with:
                ios_version: "{{ios_version}}"
                eligible_count: "{{check-eligibility.eligible_count}}"
            - name: initiate-rollout
              type: call
              call: "ota-service.start-rollout"
              with:
                ios_version: "{{ios_version}}"
                rollout_percent: "{{rollout_percent}}"
                firmware_id: "{{stage-firmware.firmware_id}}"
            - name: report-status
              type: call
              call: "slack.post-message"
              with:
                channel: "#ios-updates"
                text: "iOS {{ios_version}} OTA rollout started at {{rollout_percent}}% for {{target_devices}}. Eligible devices: {{check-eligibility.eligible_count}}. Firmware: {{stage-firmware.firmware_id}}."
  consumes:
    - type: http
      namespace: ota-service
      baseUri: "https://ota-updates.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.ota_service_token"
      resources:
        - name: eligibility
          path: "/eligibility"
          operations:
            - name: check-device-eligibility
              method: POST
        - name: staging
          path: "/firmware/stage"
          operations:
            - name: stage-firmware
              method: POST
        - name: rollouts
          path: "/rollouts"
          operations:
            - name: start-rollout
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a critical Datadog alert fires, creates a ServiceNow incident, pages the on-call team in PagerDuty, and posts a Slack alert to the ops channel.

naftiko: "0.5"
info:
  label: "IT Incident Response Chain"
  description: "When a critical Datadog alert fires, creates a ServiceNow incident, pages the on-call team in PagerDuty, and posts a Slack alert to the ops channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert ID, affected service, and severity, create a ServiceNow incident, trigger a PagerDuty page, and notify the ops Slack channel."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert or monitor ID."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected service or application."
            - name: severity
              in: body
              type: string
              description: "Alert severity: critical, high, medium, or low."
            - name: alert_message
              in: body
              type: string
              description: "The alert message body from Datadog."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-ops.create-incident"
              with:
                short_description: "{{severity}} alert: {{service_name}} — {{alert_id}}"
                description: "{{alert_message}}"
                urgency: "1"
                impact: "1"
                assignment_group: "IT_Operations"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{severity}} alert on {{service_name}}"
                service_id: "$secrets.pagerduty_service_id"
                body: "{{alert_message}}"
            - name: alert-slack
              type: call
              call: "slack-ops.post-message"
              with:
                channel: "#it-ops-alerts"
                text: "INCIDENT: {{severity}} on {{service_name}} | Datadog: {{alert_id}} | SNOW: {{create-incident.number}} | PD: {{page-oncall.incident_number}}"
  consumes:
    - type: http
      namespace: servicenow-ops
      baseUri: "https://apple.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack-ops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates a daily sprint status digest from Jira, summarizing completed, in-progress, and blocked issues, then posts it to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Digest Report"
  description: "Generates a daily sprint status digest from Jira, summarizing completed, in-progress, and blocked issues, then posts it to the engineering Slack channel."
  tags:
    - devops
    - jira
    - reporting
    - sprint
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: digest-sprint-status
          description: "Given a Jira project key and sprint name, fetch all sprint issues and post a summary digest to the engineering Slack channel. Use for daily stand-up prep and sprint reviews."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. SW or HW."
            - name: sprint_name
              in: body
              type: string
              description: "The Jira sprint name to summarize."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to post the digest to, e.g. #engineering-standup."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-sprint.search-issues"
              with:
                jql: "project = {{project_key}} AND sprint = '{{sprint_name}}'"
            - name: post-digest
              type: call
              call: "slack-sprint.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Sprint Digest — {{project_key}} / {{sprint_name}}: Total: {{get-sprint-issues.total}} | Done: {{get-sprint-issues.done_count}} | In Progress: {{get-sprint-issues.inprogress_count}} | Blocked: {{get-sprint-issues.blocked_count}}"
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/search"
          operations:
            - name: search-issues
              method: GET
              inputParameters:
                - name: jql
                  in: query
    - type: http
      namespace: slack-sprint
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager via Slack.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Signal"
  description: "When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager via Slack."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - slack
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: enrich-candidate-profile
          description: "Given a LinkedIn member URN and Workday job requisition ID, fetch the LinkedIn profile, create the candidate record in Workday, and notify the hiring manager via Slack."
          inputParameters:
            - name: linkedin_member_urn
              in: body
              type: string
              description: "The LinkedIn member URN for the candidate."
            - name: job_req_id
              in: body
              type: string
              description: "The Workday job requisition ID."
            - name: hiring_manager_slack_id
              in: body
              type: string
              description: "The Slack user ID of the hiring manager."
          steps:
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-profile"
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: create-candidate
              type: call
              call: "workday-recruit.create-candidate"
              with:
                job_req_id: "{{job_req_id}}"
                first_name: "{{get-linkedin-profile.firstName}}"
                last_name: "{{get-linkedin-profile.lastName}}"
                headline: "{{get-linkedin-profile.headline}}"
            - name: notify-hiring-manager
              type: call
              call: "slack-recruit.post-message"
              with:
                channel: "{{hiring_manager_slack_id}}"
                text: "New candidate: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} applied for req {{job_req_id}}. Title: {{get-linkedin-profile.headline}}. Workday: {{create-candidate.candidate_id}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: workday-recruit
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: candidates
          path: "/apple/jobRequisitions/{{job_req_id}}/candidates"
          inputParameters:
            - name: job_req_id
              in: path
          operations:
            - name: create-candidate
              method: POST
    - type: http
      namespace: slack-recruit
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks device compliance via Jamf Pro, restricts non-compliant devices in Okta, creates a ServiceNow remediation ticket, and notifies IT security.

naftiko: "0.5"
info:
  label: "MDM Device Compliance Enforcement"
  description: "Checks device compliance via Jamf Pro, restricts non-compliant devices in Okta, creates a ServiceNow remediation ticket, and notifies IT security."
  tags:
    - device-management
    - security
    - jamf
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: mdm-compliance
      port: 8080
      tools:
        - name: enforce-device-compliance
          description: "Check device compliance in Jamf, restrict access in Okta if non-compliant, open a remediation ticket, and alert IT security."
          inputParameters:
            - name: device_serial
              in: body
              type: string
              description: "The device serial number to check."
            - name: employee_email
              in: body
              type: string
              description: "The device owner email."
          steps:
            - name: check-compliance
              type: call
              call: "jamf.get-device-compliance"
              with:
                serial_number: "{{device_serial}}"
            - name: restrict-access
              type: call
              call: "okta.suspend-user-apps"
              with:
                email: "{{employee_email}}"
                reason: "Device {{device_serial}} non-compliant: {{check-compliance.violations}}"
            - name: create-remediation-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Non-compliant device: {{device_serial}}"
                description: "Owner: {{employee_email}}. Violations: {{check-compliance.violations}}. Okta access restricted."
                category: "security_compliance"
                urgency: "2"
            - name: alert-security
              type: call
              call: "slack.post-message"
              with:
                channel: "#it-security"
                text: "Non-compliant device {{device_serial}} ({{employee_email}}). Okta access restricted. Ticket: {{create-remediation-ticket.number}}"
  consumes:
    - type: http
      namespace: jamf
      baseUri: "https://apple.jamfcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jamf_api_token"
      resources:
        - name: devices
          path: "/computers-inventory?filter=hardware.serialNumber=={{serial_number}}"
          inputParameters:
            - name: serial_number
              in: query
          operations:
            - name: get-device-compliance
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://apple.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{email}}/lifecycle/suspend"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: suspend-user-apps
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://apple.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Deploys a Core ML model by pulling the artifact from S3, registering it in the model registry, triggering OTA delivery, and notifying the ML team.

naftiko: "0.5"
info:
  label: "ML Model Deployment Pipeline"
  description: "Deploys a Core ML model by pulling the artifact from S3, registering it in the model registry, triggering OTA delivery, and notifying the ML team."
  tags:
    - machine-learning
    - deployment
    - core-ml
    - s3
capability:
  exposes:
    - type: mcp
      namespace: ml-deploy
      port: 8080
      tools:
        - name: deploy-coreml-model
          description: "Deploy a Core ML model: fetch artifact from S3, register in model registry, trigger OTA, and notify ML team."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The Core ML model name."
            - name: model_version
              in: body
              type: string
              description: "The model version to deploy."
            - name: s3_artifact_path
              in: body
              type: string
              description: "The S3 path to the compiled model artifact."
          steps:
            - name: fetch-artifact
              type: call
              call: "s3.get-object"
              with:
                bucket: "apple-ml-models"
                key: "{{s3_artifact_path}}"
            - name: register-model
              type: call
              call: "model-registry.register"
              with:
                model_name: "{{model_name}}"
                version: "{{model_version}}"
                artifact_url: "{{fetch-artifact.object_url}}"
            - name: trigger-ota
              type: call
              call: "ota-service.push-model"
              with:
                model_id: "{{register-model.model_id}}"
                target_os: "iOS"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#ml-deployments"
                text: "Core ML model {{model_name}} v{{model_version}} deployed. Registry ID: {{register-model.model_id}}. OTA status: {{trigger-ota.delivery_status}}."
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.us-west-2.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/apple-ml-models/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-object
              method: GET
    - type: http
      namespace: model-registry
      baseUri: "https://ml-registry.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ml_registry_token"
      resources:
        - name: models
          path: "/models"
          operations:
            - name: register
              method: POST
    - type: http
      namespace: ota-service
      baseUri: "https://ota-ml.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ota_ml_token"
      resources:
        - name: deployments
          path: "/deployments"
          operations:
            - name: push-model
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a new employee joins Apple, provisions appropriate Okta application assignments based on their department and role as defined in Workday.

naftiko: "0.5"
info:
  label: "Okta User Access Provisioning"
  description: "When a new employee joins Apple, provisions appropriate Okta application assignments based on their department and role as defined in Workday."
  tags:
    - identity
    - security
    - okta
    - workday
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-provisioning
      port: 8080
      tools:
        - name: provision-okta-access
          description: "Given a Workday employee ID and Okta user ID, retrieve their department and role from Workday, then assign the appropriate Okta application groups."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the employee."
            - name: okta_user_id
              in: body
              type: string
              description: "The Okta user ID for the employee."
          steps:
            - name: get-worker-profile
              type: call
              call: "workday-okta.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: assign-app-groups
              type: call
              call: "okta-prov.assign-group"
              with:
                user_id: "{{okta_user_id}}"
                department: "{{get-worker-profile.department}}"
  consumes:
    - type: http
      namespace: workday-okta
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/apple/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-prov
      baseUri: "https://apple.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: assign-group
              method: PUT

When a PagerDuty incident goes unacknowledged past an SLA threshold, escalates the incident to senior on-call, creates a Jira post-mortem issue, and notifies the incident Slack channel.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Escalation"
  description: "When a PagerDuty incident goes unacknowledged past an SLA threshold, escalates the incident to senior on-call, creates a Jira post-mortem issue, and notifies the incident Slack channel."
  tags:
    - itsm
    - incident-response
    - pagerduty
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-unacknowledged-incident
          description: "Given a PagerDuty incident ID that is unacknowledged, escalate to the senior on-call policy, create a Jira post-mortem issue, and notify the incident Slack channel."
          inputParameters:
            - name: pd_incident_id
              in: body
              type: string
              description: "The PagerDuty incident ID to escalate."
            - name: service_name
              in: body
              type: string
              description: "The affected service name."
            - name: incident_summary
              in: body
              type: string
              description: "Brief description of the incident."
          steps:
            - name: escalate-pd
              type: call
              call: "pagerduty.escalate-incident"
              with:
                incident_id: "{{pd_incident_id}}"
                escalation_policy_id: "$secrets.pd_senior_escalation_policy"
            - name: create-postmortem
              type: call
              call: "jira-pm.create-issue"
              with:
                project_key: "PM"
                issuetype: "Post-mortem"
                summary: "Post-mortem: {{service_name}} — {{pd_incident_id}}"
                description: "{{incident_summary}} — PagerDuty incident escalated at {{escalate-pd.escalated_at}}."
            - name: notify-incident-channel
              type: call
              call: "slack-pd.post-message"
              with:
                channel: "#incidents"
                text: "Incident ESCALATED: {{service_name}} | PD: {{pd_incident_id}} | Post-mortem Jira: {{create-postmortem.key}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident-escalations
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: escalate-incident
              method: PUT
    - type: http
      namespace: jira-pm
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-pd
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Returns current headcount by department and cost center from Workday, for use in finance planning and headcount reporting.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Returns current headcount by department and cost center from Workday, for use in finance planning and headcount reporting."
  tags:
    - hr
    - finance
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns a list of active Apple employees grouped by department and cost center from Workday. Use for headcount planning, budget reviews, and workforce analytics."
          call: "workday-hc.headcount-report"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/apple/reports/headcount"
          operations:
            - name: headcount-report
              method: GET

Triggers a Power BI dataset refresh for a business report and posts a Slack notification with a report link when the refresh completes.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh and Distribution"
  description: "Triggers a Power BI dataset refresh for a business report and posts a Slack notification with a report link when the refresh completes."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - slack
capability:
  exposes:
    - type: mcp
      namespace: powerbi-ops
      port: 8080
      tools:
        - name: refresh-and-distribute-report
          description: "Given a Power BI workspace ID and dataset ID, trigger a refresh and notify a Slack channel with the report URL when complete."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to notify on completion."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-slack
              type: call
              call: "slack-pbi.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Power BI dataset {{dataset_id}} refresh triggered in workspace {{workspace_id}}. Refresh ID: {{trigger-refresh.refresh_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: slack-pbi
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Processes a GDPR/CCPA data subject request by collecting user data from iCloud and Apple ID services, packaging it, and notifying the user and legal team.

naftiko: "0.5"
info:
  label: "Privacy Data Request Fulfillment"
  description: "Processes a GDPR/CCPA data subject request by collecting user data from iCloud and Apple ID services, packaging it, and notifying the user and legal team."
  tags:
    - privacy
    - compliance
    - gdpr
    - legal
capability:
  exposes:
    - type: mcp
      namespace: privacy-dsr
      port: 8080
      tools:
        - name: fulfill-data-request
          description: "Given a data subject request ID and Apple ID, collect user data, generate export package, and notify user and legal."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The data subject request identifier."
            - name: apple_id
              in: body
              type: string
              description: "The Apple ID of the data subject."
          steps:
            - name: collect-icloud-data
              type: call
              call: "icloud.export-user-data"
              with:
                apple_id: "{{apple_id}}"
                request_id: "{{request_id}}"
            - name: collect-appleid-data
              type: call
              call: "identity.export-user-profile"
              with:
                apple_id: "{{apple_id}}"
            - name: create-export-package
              type: call
              call: "data-packaging.create-package"
              with:
                request_id: "{{request_id}}"
                icloud_data_ref: "{{collect-icloud-data.data_ref}}"
                profile_data_ref: "{{collect-appleid-data.data_ref}}"
            - name: notify-user
              type: call
              call: "ses.send-email"
              with:
                to: "{{apple_id}}"
                subject: "Your Data Request is Ready"
                body: "Your data export for request {{request_id}} is ready for download. Package ID: {{create-export-package.package_id}}."
  consumes:
    - type: http
      namespace: icloud
      baseUri: "https://setup.icloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.icloud_admin_token"
      resources:
        - name: exports
          path: "/users/{{apple_id}}/export"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: export-user-data
              method: POST
    - type: http
      namespace: identity
      baseUri: "https://idmsa.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.identity_service_token"
      resources:
        - name: profiles
          path: "/users/{{apple_id}}/profile/export"
          inputParameters:
            - name: apple_id
              in: path
          operations:
            - name: export-user-profile
              method: POST
    - type: http
      namespace: data-packaging
      baseUri: "https://privacy-data.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.privacy_data_token"
      resources:
        - name: packages
          path: "/packages"
          operations:
            - name: create-package
              method: POST
    - type: http
      namespace: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Coordinates a product recall by identifying affected serial numbers, notifying customers, creating a logistics plan, and reporting to regulatory teams.

naftiko: "0.5"
info:
  label: "Product Recall Coordination Workflow"
  description: "Coordinates a product recall by identifying affected serial numbers, notifying customers, creating a logistics plan, and reporting to regulatory teams."
  tags:
    - quality-assurance
    - supply-chain
    - compliance
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: product-recall
      port: 8080
      tools:
        - name: coordinate-recall
          description: "Coordinate a product recall: identify affected units, notify customers, create logistics plan, and report to regulatory."
          inputParameters:
            - name: product_sku
              in: body
              type: string
              description: "The recalled product SKU."
            - name: recall_reason
              in: body
              type: string
              description: "The reason for the recall."
            - name: serial_range_start
              in: body
              type: string
              description: "Start of the affected serial number range."
            - name: serial_range_end
              in: body
              type: string
              description: "End of the affected serial number range."
          steps:
            - name: identify-affected
              type: call
              call: "manufacturing-db.get-units-in-range"
              with:
                product_sku: "{{product_sku}}"
                serial_start: "{{serial_range_start}}"
                serial_end: "{{serial_range_end}}"
            - name: notify-customers
              type: call
              call: "notification-service.send-bulk-notification"
              with:
                customer_list: "{{identify-affected.customer_contacts}}"
                subject: "Important Safety Recall: {{product_sku}}"
                message: "Your device may be affected by a recall. Reason: {{recall_reason}}. Please visit apple.com/support/recall."
            - name: create-logistics-plan
              type: call
              call: "logistics-api.create-recall-plan"
              with:
                product_sku: "{{product_sku}}"
                unit_count: "{{identify-affected.affected_count}}"
            - name: report-to-regulatory
              type: call
              call: "compliance-api.submit-recall-report"
              with:
                product_sku: "{{product_sku}}"
                reason: "{{recall_reason}}"
                affected_units: "{{identify-affected.affected_count}}"
                logistics_plan_id: "{{create-logistics-plan.plan_id}}"
  consumes:
    - type: http
      namespace: manufacturing-db
      baseUri: "https://manufacturing-data.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.manufacturing_db_token"
      resources:
        - name: units
          path: "/products/{{product_sku}}/units"
          inputParameters:
            - name: product_sku
              in: path
          operations:
            - name: get-units-in-range
              method: POST
    - type: http
      namespace: notification-service
      baseUri: "https://notifications.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_service_token"
      resources:
        - name: bulk
          path: "/notifications/bulk"
          operations:
            - name: send-bulk-notification
              method: POST
    - type: http
      namespace: logistics-api
      baseUri: "https://logistics.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.logistics_token"
      resources:
        - name: recall-plans
          path: "/recall-plans"
          operations:
            - name: create-recall-plan
              method: POST
    - type: http
      namespace: compliance-api
      baseUri: "https://compliance-internal.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: recall-reports
          path: "/recall-reports"
          operations:
            - name: submit-recall-report
              method: POST

Optimizes Apple Retail store employee schedules by analyzing foot traffic predictions, current staffing, and generating optimized shift assignments in Workday.

naftiko: "0.5"
info:
  label: "Retail Employee Schedule Optimizer"
  description: "Optimizes Apple Retail store employee schedules by analyzing foot traffic predictions, current staffing, and generating optimized shift assignments in Workday."
  tags:
    - retail
    - workforce-management
    - workday
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: schedule-optimizer
      port: 8080
      tools:
        - name: optimize-store-schedule
          description: "Optimize retail employee schedules: analyze traffic predictions, review current staffing, generate shift assignments, and update Workday."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The Apple Retail Store number."
            - name: week_start
              in: body
              type: string
              description: "The week start date in ISO 8601 format."
          steps:
            - name: get-traffic-forecast
              type: call
              call: "retail-analytics.get-traffic-prediction"
              with:
                store_number: "{{store_number}}"
                week_start: "{{week_start}}"
            - name: get-current-staff
              type: call
              call: "workday.get-store-roster"
              with:
                store_number: "{{store_number}}"
            - name: generate-schedule
              type: call
              call: "schedule-engine.optimize"
              with:
                traffic_forecast: "{{get-traffic-forecast.hourly_predictions}}"
                staff_roster: "{{get-current-staff.employees}}"
                store_number: "{{store_number}}"
            - name: publish-schedule
              type: call
              call: "workday.publish-schedule"
              with:
                store_number: "{{store_number}}"
                schedule: "{{generate-schedule.optimized_shifts}}"
                week_start: "{{week_start}}"
  consumes:
    - type: http
      namespace: retail-analytics
      baseUri: "https://retail-analytics.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.retail_analytics_token"
      resources:
        - name: traffic
          path: "/stores/{{store_number}}/traffic/prediction"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: get-traffic-prediction
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: rosters
          path: "/apple/stores/{{store_number}}/roster"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: get-store-roster
              method: GET
        - name: schedules
          path: "/apple/stores/{{store_number}}/schedules"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: publish-schedule
              method: POST
    - type: http
      namespace: schedule-engine
      baseUri: "https://schedule-engine.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.schedule_engine_token"
      resources:
        - name: optimization
          path: "/optimize"
          operations:
            - name: optimize
              method: POST

Manages Genius Bar appointment scheduling by checking store availability, booking the slot, creating a service ticket, and sending a confirmation to the customer.

naftiko: "0.5"
info:
  label: "Retail Genius Bar Appointment Orchestrator"
  description: "Manages Genius Bar appointment scheduling by checking store availability, booking the slot, creating a service ticket, and sending a confirmation to the customer."
  tags:
    - retail
    - customer-service
    - scheduling
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: genius-bar
      port: 8080
      tools:
        - name: book-genius-appointment
          description: "Book a Genius Bar appointment: check store availability, reserve slot, create service ticket, and confirm with customer."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The Apple Retail Store number."
            - name: customer_email
              in: body
              type: string
              description: "The customer email address."
            - name: device_serial
              in: body
              type: string
              description: "The device serial number needing service."
            - name: issue_description
              in: body
              type: string
              description: "Brief description of the issue."
          steps:
            - name: check-availability
              type: call
              call: "retail-api.get-availability"
              with:
                store_number: "{{store_number}}"
            - name: book-slot
              type: call
              call: "retail-api.book-appointment"
              with:
                store_number: "{{store_number}}"
                slot_id: "{{check-availability.next_available_slot_id}}"
                customer_email: "{{customer_email}}"
            - name: create-service-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Genius Bar: {{issue_description}}"
                description: "Device: {{device_serial}}. Store: {{store_number}}. Appointment: {{book-slot.appointment_id}}"
                category: "hardware_support"
            - name: send-confirmation
              type: call
              call: "ses.send-email"
              with:
                to: "{{customer_email}}"
                subject: "Your Genius Bar Appointment Confirmation"
                body: "Appointment confirmed at store {{store_number}} on {{book-slot.appointment_time}}. Ref: {{book-slot.appointment_id}}."
  consumes:
    - type: http
      namespace: retail-api
      baseUri: "https://retail-internal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.retail_api_token"
      resources:
        - name: availability
          path: "/stores/{{store_number}}/genius-bar/availability"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: get-availability
              method: GET
        - name: appointments
          path: "/stores/{{store_number}}/genius-bar/appointments"
          inputParameters:
            - name: store_number
              in: path
          operations:
            - name: book-appointment
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://apple.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: ses
      baseUri: "https://email.us-west-2.amazonaws.com/v2"
      authentication:
        type: bearer
        token: "$secrets.aws_ses_token"
      resources:
        - name: emails
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

When a qualifying LinkedIn signal occurs, enriches the Salesforce contact and alerts the owning sales rep in Slack.

naftiko: "0.5"
info:
  label: "Sales Intelligence Enrichment from LinkedIn"
  description: "When a qualifying LinkedIn signal occurs, enriches the Salesforce contact and alerts the owning sales rep in Slack."
  tags:
    - sales
    - crm
    - salesforce
    - linkedin
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-lead-from-linkedin
          description: "Given a LinkedIn member URN and Salesforce contact ID, fetch the LinkedIn profile, update the Salesforce contact, and notify the owning sales rep via Slack."
          inputParameters:
            - name: linkedin_member_urn
              in: body
              type: string
              description: "The LinkedIn member URN for the contact."
            - name: salesforce_contact_id
              in: body
              type: string
              description: "The Salesforce contact record ID to enrich."
            - name: rep_slack_id
              in: body
              type: string
              description: "The Slack user ID of the owning sales rep."
          steps:
            - name: get-linkedin-profile
              type: call
              call: "linkedin.get-profile"
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: enrich-salesforce
              type: call
              call: "salesforce-si.update-contact"
              with:
                contact_id: "{{salesforce_contact_id}}"
                title: "{{get-linkedin-profile.headline}}"
                linkedin_profile: "https://www.linkedin.com/in/{{get-linkedin-profile.vanityName}}"
            - name: alert-rep
              type: call
              call: "slack-si.post-message"
              with:
                channel: "{{rep_slack_id}}"
                text: "Lead Enriched: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} | Title: {{get-linkedin-profile.headline}} | Salesforce updated."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: salesforce-si
      baseUri: "https://apple.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: update-contact
              method: PATCH
    - type: http
      namespace: slack-si
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates a weekly account health digest from Salesforce, summarizing open opportunities and support cases for strategic accounts, posted to the sales Slack channel.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Digest"
  description: "Generates a weekly account health digest from Salesforce, summarizing open opportunities and support cases for strategic accounts, posted to the sales Slack channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - slack
capability:
  exposes:
    - type: mcp
      namespace: account-health
      port: 8080
      tools:
        - name: digest-account-health
          description: "Given a Salesforce account ID and Slack channel, retrieve open opportunities and support cases, then post a health digest to the sales Slack channel."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to post the health digest to."
          steps:
            - name: get-account
              type: call
              call: "salesforce-health.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-opportunities
              type: call
              call: "salesforce-health.get-account-opportunities"
              with:
                account_id: "{{account_id}}"
            - name: post-digest
              type: call
              call: "slack-health.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Account Health: {{get-account.name}} | Open Opps: {{get-opportunities.total_count}} | Pipeline: ${{get-opportunities.total_amount}}"
  consumes:
    - type: http
      namespace: salesforce-health
      baseUri: "https://apple.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
        - name: account-opportunities
          path: "/sobjects/Account/{{account_id}}/Opportunities"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-opportunities
              method: GET
    - type: http
      namespace: slack-health
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current status, value, stage, and close date of a Salesforce opportunity by ID for sales pipeline reviews.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Status Lookup"
  description: "Retrieves the current status, value, stage, and close date of a Salesforce opportunity by ID for sales pipeline reviews."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns stage, amount, close date, and account name. Use for pipeline reviews or to surface deal context."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity record ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: number
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://apple.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

Retrieves a pending expense report from SAP Concur, validates it against Apple travel policy, and routes it for manager approval via ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves a pending expense report from SAP Concur, validates it against Apple travel policy, and routes it for manager approval via ServiceNow."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: expense-mgmt
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given a SAP Concur expense report ID and employee ID, retrieve the report details and create a ServiceNow approval task for the manager."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report identifier."
            - name: employee_id
              in: body
              type: string
              description: "The employee ID submitting the expense report."
          steps:
            - name: get-expense-report
              type: call
              call: "sap-concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: create-approval-task
              type: call
              call: "servicenow-exp.create-task"
              with:
                short_description: "Expense approval: {{employee_id}} — {{expense_report_id}}"
                description: "Amount: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Period: {{get-expense-report.period}}."
                assignment_group: "Finance_Expense"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow-exp
      baseUri: "https://apple.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Looks up an Apple SAP S/4HANA purchase order by number and returns header status, vendor details, and total value.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up an Apple SAP S/4HANA purchase order by number and returns header status, vendor details, and total value."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns status, vendor name, total value, and currency. Use for procurement status checks and AP invoice matching."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500098765."
          call: "sap-erp.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://apple-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

When a critical CVE is detected by Qualys, creates a Jira security ticket, triggers a Terraform patch deployment, and escalates via PagerDuty.

naftiko: "0.5"
info:
  label: "Security Vulnerability Response Chain"
  description: "When a critical CVE is detected by Qualys, creates a Jira security ticket, triggers a Terraform patch deployment, and escalates via PagerDuty."
  tags:
    - security
    - vulnerability-management
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: vuln-response
      port: 8080
      tools:
        - name: respond-to-vulnerability
          description: "Given a CVE ID, fetch vulnerability details, create a security Jira ticket, trigger patching, and escalate via PagerDuty."
          inputParameters:
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier, e.g. CVE-2026-12345."
            - name: affected_hosts
              in: body
              type: string
              description: "Comma-separated list of affected hostnames."
          steps:
            - name: get-vuln-details
              type: call
              call: "qualys.get-vulnerability"
              with:
                cve_id: "{{cve_id}}"
            - name: create-security-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Critical CVE: {{cve_id}} - {{get-vuln-details.title}}"
                description: "CVSS: {{get-vuln-details.cvss_score}}. Affected: {{affected_hosts}}. Remediation: {{get-vuln-details.remediation}}"
                issue_type: "Security Bug"
                priority: "Critical"
            - name: trigger-patch
              type: call
              call: "terraform.trigger-run"
              with:
                workspace: "security-patches"
                message: "Auto-patch for {{cve_id}}"
            - name: escalate-pagerduty
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Critical CVE {{cve_id}} detected"
                description: "CVSS: {{get-vuln-details.cvss_score}}. Jira: {{create-security-ticket.key}}. Terraform run: {{trigger-patch.run_id}}."
                severity: "critical"
                service_id: "security-ops"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.apple.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.qualys_user"
        password: "$secrets.qualys_password"
      resources:
        - name: vulnerabilities
          path: "/fo/knowledge_base/vuln/?action=list&cve_id={{cve_id}}"
          inputParameters:
            - name: cve_id
              in: query
          operations:
            - name: get-vulnerability
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://apple-eng.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: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: trigger-run
              method: POST
    - 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

Pulls wafer test results from the fab database, runs yield analysis in Snowflake, generates a report, and posts findings to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "Silicon Wafer Yield Analysis Pipeline"
  description: "Pulls wafer test results from the fab database, runs yield analysis in Snowflake, generates a report, and posts findings to the engineering Slack channel."
  tags:
    - silicon-design
    - manufacturing
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: wafer-yield
      port: 8080
      tools:
        - name: analyze-wafer-yield
          description: "Given a wafer lot ID, pull test data, run yield analysis, generate report, and share results with engineering."
          inputParameters:
            - name: lot_id
              in: body
              type: string
              description: "The wafer lot identifier."
            - name: fab_site
              in: body
              type: string
              description: "The fabrication site code, e.g. TSMC-F16."
          steps:
            - name: get-test-results
              type: call
              call: "fab-db.get-wafer-tests"
              with:
                lot_id: "{{lot_id}}"
                fab_site: "{{fab_site}}"
            - name: run-yield-analysis
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL silicon_analytics.analyze_yield('{{lot_id}}', '{{fab_site}}')"
                warehouse: "SILICON_WH"
            - name: generate-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "SILICON"
                title: "Yield Report: Lot {{lot_id}} - {{fab_site}}"
                body: "Yield: {{run-yield-analysis.yield_percent}}%. Defects: {{run-yield-analysis.defect_count}}. Good dies: {{run-yield-analysis.good_dies}}."
            - name: notify-engineering
              type: call
              call: "slack.post-message"
              with:
                channel: "#silicon-engineering"
                text: "Yield report for lot {{lot_id}} at {{fab_site}}: {{run-yield-analysis.yield_percent}}% yield. Report: {{generate-report.url}}"
  consumes:
    - type: http
      namespace: fab-db
      baseUri: "https://fab-data.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fab_db_token"
      resources:
        - name: wafer-tests
          path: "/lots/{{lot_id}}/tests?site={{fab_site}}"
          inputParameters:
            - name: lot_id
              in: path
            - name: fab_site
              in: query
          operations:
            - name: get-wafer-tests
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://apple-eng.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Siri intent resolution performance by querying Datadog metrics, comparing against SLOs, and alerting the Siri team if degraded.

naftiko: "0.5"
info:
  label: "Siri Intent Performance Monitoring"
  description: "Monitors Siri intent resolution performance by querying Datadog metrics, comparing against SLOs, and alerting the Siri team if degraded."
  tags:
    - ai
    - siri
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: siri-perf
      port: 8080
      tools:
        - name: check-intent-performance
          description: "Check Siri intent resolution performance metrics from Datadog, compare against SLOs, and alert if thresholds breached."
          inputParameters:
            - name: intent_domain
              in: body
              type: string
              description: "The Siri intent domain, e.g. com.apple.Siri.messaging."
            - name: time_range
              in: body
              type: string
              description: "Time range for metrics, e.g. last_1h, last_24h."
          steps:
            - name: query-metrics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:siri.intent.resolution_time{domain:{{intent_domain}}}.rollup(avg, 300)"
                time_range: "{{time_range}}"
            - name: get-slo-thresholds
              type: call
              call: "slo-registry.get-slo"
              with:
                service: "siri"
                metric: "intent_resolution_time"
            - name: evaluate-slo
              type: call
              call: "datadog.check-slo-status"
              with:
                slo_id: "{{get-slo-thresholds.slo_id}}"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#siri-engineering"
                text: "Siri intent perf for {{intent_domain}}: Avg resolution={{query-metrics.avg_value}}ms. SLO target={{get-slo-thresholds.target_ms}}ms. SLO status: {{evaluate-slo.status}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
        - name: slo
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: check-slo-status
              method: GET
    - type: http
      namespace: slo-registry
      baseUri: "https://slo-registry.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.slo_registry_token"
      resources:
        - name: slos
          path: "/slos"
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for failed or long-running data pipeline tasks in a given schema, returning a status report for data engineering triage.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Check"
  description: "Queries Snowflake for failed or long-running data pipeline tasks in a given schema, returning a status report for data engineering triage."
  tags:
    - data
    - analytics
    - snowflake
    - pipeline-monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: get-pipeline-task-failures
          description: "Query Snowflake task history for failed tasks in a given database and schema over the last N hours. Use to triage data engineering issues and SLA breaches."
          inputParameters:
            - name: database_name
              in: body
              type: string
              description: "The Snowflake database to query, e.g. APPLE_ANALYTICS."
            - name: schema_name
              in: body
              type: string
              description: "The Snowflake schema to query, e.g. ETL."
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours to look back in task history."
          call: "snowflake.query-task-history"
          with:
            database: "{{database_name}}"
            schema: "{{schema_name}}"
            hours: "{{lookback_hours}}"
          outputParameters:
            - name: failed_tasks
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://apple.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/{{schema}}/tasks/history"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
            - name: hours
              in: query
          operations:
            - name: query-task-history
              method: GET

When a Snowflake data quality check fails, creates a Jira data quality issue and notifies the data engineering team via Slack.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert"
  description: "When a Snowflake data quality check fails, creates a Jira data quality issue and notifies the data engineering team via Slack."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - data-quality
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: handle-data-quality-failure
          description: "Given a Snowflake table and failed data quality check name, open a Jira data quality issue and notify the data engineering Slack channel."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "The fully qualified Snowflake table name that failed the quality check."
            - name: check_name
              in: body
              type: string
              description: "The data quality check name that failed."
            - name: failure_detail
              in: body
              type: string
              description: "Description of what failed and relevant metrics."
          steps:
            - name: create-dq-issue
              type: call
              call: "jira-dq.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "[DQ Failure] {{table_name}} — {{check_name}}"
                description: "Data quality check {{check_name}} failed on {{table_name}}. Detail: {{failure_detail}}."
            - name: notify-data-team
              type: call
              call: "slack-dq.post-message"
              with:
                channel: "#data-engineering-alerts"
                text: "Data Quality Failure: {{table_name}} | Check: {{check_name}} | Jira: {{create-dq-issue.key}}"
  consumes:
    - type: http
      namespace: jira-dq
      baseUri: "https://apple.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-dq
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a new supplier is approved in SAP Ariba, creates a Salesforce vendor account, opens a ServiceNow setup task, and notifies the procurement team via Slack.

naftiko: "0.5"
info:
  label: "Supplier Onboarding Orchestration"
  description: "When a new supplier is approved in SAP Ariba, creates a Salesforce vendor account, opens a ServiceNow setup task, and notifies the procurement team via Slack."
  tags:
    - procurement
    - supply-chain
    - sap-ariba
    - salesforce
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given an Ariba supplier ID and supplier name, create a Salesforce vendor account, open a ServiceNow setup task, and notify the procurement team in Slack."
          inputParameters:
            - name: ariba_supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: supplier_name
              in: body
              type: string
              description: "The supplier company name."
            - name: category
              in: body
              type: string
              description: "The procurement category, e.g. IT Hardware, Logistics."
          steps:
            - name: create-sf-vendor
              type: call
              call: "salesforce-sup.create-account"
              with:
                name: "{{supplier_name}}"
                type: "Vendor"
                ariba_supplier_id: "{{ariba_supplier_id}}"
                category: "{{category}}"
            - name: create-setup-task
              type: call
              call: "servicenow-sup.create-task"
              with:
                short_description: "Supplier setup: {{supplier_name}}"
                description: "Ariba ID: {{ariba_supplier_id}}. Category: {{category}}. Salesforce Account: {{create-sf-vendor.account_id}}."
                assignment_group: "Procurement"
            - name: notify-procurement
              type: call
              call: "slack-sup.post-message"
              with:
                channel: "#procurement-ops"
                text: "New Supplier Onboarded: {{supplier_name}} | Category: {{category}} | Ariba: {{ariba_supplier_id}} | SNOW: {{create-setup-task.number}}"
  consumes:
    - type: http
      namespace: salesforce-sup
      baseUri: "https://apple.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: servicenow-sup
      baseUri: "https://apple.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: slack-sup
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors supplier inventory levels for a component, checks against forecast demand in SAP, and triggers a PagerDuty alert and Slack notification if shortage is detected.

naftiko: "0.5"
info:
  label: "Supply Chain Component Shortage Alert"
  description: "Monitors supplier inventory levels for a component, checks against forecast demand in SAP, and triggers a PagerDuty alert and Slack notification if shortage is detected."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-alert
      port: 8080
      tools:
        - name: check-component-shortage
          description: "Given a component part number, check supplier inventory against SAP demand forecast and alert if a shortage is detected."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "The component part number to check."
            - name: supplier_id
              in: body
              type: string
              description: "The supplier identifier."
          steps:
            - name: get-inventory
              type: call
              call: "supplier-portal.get-inventory"
              with:
                part_number: "{{part_number}}"
                supplier_id: "{{supplier_id}}"
            - name: get-demand-forecast
              type: call
              call: "sap.get-demand-forecast"
              with:
                material_number: "{{part_number}}"
            - name: alert-pagerduty
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Component shortage alert: {{part_number}}"
                description: "Supplier {{supplier_id}} inventory: {{get-inventory.quantity_available}}. Forecasted demand: {{get-demand-forecast.forecasted_demand}}."
                severity: "high"
                service_id: "supply-chain-ops"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#supply-chain-alerts"
                text: "Shortage alert for {{part_number}} from supplier {{supplier_id}}. Available: {{get-inventory.quantity_available}}, Demand: {{get-demand-forecast.forecasted_demand}}. PagerDuty: {{alert-pagerduty.incident_id}}"
  consumes:
    - type: http
      namespace: supplier-portal
      baseUri: "https://supplier-portal.apple.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.supplier_portal_token"
      resources:
        - name: inventory
          path: "/suppliers/{{supplier_id}}/inventory/{{part_number}}"
          inputParameters:
            - name: supplier_id
              in: path
            - name: part_number
              in: path
          operations:
            - name: get-inventory
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.apple.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: demand
          path: "/demand-forecast/{{material_number}}"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-demand-forecast
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up a Swift package in the Apple Swift Package Registry by name, returning latest version, dependencies, and platforms.

naftiko: "0.5"
info:
  label: "Swift Package Registry Lookup"
  description: "Looks up a Swift package in the Apple Swift Package Registry by name, returning latest version, dependencies, and platforms."
  tags:
    - developer-tools
    - swift
    - packages
capability:
  exposes:
    - type: mcp
      namespace: swift-packages
      port: 8080
      tools:
        - name: get-package
          description: "Look up a Swift package by scope and name. Returns latest version, supported platforms, and dependency count."
          inputParameters:
            - name: package_scope
              in: body
              type: string
              description: "The Swift package scope, e.g. apple."
            - name: package_name
              in: body
              type: string
              description: "The Swift package name, e.g. swift-nio."
          call: "swift-registry.get-package"
          with:
            package_scope: "{{package_scope}}"
            package_name: "{{package_name}}"
          outputParameters:
            - name: latest_version
              type: string
              mapping: "$.releases[0].version"
            - name: platforms
              type: array
              mapping: "$.metadata.platforms"
  consumes:
    - type: http
      namespace: swift-registry
      baseUri: "https://packages.swift.org/api/v1"
      authentication:
        type: bearer
        token: "$secrets.swift_registry_token"
      resources:
        - name: packages
          path: "/{{package_scope}}/{{package_name}}"
          inputParameters:
            - name: package_scope
              in: path
            - name: package_name
              in: path
          operations:
            - name: get-package
              method: GET

Publishes educational Swift Playground content by validating the package, uploading to the content CDN, registering metadata, and notifying the education team.

naftiko: "0.5"
info:
  label: "Swift Playground Content Publishing"
  description: "Publishes educational Swift Playground content by validating the package, uploading to the content CDN, registering metadata, and notifying the education team."
  tags:
    - developer-tools
    - education
    - swift
    - content-publishing
capability:
  exposes:
    - type: mcp
      namespace: playground-publish
      port: 8080
      tools:
        - name: publish-playground
          description: "Publish a Swift Playground: validate package, upload to CDN, register metadata, and notify education team."
          inputParameters:
            - name: package_id
              in: body
              type: string
              description: "The Swift Playground package identifier."
            - name: version
              in: body
              type: string
              description: "The content version to publish."
          steps:
            - name: validate-package
              type: call
              call: "playground-api.validate"
              with:
                package_id: "{{package_id}}"
                version: "{{version}}"
            - name: upload-to-cdn
              type: call
              call: "cdn-api.upload-asset"
              with:
                asset_type: "playground"
                asset_id: "{{package_id}}"
                version: "{{version}}"
                content_ref: "{{validate-package.content_ref}}"
            - name: register-metadata
              type: call
              call: "playground-api.register-version"
              with:
                package_id: "{{package_id}}"
                version: "{{version}}"
                cdn_url: "{{upload-to-cdn.asset_url}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#education-content"
                text: "Swift Playground {{package_id}} v{{version}} published. CDN: {{upload-to-cdn.asset_url}}."
  consumes:
    - type: http
      namespace: playground-api
      baseUri: "https://playground-content.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.playground_api_token"
      resources:
        - name: validation
          path: "/packages/{{package_id}}/validate"
          inputParameters:
            - name: package_id
              in: path
          operations:
            - name: validate
              method: POST
        - name: versions
          path: "/packages/{{package_id}}/versions"
          inputParameters:
            - name: package_id
              in: path
          operations:
            - name: register-version
              method: POST
    - type: http
      namespace: cdn-api
      baseUri: "https://cdn-management.apple.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cdn_api_token"
      resources:
        - name: assets
          path: "/assets"
          operations:
            - name: upload-asset
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Triggers a Tableau workbook extract refresh and notifies stakeholders via Slack when the refresh completes or fails.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh Trigger"
  description: "Triggers a Tableau workbook extract refresh and notifies stakeholders via Slack when the refresh completes or fails."
  tags:
    - data
    - analytics
    - tableau
    - reporting
    - slack
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-tableau-workbook
          description: "Given a Tableau workbook ID and site name, trigger an extract refresh and notify stakeholders via Slack."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID to refresh."
            - name: site_name
              in: body
              type: string
              description: "The Tableau site name, e.g. apple."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to notify on completion."
          steps:
            - name: trigger-refresh
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbook_id: "{{workbook_id}}"
                site: "{{site_name}}"
            - name: notify-stakeholders
              type: call
              call: "slack-tableau.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Tableau workbook {{workbook_id}} refresh triggered. Job ID: {{trigger-refresh.job_id}}."
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.apple.com/api/2.8"
      authentication:
        type: apikey
        key: "X-Tableau-Auth"
        value: "$secrets.tableau_token"
        placement: header
      resources:
        - name: workbook-refresh
          path: "/sites/{{site}}/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: site
              in: path
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST
    - type: http
      namespace: slack-tableau
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates a new Terraform Cloud workspace for a given project and environment, and notifies the infrastructure team via Slack.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Provisioning"
  description: "Creates a new Terraform Cloud workspace for a given project and environment, and notifies the infrastructure team via Slack."
  tags:
    - cloud
    - infrastructure
    - terraform
    - devops
    - slack
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-terraform-workspace
          description: "Given a project name and environment, create a Terraform Cloud workspace in the Apple Terraform organization and notify the infrastructure Slack channel."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The project name for the new workspace."
            - name: environment
              in: body
              type: string
              description: "The deployment environment: dev, staging, or prod."
          steps:
            - name: create-workspace
              type: call
              call: "terraform.create-workspace"
              with:
                org: "apple"
                name: "{{project_name}}-{{environment}}"
            - name: notify-infra
              type: call
              call: "slack-tf.post-message"
              with:
                channel: "#infrastructure-team"
                text: "Terraform workspace created: {{project_name}}-{{environment}}. ID: {{create-workspace.workspace_id}}."
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/{{org}}/workspaces"
          inputParameters:
            - name: org
              in: path
          operations:
            - name: create-workspace
              method: POST
    - type: http
      namespace: slack-tf
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves beta tester details from TestFlight by email, including invitation status, installed builds, and last active date.

naftiko: "0.5"
info:
  label: "TestFlight Beta Tester Lookup"
  description: "Retrieves beta tester details from TestFlight by email, including invitation status, installed builds, and last active date."
  tags:
    - developer-tools
    - testflight
    - beta-testing
capability:
  exposes:
    - type: mcp
      namespace: testflight
      port: 8080
      tools:
        - name: get-beta-tester
          description: "Look up a TestFlight beta tester by email. Returns invitation status, number of installed builds, and last session date."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The beta tester email address."
          call: "appstoreconnect.get-beta-tester"
          with:
            email: "{{email}}"
          outputParameters:
            - name: first_name
              type: string
              mapping: "$.data[0].attributes.firstName"
            - name: invitation_status
              type: string
              mapping: "$.data[0].attributes.inviteType"
            - name: installed_builds
              type: number
              mapping: "$.data[0].attributes.installedCfBundleShortVersionStrings.length"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: beta-testers
          path: "/betaTesters?filter[email]={{email}}"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: get-beta-tester
              method: GET

When an employee changes roles in Workday, updates their Okta group memberships and notifies the new manager via Slack.

naftiko: "0.5"
info:
  label: "Workday Role Change Provisioning"
  description: "When an employee changes roles in Workday, updates their Okta group memberships and notifies the new manager via Slack."
  tags:
    - hr
    - identity
    - workday
    - okta
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID and new role details, update Okta group assignments for the new role and notify the new manager via Slack."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the employee changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job role or title."
            - name: new_manager_slack_id
              in: body
              type: string
              description: "The Slack user ID of the new manager."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-okta-groups
              type: call
              call: "okta-role.update-user-groups"
              with:
                user_id: "{{get-worker.okta_user_id}}"
                department: "{{get-worker.new_department}}"
            - name: notify-new-manager
              type: call
              call: "slack-role.post-message"
              with:
                channel: "{{new_manager_slack_id}}"
                text: "{{get-worker.full_name}} has been assigned to your team in role: {{new_role}}. Okta access updated."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/apple/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-role
      baseUri: "https://apple.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: slack-role
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the status of an Xcode Cloud build run by its build ID, including result, duration, and workflow name.

naftiko: "0.5"
info:
  label: "Xcode Cloud Build Status"
  description: "Retrieves the status of an Xcode Cloud build run by its build ID, including result, duration, and workflow name."
  tags:
    - developer-tools
    - ci-cd
    - xcode-cloud
capability:
  exposes:
    - type: mcp
      namespace: xcode-cloud
      port: 8080
      tools:
        - name: get-build-status
          description: "Check the status of an Xcode Cloud build run. Returns build result, duration in seconds, and workflow name."
          inputParameters:
            - name: build_run_id
              in: body
              type: string
              description: "The Xcode Cloud build run identifier."
          call: "appstoreconnect.get-build-run"
          with:
            build_run_id: "{{build_run_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data.attributes.completionStatus"
            - name: duration_seconds
              type: number
              mapping: "$.data.attributes.executionDuration"
            - name: workflow_name
              type: string
              mapping: "$.data.attributes.workflowName"
  consumes:
    - type: http
      namespace: appstoreconnect
      baseUri: "https://api.appstoreconnect.apple.com/v1"
      authentication:
        type: bearer
        token: "$secrets.appstore_connect_token"
      resources:
        - name: build-runs
          path: "/ciBuildRuns/{{build_run_id}}"
          inputParameters:
            - name: build_run_id
              in: path
          operations:
            - name: get-build-run
              method: GET

When a Zoom meeting recording is available, retrieves the transcript, submits it to OpenAI for a summary, and posts the summary to the relevant Slack channel.

naftiko: "0.5"
info:
  label: "Zoom Meeting Recording Transcript Distribution"
  description: "When a Zoom meeting recording is available, retrieves the transcript, submits it to OpenAI for a summary, and posts the summary to the relevant Slack channel."
  tags:
    - communication
    - zoom
    - openai
    - ai
    - slack
capability:
  exposes:
    - type: mcp
      namespace: meeting-intelligence
      port: 8080
      tools:
        - name: summarize-meeting-recording
          description: "Given a Zoom meeting ID and Slack channel, retrieve the recording transcript, generate an AI summary with OpenAI, and post it to Slack."
          inputParameters:
            - name: zoom_meeting_id
              in: body
              type: string
              description: "The Zoom meeting ID."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to post the summary to."
          steps:
            - name: get-recording
              type: call
              call: "zoom.get-recording"
              with:
                meeting_id: "{{zoom_meeting_id}}"
            - name: summarize
              type: call
              call: "openai-zoom.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Summarize this meeting transcript with: Key Decisions, Action Items (owner + due date), and Next Steps: {{get-recording.transcript}}"
            - name: post-summary
              type: call
              call: "slack-zoom.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Meeting Summary ({{zoom_meeting_id}}): {{summarize.text}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: recordings
          path: "/meetings/{{meeting_id}}/recordings"
          inputParameters:
            - name: meeting_id
              in: path
          operations:
            - name: get-recording
              method: GET
    - type: http
      namespace: openai-zoom
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: slack-zoom
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST