@h-ear/mcp-server 1.0.0 → 1.0.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/README.md +8 -2
- package/dist/tools/classify-audio.d.ts.map +1 -1
- package/dist/tools/classify-audio.js +28 -17
- package/dist/tools/classify-audio.js.map +1 -1
- package/dist/tools/classify-batch.d.ts.map +1 -1
- package/dist/tools/classify-batch.js +15 -5
- package/dist/tools/classify-batch.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -72,8 +72,8 @@ OAuth 2.1 + PKCE discovery is automatic via [RFC 9728](https://datatracker.ietf.
|
|
|
72
72
|
|
|
73
73
|
| Tool | Description | Auth |
|
|
74
74
|
|------|-------------|------|
|
|
75
|
-
| `classifyAudio` | Classify a single audio file or URL (MP3, WAV, FLAC, OGG, M4A). No file size limit — large local files are uploaded via byte-slice chunking (no ffmpeg required); URL mode is fetched server-side with no client upload. | API Key |
|
|
76
|
-
| `classifyBatch` | Batch classify up to 50 audio files or URLs. | API Key |
|
|
75
|
+
| `classifyAudio` | Classify a single audio file or URL (MP3, WAV, FLAC, OGG, M4A). Supports optional GPS coordinates (`latitude`/`longitude`) for location tagging. No file size limit — large local files are uploaded via byte-slice chunking (no ffmpeg required); URL mode is fetched server-side with no client upload. | API Key |
|
|
76
|
+
| `classifyBatch` | Batch classify up to 50 audio files or URLs. Supports optional GPS (`latitude`/`longitude`) applied to all files. | API Key |
|
|
77
77
|
| `listClasses` | List 521+ supported audio classes across 3 taxonomies (AudioSet/YAMNet, AudioSet/PANNs, Species). | None |
|
|
78
78
|
| `healthCheck` | API liveness check — status, version, deployment timestamp. | None |
|
|
79
79
|
| `usage` | API quota: minutes used, calls today, remaining balance. | API Key |
|
|
@@ -132,6 +132,12 @@ Claude Desktop has a hardcoded 60-second MCP timeout. Large file uploads can exc
|
|
|
132
132
|
- **Claude Code:** Set `MCP_TIMEOUT=300000` (5 min) environment variable
|
|
133
133
|
- **Claude Desktop:** Use URL mode (`url` parameter) instead of `filePath` for large files — the API fetches the file server-side with no timeout concern
|
|
134
134
|
|
|
135
|
+
## GPS / Location
|
|
136
|
+
|
|
137
|
+
Pass `latitude` and `longitude` to `classifyAudio` or `classifyBatch` to tag recordings with GPS coordinates. Both must be provided together (decimal degrees: lat -90..90, lng -180..180).
|
|
138
|
+
|
|
139
|
+
The server applies a priority cascade: file-embedded GPS > client-provided GPS > IP geolocation. Location data is returned in the job result via `getJob` when available.
|
|
140
|
+
|
|
135
141
|
## Supported Formats
|
|
136
142
|
|
|
137
143
|
MP3, WAV, FLAC, OGG, M4A
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-audio.d.ts","sourceRoot":"","sources":["../../src/tools/classify-audio.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EACH,KAAK,aAAa,EAErB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"classify-audio.d.ts","sourceRoot":"","sources":["../../src/tools/classify-audio.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EACH,KAAK,aAAa,EAErB,MAAM,aAAa,CAAC;AA0DrB,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA2JpF"}
|
|
@@ -51,9 +51,7 @@ function buildClientMetadata(filePath, fileStat) {
|
|
|
51
51
|
catch {
|
|
52
52
|
// Hash is a hint; failure is non-fatal.
|
|
53
53
|
}
|
|
54
|
-
// getAudioDuration()
|
|
55
|
-
// throws) when ffprobe is unavailable or the file is unreadable, so no
|
|
56
|
-
// separate hasFFmpeg() guard is needed.
|
|
54
|
+
// getAudioDuration() returns 0 when ffprobe unavailable.
|
|
57
55
|
const probed = getAudioDuration(filePath);
|
|
58
56
|
if (probed > 0) {
|
|
59
57
|
out.clientReportedDuration = probed;
|
|
@@ -72,15 +70,25 @@ export function registerClassifyAudio(server, client) {
|
|
|
72
70
|
.describe('Confidence threshold (0.0-1.0). Only classes above this score are returned.'),
|
|
73
71
|
filterMinDurationSeconds: z.number().min(0.1).max(595).optional()
|
|
74
72
|
.describe('Minimum event duration filter in seconds.'),
|
|
75
|
-
waitForResult: z.
|
|
73
|
+
waitForResult: z.any().default(false)
|
|
76
74
|
.describe('If true, polls until classification completes (up to 5 min). Default false — returns immediately with job ID for later retrieval via getJob.'),
|
|
77
75
|
callbackUrl: z.string().url().optional()
|
|
78
76
|
.describe('Webhook URL (HTTPS) for async result delivery. When provided, the server POSTs classification results to this URL on completion — no polling needed. Use getJob to check status manually.'),
|
|
79
77
|
callbackSecret: z.string().optional()
|
|
80
78
|
.describe('HMAC-SHA256 secret for webhook signature verification. Only used with callbackUrl.'),
|
|
79
|
+
latitude: z.number().min(-90).max(90).optional()
|
|
80
|
+
.describe('GPS latitude (decimal degrees, -90 to 90). Tag the recording location. Must be paired with longitude.'),
|
|
81
|
+
longitude: z.number().min(-180).max(180).optional()
|
|
82
|
+
.describe('GPS longitude (decimal degrees, -180 to 180). Tag the recording location. Must be paired with latitude.'),
|
|
81
83
|
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
82
84
|
try {
|
|
83
|
-
const { onProgress
|
|
85
|
+
const { onProgress } = createProgressReporter(extra);
|
|
86
|
+
// Desktop sends booleans as strings — coerce here to keep schema simple
|
|
87
|
+
const waitForResult = params.waitForResult === true || params.waitForResult === 'true';
|
|
88
|
+
// Validate GPS pair — both must be present if either is
|
|
89
|
+
if ((params.latitude !== undefined) !== (params.longitude !== undefined)) {
|
|
90
|
+
return { content: [{ type: 'text', text: 'Error: latitude and longitude must both be provided together.' }], isError: true };
|
|
91
|
+
}
|
|
84
92
|
// Pre-flight auth check -- fail fast before starting a potentially long operation
|
|
85
93
|
try {
|
|
86
94
|
await client.usage();
|
|
@@ -93,8 +101,8 @@ export function registerClassifyAudio(server, client) {
|
|
|
93
101
|
}
|
|
94
102
|
// URL mode: pass through directly
|
|
95
103
|
if (params.url) {
|
|
96
|
-
const classifyParams = { url: params.url, threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret };
|
|
97
|
-
if (params.callbackUrl || !
|
|
104
|
+
const classifyParams = { url: params.url, threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret, latitude: params.latitude, longitude: params.longitude };
|
|
105
|
+
if (params.callbackUrl || !waitForResult) {
|
|
98
106
|
const accepted = await client.submitClassify(classifyParams);
|
|
99
107
|
return { content: [{ type: 'text', text: JSON.stringify(accepted, null, 2) }] };
|
|
100
108
|
}
|
|
@@ -114,12 +122,13 @@ export function registerClassifyAudio(server, client) {
|
|
|
114
122
|
}
|
|
115
123
|
const stat = statSync(params.filePath);
|
|
116
124
|
const fileSizeMB = stat.size / (1024 * 1024);
|
|
117
|
-
// Client
|
|
118
|
-
// persists on the snippet (hash, mtime, optional duration). The server
|
|
119
|
-
// processor ffprobe init pass still owns authoritative duration.
|
|
125
|
+
// Client metadata sidecar: best-effort hints; ffprobe owns authoritative duration.
|
|
120
126
|
const clientMetadata = buildClientMetadata(params.filePath, stat);
|
|
121
|
-
// Small file: read and submit via multipart/form-data
|
|
122
|
-
|
|
127
|
+
// Small file: read and submit via multipart/form-data.
|
|
128
|
+
// Files exceeding duration limit must go through chunked upload
|
|
129
|
+
// so the server's chunk-by-requeue pipeline handles duration splitting.
|
|
130
|
+
const duration = clientMetadata.clientReportedDuration ?? 0;
|
|
131
|
+
if (stat.size <= HEAR_API.MAX_FILE_SIZE_BYTES && duration <= HEAR_API.MAX_DURATION_SECONDS) {
|
|
123
132
|
onProgress(`Reading ${basename(params.filePath)} (${fileSizeMB.toFixed(1)}MB)`);
|
|
124
133
|
const fileBuffer = readFileSync(params.filePath);
|
|
125
134
|
const accepted = await client.submitClassifyFile(fileBuffer, basename(params.filePath), {
|
|
@@ -127,17 +136,17 @@ export function registerClassifyAudio(server, client) {
|
|
|
127
136
|
filterMinDurationSeconds: params.filterMinDurationSeconds,
|
|
128
137
|
callbackUrl: params.callbackUrl,
|
|
129
138
|
callbackSecret: params.callbackSecret,
|
|
139
|
+
latitude: params.latitude,
|
|
140
|
+
longitude: params.longitude,
|
|
130
141
|
...clientMetadata,
|
|
131
142
|
});
|
|
132
|
-
if (params.callbackUrl || !
|
|
143
|
+
if (params.callbackUrl || !waitForResult) {
|
|
133
144
|
return { content: [{ type: 'text', text: JSON.stringify(accepted, null, 2) }] };
|
|
134
145
|
}
|
|
135
146
|
const result = await client.pollJob(accepted.requestId, onProgress);
|
|
136
147
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
137
148
|
}
|
|
138
|
-
// Large file: byte-slice upload
|
|
139
|
-
// Reads 25MB slices from the original file, uploads each via chunked session.
|
|
140
|
-
// Server AppendBlob concatenates raw bytes → original file restored → ONE ML job.
|
|
149
|
+
// Large file: byte-slice upload. Server AppendBlob concatenates raw bytes into one ML job.
|
|
141
150
|
const fileSize = stat.size;
|
|
142
151
|
const chunkSize = HEAR_API.MAX_FILE_SIZE_BYTES;
|
|
143
152
|
const totalChunks = Math.ceil(fileSize / chunkSize);
|
|
@@ -153,9 +162,11 @@ export function registerClassifyAudio(server, client) {
|
|
|
153
162
|
filterMinDurationSeconds: params.filterMinDurationSeconds,
|
|
154
163
|
callbackUrl: params.callbackUrl,
|
|
155
164
|
callbackSecret: params.callbackSecret,
|
|
165
|
+
latitude: params.latitude,
|
|
166
|
+
longitude: params.longitude,
|
|
156
167
|
...clientMetadata,
|
|
157
168
|
}, onProgress);
|
|
158
|
-
if (params.callbackUrl || !
|
|
169
|
+
if (params.callbackUrl || !waitForResult) {
|
|
159
170
|
return { content: [{ type: 'text', text: JSON.stringify(accepted, null, 2) }] };
|
|
160
171
|
}
|
|
161
172
|
onProgress(`Polling job ${accepted.requestId}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-audio.js","sourceRoot":"","sources":["../../src/tools/classify-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,IAAI,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAEH,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAC3C,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAgB;IAClC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,iDAAiD;QACjD,OAAO,IAAI,EAAE,CAAC;YACV,SAAS,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;YAAS,CAAC;QACP,SAAS,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAAC,QAAgB,EAAE,QAAe;IAC1D,MAAM,GAAG,GAA6B;QAClC,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE;QAChD,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC;KACvC,CAAC;IACF,IAAI,CAAC;QACD,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,wCAAwC;IAC5C,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"classify-audio.js","sourceRoot":"","sources":["../../src/tools/classify-audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-batch.d.ts","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"classify-batch.d.ts","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,aAAa,CAAC;AAI/F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA+IpF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { readFileSync, existsSync, statSync } from 'fs';
|
|
3
3
|
import { basename, extname } from 'path';
|
|
4
|
-
import { HEAR_API } from '@h-ear/core';
|
|
4
|
+
import { HEAR_API, getAudioDuration } from '@h-ear/core';
|
|
5
5
|
import { createProgressReporter } from '../progress.js';
|
|
6
6
|
export function registerClassifyBatch(server, client) {
|
|
7
7
|
server.tool('classifyBatch', `Classify multiple audio files. Provide filePaths for local files (recommended) or files with URLs. Local files: submits all then polls each sequentially (may take several minutes), or provide callbackUrl to skip polling and receive results via webhook. URL files: returns immediately with batch ID (results via webhook). Max ${HEAR_API.MAX_BATCH_FILES} files. Requires API key (HEAR_API_KEY).`, {
|
|
@@ -20,9 +20,17 @@ export function registerClassifyBatch(server, client) {
|
|
|
20
20
|
.describe('Confidence threshold for all files.'),
|
|
21
21
|
filterMinDurationSeconds: z.number().min(0.1).max(595).optional()
|
|
22
22
|
.describe('Minimum event duration filter in seconds.'),
|
|
23
|
+
latitude: z.number().min(-90).max(90).optional()
|
|
24
|
+
.describe('GPS latitude (decimal degrees, -90 to 90). Applied to all files in the batch. Must be paired with longitude.'),
|
|
25
|
+
longitude: z.number().min(-180).max(180).optional()
|
|
26
|
+
.describe('GPS longitude (decimal degrees, -180 to 180). Applied to all files in the batch. Must be paired with latitude.'),
|
|
23
27
|
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
24
28
|
try {
|
|
25
29
|
const { onProgress, step } = createProgressReporter(extra);
|
|
30
|
+
// Validate GPS pair — both must be present if either is
|
|
31
|
+
if ((params.latitude !== undefined) !== (params.longitude !== undefined)) {
|
|
32
|
+
return { content: [{ type: 'text', text: 'Error: latitude and longitude must both be provided together.' }], isError: true };
|
|
33
|
+
}
|
|
26
34
|
// Local file mode: submit all async, then poll all
|
|
27
35
|
if (params.filePaths) {
|
|
28
36
|
const totalFiles = params.filePaths.length;
|
|
@@ -39,8 +47,10 @@ export function registerClassifyBatch(server, client) {
|
|
|
39
47
|
jobs.push({ file: filePath, error: `Unsupported format: ${ext}` });
|
|
40
48
|
continue;
|
|
41
49
|
}
|
|
42
|
-
// Large file: byte-slice chunked upload (no ffmpeg, no temp files)
|
|
43
|
-
|
|
50
|
+
// Large file or long duration: byte-slice chunked upload (no ffmpeg, no temp files).
|
|
51
|
+
// Duration check ensures files >600s route to server chunk-by-requeue pipeline.
|
|
52
|
+
const fileDuration = getAudioDuration(filePath);
|
|
53
|
+
if (stat.size > HEAR_API.MAX_FILE_SIZE_BYTES || fileDuration > HEAR_API.MAX_DURATION_SECONDS) {
|
|
44
54
|
try {
|
|
45
55
|
const fileSize = stat.size;
|
|
46
56
|
const chunkSize = HEAR_API.MAX_FILE_SIZE_BYTES;
|
|
@@ -52,7 +62,7 @@ export function registerClassifyBatch(server, client) {
|
|
|
52
62
|
const length = Math.min(chunkSize, fileSize - offset);
|
|
53
63
|
chunks.push({ filePath, offset, length, index: ci });
|
|
54
64
|
}
|
|
55
|
-
const accepted = await client.submitClassifyChunked(chunks, basename(filePath), { threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret }, onProgress);
|
|
65
|
+
const accepted = await client.submitClassifyChunked(chunks, basename(filePath), { threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret, latitude: params.latitude, longitude: params.longitude }, onProgress);
|
|
56
66
|
jobs.push({ file: basename(filePath), requestId: accepted.requestId });
|
|
57
67
|
step(jobs.length, totalFiles, `Submitted ${basename(filePath)} → ${accepted.requestId} (chunked)`);
|
|
58
68
|
}
|
|
@@ -64,7 +74,7 @@ export function registerClassifyBatch(server, client) {
|
|
|
64
74
|
// Small file: direct upload
|
|
65
75
|
try {
|
|
66
76
|
const fileBuffer = readFileSync(filePath);
|
|
67
|
-
const accepted = await client.submitClassifyFile(fileBuffer, basename(filePath), { threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret });
|
|
77
|
+
const accepted = await client.submitClassifyFile(fileBuffer, basename(filePath), { threshold: params.threshold, filterMinDurationSeconds: params.filterMinDurationSeconds, callbackUrl: params.callbackUrl, callbackSecret: params.callbackSecret, latitude: params.latitude, longitude: params.longitude });
|
|
68
78
|
jobs.push({ file: basename(filePath), requestId: accepted.requestId });
|
|
69
79
|
const progressTotal = params.callbackUrl ? totalFiles : totalFiles * 2;
|
|
70
80
|
step(jobs.length, progressTotal, `Submitted ${basename(filePath)} → ${accepted.requestId}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-batch.js","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,EAAwC,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"classify-batch.js","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ear/mcp-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"mcpName": "io.github.badajoz95/h-ear",
|
|
5
5
|
"description": "MCP server for the H-ear World audio classification API — connect Claude, ChatGPT, and other AI agents to 521+ sound classes",
|
|
6
6
|
"type": "module",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"version:major": "npm version major --no-git-tag-version"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@h-ear/core": "
|
|
40
|
+
"@h-ear/core": "^1.0.0",
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.26.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|