@labelgrid/mcp 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@ All notable changes to `@labelgrid/mcp` are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.1] - 2026-08-05
9
+
10
+ ### Changed
11
+
12
+ - `get_analytics` states how the summary aggregates: every section aggregates
13
+ over the resolved filter scope, so a `upc` filter returns release totals
14
+ rather than a row per track. Per-track output comes from the `track-*-daily`
15
+ sections (which need a `release_id`, `isrc` or `upc` scope) or from
16
+ `get_analytics_rankings`.
17
+ - `get_analytics_rankings` is described as the per-entity breakdown of a scope
18
+ as well as a leaderboard — `type: 'tracks'` with a `upc` or `release_id`
19
+ filter ranks the tracks on that release.
20
+ - Descriptions on the `metrics`, `view` and `type` parameters were removed where
21
+ they restated the parameter's own enum or its tool description. No parameter,
22
+ enum value or validation rule changed.
23
+
8
24
  ## [0.6.0] - 2026-08-05
9
25
 
10
26
  ### Added
package/README.md CHANGED
@@ -149,9 +149,9 @@ tool definitions by `npm run gen-docs` — do not edit it by hand._
149
149
 
150
150
  | Tool | Gate | Description |
151
151
  | --- | --- | --- |
152
- | `get_analytics` | read | Streaming analytics summary. Window capped at 400 days; `metrics` takes 1-12 section keys per request (split larger selections — responses are cached). KUGOU/KUWO/QQMUSIC report weekly: one point per week carrying the whole week — never average it per day. `meta` carries `platform_cadence`, `section_granularity`, `sections_as_of` and `sections_complete_through` (later dates still filling in). Call get_analytics_availability first for section-per-platform support. The `social-*` / `soundcloud-engagement` sections cover social and UGC usage instead of streaming: their `platform` is a UGC platform; a use, view and play are distinct quantities, never summed with each other or with streams; `ugc_platform` narrows them. Selecting any adds `meta.social_availability` (which UGC platforms report each signal) — the streaming matrix excludes them. The `track-*-daily` sections need a `release_id`, `isrc` or `upc` scope. `track-listeners-daily` sums per-entry daily counts: not distinct people, not summable across dates. Rate-limited ~60/min; windows over 90 days draw a separate lower ~30/min budget — prefer shorter windows for polling. A 429 carries retry_after_seconds. |
152
+ | `get_analytics` | read | Streaming analytics summary. Window capped at 400 days; `metrics` takes 1-12 section keys per request (split larger selections; responses cached). KUGOU/KUWO/QQMUSIC report weekly: one point carries the whole week — never average per day. `meta` carries `platform_cadence`, `section_granularity`, `sections_as_of` and `sections_complete_through` (later dates still filling in). See get_analytics_availability for per-platform support. Sections aggregate over the resolved filter scope: a `upc` filter gives release totals, not per-track rows. For those use `track-*-daily` (needs a `release_id`, `isrc` or `upc` scope) or get_analytics_rankings. `track-listeners-daily` sums per-entry daily counts: not distinct people, not summable across dates. `social-*` / `soundcloud-engagement` cover social/UGC usage, not streaming: `platform` is a UGC platform, `ugc_platform` narrows them; use, view and play are distinct quantities never summed together or with streams. Selecting any adds `meta.social_availability` (which UGC platforms report each signal); the streaming matrix omits them. Rate-limited ~60/min; windows over 90 days draw a separate ~30/min budget — prefer short windows for polling. A 429 carries retry_after_seconds. |
153
153
  | `get_analytics_availability` | read | Static `availability` matrix (per section, per platform) plus `platform_cadence` (daily\|weekly per platform). Account- and date-independent: fetch once, reuse. Read it before get_analytics so an unreported section is treated as unavailable, not an empty chart. |
