{
  "name": "Patchline",
  "description": "Patchline is the music-industry control plane for AI copilots — catalog, artist intelligence, playlist matching, drop links, smart links, asset shares, and release execution exposed as live tools any MCP-compatible agent can call.",
  "site": "https://www.patchline.ai",
  "mcp_endpoint": "https://www.patchline.ai/api/mcp/v1",
  "auth": {
    "type": "oauth2",
    "pkce": true,
    "protected_resource_metadata": "https://www.patchline.ai/.well-known/oauth-protected-resource",
    "authorization_server_metadata": "https://www.patchline.ai/.well-known/oauth-authorization-server",
    "install_for_humans": "https://www.patchline.ai/mcp"
  },
  "docs_for_agents": {
    "rules": "https://www.patchline.ai/AGENTS.md",
    "llms_txt": "https://www.patchline.ai/llms.txt",
    "mcp_install_md": "https://www.patchline.ai/llms.mdx/mcp",
    "claude_plugin_md": "https://www.patchline.ai/llms.mdx/claude"
  },
  "tools": [
    {
      "name": "get_started",
      "category": "Onboarding",
      "callFirst": true,
      "description": "Orient a new or returning user: reports the workspace (artists, tracks, releases) and the single best next action — connect an artist, add music, get a release out, or grow the audience. Call this FIRST when unsure where to begin; works with no prior context."
    },
    {
      "name": "analyze_url",
      "category": "Dispatch",
      "callFirst": true,
      "description": "Universal dispatcher for Spotify URLs (track, artist, album, playlist) and YouTube URLs (video, channel). Paste a link and get the canonical identity plus a ranked list of next MCP tools to call with exact arguments. Call this FIRST whenever a user shares a Spotify or YouTube link; for artist profiles on other platforms, pass the profile URL straight to add_artist."
    },
    {
      "name": "browse_catalog",
      "category": "Catalog",
      "description": "List tracks in the user catalog with pagination — title, ISRC, BPM, key, status. Optional artistId scopes to one roster artist (manager accounts)."
    },
    {
      "name": "import_track_from_url",
      "category": "Catalog",
      "description": "Import a track's metadata into the catalog from a Spotify track URL — creates a catalog entry with title, artist, ISRC, and platform link (no audio; pair with get_asset_upload_link for audio). Resolve title/artist/ISRC via get_song_intelligence first. Dedup-safe on re-import. A provider-resolved artist that can't be independently corroborated is refused (fail-closed); pass allowLowConfidenceArtist:true only after confirming the artist with the user."
    },
    {
      "name": "get_audience_overview",
      "category": "Audience",
      "description": "Aggregate fan-graph overview: total fans, captures (7/30d), repeat and active fans, buyers, store revenue, capture rate, and identity stats. Aggregates only — no fan names or emails."
    },
    {
      "name": "get_audience_geo",
      "category": "Audience",
      "description": "City-level fan geography: hubs with fan counts, total countries/cities, configurable lookback window. For tour routing and geo-targeted promotion. Aggregates only."
    },
    {
      "name": "catalog_search",
      "category": "Catalog",
      "description": "Search across the user catalog by title, artist, ISRC, and metadata. Defaults to music/audio assets; set includeNonAudio only when the user asks for cover art, images, or documents."
    },
    {
      "name": "get_asset",
      "category": "Catalog",
      "description": "Full metadata for a single track by asset ID — covers, audio features, version history, distribution status."
    },
    {
      "name": "manage_catalog_asset",
      "category": "Catalog",
      "description": "Operator actions for owned catalog assets: duplicate candidate scan, reversible archive/restore, dry-run reattribution preview, confirmed canonical-recording repair, and set_cover_art (set a track cover from an owned image asset). No hard delete and no roster deletion."
    },
    {
      "name": "get_artist_intelligence",
      "category": "Artists",
      "description": "Cached roster intelligence for a single artist: streaming, social audience, genres, recent activity. Run add_artist first if the artist is missing."
    },
    {
      "name": "search_artists",
      "category": "Artists",
      "description": "Search artists by name within the user roster."
    },
    {
      "name": "get_trending_artists",
      "category": "Artists",
      "description": "Top artists by streaming reach. Optional genre and ISO2 market filters return Aria artist ids that can be passed directly to add_artist."
    },
    {
      "name": "refresh_artist_intelligence",
      "category": "Artists",
      "description": "Queue a refresh for one roster artist through Patchline's existing artist intelligence refresh pipeline. Stale-only by default; skips fresh or already pending rows."
    },
    {
      "name": "refresh_roster_intelligence",
      "category": "Artists",
      "description": "Queue bounded stale-only intelligence refreshes for up to 10 roster artists through Patchline's existing artist intelligence refresh pipeline. Returns queued/skipped/failed counts."
    },
    {
      "name": "add_artist",
      "category": "Roster",
      "description": "Add an artist to the user roster from a platform URL or an ariaArtistId returned by search_artists/get_trending_artists. Name-only is rejected unless explicitly creating a manual profile. Triggers background audience enrichment when canonical identity is available."
    },
    {
      "name": "remove_artist",
      "category": "Roster",
      "description": "Remove an artist from the user roster by patchlineArtistId."
    },
    {
      "name": "browse_roster",
      "category": "Roster",
      "description": "List or filter the authenticated user roster — artists with IDs, platform IDs, enrichment status, genres, and metrics. No query required."
    },
    {
      "name": "get_roster_digest",
      "category": "Roster",
      "description": "Read-only Monday brief for a serious artist or label owner: roster health, missing identity fields, catalog counts, live surfaces, release/campaign summary, aggregate audience highlights, cleanup candidates, and next actions. No raw fan names, emails, or per-fan journeys."
    },
    {
      "name": "get_releases",
      "category": "Releases",
      "description": "Release plans, schedules, and campaign details for the authenticated user."
    },
    {
      "name": "find_playlists",
      "category": "Playlists",
      "description": "Playlist match opportunities ranked by sonic fit and curator responsiveness for a given track."
    },
    {
      "name": "inspect_playlist",
      "category": "Playlists",
      "description": "Full Spotify playlist intelligence: curator identity, genres, freshness, followers, track turnover, recent additions, submission status."
    },
    {
      "name": "create_smart_link",
      "category": "Smart Links",
      "description": "Smart link landing page for an owned catalog track — server-side resolves ISRC, DSP URLs, and cover art. For pre-release campaigns use create_drop_link instead."
    },
    {
      "name": "list_store_listings",
      "category": "Storefront",
      "description": "List authenticated-user store inventory and listing readiness. Read-only; reports seller agreement, payout, rights, AI-policy, audio, and marketplace blockers inherited from the store inventory service."
    },
    {
      "name": "manage_store_listing",
      "category": "Storefront",
      "description": "Validate, list, unlist, price, reorder, or update metadata for store inventory through the store inventory service. Mutations inherit all commerce safety checks."
    },
    {
      "name": "create_store_link",
      "category": "Storefront",
      "description": "Create or return the authenticated user’s public store surface through the store share service. Returns a store share URL and normalized section config."
    },
    {
      "name": "get_store_analytics",
      "category": "Storefront",
      "description": "Read aggregate store analytics: views, revenue, orders, conversion, and recent sales with buyer emails redacted from MCP output."
    },
    {
      "name": "get_fan_segments",
      "category": "Storefront",
      "description": "Read aggregate store fan segments and engagement stats for the user-owned store surface. No raw fan emails, names, or per-fan journeys."
    },
    {
      "name": "create_drop_link",
      "category": "Smart Links",
      "description": "Create a public release/drop link for an owned release. Returns the share URL plus normalized section config."
    },
    {
      "name": "create_asset_share",
      "category": "Smart Links",
      "description": "Create a public asset share link for an owned catalog asset without changing the asset itself. Returns a share URL and normalized section config."
    },
    {
      "name": "create_briefing",
      "category": "Smart Links",
      "description": "Create a public briefing/report microsite from markdown, validated structured modules, and optional Patchline source references. Template-driven only; does not create arbitrary HTML/CSS/JS."
    },
    {
      "name": "list_share_surfaces",
      "category": "Smart Links",
      "description": "List owner-safe focused link surfaces for the authenticated user: drops, smart links, asset shares, plus report/briefing microsites for MCP report sharing."
    },
    {
      "name": "get_share_surface",
      "category": "Smart Links",
      "description": "Read owner-safe metadata, normalized section config, source refs, and analytics for a public share surface by URL or shareId."
    },
    {
      "name": "manage_share_surface",
      "category": "Smart Links",
      "description": "Update briefing/report microsite metadata or revoke a public share surface. Revoke unpublishes the surface and is destructive."
    },
    {
      "name": "get_surface_analytics",
      "category": "Smart Links",
      "description": "Read aggregate analytics for an owned public share surface: views, captures, downloads, plays, last viewed, and linked asset/project/campaign IDs."
    },
    {
      "name": "read_public_surface",
      "category": "Smart Links",
      "description": "Read owner-safe metadata and section config for a public surface by URL or shareId."
    },
    {
      "name": "get_audio_features",
      "category": "Music Data",
      "description": "BPM, key, mood, danceability, and genre tags for a track. Accepts assetId or ISRC."
    },
    {
      "name": "get_song_intelligence",
      "category": "Music Data",
      "description": "Full track intelligence: ISRC, audio analysis, playlist matches, streaming stats, collaborators. Accepts a Spotify track URL."
    },
    {
      "name": "get_work_metadata",
      "category": "Music Data",
      "description": "Coverage-limited/experimental musical-work lookup for writers, publishers, and ISWC. Requires Spotify track ID/URL or ISRC; unresolved works return WORK_NOT_RESOLVED with do-not-retry guidance."
    },
    {
      "name": "find_similar_tracks",
      "category": "Music Data",
      "description": "Find tracks with similar audio characteristics (vibe, instrumentation, production) to a given catalog asset, ranked by audio-embedding similarity. Restricted to the caller-owned catalog."
    },
    {
      "name": "get_bio",
      "category": "AI Generation",
      "description": "Returns the AI-generated bio for an artist from intelligence cache. Populated during enrichment — no live LLM call."
    },
    {
      "name": "generate_pitch",
      "category": "AI Generation",
      "description": "Playlist curator pitch for a specific track. Standard mode is grounded in real track/audio/audience data; cold_start requires verified_context and returns INSUFFICIENT_DATA instead of ungrounded or template copy."
    },
    {
      "name": "generate_image",
      "category": "AI Generation",
      "description": "Generate release cover art or a promo flyer only when the user explicitly asks for generated artwork. Uploads remain the preferred path when the user already has visual assets."
    },
    {
      "name": "get_asset_upload_link",
      "category": "Asset Upload",
      "description": "Create a new Asset Hub record and return a short-lived presigned S3 URL so the client can PUT bytes directly to storage. Supports audio masters (→ track analysis) and image covers (→ visual library, usable as a track cover via manage_catalog_asset set_cover_art); kind inferred from the extension. Bytes do NOT pass through the MCP server. After the upload completes, call confirm_asset_upload."
    },
    {
      "name": "create_upload_link",
      "category": "Asset Upload",
      "description": "Create a short-lived secure browser upload link for a human handoff when the MCP client cannot upload bytes directly. The user opens the link while signed in to Patchline; this does not upload bytes or bypass user auth."
    },
    {
      "name": "confirm_asset_upload",
      "category": "Asset Upload",
      "description": "Confirm a direct-to-S3 upload created by get_asset_upload_link. Marks the asset ready; for audio it also triggers Patchline track analysis (audio fingerprinting, aiMetadata extraction). Image covers finalize with no analysis."
    },
    {
      "name": "create_project",
      "category": "Projects",
      "description": "Create a real Patchline project for the signed-in user. Use during Aria start after artist resolution so the local workspace is linked to the Patchline dashboard. Requires artistId from add_artist."
    },
    {
      "name": "get_artist_context",
      "category": "Projects",
      "description": "Best-effort read of safe artist/account campaign context for Aria planning: connected platforms, distributor preference, email-list bucket, Telegram linkage, recent releases, defaults. Unknown fields return null instead of failing."
    },
    {
      "name": "create_campaign",
      "category": "Projects",
      "description": "Start async Aria campaign planning for a Patchline project. Requires projectId from create_project and returns polling guidance; use get_campaign to read generated tasks."
    },
    {
      "name": "get_campaign",
      "category": "Projects",
      "description": "Read campaign generation progress and generated marketing tasks for a Patchline project. Use after create_campaign; poll with a bounded retry loop until completed or failed."
    }
  ],
  "tool_count": 49,
  "generated_at": "2026-06-19T09:51:07.184Z"
}