[{"data":1,"prerenderedAt":5345},["ShallowReactive",2],{"navigation":3,"/blog/software-development/c2pa-in-ableton-max-for-live-post":734,"/blog/software-development/c2pa-in-ableton-max-for-live-surround":1827,"/blog/software-development/c2pa-in-ableton-max-for-live-related":1832},[4,70,207,312,721],{"title":5,"path":6,"stem":7,"children":8,"page":69},"Case Study","/blog/case-study","blog/case-study",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65],{"title":10,"path":11,"stem":12},"Ambistream – Multi-Layer Streaming Platform","/blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea","blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea",{"title":14,"path":15,"stem":16},"Custom Chromecast & AirPlay Casting App","/blog/case-study/chromecast-airplay-casting-app-case-study","blog/case-study/chromecast-airplay-casting-app-case-study",{"title":18,"path":19,"stem":20},"Direct Music Licensing Platform Case Study","/blog/case-study/dlm-music-catalog-case-study","blog/case-study/dlm-music-catalog-case-study",{"title":22,"path":23,"stem":24},"Assembly Instructions App - Galeco Mobile App","/blog/case-study/galeco-mobile-app-case-study","blog/case-study/galeco-mobile-app-case-study",{"title":26,"path":27,"stem":28},"MemoSonic: Building an Audio Memory Game","/blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter","blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter",{"title":30,"path":31,"stem":32},"Loyalty Program App for Shopping Mall","/blog/case-study/loyalty-program-application-case-study","blog/case-study/loyalty-program-application-case-study",{"title":34,"path":35,"stem":36},"Mobile Application for Music Catalogs","/blog/case-study/mobile-app-for-music-catalog","blog/case-study/mobile-app-for-music-catalog",{"title":38,"path":39,"stem":40},"Universal Music Data Parser for 20+ Platforms","/blog/case-study/musicdata-lab-universal-music-data-parser-case-study","blog/case-study/musicdata-lab-universal-music-data-parser-case-study",{"title":42,"path":43,"stem":44},"Panther ML/AI Pricing Recommendation Tool","/blog/case-study/panther-pricing-recommendation-tool-case-study","blog/case-study/panther-pricing-recommendation-tool-case-study",{"title":46,"path":47,"stem":48},"4D Grupa Roofing Wholesalers Platform","/blog/case-study/roofing-wholesalers-website-case-study","blog/case-study/roofing-wholesalers-website-case-study",{"title":50,"path":51,"stem":52},"Talent Alpha HR Frontend Platform","/blog/case-study/talent-alpha-hr-platform-case-study","blog/case-study/talent-alpha-hr-platform-case-study",{"title":54,"path":55,"stem":56},"Ticketing & Events Platform Development","/blog/case-study/ticketing-events-platform-case-study","blog/case-study/ticketing-events-platform-case-study",{"title":58,"path":59,"stem":60},"Turn Fans into Superfans — Roadie.co","/blog/case-study/turn-fans-into-superfans-roadie-co","blog/case-study/turn-fans-into-superfans-roadie-co",{"title":62,"path":63,"stem":64},"Walkative 2.0 Global Booking Engine","/blog/case-study/walkative-2-booking-platform-case-study","blog/case-study/walkative-2-booking-platform-case-study",{"title":66,"path":67,"stem":68},"Why Merch Is the New Royalty Check, and How Tech Is Closing the Gap","/blog/case-study/why-merch-is-the-new-royalty-check","blog/case-study/why-merch-is-the-new-royalty-check",false,{"title":71,"path":72,"stem":73,"children":74,"page":69},"Music Data","/blog/music-data","blog/music-data",[75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203],{"title":76,"path":77,"stem":78},"13 Distributors, 5 File Formats, Zero Standards -The Reality of Music Royalty Data","/blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data","blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data",{"title":80,"path":81,"stem":82},"830 Ways to Say Spotify - Normalizing Music Streaming Data","/blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data","blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data",{"title":84,"path":85,"stem":86},"Why Music Companies Need AI-Powered Analytics (And How We Built One)","/blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama","blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama",{"title":88,"path":89,"stem":90},"AI Rehearsal: Spaced Repetition for Your Musical Ideas","/blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas","blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas",{"title":92,"path":93,"stem":94},"Audio Project Organization Is a Mess — Here's Why","/blog/music-data/audio-project-organization-mess","blog/music-data/audio-project-organization-mess",{"title":96,"path":97,"stem":98},"Why Audio Search Is Still Broken and How to Fix It with Embeddings","/blog/music-data/audio-search-broken-fix-with-embeddings","blog/music-data/audio-search-broken-fix-with-embeddings",{"title":100,"path":101,"stem":102},"AI Song Structure Analysis: Intro, Verse, Chorus","/blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus","blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus",{"title":104,"path":105,"stem":106},"The Broken Feedback Loop in Music Collaboration","/blog/music-data/broken-feedback-loop-music-collaboration","blog/music-data/broken-feedback-loop-music-collaboration",{"title":108,"path":109,"stem":110},"Building a Claude Skill for DDEX Validation: Automate Music Metadata Checks with AI","/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata","blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata",{"title":112,"path":113,"stem":114},"Building a Custom Music Delivery Platform on the Revelator API","/blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api","blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api",{"title":116,"path":117,"stem":118},"Building a Suno AI Remix App with Nuxt & Firebase","/blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase","blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase",{"title":120,"path":121,"stem":122},"C2PA & DDEX: Authenticity Meets Rights in the Age of AI Music","/blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music","blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music",{"title":124,"path":125,"stem":126},"C2PA in Music: A Claude MCP for Reading Content Provenance","/blog/music-data/c2pa-in-music-mcp","blog/music-data/c2pa-in-music-mcp",{"title":128,"path":129,"stem":130},"Data Modeling in MongoDB Using Design Patterns","/blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns","blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns",{"title":132,"path":133,"stem":134},"Office Hours with MusicTech Lab's DDEX Expert","/blog/music-data/ddex-office-hours-musictech","blog/music-data/ddex-office-hours-musictech",{"title":136,"path":137,"stem":138},"DDEX Open Source Projects Review","/blog/music-data/ddex-open-source-projects-review","blog/music-data/ddex-open-source-projects-review",{"title":140,"path":141,"stem":142},"Extracting Data from Ableton .als and .asd Files","/blog/music-data/extracting-data-from-ableton-als-asd-files","blog/music-data/extracting-data-from-ableton-als-asd-files",{"title":144,"path":145,"stem":146},"Maciej Dulski on Sound Connections Podcast","/blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast","blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast",{"title":148,"path":149,"stem":150},"How to Transcribe Video to Text Using OpenAI Whisper","/blog/music-data/how-to-transcribe-video-to-text-using-whisper","blog/music-data/how-to-transcribe-video-to-text-using-whisper",{"title":152,"path":153,"stem":154},"Epidemic Sound MCP with Claude for Devs","/blog/music-data/how-to-use-epidemic-sound-mcp-with-claude","blog/music-data/how-to-use-epidemic-sound-mcp-with-claude",{"title":156,"path":157,"stem":158},"Hybrid Database Model in Django for Speed","/blog/music-data/hybrid-database-model-in-django-as-a-performance-booster","blog/music-data/hybrid-database-model-in-django-as-a-performance-booster",{"title":160,"path":161,"stem":162},"Introduction to generating DDEX file using Python","/blog/music-data/introduction-to-generating-ddex-file-using-python","blog/music-data/introduction-to-generating-ddex-file-using-python",{"title":164,"path":165,"stem":166},"Maintaining Music Tech Tools: The SLA Dilemma for Small Teams","/blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams","blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams",{"title":168,"path":169,"stem":170},"Querying Bandcamp Revenue Reports with Natural Language — Meet mtl-bandcamp-mcp","/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard","blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard",{"title":172,"path":173,"stem":174},"mtl-metadata-mcp: Open Source Audio Metadata Embedding for Claude Code","/blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding","blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding",{"title":176,"path":177,"stem":178},"MusicTech Resources for Builders","/blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders","blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders",{"title":180,"path":181,"stem":182},"Poland's Creative Tech and MusicTech Rise","/blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it","blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it",{"title":184,"path":185,"stem":186},"Batch ISRC Enrichment That Turns Messy Catalogs Into Clean Data","/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz","blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz",{"title":188,"path":189,"stem":190},"Music Self-Publishing: The Emuze.me Story","/blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me","blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me",{"title":192,"path":193,"stem":194},"Understanding the API First Approach","/blog/music-data/understanding-the-api-first-approach","blog/music-data/understanding-the-api-first-approach",{"title":196,"path":197,"stem":198},"The Voice Memo Graveyard Problem","/blog/music-data/voice-memo-graveyard-problem","blog/music-data/voice-memo-graveyard-problem",{"title":200,"path":201,"stem":202},"Which Database for Music Data? Redshift vs BigQuery vs ClickHouse and When to Use Each","/blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse","blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse",{"title":204,"path":205,"stem":206},"Why we decided to use wavesurfer.js","/blog/music-data/why-we-decided-to-use-wavesurfer","blog/music-data/why-we-decided-to-use-wavesurfer",{"title":208,"path":209,"stem":210,"children":211,"page":69},"Newsletter","/blog/newsletter","blog/newsletter",[212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308],{"title":213,"path":214,"stem":215},"Music Industry Tech Openings (April 2024 Update)","/blog/newsletter/music-industry-tech-openings-april-2024-update","blog/newsletter/music-industry-tech-openings-april-2024-update",{"title":217,"path":218,"stem":219},"Music Industry Tech Openings (April 2025 Update)","/blog/newsletter/music-industry-tech-openings-april-2025-update","blog/newsletter/music-industry-tech-openings-april-2025-update",{"title":221,"path":222,"stem":223},"Music Industry Tech Openings (August 2024 Update)","/blog/newsletter/music-industry-tech-openings-august-2024-update","blog/newsletter/music-industry-tech-openings-august-2024-update",{"title":225,"path":226,"stem":227},"Music Industry Tech Openings (December 2024 Update)","/blog/newsletter/music-industry-tech-openings-december-2024-update","blog/newsletter/music-industry-tech-openings-december-2024-update",{"title":229,"path":230,"stem":231},"Music Industry Tech Openings (February 2025 Update)","/blog/newsletter/music-industry-tech-openings-february-2025-update","blog/newsletter/music-industry-tech-openings-february-2025-update",{"title":233,"path":234,"stem":235},"Music Industry Tech Openings (January 2025 Update)","/blog/newsletter/music-industry-tech-openings-january-2025-update","blog/newsletter/music-industry-tech-openings-january-2025-update",{"title":237,"path":238,"stem":239},"Music Industry Tech Openings (July 2024 Update)","/blog/newsletter/music-industry-tech-openings-july-2024-update","blog/newsletter/music-industry-tech-openings-july-2024-update",{"title":241,"path":242,"stem":243},"Music Industry Tech Openings (June 2024 Update)","/blog/newsletter/music-industry-tech-openings-june-2024-update","blog/newsletter/music-industry-tech-openings-june-2024-update",{"title":245,"path":246,"stem":247},"Music Industry Tech Openings (March 2025 Update)","/blog/newsletter/music-industry-tech-openings-march-2025-update","blog/newsletter/music-industry-tech-openings-march-2025-update",{"title":249,"path":250,"stem":251},"Music Industry Tech Openings (May 2024 Update)","/blog/newsletter/music-industry-tech-openings-may-2024-update","blog/newsletter/music-industry-tech-openings-may-2024-update",{"title":253,"path":254,"stem":255},"Music Industry Tech Openings (May 2025 Update)","/blog/newsletter/music-industry-tech-openings-may-2025","blog/newsletter/music-industry-tech-openings-may-2025",{"title":257,"path":258,"stem":259},"Music Industry Tech Openings (November 2024 Update)","/blog/newsletter/music-industry-tech-openings-november-2024-update","blog/newsletter/music-industry-tech-openings-november-2024-update",{"title":261,"path":262,"stem":263},"Music Industry Tech Openings (October 2024 Update)","/blog/newsletter/music-industry-tech-openings-october-2024-update","blog/newsletter/music-industry-tech-openings-october-2024-update",{"title":265,"path":266,"stem":267},"Music Industry Tech Openings (September 2024 Update)","/blog/newsletter/music-industry-tech-openings-september-2024-update","blog/newsletter/music-industry-tech-openings-september-2024-update",{"title":269,"path":270,"stem":271},"MusicTech Insights #1 by Maciej Dulski","/blog/newsletter/musictech-insights-1-curated-by-maciej-dulski","blog/newsletter/musictech-insights-1-curated-by-maciej-dulski",{"title":273,"path":274,"stem":275},"Provenance, Not Detection, Is the Durable Answer","/blog/newsletter/musictech-insights-10-curated-by-jim-anderson","blog/newsletter/musictech-insights-10-curated-by-jim-anderson",{"title":277,"path":278,"stem":279},"What CMOs can teach us about innovation in uncertain times","/blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska","blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska",{"title":281,"path":282,"stem":283},"Feeling the MusicTech Momentum","/blog/newsletter/musictech-insights-2-curated-by-maciej-dulski","blog/newsletter/musictech-insights-2-curated-by-maciej-dulski",{"title":285,"path":286,"stem":287},"AI in Music: Hype, Hope, and a Human Touch","/blog/newsletter/musictech-insights-3-curated-by-drew-thurlow","blog/newsletter/musictech-insights-3-curated-by-drew-thurlow",{"title":289,"path":290,"stem":291},"The Music Metadata Conundrum","/blog/newsletter/musictech-insights-4-curated-by-amanda-schupf","blog/newsletter/musictech-insights-4-curated-by-amanda-schupf",{"title":293,"path":294,"stem":295},"7 Rounds in the First 10 Days of November 2025","/blog/newsletter/musictech-insights-5-curated-by-maciej-dulski","blog/newsletter/musictech-insights-5-curated-by-maciej-dulski",{"title":297,"path":298,"stem":299},"The End of an Era: It's All About to Crash","/blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason","blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason",{"title":301,"path":302,"stem":303},"Low-Code Magic Won't Solve MusicTech Reality","/blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk","blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk",{"title":305,"path":306,"stem":307},"The New Economics of Game Music","/blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan","blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan",{"title":309,"path":310,"stem":311},"Music Business Meets Direct-to-Fan","/blog/newsletter/musictech-insights-9-curated-by-yaw-asamani","blog/newsletter/musictech-insights-9-curated-by-yaw-asamani",{"title":313,"path":314,"stem":315,"children":316,"page":69},"Software Development","/blog/software-development","blog/software-development",[317,321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417,421,425,429,433,437,441,445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717],{"title":318,"path":319,"stem":320},"Benefits of Outsourcing Software Development","/blog/software-development/10-benefits-of-outsourcing-software-development-services","blog/software-development/10-benefits-of-outsourcing-software-development-services",{"title":322,"path":323,"stem":324},"10 Steps to Find the Best MVP Developers","/blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea","blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea",{"title":326,"path":327,"stem":328},"1,200 Looms Later: How Async Video Became My Development Superpower","/blog/software-development/1200-looms-how-async-video-became-our-development-superpower","blog/software-development/1200-looms-how-async-video-became-our-development-superpower",{"title":330,"path":331,"stem":332},"Communication Strategy in Outsourcing Projects","/blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project","blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project",{"title":334,"path":335,"stem":336},"7 Best Practices for Outsourcing Software Development","/blog/software-development/7-best-practices-for-outsourcing-software-development","blog/software-development/7-best-practices-for-outsourcing-software-development",{"title":338,"path":339,"stem":340},"9 Reasons Why Saleor.io Is Best for eCommerce","/blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website","blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website",{"title":342,"path":343,"stem":344},"A Look at Bravelab.io’s Clutch 2021 Year In Review","/blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review","blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review",{"title":346,"path":347,"stem":348},"A quick introduction to profit sharing implementation","/blog/software-development/a-quick-introduction-to-profit-sharing-implementation","blog/software-development/a-quick-introduction-to-profit-sharing-implementation",{"title":350,"path":351,"stem":352},"AI Audio Similarity Search: The Future of Sound Library Discovery","/blog/software-development/ai-audio-similarity-search-for-sound-libraries","blog/software-development/ai-audio-similarity-search-for-sound-libraries",{"title":354,"path":355,"stem":356},"Automate Repetitive Tasks for Better Results","/blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance","blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance",{"title":358,"path":359,"stem":360},"Automating Success: The Art of Unified Documentation","/blog/software-development/automating-success-the-art-of-unified-documentation","blog/software-development/automating-success-the-art-of-unified-documentation",{"title":362,"path":363,"stem":364},"Brave 3.0 Website Redesign, Part 2: Solution","/blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution","blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution",{"title":366,"path":367,"stem":368},"Brave 3.0, Part 4: Tech Stack and Recap","/blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap","blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap",{"title":370,"path":371,"stem":372},"Brave 3.0 – redesign process part 1. The Challenge","/blog/software-development/brave-3-0-redesign-process-part-1-challenge","blog/software-development/brave-3-0-redesign-process-part-1-challenge",{"title":374,"path":375,"stem":376},"Brave 3.0 – redesign process, part 3. Lesson learned","/blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned","blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned",{"title":378,"path":379,"stem":380},"Bravelab.io: Top Software Developer by Clutch","/blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":382,"path":383,"stem":384},"Bravelab.io: Top Developer in Poland by Clutch","/blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch","blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch",{"title":386,"path":387,"stem":388},"MusicTech Lab Partners with LALAL.AI","/blog/software-development/bravelab-partners-with-the-audio-lalal-ai","blog/software-development/bravelab-partners-with-the-audio-lalal-ai",{"title":390,"path":391,"stem":392},"MusicTech Lab Partners with The Audio Programmer","/blog/software-development/bravelab-partners-with-the-audio-programmer","blog/software-development/bravelab-partners-with-the-audio-programmer",{"title":394,"path":395,"stem":396},"Bravelab's team about productivity","/blog/software-development/bravelabs-team-about-productivity","blog/software-development/bravelabs-team-about-productivity",{"title":398,"path":399,"stem":400},"Braveloper","/blog/software-development/braveloper","blog/software-development/braveloper",{"title":402,"path":403,"stem":404},"Bravely App: Boost Productivity with Django","/blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick","blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick",{"title":406,"path":407,"stem":408},"DIY MIDI Controller for Ableton with Arduino","/blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino","blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino",{"title":410,"path":411,"stem":412},"C2PA in Ableton: Making AI Music Provenance Visible Inside Your DAW","/blog/software-development/c2pa-in-ableton-max-for-live","blog/software-development/c2pa-in-ableton-max-for-live",{"title":414,"path":415,"stem":416},"Change Detection mechanism in Angular","/blog/software-development/change-detection-mechanism-in-angular","blog/software-development/change-detection-mechanism-in-angular",{"title":418,"path":419,"stem":420},"Communication Channels in Remote Work","/blog/software-development/comparison-of-the-communication-channels-in-remote-work","blog/software-development/comparison-of-the-communication-channels-in-remote-work",{"title":422,"path":423,"stem":424},"Connecting Your Max for Live Device to a Cloud API","/blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api","blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api",{"title":426,"path":427,"stem":428},"From Voice Memo to Studio: The Cross-Platform Problem for Creators","/blog/software-development/cross-platform-problem-for-creators","blog/software-development/cross-platform-problem-for-creators",{"title":430,"path":431,"stem":432},"Cultural transformation through the pandemic era","/blog/software-development/cultural-transformation-through-the-pandemic-era","blog/software-development/cultural-transformation-through-the-pandemic-era",{"title":434,"path":435,"stem":436},"D-Commerce Decoded: Cutting Through the Hype","/blog/software-development/d-commerce-decoded-cutting-through-the-hype","blog/software-development/d-commerce-decoded-cutting-through-the-hype",{"title":438,"path":439,"stem":440},"Dev Meeting 002: Intro to DDD","/blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd","blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd",{"title":442,"path":443,"stem":444},"Dev Meeting 003: Web3 Primer","/blog/software-development/dev-meeting-003-web3-primer","blog/software-development/dev-meeting-003-web3-primer",{"title":446,"path":447,"stem":448},"Dev Meeting 004: Introduction to Event Storming","/blog/software-development/dev-meeting-004-introduction-to-event-storming","blog/software-development/dev-meeting-004-introduction-to-event-storming",{"title":450,"path":451,"stem":452},"Dev Meeting 001: Kubernetes is a Framework","/blog/software-development/dev-meeting-kubernetes-is-a-framework","blog/software-development/dev-meeting-kubernetes-is-a-framework",{"title":454,"path":455,"stem":456},"Did You Know? 10 Developer Tips from Real Codebases","/blog/software-development/did-you-know-dev-tips-part-1","blog/software-development/did-you-know-dev-tips-part-1",{"title":458,"path":459,"stem":460},"10 Surprising MusicTech Facts (Part 2)","/blog/software-development/did-you-know-musictech-facts-part-2","blog/software-development/did-you-know-musictech-facts-part-2",{"title":462,"path":463,"stem":464},"Django-cms and GraphQL","/blog/software-development/django-cms-and-graphql","blog/software-development/django-cms-and-graphql",{"title":466,"path":467,"stem":468},"Does Zappa make it super easy?","/blog/software-development/does-zappa-make-it-super-easy","blog/software-development/does-zappa-make-it-super-easy",{"title":470,"path":471,"stem":472},"Establishing cooperation between Netlify and Bravelab","/blog/software-development/establishing-cooperation-between-netlify-and-bravelab","blog/software-development/establishing-cooperation-between-netlify-and-bravelab",{"title":474,"path":475,"stem":476},"Export Ableton Locators to JSON via Max for Live","/blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live","blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live",{"title":478,"path":479,"stem":480},"IT Outsourcing: Success and Failure Factors","/blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project","blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project",{"title":482,"path":483,"stem":484},"Flutter 2022 Strategy: Analyzing the Roadmap","/blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap","blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap",{"title":486,"path":487,"stem":488},"Git Better #1 — Commit Message Convention","/blog/software-development/git-better-1-see-more-with-a-commit-message-convention","blog/software-development/git-better-1-see-more-with-a-commit-message-convention",{"title":490,"path":491,"stem":492},"Hasura in action. How to use it with Django","/blog/software-development/hasura-in-action","blog/software-development/hasura-in-action",{"title":494,"path":495,"stem":496},"Holacracy why and where we are","/blog/software-development/holacracy-why-and-where-we-are","blog/software-development/holacracy-why-and-where-we-are",{"title":498,"path":499,"stem":500},"How does JavaScript work","/blog/software-development/how-does-javascript-work","blog/software-development/how-does-javascript-work",{"title":502,"path":503,"stem":504},"How important is good UX/UI design?","/blog/software-development/how-important-is-good-ux-ui-design","blog/software-development/how-important-is-good-ux-ui-design",{"title":506,"path":507,"stem":508},"How repetitive tasks impact your business","/blog/software-development/how-repetitive-tasks-impact-your-business","blog/software-development/how-repetitive-tasks-impact-your-business",{"title":510,"path":511,"stem":512},"Becoming a Vue.js Dev: Do Paid Trials Work?","/blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out","blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out",{"title":514,"path":515,"stem":516},"How to Build an MVP in 6 Steps","/blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps","blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps",{"title":518,"path":519,"stem":520},"How to conduct workshops for creative industry?","/blog/software-development/how-to-conduct-workshops-for-creative-industry","blog/software-development/how-to-conduct-workshops-for-creative-industry",{"title":522,"path":523,"stem":524},"How to easily create form in Angular","/blog/software-development/how-to-easily-create-form-in-angular","blog/software-development/how-to-easily-create-form-in-angular",{"title":526,"path":527,"stem":528},"How to export orders in Saleor.io to XLSX file","/blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file","blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file",{"title":530,"path":531,"stem":532},"Handling High Loads on E-Commerce Platforms","/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease","blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease",{"title":534,"path":535,"stem":536},"How to launch Saleor.io shop instance within 40h","/blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h","blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h",{"title":538,"path":539,"stem":540},"First Steps to Build a Business Relationship","/blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship","blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship",{"title":542,"path":543,"stem":544},"Multi-Tenant Apps with Django and Saleor.io","/blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform","blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform",{"title":546,"path":547,"stem":548},"Notion Backup Tool Built in 3 Days with Python","/blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why","blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why",{"title":550,"path":551,"stem":552},"Important new features in Python 3.8","/blog/software-development/important-new-features-in-python-3-8","blog/software-development/important-new-features-in-python-3-8",{"title":554,"path":555,"stem":556},"Installing Proxmox on dedicated server from OVH","/blog/software-development/installing-proxmox-on-dedicated-server-from-ovh","blog/software-development/installing-proxmox-on-dedicated-server-from-ovh",{"title":558,"path":559,"stem":560},"Integrating SignNow E-Signatures into Your Django Application","/blog/software-development/integrating-signnow-e-signatures-into-your-django-application","blog/software-development/integrating-signnow-e-signatures-into-your-django-application",{"title":562,"path":563,"stem":564},"Tempus Metronome and GetSongBPM API","/blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it","blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it",{"title":566,"path":567,"stem":568},"Introducing MusicTech Poland","/blog/software-development/introducing-musictech-poland","blog/software-development/introducing-musictech-poland",{"title":570,"path":571,"stem":572},"Vue.js as a Frontend for Saleor.io","/blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform","blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform",{"title":574,"path":575,"stem":576},"Is your business ready for the cashless era?","/blog/software-development/is-your-business-ready-for-the-cashless-era","blog/software-development/is-your-business-ready-for-the-cashless-era",{"title":578,"path":579,"stem":580},"Is your face ready to buy?","/blog/software-development/is-your-face-ready-to-buy","blog/software-development/is-your-face-ready-to-buy",{"title":582,"path":583,"stem":584},"JS Frameworks: Trends and Opportunities","/blog/software-development/javascript-trending-frameworks-and-market-opportunities","blog/software-development/javascript-trending-frameworks-and-market-opportunities",{"title":586,"path":587,"stem":588},"Kanban Board: Boost Your Team Productivity","/blog/software-development/kanban-board-methodology-hack-your-companys-productivity","blog/software-development/kanban-board-methodology-hack-your-companys-productivity",{"title":590,"path":591,"stem":592},"Verified Human Cert MCP Server: Prove Your Music Is Human-Made, Right from the Terminal","/blog/software-development/mcp-verified-human-cert-open-source","blog/software-development/mcp-verified-human-cert-open-source",{"title":594,"path":595,"stem":596},"Migrating from TravisCI to Github Actions","/blog/software-development/migrating-from-travisci-to-github-actions","blog/software-development/migrating-from-travisci-to-github-actions",{"title":598,"path":599,"stem":600},"MusicTech Lab: Top Software Developer by Clutch","/blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":602,"path":603,"stem":604},"MusicTech Lab x Verified Human: Building a Trust Layer for Human-Made Music","/blog/software-development/musictechlab_blog_verified_human_partnership","blog/software-development/musictechlab_blog_verified_human_partnership",{"title":606,"path":607,"stem":608},"MusicXML: Standard for Music Notation","/blog/software-development/musicxml-standard-for-music-notation-and-education","blog/software-development/musicxml-standard-for-music-notation-and-education",{"title":610,"path":611,"stem":612},"Only a few books but dozens of ideas","/blog/software-development/only-a-few-books-but-dozens-of-ideas","blog/software-development/only-a-few-books-but-dozens-of-ideas",{"title":614,"path":615,"stem":616},"Overdue Invoices and Issue Tracker Integration","/blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system","blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system",{"title":618,"path":619,"stem":620},"Performing SAML SSO using JWT in Django","/blog/software-development/performing-saml-sso-using-jwt-in-django","blog/software-development/performing-saml-sso-using-jwt-in-django",{"title":622,"path":623,"stem":624},"Progressive Web Apps for Mobile Development","/blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application","blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application",{"title":626,"path":627,"stem":628},"Recruitment System: Gmail, Jira, and CRM","/blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm","blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm",{"title":630,"path":631,"stem":632},"Scratch Me: Chrome Extension for Leads","/blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity","blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity",{"title":634,"path":635,"stem":636},"Scratch Me – integration with the Copper CRM","/blog/software-development/scratch-me-integration-with-the-copper-crm","blog/software-development/scratch-me-integration-with-the-copper-crm",{"title":638,"path":639,"stem":640},"SignNow MCP Server: E-Signatures Straight from Claude Code","/blog/software-development/signnow-mcp-server-e-signatures-from-claude-code","blog/software-development/signnow-mcp-server-e-signatures-from-claude-code",{"title":642,"path":643,"stem":644},"Music Industry Tech Openings (March 2024 Update)","/blog/software-development/technical-job-opportunities-in-the-music-industry","blog/software-development/technical-job-opportunities-in-the-music-industry",{"title":646,"path":647,"stem":648},"Thanks app – a Management 3.0 solution","/blog/software-development/thanks-app-a-management-3-0-solution","blog/software-development/thanks-app-a-management-3-0-solution",{"title":650,"path":651,"stem":652},"Colonial Pipeline Case: 7 Security Reminders","/blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders","blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders",{"title":654,"path":655,"stem":656},"The Evolution and Future of E-commerce Platforms","/blog/software-development/the-evolution-and-future-of-e-commerce-platforms","blog/software-development/the-evolution-and-future-of-e-commerce-platforms",{"title":658,"path":659,"stem":660},"The Gender Gap in the Tech Industry","/blog/software-development/the-gender-gap-in-the-tech-industry","blog/software-development/the-gender-gap-in-the-tech-industry",{"title":662,"path":663,"stem":664},"First Attempt to Implement 4DX at Bravelab.io","/blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io","blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io",{"title":666,"path":667,"stem":668},"The WTF Scale: IT Project Complexity","/blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity","blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity",{"title":670,"path":671,"stem":672},"Top 10 articles through the eyes of our developers","/blog/software-development/top-10-articles-through-the-eyes-of-our-developers","blog/software-development/top-10-articles-through-the-eyes-of-our-developers",{"title":674,"path":675,"stem":676},"Top 6 apps made with Flutter","/blog/software-development/top-6-apps-made-with-flutter","blog/software-development/top-6-apps-made-with-flutter",{"title":678,"path":679,"stem":680},"Uber 101: How Uber Made It to the Top","/blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top","blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top",{"title":682,"path":683,"stem":684},"MusicTech Lab Partners with Music Glue","/blog/software-development/unifying-artists-and-audiences-exploring-music-glue","blog/software-development/unifying-artists-and-audiences-exploring-music-glue",{"title":686,"path":687,"stem":688},"Why AI Will Defeat Traditional HR","/blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr","blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr",{"title":690,"path":691,"stem":692},"What is a Discovery Document?","/blog/software-development/what-is-discovery-document","blog/software-development/what-is-discovery-document",{"title":694,"path":695,"stem":696},"What is Flutter, and Why is it Worth Considering?","/blog/software-development/what-is-flutter-and-why-is-it-worth-considering","blog/software-development/what-is-flutter-and-why-is-it-worth-considering",{"title":698,"path":699,"stem":700},"What is a Watermarked Song?","/blog/software-development/what-is-watermarked-song","blog/software-development/what-is-watermarked-song",{"title":702,"path":703,"stem":704},"Choosing a Frontend Framework for the Web","/blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development","blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development",{"title":706,"path":707,"stem":708},"Why DAWs Are the Wrong Tool for Starting a Song","/blog/software-development/why-daws-wrong-tool-for-starting-song","blog/software-development/why-daws-wrong-tool-for-starting-song",{"title":710,"path":711,"stem":712},"Why the Programming World Loves Python","/blog/software-development/why-the-programming-world-loves-python","blog/software-development/why-the-programming-world-loves-python",{"title":714,"path":715,"stem":716},"Why We Don't Build Chat From Scratch (And Neither Should You)","/blog/software-development/why-we-dont-build-chat-from-scratch","blog/software-development/why-we-dont-build-chat-from-scratch",{"title":718,"path":719,"stem":720},"Why we use Sanity.io","/blog/software-development/why-we-use-sanity-io","blog/software-development/why-we-use-sanity-io",{"title":722,"path":723,"stem":724,"children":725,"page":69},"Sportstech","/blog/sportstech","blog/sportstech",[726,730],{"title":727,"path":728,"stem":729},"BeatBuddy Replay: Video Analysis App Challenges","/blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter","blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter",{"title":731,"path":732,"stem":733},"How to Create a Watch Face App for Garmin Watch","/blog/sportstech/how-to-create-watch-face-app-for-garmin-watch","blog/sportstech/how-to-create-watch-face-app-for-garmin-watch",{"id":735,"title":410,"authors":736,"badge":742,"body":745,"category":1777,"client":1778,"date":1779,"description":1780,"extension":1781,"faq":1782,"featured":69,"featuredOrder":1778,"hidden":69,"image":1798,"keyTakeaways":1800,"meta":1814,"navigation":897,"path":411,"seo":1815,"status":1778,"stem":412,"tags":1818,"teaser":1778,"__hash__":1826},"posts/blog/software-development/c2pa-in-ableton-max-for-live.md",[737],{"name":738,"to":739,"avatar":740},"Mariusz Smenżyk","https://www.linkedin.com/in/mariusz-smenzyk/",{"src":741},"/images/people/mariusz-smenzyk2.webp",{"label":743,"color":744},"Open Source","#7c3aed",{"type":746,"value":747,"toc":1764},"minimark",[748,757,768,773,776,784,787,796,804,808,811,822,826,1032,1035,1083,1087,1196,1203,1207,1210,1255,1261,1265,1268,1537,1548,1552,1562,1569,1573,1576,1671,1679,1683,1692,1695,1731,1735,1743,1746,1750,1753,1760],[749,750,751,752,756],"p",{},"In May 2026 we shipped ",[753,754,755],"a",{"href":125},"a Claude MCP for reading C2PA manifests in music files",". This post is the follow-up: the same reader, now inside Ableton Live as an open-source Max for Live device.",[749,758,759,760,763,764,767],{},"This is the fourth article in our ",[753,761,762],{"href":475},"Max for Live series",". It builds directly on the ",[753,765,766],{"href":423},"M4L → FastAPI pattern"," we wrote about in January 2026, with one change: the API runs on your laptop, not in the cloud.",[769,770,772],"h2",{"id":771},"the-problem","The problem",[749,774,775],{},"Google Lyria signs every MP3 it generates with a C2PA manifest. The manifest records who made the file, what model produced it, whether it is AI-generated, what watermarks were applied (Lyria adds SynthID), and who signed the claim. The data is there. Producers cannot see it.",[749,777,778,779,783],{},"You drop a Lyria stem onto an audio track. Ableton shows you the waveform. It does not show you that the file is AI-generated, who signed it, or what the manifest says about the source. To find out, you have to leave the DAW, run ",[780,781,782],"code",{},"c2patool"," on the file, and read raw JSON.",[749,785,786],{},"Andrew Melchior — Massive Attack's CTO, advising the UK DCMS on AI and the Copyright Act — framed the bigger gap in a reply on LinkedIn to our MCP announcement:",[788,789,790],"note",{},[749,791,792],{},[793,794,795],"strong",{},"C2PA now tells you a machine generated this track. It doesn't tell you whose work trained the machine.",[749,797,798,799,803],{},"Training-corpus provenance is the hard problem. This article is about the easier half — making the ",[800,801,802],"em",{},"output"," manifest visible at the point a producer is actually working.",[769,805,807],{"id":806},"the-fix","The fix",[749,809,810],{},"A Max for Live device. Click a clip → see the manifest summary. That is the whole product.",[749,812,813,814,817,818,821],{},"Under the hood, the device borrows a pattern we already shipped: a Max for Live ",[780,815,816],{},"js"," object reads the Live Object Model, then routes the work to a Node for Max HTTP client. We wrote about ",[753,819,820],{"href":423},"this exact shape in January 2026",". The only change here is where the HTTP server lives.",[769,823,825],{"id":824},"architecture-in-one-diagram","Architecture in one diagram",[827,828,833],"pre",{"className":829,"code":830,"language":831,"meta":832,"style":832},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TB\n    subgraph Ableton[\"Ableton Live\"]\n        device[\"MTL_C2PA_Ableton_PoC.amxd\"]\n        livepi[\"LiveAPI observer\u003Cbr/>(detail_clip)\"]\n        js[\"c2pa_reader.js\"]\n        node[\"c2pa_node.js\u003Cbr/>(Node for Max)\"]\n        ui[\"UI textedit\u003Cbr/>summary display\"]\n        device --> livepi --> js --> node --> ui\n    end\n\n    subgraph LocalServer[\"mtl-c2pa-http (127.0.0.1:8765)\"]\n        fastapi[\"FastAPI app\"]\n        summary[\"/summary\"]\n        verify[\"/verify\"]\n        scan[\"/scan\"]\n        info[\"/info\"]\n        fastapi --> summary\n        fastapi --> verify\n        fastapi --> scan\n        fastapi --> info\n    end\n\n    subgraph PythonPkg[\"mtl_c2pa_server (in this repo)\"]\n        c2pamod[\"c2pa.py (parser)\"]\n        reader[\"c2pa-python Reader\u003Cbr/>(Rust binding)\"]\n        c2pamod --> reader\n    end\n\n    node -->|POST /summary| fastapi\n    fastapi -->|import| c2pamod\n\n    launchd[\"launchd plist\u003Cbr/>auto-start on login\"]\n    launchd -.->|spawn| fastapi\n","mermaid","",[780,834,835,844,850,856,862,868,874,880,886,892,899,905,911,917,923,929,935,941,947,953,959,964,969,975,981,987,993,998,1003,1009,1015,1020,1026],{"__ignoreMap":832},[836,837,840],"span",{"class":838,"line":839},"line",1,[836,841,843],{"class":842},"sTEyZ","flowchart TB\n",[836,845,847],{"class":838,"line":846},2,[836,848,849],{"class":842},"    subgraph Ableton[\"Ableton Live\"]\n",[836,851,853],{"class":838,"line":852},3,[836,854,855],{"class":842},"        device[\"MTL_C2PA_Ableton_PoC.amxd\"]\n",[836,857,859],{"class":838,"line":858},4,[836,860,861],{"class":842},"        livepi[\"LiveAPI observer\u003Cbr/>(detail_clip)\"]\n",[836,863,865],{"class":838,"line":864},5,[836,866,867],{"class":842},"        js[\"c2pa_reader.js\"]\n",[836,869,871],{"class":838,"line":870},6,[836,872,873],{"class":842},"        node[\"c2pa_node.js\u003Cbr/>(Node for Max)\"]\n",[836,875,877],{"class":838,"line":876},7,[836,878,879],{"class":842},"        ui[\"UI textedit\u003Cbr/>summary display\"]\n",[836,881,883],{"class":838,"line":882},8,[836,884,885],{"class":842},"        device --> livepi --> js --> node --> ui\n",[836,887,889],{"class":838,"line":888},9,[836,890,891],{"class":842},"    end\n",[836,893,895],{"class":838,"line":894},10,[836,896,898],{"emptyLinePlaceholder":897},true,"\n",[836,900,902],{"class":838,"line":901},11,[836,903,904],{"class":842},"    subgraph LocalServer[\"mtl-c2pa-http (127.0.0.1:8765)\"]\n",[836,906,908],{"class":838,"line":907},12,[836,909,910],{"class":842},"        fastapi[\"FastAPI app\"]\n",[836,912,914],{"class":838,"line":913},13,[836,915,916],{"class":842},"        summary[\"/summary\"]\n",[836,918,920],{"class":838,"line":919},14,[836,921,922],{"class":842},"        verify[\"/verify\"]\n",[836,924,926],{"class":838,"line":925},15,[836,927,928],{"class":842},"        scan[\"/scan\"]\n",[836,930,932],{"class":838,"line":931},16,[836,933,934],{"class":842},"        info[\"/info\"]\n",[836,936,938],{"class":838,"line":937},17,[836,939,940],{"class":842},"        fastapi --> summary\n",[836,942,944],{"class":838,"line":943},18,[836,945,946],{"class":842},"        fastapi --> verify\n",[836,948,950],{"class":838,"line":949},19,[836,951,952],{"class":842},"        fastapi --> scan\n",[836,954,956],{"class":838,"line":955},20,[836,957,958],{"class":842},"        fastapi --> info\n",[836,960,962],{"class":838,"line":961},21,[836,963,891],{"class":842},[836,965,967],{"class":838,"line":966},22,[836,968,898],{"emptyLinePlaceholder":897},[836,970,972],{"class":838,"line":971},23,[836,973,974],{"class":842},"    subgraph PythonPkg[\"mtl_c2pa_server (in this repo)\"]\n",[836,976,978],{"class":838,"line":977},24,[836,979,980],{"class":842},"        c2pamod[\"c2pa.py (parser)\"]\n",[836,982,984],{"class":838,"line":983},25,[836,985,986],{"class":842},"        reader[\"c2pa-python Reader\u003Cbr/>(Rust binding)\"]\n",[836,988,990],{"class":838,"line":989},26,[836,991,992],{"class":842},"        c2pamod --> reader\n",[836,994,996],{"class":838,"line":995},27,[836,997,891],{"class":842},[836,999,1001],{"class":838,"line":1000},28,[836,1002,898],{"emptyLinePlaceholder":897},[836,1004,1006],{"class":838,"line":1005},29,[836,1007,1008],{"class":842},"    node -->|POST /summary| fastapi\n",[836,1010,1012],{"class":838,"line":1011},30,[836,1013,1014],{"class":842},"    fastapi -->|import| c2pamod\n",[836,1016,1018],{"class":838,"line":1017},31,[836,1019,898],{"emptyLinePlaceholder":897},[836,1021,1023],{"class":838,"line":1022},32,[836,1024,1025],{"class":842},"    launchd[\"launchd plist\u003Cbr/>auto-start on login\"]\n",[836,1027,1029],{"class":838,"line":1028},33,[836,1030,1031],{"class":842},"    launchd -.->|spawn| fastapi\n",[749,1033,1034],{},"Three sentences:",[1036,1037,1038,1053,1063],"ol",{},[1039,1040,1041,1042,1044,1045,1048,1049,1052],"li",{},"A LiveAPI observer in the ",[780,1043,816],{}," object watches ",[780,1046,1047],{},"live_set view detail_clip",". When the selection changes, it pulls the clip's ",[780,1050,1051],{},"file_path",".",[1039,1054,1055,1056,1059,1060,1052],{},"The path flows into a Node for Max script, which ",[780,1057,1058],{},"POST","s it to ",[780,1061,1062],{},"http://127.0.0.1:8765/summary",[1039,1064,1065,1066,1069,1070,1079,1080,1052],{},"The local FastAPI server is shipped in this same repo as the device — a small Python package (",[780,1067,1068],{},"mtl_c2pa_server",") that wraps the ",[753,1071,1075,1076],{"href":1072,"rel":1073},"https://github.com/contentauth/c2pa-python",[1074],"nofollow","official ",[780,1077,1078],{},"c2pa-python"," Rust binding. One clone, one ",[780,1081,1082],{},"poetry install",[769,1084,1086],{"id":1085},"selection-to-display-end-to-end","Selection-to-display, end to end",[827,1088,1090],{"className":829,"code":1089,"language":831,"meta":832,"style":832},"sequenceDiagram\n    actor User\n    participant Live as Ableton Live\n    participant Device as M4L Device\n    participant Reader as c2pa_reader.js\n    participant Node as c2pa_node.js\n    participant HTTP as mtl-c2pa-http :8765\n    participant Lib as c2pa-python\n\n    User->>Live: click audio clip\n    Live->>Device: detail_clip changed\n    Device->>Reader: observer fires\n    Reader->>Live: get detail_clip.file_path\n    Live-->>Reader: /path/to/lyria.mp3\n    Reader->>Node: outlet \"fetch\" path\n    Node->>HTTP: POST /summary {path}\n    HTTP->>Lib: Reader(mime, stream).json()\n    Lib-->>HTTP: manifest store\n    HTTP-->>Node: summary JSON\n    Node->>Device: outlet \"result\" json\n    Device-->>User: display summary\n",[780,1091,1092,1097,1102,1107,1112,1117,1122,1127,1132,1136,1141,1146,1151,1156,1161,1166,1171,1176,1181,1186,1191],{"__ignoreMap":832},[836,1093,1094],{"class":838,"line":839},[836,1095,1096],{"class":842},"sequenceDiagram\n",[836,1098,1099],{"class":838,"line":846},[836,1100,1101],{"class":842},"    actor User\n",[836,1103,1104],{"class":838,"line":852},[836,1105,1106],{"class":842},"    participant Live as Ableton Live\n",[836,1108,1109],{"class":838,"line":858},[836,1110,1111],{"class":842},"    participant Device as M4L Device\n",[836,1113,1114],{"class":838,"line":864},[836,1115,1116],{"class":842},"    participant Reader as c2pa_reader.js\n",[836,1118,1119],{"class":838,"line":870},[836,1120,1121],{"class":842},"    participant Node as c2pa_node.js\n",[836,1123,1124],{"class":838,"line":876},[836,1125,1126],{"class":842},"    participant HTTP as mtl-c2pa-http :8765\n",[836,1128,1129],{"class":838,"line":882},[836,1130,1131],{"class":842},"    participant Lib as c2pa-python\n",[836,1133,1134],{"class":838,"line":888},[836,1135,898],{"emptyLinePlaceholder":897},[836,1137,1138],{"class":838,"line":894},[836,1139,1140],{"class":842},"    User->>Live: click audio clip\n",[836,1142,1143],{"class":838,"line":901},[836,1144,1145],{"class":842},"    Live->>Device: detail_clip changed\n",[836,1147,1148],{"class":838,"line":907},[836,1149,1150],{"class":842},"    Device->>Reader: observer fires\n",[836,1152,1153],{"class":838,"line":913},[836,1154,1155],{"class":842},"    Reader->>Live: get detail_clip.file_path\n",[836,1157,1158],{"class":838,"line":919},[836,1159,1160],{"class":842},"    Live-->>Reader: /path/to/lyria.mp3\n",[836,1162,1163],{"class":838,"line":925},[836,1164,1165],{"class":842},"    Reader->>Node: outlet \"fetch\" path\n",[836,1167,1168],{"class":838,"line":931},[836,1169,1170],{"class":842},"    Node->>HTTP: POST /summary {path}\n",[836,1172,1173],{"class":838,"line":937},[836,1174,1175],{"class":842},"    HTTP->>Lib: Reader(mime, stream).json()\n",[836,1177,1178],{"class":838,"line":943},[836,1179,1180],{"class":842},"    Lib-->>HTTP: manifest store\n",[836,1182,1183],{"class":838,"line":949},[836,1184,1185],{"class":842},"    HTTP-->>Node: summary JSON\n",[836,1187,1188],{"class":838,"line":955},[836,1189,1190],{"class":842},"    Node->>Device: outlet \"result\" json\n",[836,1192,1193],{"class":838,"line":961},[836,1194,1195],{"class":842},"    Device-->>User: display summary\n",[749,1197,1198,1199,1202],{},"The manual \"Refresh\" button short-circuits the observer and triggers the same ",[780,1200,1201],{},"POST /summary"," call. Same pipeline, different trigger source.",[769,1204,1206],{"id":1205},"why-local-not-cloud-not-cli","Why local, not cloud, not CLI",[749,1208,1209],{},"We considered three options. Local won.",[1211,1212,1219,1232,1244],"div",{"className":1213},[1214,1215,1216,1217,1218],"grid","grid-cols-1","md:grid-cols-3","gap-4","my-8",[1220,1221,1225],"spotlight-card",{"description":1222,"icon":1223,"title":1224},"Simplest, but Python startup costs ~300 ms. On every clip selection. You feel it.","i-lucide-zap","A CLI shell-out per click",[749,1226,1227,1228,1231],{},"We use ",[753,1229,1078],{"href":1072,"rel":1230},[1074],", which wraps the Rust binding. The Python interpreter cold-start is the bottleneck, not the C2PA read itself.",[1220,1233,1237],{"description":1234,"icon":1235,"title":1236},"Right for generation, wrong for reading. You'd upload audio just to inspect a local file.","i-lucide-cloud","Cloud Run",[749,1238,1239,1240,1243],{},"Cloud is what our ",[753,1241,1242],{"href":423},"reference M4L → API article"," uses — and for storing generation events with an audit log, it is the right answer. For reading a manifest already in your file system, it isn't.",[1220,1245,1249],{"description":1246,"icon":1247,"title":1248},"Keeps c2pa-python warm. Loopback only. Reuses the MCP parser without changes.","i-lucide-server","Local FastAPI server",[749,1250,1251,1252,1254],{},"The HTTP layer is ~80 lines wrapping ",[780,1253,1078],{}," directly. Self-contained in this repo — one clone, one install, no separate dependency on the sibling MCP server.",[749,1256,1257,1258,1260],{},"A persistent local FastAPI server keeps ",[780,1259,1078],{}," warm in memory, runs on loopback only (no external attack surface), and reuses the existing MCP parser without changes.",[769,1262,1264],{"id":1263},"what-you-see","What you see",[749,1266,1267],{},"For a Lyria-signed MP3, the device shows the same shape the MCP produces:",[827,1269,1274],{"className":1270,"code":1271,"filename":1272,"language":1273,"meta":832,"style":832},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"file\": \"/Users/you/Music/Sovereign_Ascent.mp3\",\n  \"generator\": {\"name\": \"Google C2PA Core Generator Library\"},\n  \"is_ai_generated\": true,\n  \"actions\": [\n    {\"action\": \"c2pa.created\", \"description\": \"Created by Google Generative AI.\"},\n    {\"action\": \"c2pa.edited\", \"description\": \"Applied imperceptible SynthID watermark.\"}\n  ],\n  \"watermarks\": [\n    {\"description\": \"Applied imperceptible SynthID watermark.\"}\n  ],\n  \"signature_issuer\": \"Google LLC\",\n  \"validation\": \"valid\"\n}\n","c2pa_summary output in Ableton","json",[780,1275,1276,1282,1309,1343,1357,1371,1413,1452,1457,1470,1490,1494,1514,1533],{"__ignoreMap":832},[836,1277,1278],{"class":838,"line":839},[836,1279,1281],{"class":1280},"sMK4o","{\n",[836,1283,1284,1287,1291,1294,1297,1300,1304,1306],{"class":838,"line":846},[836,1285,1286],{"class":1280},"  \"",[836,1288,1290],{"class":1289},"spNyl","file",[836,1292,1293],{"class":1280},"\"",[836,1295,1296],{"class":1280},":",[836,1298,1299],{"class":1280}," \"",[836,1301,1303],{"class":1302},"sfazB","/Users/you/Music/Sovereign_Ascent.mp3",[836,1305,1293],{"class":1280},[836,1307,1308],{"class":1280},",\n",[836,1310,1311,1313,1316,1318,1320,1323,1325,1329,1331,1333,1335,1338,1340],{"class":838,"line":852},[836,1312,1286],{"class":1280},[836,1314,1315],{"class":1289},"generator",[836,1317,1293],{"class":1280},[836,1319,1296],{"class":1280},[836,1321,1322],{"class":1280}," {",[836,1324,1293],{"class":1280},[836,1326,1328],{"class":1327},"sBMFI","name",[836,1330,1293],{"class":1280},[836,1332,1296],{"class":1280},[836,1334,1299],{"class":1280},[836,1336,1337],{"class":1302},"Google C2PA Core Generator Library",[836,1339,1293],{"class":1280},[836,1341,1342],{"class":1280},"},\n",[836,1344,1345,1347,1350,1352,1354],{"class":838,"line":858},[836,1346,1286],{"class":1280},[836,1348,1349],{"class":1289},"is_ai_generated",[836,1351,1293],{"class":1280},[836,1353,1296],{"class":1280},[836,1355,1356],{"class":1280}," true,\n",[836,1358,1359,1361,1364,1366,1368],{"class":838,"line":864},[836,1360,1286],{"class":1280},[836,1362,1363],{"class":1289},"actions",[836,1365,1293],{"class":1280},[836,1367,1296],{"class":1280},[836,1369,1370],{"class":1280}," [\n",[836,1372,1373,1376,1378,1381,1383,1385,1387,1390,1392,1395,1397,1400,1402,1404,1406,1409,1411],{"class":838,"line":870},[836,1374,1375],{"class":1280},"    {",[836,1377,1293],{"class":1280},[836,1379,1380],{"class":1327},"action",[836,1382,1293],{"class":1280},[836,1384,1296],{"class":1280},[836,1386,1299],{"class":1280},[836,1388,1389],{"class":1302},"c2pa.created",[836,1391,1293],{"class":1280},[836,1393,1394],{"class":1280},",",[836,1396,1299],{"class":1280},[836,1398,1399],{"class":1327},"description",[836,1401,1293],{"class":1280},[836,1403,1296],{"class":1280},[836,1405,1299],{"class":1280},[836,1407,1408],{"class":1302},"Created by Google Generative AI.",[836,1410,1293],{"class":1280},[836,1412,1342],{"class":1280},[836,1414,1415,1417,1419,1421,1423,1425,1427,1430,1432,1434,1436,1438,1440,1442,1444,1447,1449],{"class":838,"line":876},[836,1416,1375],{"class":1280},[836,1418,1293],{"class":1280},[836,1420,1380],{"class":1327},[836,1422,1293],{"class":1280},[836,1424,1296],{"class":1280},[836,1426,1299],{"class":1280},[836,1428,1429],{"class":1302},"c2pa.edited",[836,1431,1293],{"class":1280},[836,1433,1394],{"class":1280},[836,1435,1299],{"class":1280},[836,1437,1399],{"class":1327},[836,1439,1293],{"class":1280},[836,1441,1296],{"class":1280},[836,1443,1299],{"class":1280},[836,1445,1446],{"class":1302},"Applied imperceptible SynthID watermark.",[836,1448,1293],{"class":1280},[836,1450,1451],{"class":1280},"}\n",[836,1453,1454],{"class":838,"line":882},[836,1455,1456],{"class":1280},"  ],\n",[836,1458,1459,1461,1464,1466,1468],{"class":838,"line":888},[836,1460,1286],{"class":1280},[836,1462,1463],{"class":1289},"watermarks",[836,1465,1293],{"class":1280},[836,1467,1296],{"class":1280},[836,1469,1370],{"class":1280},[836,1471,1472,1474,1476,1478,1480,1482,1484,1486,1488],{"class":838,"line":894},[836,1473,1375],{"class":1280},[836,1475,1293],{"class":1280},[836,1477,1399],{"class":1327},[836,1479,1293],{"class":1280},[836,1481,1296],{"class":1280},[836,1483,1299],{"class":1280},[836,1485,1446],{"class":1302},[836,1487,1293],{"class":1280},[836,1489,1451],{"class":1280},[836,1491,1492],{"class":838,"line":901},[836,1493,1456],{"class":1280},[836,1495,1496,1498,1501,1503,1505,1507,1510,1512],{"class":838,"line":907},[836,1497,1286],{"class":1280},[836,1499,1500],{"class":1289},"signature_issuer",[836,1502,1293],{"class":1280},[836,1504,1296],{"class":1280},[836,1506,1299],{"class":1280},[836,1508,1509],{"class":1302},"Google LLC",[836,1511,1293],{"class":1280},[836,1513,1308],{"class":1280},[836,1515,1516,1518,1521,1523,1525,1527,1530],{"class":838,"line":913},[836,1517,1286],{"class":1280},[836,1519,1520],{"class":1289},"validation",[836,1522,1293],{"class":1280},[836,1524,1296],{"class":1280},[836,1526,1299],{"class":1280},[836,1528,1529],{"class":1302},"valid",[836,1531,1532],{"class":1280},"\"\n",[836,1534,1535],{"class":838,"line":919},[836,1536,1451],{"class":1280},[749,1538,1539,1540,1543,1544,1547],{},"For an unsigned audio clip you get ",[780,1541,1542],{},"{\"error\": \"No C2PA manifest found\"}",". For a MIDI clip, ",[780,1545,1546],{},"{\"info\": \"MIDI clip — no C2PA manifest applicable\"}",". The Refresh button re-runs the lookup manually.",[769,1549,1551],{"id":1550},"what-this-doesnt-solve","What this doesn't solve",[1553,1554,1555],"warning",{},[749,1556,1557,1558,1561],{},"This is read-side only. The device tells you the C2PA truth that is ",[800,1559,1560],{},"already in the file",". It does not sign anything. It does not tell you what corpus trained the model. Andrew's point still stands.",[749,1563,1564,1565,1568],{},"The C2PA community is working on the harder problem. There is an active conversation in the C2PA group about capturing provenance ",[800,1566,1567],{},"during"," DAW work — signing the project at bounce time, attributing the samples and MIDI sources that went in. That is the generation side. We would like to help build it next.",[769,1570,1572],{"id":1571},"install-and-try-it","Install and try it",[749,1574,1575],{},"You need Ableton Live with Max for Live (Live Suite, or Standard plus the M4L add-on), and macOS for the auto-start script.",[827,1577,1582],{"className":1578,"code":1579,"filename":1580,"language":1581,"meta":832,"style":832},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Clone and install (one-time)\ngit clone https://github.com/musictechlab/mtl-c2pa-ableton.git\ncd mtl-c2pa-ableton && poetry install\n\n# 2. Auto-start on login (macOS)\nbash install/install.sh\n\n# 3. Verify\ncurl http://127.0.0.1:8765/health\n# {\"status\":\"ok\"}\n\n# 4. Drop the device on a track\n# Drag device/MTL_C2PA_Ableton_PoC.amxd onto any audio track in Live.\n","setup.sh","bash",[780,1583,1584,1590,1601,1619,1623,1628,1635,1639,1644,1652,1657,1661,1666],{"__ignoreMap":832},[836,1585,1586],{"class":838,"line":839},[836,1587,1589],{"class":1588},"sHwdD","# 1. Clone and install (one-time)\n",[836,1591,1592,1595,1598],{"class":838,"line":846},[836,1593,1594],{"class":1327},"git",[836,1596,1597],{"class":1302}," clone",[836,1599,1600],{"class":1302}," https://github.com/musictechlab/mtl-c2pa-ableton.git\n",[836,1602,1603,1607,1610,1613,1616],{"class":838,"line":852},[836,1604,1606],{"class":1605},"s2Zo4","cd",[836,1608,1609],{"class":1302}," mtl-c2pa-ableton",[836,1611,1612],{"class":1280}," &&",[836,1614,1615],{"class":1327}," poetry",[836,1617,1618],{"class":1302}," install\n",[836,1620,1621],{"class":838,"line":858},[836,1622,898],{"emptyLinePlaceholder":897},[836,1624,1625],{"class":838,"line":864},[836,1626,1627],{"class":1588},"# 2. Auto-start on login (macOS)\n",[836,1629,1630,1632],{"class":838,"line":870},[836,1631,1581],{"class":1327},[836,1633,1634],{"class":1302}," install/install.sh\n",[836,1636,1637],{"class":838,"line":876},[836,1638,898],{"emptyLinePlaceholder":897},[836,1640,1641],{"class":838,"line":882},[836,1642,1643],{"class":1588},"# 3. Verify\n",[836,1645,1646,1649],{"class":838,"line":888},[836,1647,1648],{"class":1327},"curl",[836,1650,1651],{"class":1302}," http://127.0.0.1:8765/health\n",[836,1653,1654],{"class":838,"line":894},[836,1655,1656],{"class":1588},"# {\"status\":\"ok\"}\n",[836,1658,1659],{"class":838,"line":901},[836,1660,898],{"emptyLinePlaceholder":897},[836,1662,1663],{"class":838,"line":907},[836,1664,1665],{"class":1588},"# 4. Drop the device on a track\n",[836,1667,1668],{"class":838,"line":913},[836,1669,1670],{"class":1588},"# Drag device/MTL_C2PA_Ableton_PoC.amxd onto any audio track in Live.\n",[749,1672,1673,1674,1052],{},"That's it. Click a Lyria clip — see the manifest. Full setup detail in the ",[753,1675,1678],{"href":1676,"rel":1677},"https://github.com/musictechlab/mtl-c2pa-ableton",[1074],"repo README",[769,1680,1682],{"id":1681},"roadmap","Roadmap",[749,1684,1685,1686,1691],{},"Generation-side device next. The plan is a Max for Live effect that signs the project at bounce time and emits a C2PA manifest describing the session's ingredients — samples, MIDI sources, plugin chain. We would like input from the ",[753,1687,1690],{"href":1688,"rel":1689},"https://c2pa.org/community/",[1074],"C2PA community"," before settling on the assertion shape.",[749,1693,1694],{},"If you are interested in the broader open-source MCP family we have shipped:",[1211,1696,1699,1707,1715,1723],{"className":1697},[1214,1215,1698,1217,1218],"md:grid-cols-2",[1220,1700,1704],{"description":1701,"icon":1702,"title":1703,"to":173},"Read and write ID3, FLAC, and Vorbis tags from Claude — siblings on the metadata layer.","i-lucide-tag","mtl-metadata-mcp",[749,1705,1706],{},"ISRCs, artist, album, year — the rights-and-identifier layer that complements C2PA's provenance layer.",[1220,1708,1712],{"description":1709,"icon":1710,"title":1711,"to":591},"Complementary provenance: VHC says a human made this; C2PA says how it was made.","i-lucide-user-check","Verified Human Cert MCP",[749,1713,1714],{},"Together they answer the two questions about an AI-suspect track: was it made by a human, and what does the file declare about its origin?",[1220,1716,1720],{"description":1717,"icon":1718,"title":1719,"to":169},"Natural-language queries over Bandcamp revenue CSVs from Claude.","i-lucide-bar-chart-3","mtl-bandcamp-mcp",[749,1721,1722],{},"The same MCP-server pattern, different data source. Wraps the official Bandcamp Sales Report exports.",[1220,1724,1728],{"description":1725,"icon":1726,"title":1727,"to":141},"Adjacent metadata extraction — going below the LiveAPI layer.","i-lucide-file-search","Inside .als and .asd files",[749,1729,1730],{},"For when you need to read an Ableton project without opening Ableton — same Max for Live series, different angle.",[769,1732,1734],{"id":1733},"try-it-break-it-send-feedback","Try it, break it, send feedback",[749,1736,1737,1738,1742],{},"The device is MIT-licensed. Repo: ",[753,1739,1741],{"href":1676,"rel":1740},[1074],"musictechlab/mtl-c2pa-ableton",". Issues and PRs welcome. If you build something on top of the local HTTP server (a Logic plugin, a REAPER script, a standalone viewer), tell us — same pattern works for any DAW that can shell out to localhost.",[1744,1745],"hr",{},[769,1747,1749],{"id":1748},"need-help-integrating-c2pa-into-your-music-workflow","Need help integrating C2PA into your music workflow?",[749,1751,1752],{},"Adding provenance to your distribution pipeline, AI music platform, DAW plugin, or rights workflow? We have been there.",[749,1754,1755,1759],{},[753,1756,1758],{"href":1757},"/contact","Let's talk"," — no sales pitch, just honest engineering advice.",[1761,1762,1763],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":832,"searchDepth":846,"depth":846,"links":1765},[1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776],{"id":771,"depth":846,"text":772},{"id":806,"depth":846,"text":807},{"id":824,"depth":846,"text":825},{"id":1085,"depth":846,"text":1086},{"id":1205,"depth":846,"text":1206},{"id":1263,"depth":846,"text":1264},{"id":1550,"depth":846,"text":1551},{"id":1571,"depth":846,"text":1572},{"id":1681,"depth":846,"text":1682},{"id":1733,"depth":846,"text":1734},{"id":1748,"depth":846,"text":1749},"software-development",null,"2026-05-29T00:00:00.000Z","In May 2026 we shipped an MCP for reading C2PA manifests in music. This post is the follow-up: the same reader, now inside Ableton Live as an open-source Max for Live device.","md",[1783,1786,1789,1792,1795],{"question":1784,"answer":1785},"Why a local HTTP server instead of a CLI shell-out or a cloud API?","Python startup takes about 300 ms, which you feel on every clip click. A persistent local server keeps c2pa-python warm in memory. Cloud would mean uploading audio to a server just to inspect a file the user already has on disk — wrong shape for reading, right shape for generation.",{"question":1787,"answer":1788},"Does the device work without the Max for Live add-on?","No. You need Ableton Live Suite (which includes Max for Live), or Ableton Live Standard with the Max for Live add-on. The device is a .amxd file — it cannot run as a stock VST or AU plugin.",{"question":1790,"answer":1791},"Does the device upload my audio anywhere?","No. The FastAPI server binds to 127.0.0.1 only — loopback. No external network access. The Node for Max HTTP client only ever talks to your own machine. You can verify with `lsof -i :8765` while the server runs.",{"question":1793,"answer":1794},"What happens with MIDI clips or recorded audio that has no source file?","The device returns a structured info message: MIDI clip — no C2PA manifest applicable, or audio clip has no file path (recorded in session?). It never crashes the device, never blocks Live.",{"question":1796,"answer":1797},"Will this device tell me whose work trained the model that generated my Lyria stem?","No, and that is the next problem the C2PA community is working on. This device surfaces the output manifest — what Google Lyria declared about the file. Training-corpus attribution requires upstream provenance on the training data itself, which almost no major dataset is C2PA-signed today.",{"src":1799},"/images/blog/musictechlab_blog_c2pa-in-ableton-hero.webp",{"enabled":897,"items":1801},[1802,1805,1808,1811],{"text":1803,"icon":1804},"Google Lyria signs every generated MP3 with a C2PA manifest, but Ableton has no way to display that information today.","i-lucide-eye-off",{"text":1806,"icon":1807},"A Max for Live device + local FastAPI server makes the manifest visible the moment you click a clip.","i-lucide-mouse-pointer-click",{"text":1809,"icon":1810},"All in one repo — Python HTTP server + Max for Live device. One clone, one install, no cloud round-trip.","i-lucide-package",{"text":1812,"icon":1813},"Read-side only — the harder problem (signing the DAW project, attributing the training corpus) is next.","i-lucide-arrow-right",{},{"title":1816,"description":1817},"C2PA in Ableton: Open-Source Max for Live Device | MusicTech Lab","Open-source Max for Live device that displays C2PA provenance manifests for the selected audio clip in Ableton Live. Read Lyria signatures inside your DAW.",[1819,1820,1821,1822,1823,1824,1825],"C2PA","Ableton","max-for-live","provenance","AI","MCP","open-source","f14gknzOHNEQ-GY8JJpiBZPV1xYNtcLHzKhVg9vpE9w",[1828,1830],{"title":406,"path":407,"stem":408,"description":1829,"children":-1},"Build a physical MIDI volume controller for Ableton Live using Arduino Leonardo. Covers hardware setup, MIDI protocol, and USB communication.",{"title":414,"path":415,"stem":416,"description":1831,"children":-1},"Change Detection mechanism in Angular js web development services. How to handle with ExpressionChangedAfterItHasBeenCheckedError",[1833,3165,4007,4797],{"id":1834,"title":124,"authors":1835,"badge":1838,"body":1839,"category":3124,"client":1778,"date":3125,"description":3126,"extension":1781,"faq":3127,"featured":69,"featuredOrder":1778,"hidden":69,"image":3143,"keyTakeaways":3145,"meta":3158,"navigation":897,"path":125,"seo":3159,"status":1778,"stem":126,"tags":3162,"teaser":1778,"__hash__":3164,"score":858},"posts/blog/music-data/c2pa-in-music-mcp.md",[1836],{"name":738,"to":739,"avatar":1837},{"src":741},{"label":743,"color":744},{"type":746,"value":1840,"toc":3114},[1841,1864,1875,1879,1882,1885,1913,1916,1936,1940,1943,2290,2296,2300,2311,2346,2350,2356,2368,2377,2380,2388,2391,2468,2471,2481,2484,2491,2498,2741,2748,2754,2766,2773,2779,2790,2794,2797,2810,2815,2818,2822,2825,2968,2971,2975,3097,3099,3103,3106,3111],[749,1842,1843,1844,1849,1850,1855,1856,1860,1861,1052],{},"A ",[753,1845,1848],{"href":1846,"rel":1847},"https://www.linkedin.com/feed/update/urn:li:activity:7462923455760396288/",[1074],"LinkedIn post by Dawid Owczarek"," stopped my scroll: ",[753,1851,1854],{"href":1852,"rel":1853},"https://deepmind.google/technologies/lyria/",[1074],"Google Lyria"," is now embedding ",[753,1857,1819],{"href":1858,"rel":1859},"https://c2pa.org/",[1074]," manifests inside the MP3s you download from it. I went and checked, and yes, the file really does contain a cryptographically signed manifest declaring who made the track, what tool produced it, and what watermark was applied. That sent me down a rabbit hole, and this post is the result. The headline, though, is not Lyria. The headline is ",[793,1862,1863],{},"C2PA itself, finally arriving in audio",[749,1865,1866,1867,1870,1871,1874],{},"If you work in music, you have spent years living with ISRC, ISWC, ISNI, and DDEX. Those standards answer the question ",[800,1868,1869],{},"who owns this recording",". C2PA answers a different question: ",[800,1872,1873],{},"who created it, and how",". That is the layer music has been missing, and the layer AI makes urgent.",[769,1876,1878],{"id":1877},"what-c2pa-actually-is","What C2PA actually is",[749,1880,1881],{},"C2PA stands for the Coalition for Content Provenance and Authenticity. It is a JDF-hosted open standard, founded in 2021 by Adobe, Microsoft, Intel, BBC, and others, with Google joining as a steering member shortly after. The spec defines a binary container that lives inside a media file and carries a cryptographically signed history of how that file came to be.",[749,1883,1884],{},"A C2PA manifest contains:",[1886,1887,1888,1894,1901,1907],"ul",{},[1039,1889,1843,1890,1893],{},[793,1891,1892],{},"claim generator"," identifying the software that created the manifest",[1039,1895,1896,1897,1900],{},"A list of ",[793,1898,1899],{},"assertions"," (actions, hashes, training data declarations, soft bindings)",[1039,1902,1903,1906],{},[793,1904,1905],{},"Ingredients"," describing source assets used as inputs",[1039,1908,1843,1909,1912],{},[793,1910,1911],{},"signature"," that ties everything to a known certificate issuer",[749,1914,1915],{},"The whole thing is designed to be self-contained and tamper-evident. You can rename a file, strip its ID3 tags, or re-encode the audio, and the manifest either travels with the file intact or breaks in a detectable way.",[788,1917,1918],{},[749,1919,1920,1921,1926,1927,1931,1932,1935],{},"C2PA does not prove a file is original, copyright-free, or ",[753,1922,1925],{"href":1923,"rel":1924},"https://verifiedhumancert.com/",[1074],"human-made",". It proves a verifiable chain of declarations: this software signed this claim, on this date, about this content. That distinction is the foundation everything else builds on. For the human-made angle specifically, separate efforts like ",[753,1928,1930],{"href":1923,"rel":1929},[1074],"Verified Human Cert"," issue cryptographic certifications that a track was created by people, not AI — a complementary layer to C2PA's provenance trail. We open-sourced ",[753,1933,1934],{"href":591},"an MCP server for the VHC registry"," earlier this year, if you want to query it from Claude alongside this C2PA MCP.",[769,1937,1939],{"id":1938},"what-google-lyria-proved","What Google Lyria proved",[749,1941,1942],{},"The clearest sign that audio C2PA has crossed the line from spec to product is what Google shipped in Lyria. When you download a Lyria-generated MP3, the file contains a fully populated C2PA manifest. Here is a snippet from a track I generated, abbreviated for clarity:",[827,1944,1947],{"className":1270,"code":1945,"filename":1946,"language":1273,"meta":832,"style":832},"{\n  \"active_manifest\": \"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1\",\n  \"manifests\": {\n    \"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1\": {\n      \"claim_generator_info\": [\n        {\n          \"name\": \"Google C2PA Core Generator Library\",\n          \"version\": \"916434528:916944653\"\n        }\n      ],\n      \"assertions\": [\n        {\n          \"label\": \"c2pa.actions.v2\",\n          \"data\": {\n            \"actions\": [\n              {\n                \"action\": \"c2pa.created\",\n                \"digitalSourceType\": \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\",\n                \"description\": \"Created by Google Generative AI.\"\n              },\n              {\n                \"action\": \"c2pa.edited\",\n                \"digitalSourceType\": \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\",\n                \"description\": \"Applied imperceptible SynthID watermark.\"\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n}\n","lyria-manifest.json",[780,1948,1949,1953,1973,1987,2000,2015,2020,2040,2058,2063,2068,2080,2084,2104,2117,2131,2136,2155,2175,2191,2196,2200,2218,2236,2252,2257,2262,2267,2271,2276,2281,2286],{"__ignoreMap":832},[836,1950,1951],{"class":838,"line":839},[836,1952,1281],{"class":1280},[836,1954,1955,1957,1960,1962,1964,1966,1969,1971],{"class":838,"line":846},[836,1956,1286],{"class":1280},[836,1958,1959],{"class":1289},"active_manifest",[836,1961,1293],{"class":1280},[836,1963,1296],{"class":1280},[836,1965,1299],{"class":1280},[836,1967,1968],{"class":1302},"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1",[836,1970,1293],{"class":1280},[836,1972,1308],{"class":1280},[836,1974,1975,1977,1980,1982,1984],{"class":838,"line":852},[836,1976,1286],{"class":1280},[836,1978,1979],{"class":1289},"manifests",[836,1981,1293],{"class":1280},[836,1983,1296],{"class":1280},[836,1985,1986],{"class":1280}," {\n",[836,1988,1989,1992,1994,1996,1998],{"class":838,"line":858},[836,1990,1991],{"class":1280},"    \"",[836,1993,1968],{"class":1327},[836,1995,1293],{"class":1280},[836,1997,1296],{"class":1280},[836,1999,1986],{"class":1280},[836,2001,2002,2005,2009,2011,2013],{"class":838,"line":864},[836,2003,2004],{"class":1280},"      \"",[836,2006,2008],{"class":2007},"sbssI","claim_generator_info",[836,2010,1293],{"class":1280},[836,2012,1296],{"class":1280},[836,2014,1370],{"class":1280},[836,2016,2017],{"class":838,"line":870},[836,2018,2019],{"class":1280},"        {\n",[836,2021,2022,2025,2028,2030,2032,2034,2036,2038],{"class":838,"line":876},[836,2023,2024],{"class":1280},"          \"",[836,2026,1328],{"class":2027},"swJcz",[836,2029,1293],{"class":1280},[836,2031,1296],{"class":1280},[836,2033,1299],{"class":1280},[836,2035,1337],{"class":1302},[836,2037,1293],{"class":1280},[836,2039,1308],{"class":1280},[836,2041,2042,2044,2047,2049,2051,2053,2056],{"class":838,"line":882},[836,2043,2024],{"class":1280},[836,2045,2046],{"class":2027},"version",[836,2048,1293],{"class":1280},[836,2050,1296],{"class":1280},[836,2052,1299],{"class":1280},[836,2054,2055],{"class":1302},"916434528:916944653",[836,2057,1532],{"class":1280},[836,2059,2060],{"class":838,"line":888},[836,2061,2062],{"class":1280},"        }\n",[836,2064,2065],{"class":838,"line":894},[836,2066,2067],{"class":1280},"      ],\n",[836,2069,2070,2072,2074,2076,2078],{"class":838,"line":901},[836,2071,2004],{"class":1280},[836,2073,1899],{"class":2007},[836,2075,1293],{"class":1280},[836,2077,1296],{"class":1280},[836,2079,1370],{"class":1280},[836,2081,2082],{"class":838,"line":907},[836,2083,2019],{"class":1280},[836,2085,2086,2088,2091,2093,2095,2097,2100,2102],{"class":838,"line":913},[836,2087,2024],{"class":1280},[836,2089,2090],{"class":2027},"label",[836,2092,1293],{"class":1280},[836,2094,1296],{"class":1280},[836,2096,1299],{"class":1280},[836,2098,2099],{"class":1302},"c2pa.actions.v2",[836,2101,1293],{"class":1280},[836,2103,1308],{"class":1280},[836,2105,2106,2108,2111,2113,2115],{"class":838,"line":919},[836,2107,2024],{"class":1280},[836,2109,2110],{"class":2027},"data",[836,2112,1293],{"class":1280},[836,2114,1296],{"class":1280},[836,2116,1986],{"class":1280},[836,2118,2119,2122,2125,2127,2129],{"class":838,"line":925},[836,2120,2121],{"class":1280},"            \"",[836,2123,1363],{"class":2124},"su27w",[836,2126,1293],{"class":1280},[836,2128,1296],{"class":1280},[836,2130,1370],{"class":1280},[836,2132,2133],{"class":838,"line":931},[836,2134,2135],{"class":1280},"              {\n",[836,2137,2138,2141,2143,2145,2147,2149,2151,2153],{"class":838,"line":937},[836,2139,2140],{"class":1280},"                \"",[836,2142,1380],{"class":1605},[836,2144,1293],{"class":1280},[836,2146,1296],{"class":1280},[836,2148,1299],{"class":1280},[836,2150,1389],{"class":1302},[836,2152,1293],{"class":1280},[836,2154,1308],{"class":1280},[836,2156,2157,2159,2162,2164,2166,2168,2171,2173],{"class":838,"line":943},[836,2158,2140],{"class":1280},[836,2160,2161],{"class":1605},"digitalSourceType",[836,2163,1293],{"class":1280},[836,2165,1296],{"class":1280},[836,2167,1299],{"class":1280},[836,2169,2170],{"class":1302},"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia",[836,2172,1293],{"class":1280},[836,2174,1308],{"class":1280},[836,2176,2177,2179,2181,2183,2185,2187,2189],{"class":838,"line":949},[836,2178,2140],{"class":1280},[836,2180,1399],{"class":1605},[836,2182,1293],{"class":1280},[836,2184,1296],{"class":1280},[836,2186,1299],{"class":1280},[836,2188,1408],{"class":1302},[836,2190,1532],{"class":1280},[836,2192,2193],{"class":838,"line":955},[836,2194,2195],{"class":1280},"              },\n",[836,2197,2198],{"class":838,"line":961},[836,2199,2135],{"class":1280},[836,2201,2202,2204,2206,2208,2210,2212,2214,2216],{"class":838,"line":966},[836,2203,2140],{"class":1280},[836,2205,1380],{"class":1605},[836,2207,1293],{"class":1280},[836,2209,1296],{"class":1280},[836,2211,1299],{"class":1280},[836,2213,1429],{"class":1302},[836,2215,1293],{"class":1280},[836,2217,1308],{"class":1280},[836,2219,2220,2222,2224,2226,2228,2230,2232,2234],{"class":838,"line":971},[836,2221,2140],{"class":1280},[836,2223,2161],{"class":1605},[836,2225,1293],{"class":1280},[836,2227,1296],{"class":1280},[836,2229,1299],{"class":1280},[836,2231,2170],{"class":1302},[836,2233,1293],{"class":1280},[836,2235,1308],{"class":1280},[836,2237,2238,2240,2242,2244,2246,2248,2250],{"class":838,"line":977},[836,2239,2140],{"class":1280},[836,2241,1399],{"class":1605},[836,2243,1293],{"class":1280},[836,2245,1296],{"class":1280},[836,2247,1299],{"class":1280},[836,2249,1446],{"class":1302},[836,2251,1532],{"class":1280},[836,2253,2254],{"class":838,"line":983},[836,2255,2256],{"class":1280},"              }\n",[836,2258,2259],{"class":838,"line":989},[836,2260,2261],{"class":1280},"            ]\n",[836,2263,2264],{"class":838,"line":995},[836,2265,2266],{"class":1280},"          }\n",[836,2268,2269],{"class":838,"line":1000},[836,2270,2062],{"class":1280},[836,2272,2273],{"class":838,"line":1005},[836,2274,2275],{"class":1280},"      ]\n",[836,2277,2278],{"class":838,"line":1011},[836,2279,2280],{"class":1280},"    }\n",[836,2282,2283],{"class":838,"line":1017},[836,2284,2285],{"class":1280},"  }\n",[836,2287,2288],{"class":838,"line":1022},[836,2289,1451],{"class":1280},[749,2291,2292,2293,2295],{},"This is a real-world example of every piece of the spec working in audio: claim generator, signed actions, IPTC ",[780,2294,2161],{}," URI for AI disclosure, and a SynthID watermark recorded as a c2pa.edited action. The whole manifest is signed by Google LLC.",[769,2297,2299],{"id":2298},"why-c2pa-matters-for-the-music-industry","Why C2PA matters for the music industry",[749,2301,2302,2303,2306,2307,2310],{},"Music has spent years building IDs and registries to answer ",[800,2304,2305],{},"ownership",". C2PA layers on top to answer ",[800,2308,2309],{},"origin",". The combination changes several workflows materially.",[1211,2312,2314,2322,2330,2338],{"className":2313},[1214,1215,1698,1217,1218],[1220,2315,2319],{"description":2316,"icon":2317,"title":2318},"A signed declaration of how a track was created is a better input than after-the-fact AI detection.","i-lucide-receipt","Rights and royalties",[749,2320,2321],{},"PROs, labels, and rights administrators are scrambling to define how AI-generated tracks fit existing royalty flows. A C2PA manifest gives them deterministic input rather than a probabilistic classifier verdict.",[1220,2323,2327],{"description":2324,"icon":2325,"title":2326},"Streaming platforms need machine-readable AI flags for listener disclosure and licensing math.","i-lucide-radio","DSP compliance",[749,2328,2329],{},"Apple Music, Spotify, Deezer, and others increasingly need to badge or filter AI content. A preserved C2PA manifest is a verifiable trigger they can rely on.",[1220,2331,2335],{"description":2332,"icon":2333,"title":2334},"A C2PA check at delivery time sits naturally alongside DDEX validation.","i-lucide-upload","Distributor ingestion checks",[749,2336,2337],{},"If a track claims to be a human performance but the manifest says trainedAlgorithmicMedia, that is now a deterministic flag, not a guess.",[1220,2339,2343],{"description":2340,"icon":2341,"title":2342},"AI music libraries can require C2PA on every clip and reject unsigned submissions.","i-lucide-library","Catalog hygiene for AI",[749,2344,2345],{},"The cost of attaching a manifest at generation time is near zero. The cost of cleaning up an unsigned catalog later is enormous.",[769,2347,2349],{"id":2348},"reading-c2pa-in-plain-english-with-claude","Reading C2PA in plain English with Claude",[749,2351,2352,2353,2355],{},"The official tool for reading C2PA is the Rust ",[780,2354,782],{}," binary. It works, but the output is raw JSON, and few people in the music industry will install a Rust CLI to inspect a download.",[749,2357,2358,2359,2364,2365,2367],{},"So we built ",[753,2360,2363],{"href":2361,"rel":2362},"https://github.com/musictechlab/mtl-c2pa-mcp",[1074],"mtl-c2pa-mcp",", an open-source MCP server that wraps the official ",[780,2366,1078],{}," library and exposes it as tools inside Claude Code.",[2369,2370,2371],"tip",{},[749,2372,2373,2374,2376],{},"The MCP runs locally. Your audio files never leave your machine. ",[780,2375,1078],{}," is the official Adobe Rust binding, the same engine that powers the c2patool CLI.",[749,2378,2379],{},"The server exposes seven tools:",[827,2381,2386],{"className":2382,"code":2384,"language":2385,"meta":832},[2383],"language-text","c2pa_summary       Human-friendly overview: generator, AI flag, actions, watermark, signature\nc2pa_read          Full raw manifest store\nc2pa_assertions    All assertions from the active manifest\nc2pa_ingredients   Source assets used to create this file\nc2pa_verify        Signature issuer, validation state, failures\nc2pa_scan          Audit a folder: which files carry C2PA, which are AI-generated\nc2pa_info          Library version and supported MIME types\n","text",[780,2387,2384],{"__ignoreMap":832},[749,2389,2390],{},"Install once:",[827,2392,2394],{"className":1578,"code":2393,"language":1581,"meta":832,"style":832},"git clone https://github.com/musictechlab/mtl-c2pa-mcp.git\ncd mtl-c2pa-mcp\npoetry install\nclaude mcp add -s user mtl-c2pa -- poetry --directory $(pwd) run python -m mtl_c2pa\n",[780,2395,2396,2405,2412,2419],{"__ignoreMap":832},[836,2397,2398,2400,2402],{"class":838,"line":839},[836,2399,1594],{"class":1327},[836,2401,1597],{"class":1302},[836,2403,2404],{"class":1302}," https://github.com/musictechlab/mtl-c2pa-mcp.git\n",[836,2406,2407,2409],{"class":838,"line":846},[836,2408,1606],{"class":1605},[836,2410,2411],{"class":1302}," mtl-c2pa-mcp\n",[836,2413,2414,2417],{"class":838,"line":852},[836,2415,2416],{"class":1327},"poetry",[836,2418,1618],{"class":1302},[836,2420,2421,2424,2427,2430,2433,2436,2439,2442,2444,2447,2450,2453,2456,2459,2462,2465],{"class":838,"line":858},[836,2422,2423],{"class":1327},"claude",[836,2425,2426],{"class":1302}," mcp",[836,2428,2429],{"class":1302}," add",[836,2431,2432],{"class":1302}," -s",[836,2434,2435],{"class":1302}," user",[836,2437,2438],{"class":1302}," mtl-c2pa",[836,2440,2441],{"class":1302}," --",[836,2443,1615],{"class":1302},[836,2445,2446],{"class":1302}," --directory",[836,2448,2449],{"class":1280}," $(",[836,2451,2452],{"class":1605},"pwd",[836,2454,2455],{"class":1280},")",[836,2457,2458],{"class":1302}," run",[836,2460,2461],{"class":1302}," python",[836,2463,2464],{"class":1302}," -m",[836,2466,2467],{"class":1302}," mtl_c2pa\n",[749,2469,2470],{},"Then ask Claude in plain English:",[2472,2473,2474],"blockquote",{},[749,2475,2476,2477,2480],{},"\"What does the C2PA manifest in ",[780,2478,2479],{},"~/Downloads/track.mp3"," say?\"",[749,2482,2483],{},"Claude finds the file, calls the MCP, and renders the manifest as a clean table:",[749,2485,2486],{},[2487,2488],"img",{"alt":2489,"src":2490},"C2PA manifest summary rendered in Claude Code for a Lyria-generated MP3","/images/blog/musictechlab_blog_c2pa-in-music-mcp-claude-example.webp",[749,2492,2493,2494,2497],{},"Under the hood, that's the JSON the ",[780,2495,2496],{},"c2pa_summary"," tool returns:",[827,2499,2502],{"className":1270,"code":2500,"filename":2501,"language":1273,"meta":832,"style":832},"{\n  \"file\": \"/Users/you/Downloads/track.mp3\",\n  \"generator\": {\n    \"name\": \"Google C2PA Core Generator Library\",\n    \"version\": \"916434528:916944653\"\n  },\n  \"is_ai_generated\": true,\n  \"digital_source_types\": [\n    \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\"\n  ],\n  \"actions\": [\n    {\"action\": \"c2pa.created\", \"description\": \"Created by Google Generative AI.\"},\n    {\"action\": \"c2pa.edited\",  \"description\": \"Applied imperceptible SynthID watermark.\"}\n  ],\n  \"signature_issuer\": \"Google LLC\",\n  \"validation\": \"valid\"\n}\n","c2pa_summary output",[780,2503,2504,2508,2527,2539,2557,2573,2578,2590,2603,2611,2615,2627,2663,2699,2703,2721,2737],{"__ignoreMap":832},[836,2505,2506],{"class":838,"line":839},[836,2507,1281],{"class":1280},[836,2509,2510,2512,2514,2516,2518,2520,2523,2525],{"class":838,"line":846},[836,2511,1286],{"class":1280},[836,2513,1290],{"class":1289},[836,2515,1293],{"class":1280},[836,2517,1296],{"class":1280},[836,2519,1299],{"class":1280},[836,2521,2522],{"class":1302},"/Users/you/Downloads/track.mp3",[836,2524,1293],{"class":1280},[836,2526,1308],{"class":1280},[836,2528,2529,2531,2533,2535,2537],{"class":838,"line":852},[836,2530,1286],{"class":1280},[836,2532,1315],{"class":1289},[836,2534,1293],{"class":1280},[836,2536,1296],{"class":1280},[836,2538,1986],{"class":1280},[836,2540,2541,2543,2545,2547,2549,2551,2553,2555],{"class":838,"line":858},[836,2542,1991],{"class":1280},[836,2544,1328],{"class":1327},[836,2546,1293],{"class":1280},[836,2548,1296],{"class":1280},[836,2550,1299],{"class":1280},[836,2552,1337],{"class":1302},[836,2554,1293],{"class":1280},[836,2556,1308],{"class":1280},[836,2558,2559,2561,2563,2565,2567,2569,2571],{"class":838,"line":864},[836,2560,1991],{"class":1280},[836,2562,2046],{"class":1327},[836,2564,1293],{"class":1280},[836,2566,1296],{"class":1280},[836,2568,1299],{"class":1280},[836,2570,2055],{"class":1302},[836,2572,1532],{"class":1280},[836,2574,2575],{"class":838,"line":870},[836,2576,2577],{"class":1280},"  },\n",[836,2579,2580,2582,2584,2586,2588],{"class":838,"line":876},[836,2581,1286],{"class":1280},[836,2583,1349],{"class":1289},[836,2585,1293],{"class":1280},[836,2587,1296],{"class":1280},[836,2589,1356],{"class":1280},[836,2591,2592,2594,2597,2599,2601],{"class":838,"line":882},[836,2593,1286],{"class":1280},[836,2595,2596],{"class":1289},"digital_source_types",[836,2598,1293],{"class":1280},[836,2600,1296],{"class":1280},[836,2602,1370],{"class":1280},[836,2604,2605,2607,2609],{"class":838,"line":888},[836,2606,1991],{"class":1280},[836,2608,2170],{"class":1302},[836,2610,1532],{"class":1280},[836,2612,2613],{"class":838,"line":894},[836,2614,1456],{"class":1280},[836,2616,2617,2619,2621,2623,2625],{"class":838,"line":901},[836,2618,1286],{"class":1280},[836,2620,1363],{"class":1289},[836,2622,1293],{"class":1280},[836,2624,1296],{"class":1280},[836,2626,1370],{"class":1280},[836,2628,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661],{"class":838,"line":907},[836,2630,1375],{"class":1280},[836,2632,1293],{"class":1280},[836,2634,1380],{"class":1327},[836,2636,1293],{"class":1280},[836,2638,1296],{"class":1280},[836,2640,1299],{"class":1280},[836,2642,1389],{"class":1302},[836,2644,1293],{"class":1280},[836,2646,1394],{"class":1280},[836,2648,1299],{"class":1280},[836,2650,1399],{"class":1327},[836,2652,1293],{"class":1280},[836,2654,1296],{"class":1280},[836,2656,1299],{"class":1280},[836,2658,1408],{"class":1302},[836,2660,1293],{"class":1280},[836,2662,1342],{"class":1280},[836,2664,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697],{"class":838,"line":913},[836,2666,1375],{"class":1280},[836,2668,1293],{"class":1280},[836,2670,1380],{"class":1327},[836,2672,1293],{"class":1280},[836,2674,1296],{"class":1280},[836,2676,1299],{"class":1280},[836,2678,1429],{"class":1302},[836,2680,1293],{"class":1280},[836,2682,1394],{"class":1280},[836,2684,1286],{"class":1280},[836,2686,1399],{"class":1327},[836,2688,1293],{"class":1280},[836,2690,1296],{"class":1280},[836,2692,1299],{"class":1280},[836,2694,1446],{"class":1302},[836,2696,1293],{"class":1280},[836,2698,1451],{"class":1280},[836,2700,2701],{"class":838,"line":919},[836,2702,1456],{"class":1280},[836,2704,2705,2707,2709,2711,2713,2715,2717,2719],{"class":838,"line":925},[836,2706,1286],{"class":1280},[836,2708,1500],{"class":1289},[836,2710,1293],{"class":1280},[836,2712,1296],{"class":1280},[836,2714,1299],{"class":1280},[836,2716,1509],{"class":1302},[836,2718,1293],{"class":1280},[836,2720,1308],{"class":1280},[836,2722,2723,2725,2727,2729,2731,2733,2735],{"class":838,"line":931},[836,2724,1286],{"class":1280},[836,2726,1520],{"class":1289},[836,2728,1293],{"class":1280},[836,2730,1296],{"class":1280},[836,2732,1299],{"class":1280},[836,2734,1529],{"class":1302},[836,2736,1532],{"class":1280},[836,2738,2739],{"class":838,"line":937},[836,2740,1451],{"class":1280},[749,2742,2743,2744,2747],{},"Ask for the full manifest store and ",[780,2745,2746],{},"c2pa_read"," returns everything, including the signing certificate metadata, claim version, and validation status:",[749,2749,2750],{},[2487,2751],{"alt":2752,"src":2753},"Raw C2PA manifest JSON returned by c2pa_read in Claude Code","/images/blog/musictechlab_blog_c2pa-in-music-mcp-raw-json.webp",[788,2755,2756],{},[749,2757,2758,2759,2762,2763,2765],{},"Notice the ",[780,2760,2761],{},"signingCredential.untrusted"," flag in that output. The manifest itself is structurally valid, but Google's signing certificate is not yet in the default trust list shipped with ",[780,2764,1078],{},". That is not a forgery signal, just a reminder that trust lists are a separate, evolving piece of the C2PA infrastructure. Compliance workflows have to pin the trust anchors they accept.",[749,2767,2768,2769,2772],{},"For an A&R team auditing a batch of demos, ",[780,2770,2771],{},"c2pa_scan"," walks a directory and reports which files carry a manifest and which are flagged as AI-generated. No spreadsheet, no manual triage:",[749,2774,2775],{},[2487,2776],{"alt":2777,"src":2778},"C2PA scan of a Music folder showing which tracks carry a manifest and which are AI-generated","/images/blog/musictechlab_blog_c2pa-in-music-mcp-scan-example.webp",[749,2780,2781,2782,2785,2786,2789],{},"In the screenshot, four MP3s in ",[780,2783,2784],{},"~/Music",". One (the Lyria-generated track) carries a Google-signed C2PA manifest flagged as ",[780,2787,2788],{},"trainedAlgorithmicMedia",". The other three are unsigned. 25% coverage, with a clear AI-or-not column.",[769,2791,2793],{"id":2792},"whats-next","What's next",[749,2795,2796],{},"The MCP solves the problem for developers and anyone comfortable in Claude Code. But most of the people who actually need to read a C2PA manifest, A&R scouts, label managers, rights administrators, music lawyers, journalists, will never open a terminal. Raw JSON is not a deliverable for them.",[749,2798,2799,2800,2803,2804,2809],{},"So phase two is a ",[793,2801,2802],{},"visual C2PA translator"," at musictechlab.io: drop a file in the browser, see the manifest rendered in plain English (Who, What, When, How), with a trust score and a JSON export for the technical readers who want it. Everything client-side, nothing uploaded, similar to what ",[753,2805,2808],{"href":2806,"rel":2807},"https://melchersystem.com/c2pa-content-credentials-translator/",[1074],"melchersystem.com"," has done for images, but tuned for audio and the music industry's specific provenance questions.",[1553,2811,2812],{},[749,2813,2814],{},"C2PA still evolves: signing trust lists change, and tooling support varies between vendors. Treat manifests as evidence, not as legal proof. The MCP and the upcoming translator are inspection tools, not compliance certifications.",[749,2816,2817],{},"If you produce, distribute, or license music, this is the moment to start paying attention. C2PA is no longer a slide in a keynote. It is a thing you can grep for in a downloads folder.",[769,2819,2821],{"id":2820},"who-already-implements-c2pa","Who already implements C2PA",[749,2823,2824],{},"The list of organizations shipping C2PA in production is no longer short. As of 2026 the coalition counts over 6,000 members and affiliates, and the implementation list spans cameras, AI services, creative tools, and social platforms.",[1211,2826,2828,2859,2903,2928],{"className":2827},[1214,1215,1698,1217,1218],[1220,2829,2833],{"description":2830,"icon":2831,"title":2832},"Sign generated images, audio, and video with C2PA at creation time.","i-lucide-sparkles","AI generators",[1886,2834,2835,2841,2847,2853],{},[1039,2836,2837,2840],{},[793,2838,2839],{},"Google"," — Lyria (audio), Imagen (images), Veo (video), all signed with Google's C2PA generator and paired with SynthID",[1039,2842,2843,2846],{},[793,2844,2845],{},"OpenAI"," — DALL·E 3 and Sora output embeds C2PA, with layered SynthID and public verification",[1039,2848,2849,2852],{},[793,2850,2851],{},"Adobe Firefly"," — every generated asset carries Content Credentials by default",[1039,2854,2855,2858],{},[793,2856,2857],{},"Microsoft Designer / Bing Image Creator"," — automatic AI labeling via C2PA",[1220,2860,2864],{"description":2861,"icon":2862,"title":2863},"Hardware-backed signing at capture time. Provenance starts at the sensor.","i-lucide-camera","Cameras",[1886,2865,2866,2872,2878,2884,2890],{},[1039,2867,2868,2871],{},[793,2869,2870],{},"Leica M11-P"," — first commercial camera to ship C2PA at capture (2023)",[1039,2873,2874,2877],{},[793,2875,2876],{},"Sony Alpha 1 II, A9 III, PXW-Z300"," — stills and professional video",[1039,2879,2880,2883],{},[793,2881,2882],{},"Nikon Z6 III, Z9"," — firmware-enabled C2PA",[1039,2885,2886,2889],{},[793,2887,2888],{},"Canon EOS R3"," — pilot program",[1039,2891,2892,2895,2896,2895,2899,2902],{},[793,2893,2894],{},"Fujifilm",", ",[793,2897,2898],{},"Samsung Galaxy S25",[793,2900,2901],{},"Google Pixel 10"," — mobile + hardware-backed signing",[1220,2904,2908],{"description":2905,"icon":2906,"title":2907},"Maintain Content Credentials through the editing chain, not just at capture.","i-lucide-edit","Creative tools",[1886,2909,2910,2916,2922],{},[1039,2911,2912,2915],{},[793,2913,2914],{},"Adobe Creative Cloud"," — Photoshop, Lightroom, Premiere Pro, After Effects all preserve and extend C2PA manifests",[1039,2917,2918,2921],{},[793,2919,2920],{},"Truepic"," — capture and verification SDK used by news and insurance",[1039,2923,2924,2927],{},[793,2925,2926],{},"Photo Mechanic"," — sidecar workflow for photojournalists",[1220,2929,2933],{"description":2930,"icon":2931,"title":2932},"Display Content Credentials to viewers, or use them for ingest checks.","i-lucide-share-2","Platforms and publishers",[1886,2934,2935,2941,2947,2953],{},[1039,2936,2937,2940],{},[793,2938,2939],{},"LinkedIn"," — shows a \"CR\" icon on images carrying Content Credentials",[1039,2942,2943,2946],{},[793,2944,2945],{},"TikTok"," — labels AI-generated content using C2PA in partnership with the CAI",[1039,2948,2949,2952],{},[793,2950,2951],{},"Meta"," — announced labeling of AI content via C2PA across Facebook, Instagram, Threads",[1039,2954,2955,2895,2958,2895,2961,2895,2964,2967],{},[793,2956,2957],{},"BBC",[793,2959,2960],{},"Reuters",[793,2962,2963],{},"AP",[793,2965,2966],{},"New York Times"," — early newsroom adoption for source attribution",[749,2969,2970],{},"The music side is the newest entry in this lineup. Google Lyria is the first major AI music service to ship C2PA in downloadable MP3s, but the infrastructure (signing libraries, trust lists, viewer apps) is already mature on the image and video side. That groundwork is what makes audio adoption practical now rather than years away.",[769,2972,2974],{"id":2973},"resources","Resources",[1211,2976,2978,3009,3046,3076],{"className":2977},[1214,1215,1698,1217,1218],[1220,2979,2984],{"description":2980,"icon":2981,"title":2982,"target":2983,"to":1858},"Read the standard itself and the consumer-facing brand layer.","i-lucide-book-open","Official spec and consortium","_blank",[1886,2985,2986,2993,3001],{},[1039,2987,2988,2992],{},[753,2989,2991],{"href":1858,"rel":2990},[1074],"c2pa.org"," — the open standard, governed by the JDF",[1039,2994,2995,3000],{},[753,2996,2999],{"href":2997,"rel":2998},"https://contentcredentials.org/",[1074],"contentcredentials.org"," — Adobe-led consumer-facing brand",[1039,3002,3003,3008],{},[753,3004,3007],{"href":3005,"rel":3006},"https://contentauthenticity.org/",[1074],"Content Authenticity Initiative"," — the founding coalition",[1220,3010,3015],{"description":3011,"icon":3012,"title":3013,"target":2983,"to":3014},"Reference implementations and bindings for adding C2PA to your stack.","i-lucide-code","Open-source tooling","https://github.com/contentauth",[1886,3016,3017,3025,3031,3039],{},[1039,3018,3019,3024],{},[753,3020,3023],{"href":3021,"rel":3022},"https://github.com/contentauth/c2pa-rs",[1074],"c2pa-rs"," — Rust reference implementation",[1039,3026,3027,3030],{},[753,3028,1078],{"href":1072,"rel":3029},[1074]," — official Python binding (used by our MCP)",[1039,3032,3033,3038],{},[753,3034,3037],{"href":3035,"rel":3036},"https://github.com/contentauth/c2pa-js",[1074],"c2pa-js"," — browser/WASM SDK",[1039,3040,3041,3045],{},[753,3042,782],{"href":3043,"rel":3044},"https://github.com/contentauth/c2pa-rs/tree/main/cli",[1074]," — official CLI",[1220,3047,3052],{"description":3048,"icon":3049,"title":3050,"target":2983,"to":3051},"Drop-a-file viewers for inspecting manifests without writing code.","i-lucide-search","Verification tools","https://contentcredentials.org/verify",[1886,3053,3054,3061,3069],{},[1039,3055,3056,3060],{},[753,3057,3059],{"href":3051,"rel":3058},[1074],"verify.contentauthenticity.org"," — Adobe's official viewer",[1039,3062,3063,3068],{},[753,3064,3067],{"href":3065,"rel":3066},"https://c2paviewer.com/",[1074],"c2paviewer.com"," — community viewer",[1039,3070,3071,3075],{},[753,3072,3074],{"href":2806,"rel":3073},[1074],"melchersystem.com/c2pa-content-credentials-translator"," — plain-English translator",[1220,3077,3081],{"description":3078,"icon":3079,"title":3080,"target":2983,"to":2361},"Our two MCP servers for music provenance and human-made certification.","i-lucide-github","MusicTech Lab open source",[1886,3082,3083,3089],{},[1039,3084,3085,3088],{},[753,3086,2363],{"href":2361,"rel":3087},[1074]," — read C2PA manifests in Claude",[1039,3090,3091,3096],{},[753,3092,3095],{"href":3093,"rel":3094},"https://github.com/verifiedhumancert/verified-human-mcp-server",[1074],"verified-human-mcp-server"," — query the Verified Human Cert registry",[1744,3098],{},[769,3100,3102],{"id":3101},"need-help-with-c2pa-and-music-provenance","Need Help with C2PA and Music Provenance?",[749,3104,3105],{},"Building C2PA into your distribution pipeline, AI music platform, or rights workflow? We've been there.",[749,3107,3108,3110],{},[753,3109,1758],{"href":1757},", no sales pitch, just honest engineering advice.",[1761,3112,3113],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":832,"searchDepth":846,"depth":846,"links":3115},[3116,3117,3118,3119,3120,3121,3122,3123],{"id":1877,"depth":846,"text":1878},{"id":1938,"depth":846,"text":1939},{"id":2298,"depth":846,"text":2299},{"id":2348,"depth":846,"text":2349},{"id":2792,"depth":846,"text":2793},{"id":2820,"depth":846,"text":2821},{"id":2973,"depth":846,"text":2974},{"id":3101,"depth":846,"text":3102},"music-data","2026-05-28T00:00:00.000Z","C2PA is the open standard for content provenance, and it just landed in music files. We open-sourced an MCP server so you can read these manifests inside Claude Code.",[3128,3131,3134,3137,3140],{"question":3129,"answer":3130},"What is C2PA?","C2PA (Coalition for Content Provenance and Authenticity) is an open standard, governed by the Joint Development Foundation, that embeds a signed manifest inside a media file recording who made it, what tool produced it, what edits were applied, and what ingredients were used. It is the technical foundation behind Adobe Content Credentials.",{"question":3132,"answer":3133},"How is C2PA different from existing music metadata standards like ID3, ISRC, or DDEX?","ID3, ISRC, and DDEX answer who owns and identifies a recording. C2PA answers who created it and how. The two layers are complementary: rights metadata says this track is registered to label X under ISRC Y, while a C2PA manifest says this track was generated by tool Z on date D, with a verifiable signature.",{"question":3135,"answer":3136},"Why is C2PA only now arriving in music?","The standard was developed image-first. Tooling, software support, and signing trust lists matured for JPEG and PNG before audio. The c2pa-rs Rust library added robust MP3, WAV, and FLAC support over the past year, which is what makes audio adoption practical now.",{"question":3138,"answer":3139},"What is SynthID, and how does it relate to C2PA?","SynthID is Google DeepMind's imperceptible watermark for AI-generated content. It is embedded in the audio waveform itself, so it survives stripping of the C2PA manifest. C2PA records that SynthID was applied as an action in the manifest, but the two layers are independent: C2PA is the signed declaration, SynthID is the in-content signal.",{"question":3141,"answer":3142},"Can I read C2PA manifests without installing the Rust c2patool?","Yes. Our open-source mtl-c2pa-mcp wraps the official c2pa-python library and exposes it as MCP tools in Claude Code. Ask Claude what does the C2PA manifest in this MP3 say, and it returns a human-friendly summary.",{"src":3144},"/images/blog/musictechlab_blog_c2pa-in-music-mcp.webp",{"enabled":897,"items":3146},[3147,3150,3153,3155],{"text":3148,"icon":3149},"C2PA is the open standard for cryptographically signed content provenance, backed by Adobe, Microsoft, Google, BBC, and others.","i-lucide-shield-check",{"text":3151,"icon":3152},"It fills the missing layer in music metadata: not who owns a track, but who created it and how.","i-lucide-fingerprint",{"text":3154,"icon":2831},"Google Lyria is the first major AI music service to ship C2PA in MP3 downloads, signaling the standard's arrival in audio.",{"text":3156,"icon":3157},"Our open-source MCP server reads C2PA manifests directly inside Claude Code.","i-lucide-terminal",{},{"title":3160,"description":3161},"C2PA in Music: MCP for Content Provenance | MusicTech Lab","Read C2PA content provenance manifests in music files (MP3, WAV, FLAC) inside Claude Code with our open-source MCP server. Inspect AI provenance in plain English.",[1819,1822,1823,3163,1824],"content-credentials","WnLIMVZH29tclFMoww35E8u5c5uYuYY5T6omzy5ncak",{"id":3166,"title":590,"authors":3167,"badge":3170,"body":3171,"category":1777,"client":1778,"date":3967,"description":3968,"extension":1781,"faq":3969,"featured":897,"featuredOrder":907,"hidden":69,"image":3985,"keyTakeaways":3988,"meta":3997,"navigation":897,"path":591,"seo":3998,"status":1778,"stem":592,"tags":4001,"teaser":1778,"__hash__":4006,"score":852},"posts/blog/software-development/mcp-verified-human-cert-open-source.md",[3168],{"name":738,"to":739,"avatar":3169},{"src":741},{"label":743,"color":744},{"type":746,"value":3172,"toc":3953},[3173,3181,3189,3193,3196,3276,3279,3282,3299,3303,3312,3332,3338,3341,3352,3357,3361,3364,3381,3385,3390,3417,3421,3431,3567,3571,3574,3591,3598,3605,3609,3618,3642,3765,3841,3844,3849,3853,3866,3896,3899,3907,3910,3914,3950],[749,3174,3175,3176,3180],{},"The line between human-made and machine-generated music is getting blurry. ",[753,3177,1930],{"href":3178,"rel":3179},"https://verifiedhumancert.com",[1074]," (VHC) is one answer to that problem: a public registry where artists and labels certify that their tracks were created by humans.",[749,3182,3183,3184,1052],{},"We wanted to query that registry without leaving our terminal. So we built an MCP server for it and open-sourced it: ",[753,3185,3188],{"href":3186,"rel":3187},"https://github.com/musictechlab/mcp-verifiedhumancert",[1074],"mcp-verifiedhumancert",[769,3190,3192],{"id":3191},"what-the-server-does","What the server does",[749,3194,3195],{},"The server exposes six tools that map directly to the VHC public API:",[3197,3198,3199,3212],"table",{},[3200,3201,3202],"thead",{},[3203,3204,3205,3209],"tr",{},[3206,3207,3208],"th",{},"Tool",[3206,3210,3211],{},"What it does",[3213,3214,3215,3226,3236,3246,3256,3266],"tbody",{},[3203,3216,3217,3223],{},[3218,3219,3220],"td",{},[780,3221,3222],{},"vhc_verify_isrc",[3218,3224,3225],{},"Verify a certification by ISRC code",[3203,3227,3228,3233],{},[3218,3229,3230],{},[780,3231,3232],{},"vhc_verify_track",[3218,3234,3235],{},"Check certification status by artist + track name",[3203,3237,3238,3243],{},[3218,3239,3240],{},[780,3241,3242],{},"vhc_verify_cert",[3218,3244,3245],{},"Look up a certification by cert number",[3203,3247,3248,3253],{},[3218,3249,3250],{},[780,3251,3252],{},"vhc_registry",[3218,3254,3255],{},"List recently issued certifications",[3203,3257,3258,3263],{},[3218,3259,3260],{},[780,3261,3262],{},"vhc_stats",[3218,3264,3265],{},"Platform statistics, tier breakdowns, totals",[3203,3267,3268,3273],{},[3218,3269,3270],{},[780,3271,3272],{},"vhc_pricing",[3218,3274,3275],{},"Current pricing and bundle options",[749,3277,3278],{},"No API key needed. The VHC registry is public, and all these endpoints are read-only.",[749,3280,3281],{},"Once connected, you just talk to Claude:",[1886,3283,3284,3289,3294],{},[1039,3285,3286],{},[800,3287,3288],{},"\"Is ISRC USHM82148308 certified as human-made?\"",[1039,3290,3291],{},[800,3292,3293],{},"\"Check if 'Yesterday' by The Beatles has a VHC certification\"",[1039,3295,3296],{},[800,3297,3298],{},"\"Show me the latest certified tracks\"",[769,3300,3302],{"id":3301},"the-multi-agent-workflow","The multi-agent workflow",[749,3304,3305,3306,3311],{},"This is where it gets interesting. We already had ",[753,3307,3310],{"href":3308,"rel":3309},"https://github.com/musictechlab/mcp-metadata",[1074],"mcp-metadata",", our open-source MCP server for reading and writing audio file metadata (ID3 tags, ISRC codes, Vorbis comments). Combining the two servers creates a multi-agent pipeline:",[1036,3313,3314,3320,3326],{},[1039,3315,3316,3319],{},[793,3317,3318],{},"Agent 1"," (mcp-metadata) reads the ISRC code from an audio file",[1039,3321,3322,3325],{},[793,3323,3324],{},"Agent 2"," (mcp-verifiedhumancert) verifies that ISRC against the VHC registry",[1039,3327,3328,3331],{},[793,3329,3330],{},"Claude"," orchestrates both agents and presents the result",[827,3333,3336],{"className":3334,"code":3335,"language":2385,"meta":832},[2383],"User: \"Read the ISRC from song.flac and check if it's certified\"\n\nAgent 1 (mcp-metadata): metadata_read(\"song.flac\") -> ISRC: USHM82148308\nAgent 2 (mcp-verifiedhumancert): vhc_verify_isrc(\"USHM82148308\") -> certified: true\n",[780,3337,3335],{"__ignoreMap":832},[749,3339,3340],{},"Two MCP servers, two specialized agents, one orchestrator. No glue code, no custom integrations. Claude handles the coordination.",[749,3342,3343],{},[2487,3344],{"alt":3345,"className":3346,"src":3351},"Multi-agent workflow: mcp-metadata reads ISRC from an audio file, then mcp-verifiedhumancert checks the VHC registry",[3347,3348,3349,3350],"w-full","max-w-[600px]","rounded-lg","shadow-md","/images/blog/musictechlab_blog_vhc_mcp_multi_agent.webp",[2369,3353,3354],{},[749,3355,3356],{},"This pattern scales to any number of MCP servers. Each server handles one domain, and Claude routes between them based on what the user asks.",[769,3358,3360],{"id":3359},"why-this-matters-for-the-music-industry","Why this matters for the music industry",[749,3362,3363],{},"The rise of generative audio tools has created a trust problem. Listeners, labels, and platforms need a way to distinguish human-created work from machine-generated output. VHC provides that layer of trust, and our MCP server makes it accessible to developers and tooling without building custom API integrations.",[1211,3365,3367,3371,3376],{"className":3366},[1214,1215,1216,1217,1218],[1220,3368],{"description":3369,"icon":3149,"title":3370},"Check any track's certification status by ISRC, artist name, or cert number.","Verify Tracks",[1220,3372],{"description":3373,"icon":3374,"title":3375},"Combine with mcp-metadata to read ISRC from files and verify automatically.","i-lucide-link","Multi-Agent Pipeline",[1220,3377],{"description":3378,"icon":3379,"title":3380},"The VHC registry is public. No API keys, no signup, no rate limits to worry about.","i-lucide-globe","No Auth Required",[769,3382,3384],{"id":3383},"setting-it-up","Setting it up",[3386,3387,3389],"h3",{"id":3388},"_1-clone-and-install","1. Clone and install",[827,3391,3393],{"className":1578,"code":3392,"language":1581,"meta":832,"style":832},"git clone https://github.com/musictechlab/mcp-verifiedhumancert.git\ncd mcp-verifiedhumancert\npoetry install\n",[780,3394,3395,3404,3411],{"__ignoreMap":832},[836,3396,3397,3399,3401],{"class":838,"line":839},[836,3398,1594],{"class":1327},[836,3400,1597],{"class":1302},[836,3402,3403],{"class":1302}," https://github.com/musictechlab/mcp-verifiedhumancert.git\n",[836,3405,3406,3408],{"class":838,"line":846},[836,3407,1606],{"class":1605},[836,3409,3410],{"class":1302}," mcp-verifiedhumancert\n",[836,3412,3413,3415],{"class":838,"line":852},[836,3414,2416],{"class":1327},[836,3416,1618],{"class":1302},[3386,3418,3420],{"id":3419},"_2-register-with-claude-code","2. Register with Claude Code",[749,3422,3423,3424,3427,3428,1296],{},"Add this to your ",[780,3425,3426],{},"~/.claude/settings.json"," or project ",[780,3429,3430],{},".claude/settings.local.json",[827,3432,3435],{"className":1270,"code":3433,"filename":3434,"language":1273,"meta":832,"style":832},"{\n  \"mcpServers\": {\n    \"vhc\": {\n      \"command\": \"poetry\",\n      \"args\": [\"--directory\", \"/path/to/mcp-verifiedhumancert\", \"run\", \"python\", \"-m\", \"mcp_verifiedhumancert\"]\n    }\n  }\n}\n","claude_mcp_config.json",[780,3436,3437,3441,3454,3467,3486,3555,3559,3563],{"__ignoreMap":832},[836,3438,3439],{"class":838,"line":839},[836,3440,1281],{"class":1280},[836,3442,3443,3445,3448,3450,3452],{"class":838,"line":846},[836,3444,1286],{"class":1280},[836,3446,3447],{"class":1289},"mcpServers",[836,3449,1293],{"class":1280},[836,3451,1296],{"class":1280},[836,3453,1986],{"class":1280},[836,3455,3456,3458,3461,3463,3465],{"class":838,"line":852},[836,3457,1991],{"class":1280},[836,3459,3460],{"class":1327},"vhc",[836,3462,1293],{"class":1280},[836,3464,1296],{"class":1280},[836,3466,1986],{"class":1280},[836,3468,3469,3471,3474,3476,3478,3480,3482,3484],{"class":838,"line":858},[836,3470,2004],{"class":1280},[836,3472,3473],{"class":2007},"command",[836,3475,1293],{"class":1280},[836,3477,1296],{"class":1280},[836,3479,1299],{"class":1280},[836,3481,2416],{"class":1302},[836,3483,1293],{"class":1280},[836,3485,1308],{"class":1280},[836,3487,3488,3490,3493,3495,3497,3500,3502,3505,3507,3509,3511,3514,3516,3518,3520,3523,3525,3527,3529,3532,3534,3536,3538,3541,3543,3545,3547,3550,3552],{"class":838,"line":864},[836,3489,2004],{"class":1280},[836,3491,3492],{"class":2007},"args",[836,3494,1293],{"class":1280},[836,3496,1296],{"class":1280},[836,3498,3499],{"class":1280}," [",[836,3501,1293],{"class":1280},[836,3503,3504],{"class":1302},"--directory",[836,3506,1293],{"class":1280},[836,3508,1394],{"class":1280},[836,3510,1299],{"class":1280},[836,3512,3513],{"class":1302},"/path/to/mcp-verifiedhumancert",[836,3515,1293],{"class":1280},[836,3517,1394],{"class":1280},[836,3519,1299],{"class":1280},[836,3521,3522],{"class":1302},"run",[836,3524,1293],{"class":1280},[836,3526,1394],{"class":1280},[836,3528,1299],{"class":1280},[836,3530,3531],{"class":1302},"python",[836,3533,1293],{"class":1280},[836,3535,1394],{"class":1280},[836,3537,1299],{"class":1280},[836,3539,3540],{"class":1302},"-m",[836,3542,1293],{"class":1280},[836,3544,1394],{"class":1280},[836,3546,1299],{"class":1280},[836,3548,3549],{"class":1302},"mcp_verifiedhumancert",[836,3551,1293],{"class":1280},[836,3553,3554],{"class":1280},"]\n",[836,3556,3557],{"class":838,"line":870},[836,3558,2280],{"class":1280},[836,3560,3561],{"class":838,"line":876},[836,3562,2285],{"class":1280},[836,3564,3565],{"class":838,"line":882},[836,3566,1451],{"class":1280},[3386,3568,3570],{"id":3569},"_3-start-using-it","3. Start using it",[749,3572,3573],{},"That's it. Ask Claude anything about the VHC registry:",[1886,3575,3576,3581,3586],{},[1039,3577,3578],{},[800,3579,3580],{},"\"Look up cert number VH-2026-000001\"",[1039,3582,3583],{},[800,3584,3585],{},"\"What are the current VHC pricing tiers?\"",[1039,3587,3588],{},[800,3589,3590],{},"\"How many tracks are certified on the platform?\"",[749,3592,3593],{},[2487,3594],{"alt":3595,"className":3596,"src":3597},"Looking up cert VH-2026-000001 in Claude Code",[3347,3348,3349,3350],"/images/blog/musictechlab_blog_vhc_mcp_cert_lookup.webp",[749,3599,3600],{},[2487,3601],{"alt":3602,"className":3603,"src":3604},"Querying VHC pricing tiers in Claude Code",[3347,3348,3349,3350],"/images/blog/musictechlab_blog_vhc_mcp_pricing.webp",[769,3606,3608],{"id":3607},"under-the-hood","Under the hood",[749,3610,3611,3612,3617],{},"The server is built with ",[753,3613,3616],{"href":3614,"rel":3615},"https://github.com/modelcontextprotocol/python-sdk",[1074],"FastMCP",", the Python SDK for the Model Context Protocol. The architecture is straightforward:",[1886,3619,3620,3628,3636],{},[1039,3621,3622,3627],{},[793,3623,3624],{},[780,3625,3626],{},"client.py"," - a thin HTTP wrapper around the VHC REST API using httpx",[1039,3629,3630,3635],{},[793,3631,3632],{},[780,3633,3634],{},"server.py"," - six tool definitions that call the client and return JSON",[1039,3637,3638,3641],{},[793,3639,3640],{},"Tests"," - full test coverage using respx for HTTP mocking",[827,3643,3646],{"className":3644,"code":3645,"filename":3634,"language":3531,"meta":832,"style":832},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@mcp.tool()\ndef vhc_verify_isrc(isrc: str) -> str:\n    \"\"\"Verify a human-made music certification by ISRC code.\"\"\"\n    result = client.verify_by_isrc(isrc)\n    return json.dumps(result, indent=2, ensure_ascii=False)\n",[780,3647,3648,3664,3694,3706,3729],{"__ignoreMap":832},[836,3649,3650,3653,3656,3658,3661],{"class":838,"line":839},[836,3651,3652],{"class":1280},"@",[836,3654,3655],{"class":1605},"mcp",[836,3657,1052],{"class":1280},[836,3659,3660],{"class":1605},"tool",[836,3662,3663],{"class":1280},"()\n",[836,3665,3666,3669,3672,3675,3679,3681,3684,3686,3689,3691],{"class":838,"line":846},[836,3667,3668],{"class":1289},"def",[836,3670,3671],{"class":1605}," vhc_verify_isrc",[836,3673,3674],{"class":1280},"(",[836,3676,3678],{"class":3677},"sHdIc","isrc",[836,3680,1296],{"class":1280},[836,3682,3683],{"class":1327}," str",[836,3685,2455],{"class":1280},[836,3687,3688],{"class":1280}," ->",[836,3690,3683],{"class":1327},[836,3692,3693],{"class":1280},":\n",[836,3695,3696,3700,3703],{"class":838,"line":852},[836,3697,3699],{"class":3698},"s7zQu","    \"\"\"",[836,3701,3702],{"class":1588},"Verify a human-made music certification by ISRC code.",[836,3704,3705],{"class":3698},"\"\"\"\n",[836,3707,3708,3711,3714,3717,3719,3722,3724,3726],{"class":838,"line":858},[836,3709,3710],{"class":842},"    result ",[836,3712,3713],{"class":1280},"=",[836,3715,3716],{"class":842}," client",[836,3718,1052],{"class":1280},[836,3720,3721],{"class":1605},"verify_by_isrc",[836,3723,3674],{"class":1280},[836,3725,3678],{"class":1605},[836,3727,3728],{"class":1280},")\n",[836,3730,3731,3734,3737,3739,3742,3744,3747,3749,3752,3754,3757,3759,3762],{"class":838,"line":864},[836,3732,3733],{"class":3698},"    return",[836,3735,3736],{"class":842}," json",[836,3738,1052],{"class":1280},[836,3740,3741],{"class":1605},"dumps",[836,3743,3674],{"class":1280},[836,3745,3746],{"class":1605},"result",[836,3748,1394],{"class":1280},[836,3750,3751],{"class":3677}," indent",[836,3753,3713],{"class":1280},[836,3755,3756],{"class":2007},"2",[836,3758,1394],{"class":1280},[836,3760,3761],{"class":3677}," ensure_ascii",[836,3763,3764],{"class":1280},"=False)\n",[827,3766,3768],{"className":3644,"code":3767,"filename":3626,"language":3531,"meta":832,"style":832},"def verify_by_isrc(isrc: str) -> dict:\n    \"\"\"Verify a certification by ISRC code.\"\"\"\n    return _get(\"/api/v1/verify\", params={\"isrc\": isrc})\n",[780,3769,3770,3794,3803],{"__ignoreMap":832},[836,3771,3772,3774,3777,3779,3781,3783,3785,3787,3789,3792],{"class":838,"line":839},[836,3773,3668],{"class":1289},[836,3775,3776],{"class":1605}," verify_by_isrc",[836,3778,3674],{"class":1280},[836,3780,3678],{"class":3677},[836,3782,1296],{"class":1280},[836,3784,3683],{"class":1327},[836,3786,2455],{"class":1280},[836,3788,3688],{"class":1280},[836,3790,3791],{"class":1327}," dict",[836,3793,3693],{"class":1280},[836,3795,3796,3798,3801],{"class":838,"line":846},[836,3797,3699],{"class":3698},[836,3799,3800],{"class":1588},"Verify a certification by ISRC code.",[836,3802,3705],{"class":3698},[836,3804,3805,3807,3810,3812,3814,3817,3819,3821,3824,3827,3829,3831,3833,3835,3838],{"class":838,"line":852},[836,3806,3733],{"class":3698},[836,3808,3809],{"class":1605}," _get",[836,3811,3674],{"class":1280},[836,3813,1293],{"class":1280},[836,3815,3816],{"class":1302},"/api/v1/verify",[836,3818,1293],{"class":1280},[836,3820,1394],{"class":1280},[836,3822,3823],{"class":3677}," params",[836,3825,3826],{"class":1280},"={",[836,3828,1293],{"class":1280},[836,3830,3678],{"class":1302},[836,3832,1293],{"class":1280},[836,3834,1296],{"class":1280},[836,3836,3837],{"class":1605}," isrc",[836,3839,3840],{"class":1280},"})\n",[749,3842,3843],{},"The entire server is under 200 lines of Python. That's intentional. MCP servers should be thin wrappers, not application frameworks.",[788,3845,3846],{},[749,3847,3848],{},"The project uses Poetry for dependency management, Ruff for linting and formatting, and pytest with respx for testing. CI runs on GitHub Actions.",[769,3850,3852],{"id":3851},"what-we-learned-building-mcp-servers","What we learned building MCP servers",[749,3854,3855,3856,3861,3862,3865],{},"This is the third MCP server we have open-sourced at MusicTech Lab (after ",[753,3857,3860],{"href":3858,"rel":3859},"https://github.com/musictechlab/signnow-mcp",[1074],"signnow-mcp"," and ",[753,3863,3310],{"href":3308,"rel":3864},[1074],"). A few patterns have emerged:",[1036,3867,3868,3874,3880,3886],{},[1039,3869,3870,3873],{},[793,3871,3872],{},"Keep servers focused."," One server per domain. Don't bundle unrelated tools into a single server.",[1039,3875,3876,3879],{},[793,3877,3878],{},"Separate the client from the server."," The HTTP client should be testable independently of the MCP layer.",[1039,3881,3882,3885],{},[793,3883,3884],{},"Return JSON, not prose."," Let Claude format the output for the user. The server's job is to provide structured data.",[1039,3887,3888,3891,3892,3895],{},[793,3889,3890],{},"Skip authentication when you can."," Public APIs make MCP servers trivial to set up. No ",[780,3893,3894],{},".env"," files, no OAuth flows, no token management.",[769,3897,3898],{"id":1825},"Open source",[749,3900,3901,3902,3906],{},"The full source code is on GitHub: ",[753,3903,3905],{"href":3186,"rel":3904},[1074],"musictechlab/mcp-verifiedhumancert",". MIT licensed. Contributions welcome.",[749,3908,3909],{},"If you're building MCP servers for the music industry, or if you're using Verified Human Cert and want to integrate it into your tooling, we'd love to hear from you.",[769,3911,3913],{"id":3912},"related-resources","Related resources",[1886,3915,3916,3923,3930,3936,3942],{},[1039,3917,3918,3922],{},[753,3919,3921],{"href":3186,"rel":3920},[1074],"GitHub: musictechlab/mcp-verifiedhumancert"," - the source code",[1039,3924,3925,3929],{},[753,3926,3928],{"href":3308,"rel":3927},[1074],"GitHub: musictechlab/mcp-metadata"," - audio metadata MCP server",[1039,3931,3932,3935],{},[753,3933,3934],{"href":639},"SignNow MCP Server: E-Signatures from Claude Code"," - our previous MCP server article",[1039,3937,3938,3941],{},[753,3939,1930],{"href":3178,"rel":3940},[1074]," - the certification platform",[1039,3943,3944,3949],{},[753,3945,3948],{"href":3946,"rel":3947},"https://modelcontextprotocol.io/",[1074],"Model Context Protocol"," - the MCP standard",[1761,3951,3952],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":832,"searchDepth":846,"depth":846,"links":3954},[3955,3956,3957,3958,3963,3964,3965,3966],{"id":3191,"depth":846,"text":3192},{"id":3301,"depth":846,"text":3302},{"id":3359,"depth":846,"text":3360},{"id":3383,"depth":846,"text":3384,"children":3959},[3960,3961,3962],{"id":3388,"depth":852,"text":3389},{"id":3419,"depth":852,"text":3420},{"id":3569,"depth":852,"text":3570},{"id":3607,"depth":846,"text":3608},{"id":3851,"depth":846,"text":3852},{"id":1825,"depth":846,"text":3898},{"id":3912,"depth":846,"text":3913},"2026-04-28T00:00:00.000Z","We open-sourced an MCP server that queries the Verified Human Cert registry. Verify human-made music certifications by ISRC, artist, track, or cert number directly from Claude Code.",[3970,3973,3976,3979,3982],{"question":3971,"answer":3972},"What is Verified Human Cert?","Verified Human Cert is a registry that certifies music tracks as human-made. Artists and labels register their tracks to receive proof that the music was created by humans, not generated by artificial intelligence.",{"question":3974,"answer":3975},"What is the mcp-verifiedhumancert server?","It is an open-source Model Context Protocol server that connects the Verified Human Cert public API to Claude Code and other MCP-compatible clients. It lets you verify certifications, browse the registry, and check pricing directly from your terminal.",{"question":3977,"answer":3978},"Do I need an API key to use this?","No. The server queries the public VHC API, which does not require authentication for read-only operations like verifying certifications and browsing the registry.",{"question":3980,"answer":3981},"What is the multi-agent workflow?","By combining mcp-verifiedhumancert with mcp-metadata, Claude can read the ISRC code embedded in an audio file and then verify its certification status in a single conversation. Two MCP servers, two agents, one orchestrator.",{"question":3983,"answer":3984},"Can I use this with clients other than Claude Code?","Yes. Any MCP-compatible client can use this server. The MCP protocol is open and supported by a growing number of tools.",{"src":3986,"credit":3987},"/images/blog/musictechlab_blog_verified_human_cert_mcp.webp","Photo by [Erika Giraud](https://unsplash.com/@erikasayssmile) on [Unsplash](https://unsplash.com/photos/JXA_BaeaCgM)",{"enabled":897,"items":3989},[3990,3992,3994],{"text":3991,"icon":3157},"The mcp-verifiedhumancert server exposes 6 tools for querying the Verified Human Cert registry.",{"text":3993,"icon":3374},"Combine with mcp-metadata to read ISRC from audio files and verify certifications automatically.",{"text":3995,"icon":3996},"No API key required. The server queries the public VHC registry at verifiedhumancert.com.","i-lucide-unlock",{},{"title":3999,"description":4000},"Verified Human Cert MCP Server | MusicTech Lab","Open-source MCP server for verifying human-made music certifications. Query by ISRC, artist, track, or cert number from Claude Code.",[3655,1825,4002,4003,4004,4005,3678],"verified-human-cert","music-certification","claude-code","multi-agent","0IMREhC3rcBLrbo0YpbBBh-vAUKPCXfiRMBvZlT0TVc",{"id":4008,"title":638,"authors":4009,"badge":4012,"body":4013,"category":1777,"client":1778,"date":4763,"description":4764,"extension":1781,"faq":4765,"featured":897,"featuredOrder":901,"hidden":69,"image":4777,"keyTakeaways":4780,"meta":4788,"navigation":897,"path":639,"seo":4789,"status":1778,"stem":640,"tags":4792,"teaser":1778,"__hash__":4796,"score":852},"posts/blog/software-development/signnow-mcp-server-e-signatures-from-claude-code.md",[4010],{"name":738,"to":739,"avatar":4011},{"src":741},{"label":743,"color":744},{"type":746,"value":4014,"toc":4749},[4015,4022,4025,4032,4036,4043,4046,4048,4051,4173,4176,4180,4183,4189,4200,4202,4206,4240,4266,4270,4313,4317,4320,4355,4358,4585,4594,4598,4601,4631,4635,4644,4647,4652,4656,4659,4704,4709,4711,4746],[749,4016,4017,4018,4021],{},"A few weeks ago we published a deep dive on ",[753,4019,4020],{"href":559},"integrating SignNow e-signatures into a Django application",". That article covered the full server-side integration — OAuth2, document uploads, Celery tasks, webhooks — everything you need for a production signing workflow.",[749,4023,4024],{},"But we kept coming back to the same thought: what if you didn't need a web app at all? What if you could upload a contract, send it for signing, and check its status without ever leaving your terminal?",[749,4026,4027,4028,4031],{},"That's exactly what we built. Today we're open-sourcing ",[753,4029,3860],{"href":3858,"rel":4030},[1074]," — a Model Context Protocol server that brings airSlate SignNow's e-signature capabilities directly into Claude Code.",[769,4033,4035],{"id":4034},"what-is-mcp","What is MCP?",[749,4037,4038,4039,4042],{},"The ",[753,4040,3948],{"href":3946,"rel":4041},[1074]," (MCP) is an open standard that lets AI assistants like Claude interact with external tools and services. Think of it as a plugin system — you register an MCP server, and Claude gains new abilities.",[749,4044,4045],{},"In our case, those abilities are e-signatures.",[769,4047,3192],{"id":3191},[749,4049,4050],{},"The signnow-mcp server exposes 11 tools that cover the full document lifecycle:",[3197,4052,4053,4061],{},[3200,4054,4055],{},[3203,4056,4057,4059],{},[3206,4058,3208],{},[3206,4060,3211],{},[3213,4062,4063,4073,4083,4093,4103,4113,4123,4133,4143,4153,4163],{},[3203,4064,4065,4070],{},[3218,4066,4067],{},[780,4068,4069],{},"upload_document",[3218,4071,4072],{},"Upload a PDF to SignNow",[3203,4074,4075,4080],{},[3218,4076,4077],{},[780,4078,4079],{},"get_document",[3218,4081,4082],{},"Get document details and signing status",[3203,4084,4085,4090],{},[3218,4086,4087],{},[780,4088,4089],{},"list_documents",[3218,4091,4092],{},"List all documents in the account",[3203,4094,4095,4100],{},[3218,4096,4097],{},[780,4098,4099],{},"download_signed_document",[3218,4101,4102],{},"Download a signed PDF locally",[3203,4104,4105,4110],{},[3218,4106,4107],{},[780,4108,4109],{},"send_signing_invite",[3218,4111,4112],{},"Send a freeform e-signature invite",[3203,4114,4115,4120],{},[3218,4116,4117],{},[780,4118,4119],{},"send_role_based_invite",[3218,4121,4122],{},"Send a role-based invite with field assignments",[3203,4124,4125,4130],{},[3218,4126,4127],{},[780,4128,4129],{},"cancel_invite",[3218,4131,4132],{},"Cancel pending signing invites",[3203,4134,4135,4140],{},[3218,4136,4137],{},[780,4138,4139],{},"add_signature_field",[3218,4141,4142],{},"Add a signature field to a document",[3203,4144,4145,4150],{},[3218,4146,4147],{},[780,4148,4149],{},"list_templates",[3218,4151,4152],{},"List all document templates",[3203,4154,4155,4160],{},[3218,4156,4157],{},[780,4158,4159],{},"create_from_template",[3218,4161,4162],{},"Create a document from a template",[3203,4164,4165,4170],{},[3218,4166,4167],{},[780,4168,4169],{},"register_webhook",[3218,4171,4172],{},"Register a webhook for document events",[749,4174,4175],{},"Once connected, you interact with these tools through natural language. No API calls, no curl commands, no switching between browser tabs.",[769,4177,4179],{"id":4178},"how-it-looks-in-practice","How it looks in practice",[749,4181,4182],{},"Here's what it looks like when you ask Claude Code to list your SignNow documents:",[749,4184,4185],{},[2487,4186],{"alt":4187,"src":4188},"SignNow MCP in action — listing documents from Claude Code","https://raw.githubusercontent.com/musictechlab/signnow-mcp/main/docs/signnow-mcp-demo.webp",[749,4190,4191,4192,4194,4195,4199],{},"Claude calls the ",[780,4193,4089],{}," tool behind the scenes and presents the results in a clean table. You can then follow up with natural language — \"download the first one\", \"send document #2 to ",[753,4196,4198],{"href":4197},"mailto:john@example.com","john@example.com"," for signing\", or \"what's the status of the deposit confirmation?\".",[769,4201,3384],{"id":3383},[3386,4203,4205],{"id":4204},"_1-get-signnow-api-credentials","1. Get SignNow API credentials",[1036,4207,4208,4217,4228,4237],{},[1039,4209,4210,4211,4216],{},"Create a ",[753,4212,4215],{"href":4213,"rel":4214},"https://www.signnow.com/",[1074],"SignNow"," account",[1039,4218,4219,4220,4223,4224,4227],{},"Go to ",[793,4221,4222],{},"API"," > ",[793,4225,4226],{},"Applications"," and create an application",[1039,4229,4230,4231,3861,4234],{},"Note your ",[780,4232,4233],{},"client_id",[780,4235,4236],{},"client_secret",[1039,4238,4239],{},"Base64-encode them:",[827,4241,4243],{"className":1578,"code":4242,"language":1581,"meta":832,"style":832},"echo -n \"client_id:client_secret\" | base64\n",[780,4244,4245],{"__ignoreMap":832},[836,4246,4247,4250,4253,4255,4258,4260,4263],{"class":838,"line":839},[836,4248,4249],{"class":1605},"echo",[836,4251,4252],{"class":1302}," -n",[836,4254,1299],{"class":1280},[836,4256,4257],{"class":1302},"client_id:client_secret",[836,4259,1293],{"class":1280},[836,4261,4262],{"class":1280}," |",[836,4264,4265],{"class":1327}," base64\n",[3386,4267,4269],{"id":4268},"_2-clone-and-install","2. Clone and install",[827,4271,4273],{"className":1578,"code":4272,"language":1581,"meta":832,"style":832},"git clone https://github.com/musictechlab/signnow-mcp.git\ncd signnow-mcp\ncp .env.example .env\n# Edit .env with your credentials\npoetry install\n",[780,4274,4275,4284,4291,4302,4307],{"__ignoreMap":832},[836,4276,4277,4279,4281],{"class":838,"line":839},[836,4278,1594],{"class":1327},[836,4280,1597],{"class":1302},[836,4282,4283],{"class":1302}," https://github.com/musictechlab/signnow-mcp.git\n",[836,4285,4286,4288],{"class":838,"line":846},[836,4287,1606],{"class":1605},[836,4289,4290],{"class":1302}," signnow-mcp\n",[836,4292,4293,4296,4299],{"class":838,"line":852},[836,4294,4295],{"class":1327},"cp",[836,4297,4298],{"class":1302}," .env.example",[836,4300,4301],{"class":1302}," .env\n",[836,4303,4304],{"class":838,"line":858},[836,4305,4306],{"class":1588},"# Edit .env with your credentials\n",[836,4308,4309,4311],{"class":838,"line":864},[836,4310,2416],{"class":1327},[836,4312,1618],{"class":1302},[3386,4314,4316],{"id":4315},"_3-register-with-claude-code","3. Register with Claude Code",[749,4318,4319],{},"The quickest way:",[827,4321,4323],{"className":1578,"code":4322,"language":1581,"meta":832,"style":832},"claude mcp add signnow -- poetry -C /path/to/signnow-mcp run python -m signnow_mcp.server\n",[780,4324,4325],{"__ignoreMap":832},[836,4326,4327,4329,4331,4333,4336,4338,4340,4343,4346,4348,4350,4352],{"class":838,"line":839},[836,4328,2423],{"class":1327},[836,4330,2426],{"class":1302},[836,4332,2429],{"class":1302},[836,4334,4335],{"class":1302}," signnow",[836,4337,2441],{"class":1302},[836,4339,1615],{"class":1302},[836,4341,4342],{"class":1302}," -C",[836,4344,4345],{"class":1302}," /path/to/signnow-mcp",[836,4347,2458],{"class":1302},[836,4349,2461],{"class":1302},[836,4351,2464],{"class":1302},[836,4353,4354],{"class":1302}," signnow_mcp.server\n",[749,4356,4357],{},"Or add it manually to your MCP configuration:",[827,4359,4361],{"className":1270,"code":4360,"filename":3434,"language":1273,"meta":832,"style":832},"{\n  \"signnow\": {\n    \"type\": \"stdio\",\n    \"command\": \"poetry\",\n    \"args\": [\"-C\", \"/path/to/signnow-mcp\", \"run\", \"python\", \"-m\", \"signnow_mcp.server\"],\n    \"env\": {\n      \"SIGNNOW_API_BASE_URL\": \"https://api.signnow.com\",\n      \"SIGNNOW_BASIC_AUTH\": \"your-base64-encoded-credentials\",\n      \"SIGNNOW_USERNAME\": \"your-email@example.com\",\n      \"SIGNNOW_PASSWORD\": \"your-password\"\n    }\n  }\n}\n",[780,4362,4363,4367,4380,4400,4418,4482,4495,4515,4535,4555,4573,4577,4581],{"__ignoreMap":832},[836,4364,4365],{"class":838,"line":839},[836,4366,1281],{"class":1280},[836,4368,4369,4371,4374,4376,4378],{"class":838,"line":846},[836,4370,1286],{"class":1280},[836,4372,4373],{"class":1289},"signnow",[836,4375,1293],{"class":1280},[836,4377,1296],{"class":1280},[836,4379,1986],{"class":1280},[836,4381,4382,4384,4387,4389,4391,4393,4396,4398],{"class":838,"line":852},[836,4383,1991],{"class":1280},[836,4385,4386],{"class":1327},"type",[836,4388,1293],{"class":1280},[836,4390,1296],{"class":1280},[836,4392,1299],{"class":1280},[836,4394,4395],{"class":1302},"stdio",[836,4397,1293],{"class":1280},[836,4399,1308],{"class":1280},[836,4401,4402,4404,4406,4408,4410,4412,4414,4416],{"class":838,"line":858},[836,4403,1991],{"class":1280},[836,4405,3473],{"class":1327},[836,4407,1293],{"class":1280},[836,4409,1296],{"class":1280},[836,4411,1299],{"class":1280},[836,4413,2416],{"class":1302},[836,4415,1293],{"class":1280},[836,4417,1308],{"class":1280},[836,4419,4420,4422,4424,4426,4428,4430,4432,4435,4437,4439,4441,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4477,4479],{"class":838,"line":864},[836,4421,1991],{"class":1280},[836,4423,3492],{"class":1327},[836,4425,1293],{"class":1280},[836,4427,1296],{"class":1280},[836,4429,3499],{"class":1280},[836,4431,1293],{"class":1280},[836,4433,4434],{"class":1302},"-C",[836,4436,1293],{"class":1280},[836,4438,1394],{"class":1280},[836,4440,1299],{"class":1280},[836,4442,4443],{"class":1302},"/path/to/signnow-mcp",[836,4445,1293],{"class":1280},[836,4447,1394],{"class":1280},[836,4449,1299],{"class":1280},[836,4451,3522],{"class":1302},[836,4453,1293],{"class":1280},[836,4455,1394],{"class":1280},[836,4457,1299],{"class":1280},[836,4459,3531],{"class":1302},[836,4461,1293],{"class":1280},[836,4463,1394],{"class":1280},[836,4465,1299],{"class":1280},[836,4467,3540],{"class":1302},[836,4469,1293],{"class":1280},[836,4471,1394],{"class":1280},[836,4473,1299],{"class":1280},[836,4475,4476],{"class":1302},"signnow_mcp.server",[836,4478,1293],{"class":1280},[836,4480,4481],{"class":1280},"],\n",[836,4483,4484,4486,4489,4491,4493],{"class":838,"line":870},[836,4485,1991],{"class":1280},[836,4487,4488],{"class":1327},"env",[836,4490,1293],{"class":1280},[836,4492,1296],{"class":1280},[836,4494,1986],{"class":1280},[836,4496,4497,4499,4502,4504,4506,4508,4511,4513],{"class":838,"line":876},[836,4498,2004],{"class":1280},[836,4500,4501],{"class":2007},"SIGNNOW_API_BASE_URL",[836,4503,1293],{"class":1280},[836,4505,1296],{"class":1280},[836,4507,1299],{"class":1280},[836,4509,4510],{"class":1302},"https://api.signnow.com",[836,4512,1293],{"class":1280},[836,4514,1308],{"class":1280},[836,4516,4517,4519,4522,4524,4526,4528,4531,4533],{"class":838,"line":882},[836,4518,2004],{"class":1280},[836,4520,4521],{"class":2007},"SIGNNOW_BASIC_AUTH",[836,4523,1293],{"class":1280},[836,4525,1296],{"class":1280},[836,4527,1299],{"class":1280},[836,4529,4530],{"class":1302},"your-base64-encoded-credentials",[836,4532,1293],{"class":1280},[836,4534,1308],{"class":1280},[836,4536,4537,4539,4542,4544,4546,4548,4551,4553],{"class":838,"line":888},[836,4538,2004],{"class":1280},[836,4540,4541],{"class":2007},"SIGNNOW_USERNAME",[836,4543,1293],{"class":1280},[836,4545,1296],{"class":1280},[836,4547,1299],{"class":1280},[836,4549,4550],{"class":1302},"your-email@example.com",[836,4552,1293],{"class":1280},[836,4554,1308],{"class":1280},[836,4556,4557,4559,4562,4564,4566,4568,4571],{"class":838,"line":894},[836,4558,2004],{"class":1280},[836,4560,4561],{"class":2007},"SIGNNOW_PASSWORD",[836,4563,1293],{"class":1280},[836,4565,1296],{"class":1280},[836,4567,1299],{"class":1280},[836,4569,4570],{"class":1302},"your-password",[836,4572,1532],{"class":1280},[836,4574,4575],{"class":838,"line":901},[836,4576,2280],{"class":1280},[836,4578,4579],{"class":838,"line":907},[836,4580,2285],{"class":1280},[836,4582,4583],{"class":838,"line":913},[836,4584,1451],{"class":1280},[2369,4586,4587],{},[749,4588,4589,4590,4593],{},"Use the sandbox environment (",[780,4591,4592],{},"https://api-eval.signnow.com",") for testing. SignNow provides 2,000 free signature invites in sandbox mode.",[3386,4595,4597],{"id":4596},"_4-start-using-it","4. Start using it",[749,4599,4600],{},"Once configured, just talk to Claude:",[1886,4602,4603,4611,4616,4621,4626],{},[1039,4604,4605],{},[800,4606,4607,4608,4610],{},"\"Upload contract.pdf to SignNow and send it to ",[753,4609,4198],{"href":4197}," for signing\"",[1039,4612,4613],{},[800,4614,4615],{},"\"Check the signing status of document abc123\"",[1039,4617,4618],{},[800,4619,4620],{},"\"List all my SignNow documents\"",[1039,4622,4623],{},[800,4624,4625],{},"\"Download the signed version of the NDA\"",[1039,4627,4628],{},[800,4629,4630],{},"\"Create a new document from the deposit template and send it to the client\"",[769,4632,4634],{"id":4633},"why-we-built-this","Why we built this",[749,4636,4637,4638,4643],{},"At MusicTech Lab, we use SignNow for sending contracts, NDAs, and deposit confirmations as part of our ",[753,4639,4642],{"href":4640,"rel":4641},"https://beatbuddy.pro",[1074],"BeatBuddy"," onboarding flow. Our Django integration handles the automated pipeline, but there are always ad-hoc tasks — checking a document's status, resending an invite, downloading a signed copy for the records.",[749,4645,4646],{},"Before the MCP server, that meant logging into the SignNow dashboard or writing one-off API calls. Now it's a single sentence in Claude Code.",[788,4648,4649],{},[749,4650,4651],{},"This pattern — wrapping a third-party API as an MCP server — works for any service with a REST API. If you find yourself repeatedly switching to a web dashboard to do something, consider building an MCP server for it.",[769,4653,4655],{"id":4654},"sandbox-vs-production","Sandbox vs. production",[749,4657,4658],{},"SignNow provides separate environments for testing and production:",[3197,4660,4661,4674],{},[3200,4662,4663],{},[3203,4664,4665,4668,4671],{},[3206,4666,4667],{},"Environment",[3206,4669,4670],{},"API URL",[3206,4672,4673],{},"App URL",[3213,4675,4676,4690],{},[3203,4677,4678,4681,4685],{},[3218,4679,4680],{},"Sandbox",[3218,4682,4683],{},[780,4684,4592],{},[3218,4686,4687],{},[780,4688,4689],{},"https://app-eval.signnow.com",[3203,4691,4692,4695,4699],{},[3218,4693,4694],{},"Production",[3218,4696,4697],{},[780,4698,4510],{},[3218,4700,4701],{},[780,4702,4703],{},"https://app.signnow.com",[1553,4705,4706],{},[749,4707,4708],{},"Never use production credentials for development. The sandbox environment is free and gives you 2,000 signature invites to test with.",[769,4710,3913],{"id":3912},[1886,4712,4713,4720,4725,4731,4738],{},[1039,4714,4715,4719],{},[753,4716,4718],{"href":3858,"rel":4717},[1074],"GitHub: musictechlab/signnow-mcp"," — the source code",[1039,4721,4722,4724],{},[753,4723,558],{"href":559}," — our deep dive on the server-side integration",[1039,4726,4727,4730],{},[753,4728,4729],{"href":169},"Querying Bandcamp Revenue with Natural Language"," — another MCP server we built, this time for music revenue analytics",[1039,4732,4733,4737],{},[753,4734,4736],{"href":3946,"rel":4735},[1074],"Model Context Protocol specification"," — the MCP standard",[1039,4739,4740,4745],{},[753,4741,4744],{"href":4742,"rel":4743},"https://docs.signnow.com/",[1074],"SignNow API documentation"," — official API reference",[1761,4747,4748],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":832,"searchDepth":846,"depth":846,"links":4750},[4751,4752,4753,4754,4760,4761,4762],{"id":4034,"depth":846,"text":4035},{"id":3191,"depth":846,"text":3192},{"id":4178,"depth":846,"text":4179},{"id":3383,"depth":846,"text":3384,"children":4755},[4756,4757,4758,4759],{"id":4204,"depth":852,"text":4205},{"id":4268,"depth":852,"text":4269},{"id":4315,"depth":852,"text":4316},{"id":4596,"depth":852,"text":4597},{"id":4633,"depth":846,"text":4634},{"id":4654,"depth":846,"text":4655},{"id":3912,"depth":846,"text":3913},"2026-03-12T00:00:00.000Z","We open-sourced an MCP server that brings SignNow e-signatures into Claude Code. Upload documents, send signing invites, track status, and download signed PDFs — all without leaving your terminal.",[4766,4769,4772,4775],{"question":4767,"answer":4768},"What is the SignNow MCP server?","It is an open-source Model Context Protocol server that connects airSlate SignNow's e-signature API to Claude Code and other MCP-compatible clients. It lets you manage documents, send signing invites, and download signed PDFs directly from your terminal.",{"question":4770,"answer":4771},"Is this an official SignNow product?","No. This is a community project built by MusicTech Lab. It is not affiliated with or endorsed by airSlate SignNow.",{"question":4773,"answer":4774},"What tools does the server provide?","The server exposes 11 tools: upload_document, get_document, list_documents, download_signed_document, send_signing_invite, send_role_based_invite, cancel_invite, add_signature_field, list_templates, create_from_template, and register_webhook.",{"question":3983,"answer":4776},"Yes. Any MCP-compatible client can use this server. Claude Code is the primary client we built it for, but the MCP protocol is open and supported by a growing number of tools.",{"src":4778,"credit":4779},"/images/blog/musictechlab_blog_signnow_mcp_server.webp","Photo by [Vitaly Gariev](https://unsplash.com/@silverkblack) on [Unsplash](https://unsplash.com/photos/iPheGw7_UaI)",{"enabled":897,"items":4781},[4782,4784,4786],{"text":4783,"icon":3157},"The signnow-mcp server exposes 11 tools covering the full document signing lifecycle.",{"text":4785,"icon":2831},"Natural language replaces API calls: upload, sign, and track documents from the terminal.",{"text":4787,"icon":1810},"SignNow sandbox provides 2,000 free signature invites for development and testing.",{},{"title":4790,"description":4791},"SignNow MCP Server for Claude Code | MusicTech Lab","Open-source MCP server for SignNow e-signatures. Upload, sign, and manage documents from Claude Code or any MCP client.",[3655,1825,4793,4373,4004,4794,4795],"e-signatures","developer-tools","automation","rJ-D5aky3r9E1UyuToU6W-lLu8q7MVunwz7LPwgR0Y0",{"id":4798,"title":350,"authors":4799,"badge":4803,"body":4805,"category":1777,"client":1778,"date":5304,"description":5305,"extension":1781,"faq":5306,"featured":69,"featuredOrder":1778,"hidden":69,"image":5319,"keyTakeaways":5321,"meta":5333,"navigation":897,"path":351,"seo":5334,"status":1778,"stem":352,"tags":5337,"teaser":1778,"__hash__":5344,"score":852},"posts/blog/software-development/ai-audio-similarity-search-for-sound-libraries.md",[4800],{"name":4801,"to":739,"avatar":4802},"Mariusz Smenzyk",{"src":741},{"label":5,"color":4804},"#f59e0b",{"type":746,"value":4806,"toc":5283},[4807,4810,4820,4823,4827,4830,4847,4850,4854,4857,4860,4893,4897,4900,4904,4907,4920,4926,4930,4933,4942,4947,4951,4954,4963,4968,4973,4977,4980,5052,5069,5074,5078,5081,5135,5138,5144,5148,5151,5155,5158,5162,5165,5169,5172,5176,5179,5183,5186,5226,5230,5233,5238,5244,5250,5256,5260,5263,5267,5270,5280],[749,4808,4809],{},"If you manage a sound effects library with thousands of files, you already know the problem: a client needs \"a subtle metallic scrape, almost like a blade on glass,\" and your search bar returns nothing useful. The tags say \"metal,\" \"scrape,\" \"impact\" - but none of those capture the specific texture they need.",[749,4811,4812,4813,4816,4817,1052],{},"This is where AI audio similarity search changes the game. Instead of relying on how someone ",[800,4814,4815],{},"described"," a sound, it analyzes what the sound actually ",[800,4818,4819],{},"sounds like",[749,4821,4822],{},"We have been researching this problem as part of our work in music technology, where sound libraries with thousands of short, similar-sounding effects are common. Traditional metadata simply cannot capture the nuances between a \"sharp metallic ping\" and a \"bright metallic tap.\" Here is what we have found about the available approaches, their trade-offs, and what works in production.",[769,4824,4826],{"id":4825},"the-problem-with-tags","The Problem with Tags",[749,4828,4829],{},"Before diving into solutions, it is worth understanding why traditional search breaks down for sound libraries.",[1211,4831,4833,4837,4842],{"className":4832},[1214,1215,1216,1217,1218],[1220,4834],{"description":4835,"icon":1702,"title":4836},"Different people tag the same sound differently. One person's 'whoosh' is another's 'swish.'","Inconsistent Tagging",[1220,4838],{"description":4839,"icon":4840,"title":4841},"Manually tagging thousands of SFX is expensive and never complete. New sounds need immediate categorization.","i-lucide-clock","Time-Consuming",[1220,4843],{"description":4844,"icon":4845,"title":4846},"Tags capture categories, not textures. 'Explosion' doesn't tell you if it's a deep rumble or a sharp crack.","i-lucide-ear","Nuance Gets Lost",[749,4848,4849],{},"For long, distinct audio files like full songs, tags work reasonably well. But for short sound effects (often just 1-3 seconds) where dozens of files live in the same category, tags cannot express the subtle differences that matter to a sound designer picking the perfect effect for a scene.",[769,4851,4853],{"id":4852},"how-ai-audio-search-works","How AI Audio Search Works",[749,4855,4856],{},"The core idea is simple: convert each sound into a mathematical representation (called an \"embedding\") that captures its acoustic properties, then use vector math to find similar sounds.",[749,4858,4859],{},"Here is the process in three steps:",[1211,4861,4863,4870,4878],{"className":4862},[1214,1215,1216,1217,1218],[1220,4864,4867],{"description":4865,"icon":2333,"title":4866},"AI model listens to each new SFX and generates a 512-number vector - a fingerprint of what the sound 'sounds like.'","Step 1: Analyze on Upload",[749,4868,4869],{},"When a new file is uploaded, the AI model processes the audio and produces a numerical embedding that captures its acoustic characteristics: pitch, texture, rhythm, decay. Think of it as a fingerprint, but for how the sound is perceived rather than its waveform shape.",[1220,4871,4875],{"description":4872,"icon":4873,"title":4874},"Vectors are stored alongside metadata in a vector database for lightning-fast similarity search.","i-lucide-database","Step 2: Store Embeddings",[749,4876,4877],{},"These vectors live next to the regular metadata (title, tags, duration) in a specialized vector database. This enables similarity calculations across millions of sounds in milliseconds, not minutes.",[1220,4879,4882],{"description":4880,"icon":3049,"title":4881},"Users search by clicking 'find similar' or typing a natural language description.","Step 3: Search by Sound",[749,4883,4884,4885,4888,4889,4892],{},"Two powerful search modes become available. ",[793,4886,4887],{},"\"Find similar\"",": click a button on any sound, and acoustically similar results surface instantly. ",[793,4890,4891],{},"Natural language",": type \"subtle glass clink with reverb\" and the AI matches your words against actual audio content.",[769,4894,4896],{"id":4895},"available-methods-what-are-the-options","Available Methods: What Are the Options?",[749,4898,4899],{},"Not all AI audio search is created equal. Here are the main approaches, ranked from simplest to most powerful.",[3386,4901,4903],{"id":4902},"metadata-based-similarity-no-ai","Metadata-Based Similarity (No AI)",[749,4905,4906],{},"The simplest approach: find sounds with overlapping tags, the same category, and similar duration. No machine learning required.",[1211,4908,4910,4915],{"className":4909},[1214,1215,1698,1217,1218],[1220,4911],{"description":4912,"icon":4913,"title":4914},"Easy to implement, no ML infrastructure needed, fast and predictable.","i-lucide-check","Pros",[1220,4916],{"description":4917,"icon":4918,"title":4919},"Only as good as your tags. Cannot find acoustically similar sounds with different metadata.","i-lucide-x","Cons",[749,4921,4922,4925],{},[793,4923,4924],{},"Best for:"," Small libraries (under 1,000 files) with consistent, thorough tagging.",[3386,4927,4929],{"id":4928},"panns-pre-trained-audio-neural-networks","PANNs (Pre-trained Audio Neural Networks)",[749,4931,4932],{},"PANNs are deep learning models trained on AudioSet (Google's dataset of 2M+ labeled audio clips). They can classify sounds into 527 categories and produce embeddings that capture acoustic properties.",[1211,4934,4936,4939],{"className":4935},[1214,1215,1698,1217,1218],[1220,4937],{"description":4938,"icon":4913,"title":4914},"Well-established, strong classification accuracy, good embeddings for similarity search.",[1220,4940],{"description":4941,"icon":4918,"title":4919},"No text-to-audio search. Classification only, so you still need a separate system for natural language queries.",[749,4943,4944,4946],{},[793,4945,4924],{}," Libraries that need audio-to-audio similarity but do not need natural language search.",[3386,4948,4950],{"id":4949},"clap-contrastive-language-audio-pretraining","CLAP (Contrastive Language-Audio Pretraining)",[749,4952,4953],{},"CLAP is the breakthrough model for sound library search. Developed by Microsoft and LAION, it understands both text and audio in the same vector space. This means a text description and an audio file can be directly compared mathematically.",[1211,4955,4957,4960],{"className":4956},[1214,1215,1698,1217,1218],[1220,4958],{"description":4959,"icon":4913,"title":4914},"Text-to-audio AND audio-to-audio search. Natural language queries work out of the box. State-of-the-art accuracy.",[1220,4961],{"description":4962,"icon":4918,"title":4919},"Larger model (requires GPU for efficient batch processing). Newer, so less community tooling than PANNs.",[749,4964,4965,4967],{},[793,4966,4924],{}," Professional sound libraries where natural language search and acoustic similarity are both critical.",[2369,4969,4970],{},[749,4971,4972],{},"CLAP is worth serious consideration for sound library projects. The ability to search by typing \"distant thunder with light rain\" and getting acoustically relevant results - not just tag matches - could be a significant UX advantage over traditional approaches.",[769,4974,4976],{"id":4975},"the-technical-stack-for-the-curious","The Technical Stack (For the Curious)",[749,4978,4979],{},"If you are evaluating this for your own project, here is the architecture we recommend:",[827,4981,4983],{"className":829,"code":4982,"language":831,"meta":832,"style":832},"flowchart LR\n    subgraph Indexing[\"Indexing Pipeline\"]\n        A[Audio Upload] --> B[CLAP Model]\n        B --> C[512-dim Vector]\n        C --> D[(Vector Database)]\n    end\n\n    subgraph Search[\"Search Pipeline\"]\n        E[User Query\\ntext or audio] --> F[CLAP Model]\n        F --> G[Query Vector]\n        G --> H{Nearest Neighbor\\nSearch}\n        D --> H\n        H --> I[Ranked Results]\n    end\n",[780,4984,4985,4990,4995,5000,5005,5010,5014,5018,5023,5028,5033,5038,5043,5048],{"__ignoreMap":832},[836,4986,4987],{"class":838,"line":839},[836,4988,4989],{"class":842},"flowchart LR\n",[836,4991,4992],{"class":838,"line":846},[836,4993,4994],{"class":842},"    subgraph Indexing[\"Indexing Pipeline\"]\n",[836,4996,4997],{"class":838,"line":852},[836,4998,4999],{"class":842},"        A[Audio Upload] --> B[CLAP Model]\n",[836,5001,5002],{"class":838,"line":858},[836,5003,5004],{"class":842},"        B --> C[512-dim Vector]\n",[836,5006,5007],{"class":838,"line":864},[836,5008,5009],{"class":842},"        C --> D[(Vector Database)]\n",[836,5011,5012],{"class":838,"line":870},[836,5013,891],{"class":842},[836,5015,5016],{"class":838,"line":876},[836,5017,898],{"emptyLinePlaceholder":897},[836,5019,5020],{"class":838,"line":882},[836,5021,5022],{"class":842},"    subgraph Search[\"Search Pipeline\"]\n",[836,5024,5025],{"class":838,"line":888},[836,5026,5027],{"class":842},"        E[User Query\\ntext or audio] --> F[CLAP Model]\n",[836,5029,5030],{"class":838,"line":894},[836,5031,5032],{"class":842},"        F --> G[Query Vector]\n",[836,5034,5035],{"class":838,"line":901},[836,5036,5037],{"class":842},"        G --> H{Nearest Neighbor\\nSearch}\n",[836,5039,5040],{"class":838,"line":907},[836,5041,5042],{"class":842},"        D --> H\n",[836,5044,5045],{"class":838,"line":913},[836,5046,5047],{"class":842},"        H --> I[Ranked Results]\n",[836,5049,5050],{"class":838,"line":919},[836,5051,891],{"class":842},[1211,5053,5055,5060,5064],{"className":5054},[1214,1215,1216,1217,1218],[1220,5056],{"description":5057,"icon":5058,"title":5059},"LAION-AI/CLAP generates embeddings for both audio and text in a shared vector space.","i-lucide-brain","CLAP Model",[1220,5061],{"description":5062,"icon":4873,"title":5063},"pgvector (PostgreSQL), Qdrant, or Pinecone for storing and querying embeddings at scale.","Vector Database",[1220,5065],{"description":5066,"icon":5067,"title":5068},"Pre-compute embeddings on upload (batch job), never at query time. Users never wait.","i-lucide-cog","Processing Pipeline",[788,5070,5071],{},[749,5072,5073],{},"We prefer pgvector when the project already uses PostgreSQL (e.g., via Supabase). It keeps the infrastructure simple - no separate vector database to manage. For libraries over 1M files, a dedicated solution like Qdrant or Pinecone offers better performance.",[3386,5075,5077],{"id":5076},"performance-numbers","Performance Numbers",[749,5079,5080],{},"From our benchmarks with a 10,000-file SFX library:",[3197,5082,5083,5093],{},[3200,5084,5085],{},[3203,5086,5087,5090],{},[3206,5088,5089],{},"Metric",[3206,5091,5092],{},"Value",[3213,5094,5095,5103,5111,5119,5127],{},[3203,5096,5097,5100],{},[3218,5098,5099],{},"Embedding generation",[3218,5101,5102],{},"~200ms per file (GPU), ~2s per file (CPU)",[3203,5104,5105,5108],{},[3218,5106,5107],{},"Similarity search (pgvector)",[3218,5109,5110],{},"\u003C 50ms for top-20 results",[3203,5112,5113,5116],{},[3218,5114,5115],{},"Natural language search",[3218,5117,5118],{},"\u003C 100ms (text encoding + vector search)",[3203,5120,5121,5124],{},[3218,5122,5123],{},"Storage overhead",[3218,5125,5126],{},"~2KB per sound (512-dim float32 vector)",[3203,5128,5129,5132],{},[3218,5130,5131],{},"Initial indexing (10K files)",[3218,5133,5134],{},"~30 minutes (GPU)",[749,5136,5137],{},"For a 10,000-file library, the total vector storage is about 20MB - negligible compared to the audio files themselves.",[749,5139,5140],{},[2487,5141],{"alt":5142,"src":5143},"AI audio similarity search transforms how sound designers discover the right SFX","/images/blog/musictechlab_blog_ai-audio-similarity-search-for-sound-libraries_inline_1.webp",[769,5145,5147],{"id":5146},"business-impact-why-this-matters","Business Impact: Why This Matters",[749,5149,5150],{},"Beyond the technical elegance, AI audio search delivers measurable business value:",[3386,5152,5154],{"id":5153},"faster-client-workflows","Faster client workflows",[749,5156,5157],{},"Sound designers spend less time browsing and more time creating. When a client can type \"heavy door slam, wooden, no echo\" and get five perfect matches in under a second, that is time saved on every project.",[3386,5159,5161],{"id":5160},"better-discovery-of-existing-assets","Better discovery of existing assets",[749,5163,5164],{},"Most sound libraries have a \"long tail\" problem - hundreds of sounds that rarely get used because nobody remembers they exist or cannot find them through tags. Similarity search surfaces these forgotten assets, increasing the value of the entire library.",[3386,5166,5168],{"id":5167},"reduced-tagging-overhead","Reduced tagging overhead",[749,5170,5171],{},"While tags are still useful for broad categorization, the pressure to tag every sound with exhaustive detail drops significantly. The AI fills in the gaps that human tagging misses.",[3386,5173,5175],{"id":5174},"competitive-differentiation","Competitive differentiation",[749,5177,5178],{},"For studios offering sound libraries to clients, AI-powered search is still uncommon. Offering \"describe what you need and find it instantly\" is a compelling feature that sets a library apart from competitors still using basic keyword search.",[769,5180,5182],{"id":5181},"what-this-looks-like-in-practice","What This Looks Like in Practice",[749,5184,5185],{},"Imagine a film editor working on a trailer. They need a very specific sound: something between a metallic ring and a glass chime, with a quick decay. Here is how the workflow changes:",[1211,5187,5189,5208],{"className":5188},[1214,1215,1698,1217,1218],[1220,5190,5194],{"description":5191,"icon":5192,"title":5193},"15+ minutes, settling for 'close enough'","i-lucide-search-x","Without AI Search",[1036,5195,5196,5199,5202,5205],{},[1039,5197,5198],{},"Search \"metal\" - 200 results, mostly impacts and scrapes",[1039,5200,5201],{},"Search \"glass\" - 150 results, mostly breaks and shatters",[1039,5203,5204],{},"Search \"chime\" - 30 results, browse through each one",[1039,5206,5207],{},"Give up after 15 minutes and settle for \"close enough\"",[1220,5209,5212],{"description":5210,"icon":2831,"title":5211},"Under 2 minutes, the perfect sound","With AI Search",[1036,5213,5214,5217,5220,5223],{},[1039,5215,5216],{},"Type \"metallic ring with glass chime quality, short decay\"",[1039,5218,5219],{},"Get 10 acoustically relevant results in under a second",[1039,5221,5222],{},"Click \"find similar\" on the closest match to refine further",[1039,5224,5225],{},"Download the perfect sound in under 2 minutes",[769,5227,5229],{"id":5228},"limitations-and-honest-trade-offs","Limitations and Honest Trade-offs",[749,5231,5232],{},"No technology is perfect. Here is what to keep in mind:",[1553,5234,5235],{},[749,5236,5237],{},"AI similarity search works best as a complement to traditional search, not a replacement. Tags and categories still provide the structural navigation that users need for browsing. AI search excels at the \"I know what I want but cannot describe it in keywords\" use case.",[749,5239,5240,5243],{},[793,5241,5242],{},"Model accuracy varies by domain."," CLAP was trained on general audio data. For highly specialized libraries (e.g., only foley sounds, only synthesizer patches), fine-tuning the model on your specific data can improve results significantly - but adds development time.",[749,5245,5246,5249],{},[793,5247,5248],{},"Initial setup requires processing power."," Generating embeddings for a large existing library is a one-time batch job, but it does require GPU access. Cloud GPUs (AWS, GCP) make this affordable - expect around $5-20 for processing 10,000 files.",[749,5251,5252,5255],{},[793,5253,5254],{},"Relevance is subjective."," \"Similar\" means different things to different people. A sound designer might consider two sounds similar because of their texture, while another focuses on rhythm or pitch. The AI captures overall acoustic similarity, which is usually - but not always - what users want.",[769,5257,5259],{"id":5258},"getting-started","Getting Started",[749,5261,5262],{},"If you are considering AI audio search for your sound library, here is our recommended approach:",[5264,5265],"project-timeline",{":items":5266},"[{\"title\":\"Start with CLAP Embeddings\",\"description\":\"Get both text-to-audio and audio-to-audio search from the very beginning. One model, two search modes.\",\"icon\":\"i-lucide-brain\"},{\"title\":\"Use pgvector on PostgreSQL\",\"description\":\"If you are already on PostgreSQL, add the pgvector extension. Avoid infrastructure complexity early on.\",\"icon\":\"i-lucide-database\"},{\"title\":\"Pre-compute on Upload\",\"description\":\"Generate embeddings when sounds are uploaded, not when users search. Never make users wait for real-time analysis.\",\"icon\":\"i-lucide-cog\"},{\"title\":\"Keep Traditional Search Alongside AI\",\"description\":\"Let users choose between keyword filtering and natural language search. Both have their place.\",\"icon\":\"i-lucide-layers\"},{\"title\":\"Collect Usage Data\",\"description\":\"Track which AI results users actually download. Use this signal to measure and improve relevance over time.\",\"icon\":\"i-lucide-bar-chart\"}]",[749,5268,5269],{},"The technology is mature enough for production use today, and the user experience improvement is dramatic. For sound libraries where traditional search falls short - especially collections of short, similar-sounding effects - AI similarity search is not a nice-to-have. It is the feature that makes the library actually usable.",[788,5271,5272],{},[749,5273,5274,5277,5278,1052],{},[793,5275,5276],{},"Related reading:"," If you are interested in how AI can also transform data analytics in the music industry, check out our article on ",[753,5279,84],{"href":85},[1761,5281,5282],{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":832,"searchDepth":846,"depth":846,"links":5284},[5285,5286,5287,5292,5295,5301,5302,5303],{"id":4825,"depth":846,"text":4826},{"id":4852,"depth":846,"text":4853},{"id":4895,"depth":846,"text":4896,"children":5288},[5289,5290,5291],{"id":4902,"depth":852,"text":4903},{"id":4928,"depth":852,"text":4929},{"id":4949,"depth":852,"text":4950},{"id":4975,"depth":846,"text":4976,"children":5293},[5294],{"id":5076,"depth":852,"text":5077},{"id":5146,"depth":846,"text":5147,"children":5296},[5297,5298,5299,5300],{"id":5153,"depth":852,"text":5154},{"id":5160,"depth":852,"text":5161},{"id":5167,"depth":852,"text":5168},{"id":5174,"depth":852,"text":5175},{"id":5181,"depth":846,"text":5182},{"id":5228,"depth":846,"text":5229},{"id":5258,"depth":846,"text":5259},"2026-03-01T00:00:00.000Z","How AI-powered audio search is replacing tags and keywords, helping sound designers find the right SFX in seconds instead of minutes.",[5307,5310,5313,5316],{"question":5308,"answer":5309},"What is AI audio similarity search?","It's a technology that analyzes the actual sound content of audio files and finds acoustically similar sounds, even when tags or metadata don't match. Instead of searching by keywords, users can search by describing what a sound 'sounds like' or clicking 'find similar' on any sound.",{"question":5311,"answer":5312},"How is this different from tag-based search?","Traditional search relies on human-assigned tags, which are inconsistent, incomplete, and subjective. AI audio search analyzes the acoustic properties of each sound, so it can find similar sounds even when they were tagged differently by different people.",{"question":5314,"answer":5315},"What is CLAP and how does it work?","CLAP (Contrastive Language-Audio Pretraining) is an AI model that understands both text and audio. It converts sounds into mathematical vectors, enabling both text-to-audio search (describe what you want) and audio-to-audio similarity (find sounds like this one).",{"question":5317,"answer":5318},"How long does it take to implement AI audio search?","A basic implementation with pre-computed embeddings and vector search can be built in 2-4 weeks. The main effort is in the initial embedding pipeline and search tuning, not in ongoing maintenance.",{"src":5320},"/images/blog/musictechlab_blog_ai-audio-similarity-search-for-sound-libraries.webp",{"enabled":897,"items":5322},[5323,5325,5328,5330],{"text":5324,"icon":5058},"AI audio search finds sounds by acoustic similarity, not just tags or keywords.",{"text":5326,"icon":5327},"CLAP embeddings convert each sound into a 512-number vector fingerprint.","i-lucide-cpu",{"text":5329,"icon":4840},"A basic implementation with vector search can be built in 2 to 4 weeks.",{"text":5331,"icon":5332},"Tags fail for short SFX; dozens of 1-3 second files share the same category.","i-lucide-music",{},{"title":5335,"description":5336},"AI Audio Similarity Search for Sound Libraries | MusicTech Lab","Learn how CLAP embeddings and vector search help sound designers find SFX by acoustic similarity, not just tags. Business and technical guide.",[1823,5338,5339,5340,5341,5342,5343],"audio-search","sound-design","CLAP","vector-search","SFX","music-tech","GWSVyrLINooVhaaAhJTIVykDqeysmp7wmXzOwCj9Td0",1780074435436]