154
- | `get_analytics_rankings` | read | Top-N rankings for a window, ordered by summed streams. Pick ONE `view`: `leaderboards` — your top artists, tracks or albums (`type` required; `all` returns all three in one request). `placements` — the playlists and radio containers driving streams, summed across storefronts. Same scope filters as get_analytics; `limit` 1-50 (default 10). Under a `platform` filter, an `availability` of `not_available_for_platform` means that platform reports no ranking and `data` is empty. |
154
+ | `get_analytics_rankings` | read | Top-N rankings for a window, ordered by summed streams — the per-entity breakdown of a scope: `type` tracks with a `upc`/`release_id` filter ranks the tracks on that release. Pick ONE `view`: `leaderboards` — your top artists, tracks or albums (`type` required; `all` returns all three in one call). `placements` — playlists and radio containers driving streams, summed across storefronts. Same scope filters as get_analytics; `limit` 1-50 (default 10). Under a `platform` filter, `availability: not_available_for_platform` means no ranking there and `data` is empty. |
155
155
  | `query_artificial_streaming` | read | Artificial-streaming (streaming-integrity) reads. Pick ONE `view`: `flags` — Stream Radar early-warning flags, paginated (`filters`: status, severity, dsp, isrc, release_id, detected_from/detected_to). Stream Radar is an optional add-on; without it the API returns a 403, surfaced verbatim. `flag_detail` — one flag by `flag_id`. `records` — reported artificial-streaming records, cursor-paginated; the detail behind any artificial-streaming fee (`filters`: dsp, start_date/end_date, release_id, isrc). `fee_breakdown` — per-release fee breakdown for one `period` (YYYY-MM). response_format:'detailed' returns the verbatim API response. |
156
156
 
157
157
  ### Finance (statements, transactions, royalties) `finance`
@@ -7,9 +7,11 @@
7
7
  import { z } from 'zod';
8
8
  import { applyProjection } from '../projection.js';
9
9
  /**
10
- * The 47 metric sections the summary endpoint can return, in the server's
11
- * canonical order: the streaming sections first, then the social and UGC
12
- * family, then the per-track daily series.
10
+ * The 47 metric sections the summary endpoint can return. The server's canonical
11
+ * order — the order it projects sections into the response — is the streaming
12
+ * sections, then the per-track daily series, then the social and UGC family.
13
+ * This list groups the social and UGC family last instead; only membership
14
+ * matters here, since the enum validates which keys are legal, not their order.
13
15
  */
14
16
  const METRICS = [
15
17
  'streams',
@@ -96,25 +98,18 @@ const getAnalytics = {
96
98
  toolset: 'insights',
97
99
  gate: 'read',
98
100
  title: 'Get streaming and social analytics',
99
- description: 'Streaming analytics summary. Window capped at 400 days; `metrics` takes 1-12 section keys per request (split larger selections — responses are cached). ' +
100
- 'KUGOU/KUWO/QQMUSIC report weekly: one point per week carrying the whole week — never average it per day. `meta` carries `platform_cadence`, `section_granularity`, `sections_as_of` and `sections_complete_through` (later dates still filling in). ' +
101
- 'Call get_analytics_availability first for section-per-platform support. ' +
102
- 'The `social-*` / `soundcloud-engagement` sections cover social and UGC usage instead of streaming: their `platform` is a UGC platform; a use, view and play are distinct quantities, never summed with each other or with streams; `ugc_platform` narrows them. Selecting any adds `meta.social_availability` (which UGC platforms report each signal) — the streaming matrix excludes them. ' +
103
- 'The `track-*-daily` sections need a `release_id`, `isrc` or `upc` scope. `track-listeners-daily` sums per-entry daily counts: not distinct people, not summable across dates. ' +
104
- 'Rate-limited ~60/min; windows over 90 days draw a separate lower ~30/min budget — prefer shorter windows for polling. A 429 carries retry_after_seconds.',
101
+ description: 'Streaming analytics summary. Window capped at 400 days; `metrics` takes 1-12 section keys per request (split larger selections; responses cached). ' +
102
+ 'KUGOU/KUWO/QQMUSIC report weekly: one point carries the whole week — never average per day. `meta` carries `platform_cadence`, `section_granularity`, `sections_as_of` and `sections_complete_through` (later dates still filling in). ' +
103
+ 'See get_analytics_availability for per-platform support. ' +
104
+ 'Sections aggregate over the resolved filter scope: a `upc` filter gives release totals, not per-track rows. For those use `track-*-daily` (needs a `release_id`, `isrc` or `upc` scope) or get_analytics_rankings. `track-listeners-daily` sums per-entry daily counts: not distinct people, not summable across dates. ' +
105
+ '`social-*` / `soundcloud-engagement` cover social/UGC usage, not streaming: `platform` is a UGC platform, `ugc_platform` narrows them; use, view and play are distinct quantities never summed together or with streams. Selecting any adds `meta.social_availability` (which UGC platforms report each signal); the streaming matrix omits them. ' +
106
+ 'Rate-limited ~60/min; windows over 90 days draw a separate ~30/min budget — prefer short windows for polling. A 429 carries retry_after_seconds.',
105
107
  inputShape: {
106
108
  start_date: z.string().describe('Window start, YYYY-MM-DD.'),
107
109
  end_date: z.string().describe('Window end, YYYY-MM-DD.'),
108
- metrics: z
109
- .array(z.enum(METRICS))
110
- .min(1)
111
- .max(MAX_METRICS_PER_REQUEST)
112
- .describe('Section keys, 1-12 per request.'),
110
+ metrics: z.array(z.enum(METRICS)).min(1).max(MAX_METRICS_PER_REQUEST),
113
111
  platform: z.enum(PLATFORMS).optional(),
114
- ugc_platform: z
115
- .enum(UGC_PLATFORMS)
116
- .optional()
117
- .describe('Narrows the social/UGC sections only.'),
112
+ ugc_platform: z.enum(UGC_PLATFORMS).optional().describe('Social/UGC sections only.'),
118
113
  release_id: z.number().int().positive().optional(),
119
114
  isrc: z.string().optional(),
120
115
  upc: z.string().optional(),
@@ -158,15 +153,15 @@ const getAnalyticsRankings = {
158
153
  toolset: 'insights',
159
154
  gate: 'read',
160
155
  title: 'Get analytics rankings',
161
- description: 'Top-N rankings for a window, ordered by summed streams. Pick ONE `view`: ' +
162
- '`leaderboards` — your top artists, tracks or albums (`type` required; `all` returns all three in one request). ' +
163
- '`placements` — the playlists and radio containers driving streams, summed across storefronts. ' +
164
- 'Same scope filters as get_analytics; `limit` 1-50 (default 10). Under a `platform` filter, an `availability` of `not_available_for_platform` means that platform reports no ranking and `data` is empty.',
156
+ description: 'Top-N rankings for a window, ordered by summed streams — the per-entity breakdown of a scope: `type` tracks with a `upc`/`release_id` filter ranks the tracks on that release. Pick ONE `view`: ' +
157
+ '`leaderboards` — your top artists, tracks or albums (`type` required; `all` returns all three in one call). ' +
158
+ '`placements` — playlists and radio containers driving streams, summed across storefronts. ' +
159
+ 'Same scope filters as get_analytics; `limit` 1-50 (default 10). Under a `platform` filter, `availability: not_available_for_platform` means no ranking there and `data` is empty.',
165
160
  inputShape: {
166
- view: z.enum(RANKING_VIEWS).describe('Which ranking read.'),
161
+ view: z.enum(RANKING_VIEWS),
167
162
  start_date: z.string().describe('Window start, YYYY-MM-DD.'),
168
163
  end_date: z.string().describe('Window end, YYYY-MM-DD.'),
169
- type: z.enum(LEADERBOARD_TYPES).optional().describe('Required for view leaderboards.'),
164
+ type: z.enum(LEADERBOARD_TYPES).optional(),
170
165
  platform: z.enum(PLATFORMS).optional(),
171
166
  ugc_platform: z.enum(UGC_PLATFORMS).optional(),
172
167
  release_id: z.number().int().positive().optional(),
@@ -178,7 +173,7 @@ const getAnalyticsRankings = {
178
173
  .int()
179
174
  .positive()
180
175
  .optional()
181
- .describe('Narrow to one of your own labels; it can never widen scope.'),
176
+ .describe('Narrow to one of your own labels; never widens scope.'),
182
177
  limit: z.number().int().positive().max(MAX_RANKING_LIMIT).optional(),
183
178
  },
184
179
  annotations: { readOnlyHint: true },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@labelgrid/mcp",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "mcpName": "io.github.labelgrid/labelgrid-mcp",
5
5
  "description": "Official LabelGrid MCP server — connect your AI client to your LabelGrid account",
6
6
  "type": "module",
package/server.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.labelgrid/labelgrid-mcp",
4
4
  "description": "Official LabelGrid MCP server — manage your music catalog, releases, analytics and distribution.",
5
- "version": "0.6.0",
5
+ "version": "0.6.1",
6
6
  "websiteUrl": "https://labelgrid.com",
7
7
  "repository": {
8
8
  "url": "https://github.com/labelgrid/labelgrid-mcp",
@@ -12,7 +12,7 @@
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@labelgrid/mcp",
15
- "version": "0.6.0",
15
+ "version": "0.6.1",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },