@h-ear/mcp-server 1.0.9 → 1.1.0-dev.202604170830
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/dist/schemas/index.d.ts +129 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +269 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/classify-audio.d.ts.map +1 -1
- package/dist/tools/classify-audio.js +73 -62
- 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 +2 -22
- package/dist/tools/classify-batch.js.map +1 -1
- package/dist/tools/create-webhook.d.ts.map +1 -1
- package/dist/tools/create-webhook.js +2 -15
- package/dist/tools/create-webhook.js.map +1 -1
- package/dist/tools/delete-webhook.d.ts.map +1 -1
- package/dist/tools/delete-webhook.js +2 -5
- package/dist/tools/delete-webhook.js.map +1 -1
- package/dist/tools/get-job-audio.d.ts.map +1 -1
- package/dist/tools/get-job-audio.js +2 -10
- package/dist/tools/get-job-audio.js.map +1 -1
- package/dist/tools/get-job-events.d.ts.map +1 -1
- package/dist/tools/get-job-events.js +2 -34
- package/dist/tools/get-job-events.js.map +1 -1
- package/dist/tools/get-job-report.d.ts +4 -0
- package/dist/tools/get-job-report.d.ts.map +1 -0
- package/dist/tools/get-job-report.js +16 -0
- package/dist/tools/get-job-report.js.map +1 -0
- package/dist/tools/get-job-waveform.d.ts.map +1 -1
- package/dist/tools/get-job-waveform.js +2 -14
- package/dist/tools/get-job-waveform.js.map +1 -1
- package/dist/tools/get-job.d.ts.map +1 -1
- package/dist/tools/get-job.js +2 -5
- package/dist/tools/get-job.js.map +1 -1
- package/dist/tools/get-upload-status.d.ts +3 -0
- package/dist/tools/get-upload-status.d.ts.map +1 -0
- package/dist/tools/get-upload-status.js +18 -0
- package/dist/tools/get-upload-status.js.map +1 -0
- package/dist/tools/get-webhook.d.ts.map +1 -1
- package/dist/tools/get-webhook.js +2 -5
- package/dist/tools/get-webhook.js.map +1 -1
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +7 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/list-classes.d.ts.map +1 -1
- package/dist/tools/list-classes.js +2 -15
- package/dist/tools/list-classes.js.map +1 -1
- package/dist/tools/list-jobs.d.ts.map +1 -1
- package/dist/tools/list-jobs.js +2 -15
- package/dist/tools/list-jobs.js.map +1 -1
- package/dist/tools/list-webhook-deliveries.d.ts.map +1 -1
- package/dist/tools/list-webhook-deliveries.js +2 -7
- package/dist/tools/list-webhook-deliveries.js.map +1 -1
- package/dist/tools/list-webhooks.d.ts.map +1 -1
- package/dist/tools/list-webhooks.js +2 -1
- package/dist/tools/list-webhooks.js.map +1 -1
- package/dist/tools/ping-webhook.d.ts.map +1 -1
- package/dist/tools/ping-webhook.js +2 -5
- package/dist/tools/ping-webhook.js.map +1 -1
- package/dist/tools/update-webhook.d.ts.map +1 -1
- package/dist/tools/update-webhook.js +2 -19
- package/dist/tools/update-webhook.js.map +1 -1
- package/dist/tools/usage.d.ts.map +1 -1
- package/dist/tools/usage.js +2 -1
- package/dist/tools/usage.js.map +1 -1
- package/dist/upload-tracker.d.ts +31 -0
- package/dist/upload-tracker.d.ts.map +1 -0
- package/dist/upload-tracker.js +34 -0
- package/dist/upload-tracker.js.map +1 -0
- package/package.json +7 -2
|
@@ -1,31 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { readFileSync, existsSync, statSync, openSync, readSync, closeSync } from 'fs';
|
|
1
|
+
import { createReadStream, readFileSync, existsSync, statSync } from 'fs';
|
|
3
2
|
import { basename, extname } from 'path';
|
|
4
3
|
import { createHash } from 'crypto';
|
|
4
|
+
import { pipeline } from 'stream/promises';
|
|
5
5
|
import { HearApiError, HEAR_API, getAudioDuration, } from '@h-ear/core';
|
|
6
6
|
import { createProgressReporter } from '../progress.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
function hashFileSync(filePath) {
|
|
7
|
+
import { trackerStart, trackerUpdate } from '../upload-tracker.js';
|
|
8
|
+
import { CLASSIFY_AUDIO_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
9
|
+
async function hashFile(filePath) {
|
|
12
10
|
const hash = createHash('sha256');
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const buf = Buffer.allocUnsafe(64 * 1024);
|
|
16
|
-
let bytesRead = 0;
|
|
17
|
-
// eslint-disable-next-line no-constant-condition
|
|
18
|
-
while (true) {
|
|
19
|
-
bytesRead = readSync(fd, buf, 0, buf.length, null);
|
|
20
|
-
if (bytesRead <= 0) {
|
|
21
|
-
break;
|
|
22
|
-
}
|
|
23
|
-
hash.update(buf.subarray(0, bytesRead));
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
finally {
|
|
27
|
-
closeSync(fd);
|
|
28
|
-
}
|
|
11
|
+
await pipeline(createReadStream(filePath, { highWaterMark: 1024 * 1024 }), hash);
|
|
29
12
|
return hash.digest('hex');
|
|
30
13
|
}
|
|
31
14
|
/**
|
|
@@ -40,18 +23,17 @@ function hashFileSync(filePath) {
|
|
|
40
23
|
* - fileHash: SHA-256 hex for dedupe / audit correlation.
|
|
41
24
|
* - originalFileName: full basename of the client-side path.
|
|
42
25
|
*/
|
|
43
|
-
function buildClientMetadata(filePath, fileStat) {
|
|
26
|
+
async function buildClientMetadata(filePath, fileStat) {
|
|
44
27
|
const out = {
|
|
45
28
|
recordingStartedAt: fileStat.mtime.toISOString(),
|
|
46
29
|
originalFileName: basename(filePath),
|
|
47
30
|
};
|
|
48
31
|
try {
|
|
49
|
-
out.fileHash =
|
|
32
|
+
out.fileHash = await hashFile(filePath);
|
|
50
33
|
}
|
|
51
34
|
catch {
|
|
52
35
|
// Hash is a hint; failure is non-fatal.
|
|
53
36
|
}
|
|
54
|
-
// getAudioDuration() returns 0 when ffprobe unavailable.
|
|
55
37
|
const probed = getAudioDuration(filePath);
|
|
56
38
|
if (probed > 0) {
|
|
57
39
|
out.clientReportedDuration = probed;
|
|
@@ -59,28 +41,8 @@ function buildClientMetadata(filePath, fileStat) {
|
|
|
59
41
|
return out;
|
|
60
42
|
}
|
|
61
43
|
const formats = HEAR_API.SUPPORTED_FORMATS.join(', ');
|
|
62
|
-
const maxMB = HEAR_API.MAX_FILE_SIZE_BYTES / (1024 * 1024);
|
|
63
44
|
export function registerClassifyAudio(server, client) {
|
|
64
|
-
server.tool('classifyAudio',
|
|
65
|
-
filePath: z.string().optional()
|
|
66
|
-
.describe('Path to a local audio file (Desktop/CLI only — requires local filesystem access). The server reads and encodes it automatically. Large files are split into chunks. Use url for web/mobile clients.'),
|
|
67
|
-
url: z.string().url().optional()
|
|
68
|
-
.describe('Public URL to audio file.'),
|
|
69
|
-
threshold: z.number().min(0).max(1).default(0.3)
|
|
70
|
-
.describe('Confidence threshold (0.0-1.0). Only classes above this score are returned.'),
|
|
71
|
-
filterMinDurationSeconds: z.number().min(0.1).max(595).optional()
|
|
72
|
-
.describe('Minimum event duration filter in seconds.'),
|
|
73
|
-
waitForResult: z.any().default(false)
|
|
74
|
-
.describe('If true, polls until classification completes (up to 5 min). Default false — returns immediately with job ID for later retrieval via getJob.'),
|
|
75
|
-
callbackUrl: z.string().url().optional()
|
|
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.'),
|
|
77
|
-
callbackSecret: z.string().optional()
|
|
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.'),
|
|
83
|
-
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
45
|
+
server.tool('classifyAudio', toolDescriptions.classifyAudio, CLASSIFY_AUDIO_SHAPE, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
84
46
|
try {
|
|
85
47
|
const { onProgress } = createProgressReporter(extra);
|
|
86
48
|
// Desktop sends booleans as strings — coerce here to keep schema simple
|
|
@@ -123,7 +85,7 @@ export function registerClassifyAudio(server, client) {
|
|
|
123
85
|
const stat = statSync(params.filePath);
|
|
124
86
|
const fileSizeMB = stat.size / (1024 * 1024);
|
|
125
87
|
// Client metadata sidecar: best-effort hints; ffprobe owns authoritative duration.
|
|
126
|
-
const clientMetadata = buildClientMetadata(params.filePath, stat);
|
|
88
|
+
const clientMetadata = await buildClientMetadata(params.filePath, stat);
|
|
127
89
|
// Small file: multipart submit; large files use chunked upload (chunk-by-requeue pipeline).
|
|
128
90
|
// @docsRef docs/components/API.md#classify-audio
|
|
129
91
|
const duration = clientMetadata.clientReportedDuration ?? 0;
|
|
@@ -145,18 +107,20 @@ export function registerClassifyAudio(server, client) {
|
|
|
145
107
|
const result = await client.pollJob(accepted.requestId, onProgress);
|
|
146
108
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
147
109
|
}
|
|
148
|
-
// Large file: byte-slice upload.
|
|
110
|
+
// Large file: byte-slice upload. Head returns fast; tail runs in background to fit
|
|
111
|
+
// the MCP client tool-call wall budget. AI agent polls getUploadStatus(uploadSessionId)
|
|
112
|
+
// until status='complete', then uses the returned requestId with getJob.
|
|
149
113
|
const fileSize = stat.size;
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
onProgress(`Large file (${fileSizeMB.toFixed(1)}MB) — uploading in ${
|
|
114
|
+
const sliceSize = HEAR_API.MAX_FILE_SIZE_BYTES;
|
|
115
|
+
const totalSlices = Math.ceil(fileSize / sliceSize);
|
|
116
|
+
onProgress(`Large file (${fileSizeMB.toFixed(1)}MB) — uploading in ${totalSlices} byte slices`);
|
|
153
117
|
const chunks = [];
|
|
154
|
-
for (let i = 0; i <
|
|
155
|
-
const offset = i *
|
|
156
|
-
const length = Math.min(
|
|
118
|
+
for (let i = 0; i < totalSlices; i++) {
|
|
119
|
+
const offset = i * sliceSize;
|
|
120
|
+
const length = Math.min(sliceSize, fileSize - offset);
|
|
157
121
|
chunks.push({ filePath: params.filePath, offset, length, index: i });
|
|
158
122
|
}
|
|
159
|
-
const
|
|
123
|
+
const sliceOptions = {
|
|
160
124
|
threshold: params.threshold,
|
|
161
125
|
filterMinDurationSeconds: params.filterMinDurationSeconds,
|
|
162
126
|
callbackUrl: params.callbackUrl,
|
|
@@ -164,13 +128,60 @@ export function registerClassifyAudio(server, client) {
|
|
|
164
128
|
latitude: params.latitude,
|
|
165
129
|
longitude: params.longitude,
|
|
166
130
|
...clientMetadata,
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
131
|
+
};
|
|
132
|
+
// Wait-for-result: caller explicitly opts into the long blocking call (rare on stdio).
|
|
133
|
+
if (waitForResult) {
|
|
134
|
+
const accepted = await client.submitClassifyChunked(chunks, basename(params.filePath), sliceOptions, onProgress);
|
|
135
|
+
onProgress(`Polling job ${accepted.requestId}`);
|
|
136
|
+
const result = await client.pollJob(accepted.requestId, onProgress);
|
|
137
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
170
138
|
}
|
|
171
|
-
|
|
172
|
-
const
|
|
173
|
-
|
|
139
|
+
// Fire-and-return: head sync (one HTTP RTT), tail in background.
|
|
140
|
+
const head = await client.submitChunkUploadHead(chunks[0], basename(params.filePath), sliceOptions,
|
|
141
|
+
/*isFinal*/ totalSlices === 1, totalSlices, onProgress);
|
|
142
|
+
// Single-slice case: head was also final, requestId already returned.
|
|
143
|
+
if (totalSlices === 1) {
|
|
144
|
+
return { content: [{ type: 'text', text: JSON.stringify(head, null, 2) }] };
|
|
145
|
+
}
|
|
146
|
+
const headResult = head;
|
|
147
|
+
const startedAt = new Date().toISOString();
|
|
148
|
+
trackerStart({
|
|
149
|
+
uploadSessionId: headResult.uploadSessionId,
|
|
150
|
+
fileName: basename(params.filePath),
|
|
151
|
+
totalSlices,
|
|
152
|
+
slicesUploaded: headResult.chunksReceived,
|
|
153
|
+
totalBytes: headResult.totalBytes,
|
|
154
|
+
startedAt,
|
|
155
|
+
status: 'uploading',
|
|
156
|
+
});
|
|
157
|
+
// Background: upload remaining slices. Process stays alive between MCP tool calls.
|
|
158
|
+
void client.submitChunkUploadTail(headResult.uploadSessionId, chunks.slice(1), basename(params.filePath), headResult.chunksReceived, totalSlices, (msg) => {
|
|
159
|
+
// Best-effort: bump slicesUploaded each time the tail logs a slice ack.
|
|
160
|
+
const m = /server confirmed (\d+) slices/.exec(msg);
|
|
161
|
+
if (m) {
|
|
162
|
+
trackerUpdate(headResult.uploadSessionId, { slicesUploaded: parseInt(m[1], 10) });
|
|
163
|
+
}
|
|
164
|
+
process.stderr.write(`[h-ear-mcp] ${msg}\n`);
|
|
165
|
+
}).then((accepted) => {
|
|
166
|
+
trackerUpdate(headResult.uploadSessionId, {
|
|
167
|
+
status: 'complete',
|
|
168
|
+
slicesUploaded: totalSlices,
|
|
169
|
+
requestId: accepted.requestId,
|
|
170
|
+
});
|
|
171
|
+
}).catch((err) => {
|
|
172
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
173
|
+
trackerUpdate(headResult.uploadSessionId, { status: 'failed', error: msg });
|
|
174
|
+
process.stderr.write(`[h-ear-mcp] background upload failed for session ${headResult.uploadSessionId}: ${msg}\n`);
|
|
175
|
+
});
|
|
176
|
+
return { content: [{ type: 'text', text: JSON.stringify({
|
|
177
|
+
status: 'uploading',
|
|
178
|
+
uploadSessionId: headResult.uploadSessionId,
|
|
179
|
+
totalSlices,
|
|
180
|
+
slicesUploaded: headResult.chunksReceived,
|
|
181
|
+
totalBytes: headResult.totalBytes,
|
|
182
|
+
fileName: basename(params.filePath),
|
|
183
|
+
message: `Upload started in background. Poll getUploadStatus('${headResult.uploadSessionId}') until status='complete', then use the returned requestId with getJob.`,
|
|
184
|
+
}, null, 2) }] };
|
|
174
185
|
}
|
|
175
186
|
catch (error) {
|
|
176
187
|
// POLL_TIMEOUT: job is still processing server-side (large file / chunk-by-requeue).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-audio.js","sourceRoot":"","sources":["../../src/tools/classify-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"classify-batch.d.ts","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,aAAa,CAAC;AAK/F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA2HpF"}
|
|
@@ -1,30 +1,10 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
1
|
import { readFileSync, existsSync, statSync } from 'fs';
|
|
3
2
|
import { basename, extname } from 'path';
|
|
4
3
|
import { HEAR_API, getAudioDuration } from '@h-ear/core';
|
|
5
4
|
import { createProgressReporter } from '../progress.js';
|
|
5
|
+
import { CLASSIFY_BATCH_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
6
6
|
export function registerClassifyBatch(server, client) {
|
|
7
|
-
server.tool('classifyBatch',
|
|
8
|
-
filePaths: z.array(z.string()).min(1).max(HEAR_API.MAX_BATCH_FILES).optional()
|
|
9
|
-
.describe('Array of local audio file paths to classify (Desktop/CLI only — requires local filesystem access). Use files with URLs for web/mobile clients.'),
|
|
10
|
-
files: z.array(z.object({
|
|
11
|
-
url: z.string().url().describe('Public URL to audio file.'),
|
|
12
|
-
id: z.string().optional().describe('Client-provided tracking ID.'),
|
|
13
|
-
})).min(1).max(HEAR_API.MAX_BATCH_FILES).optional()
|
|
14
|
-
.describe('Array of public audio URLs (alternative to filePaths). Requires callbackUrl.'),
|
|
15
|
-
callbackUrl: z.string().url().optional()
|
|
16
|
-
.describe('Webhook URL (HTTPS) for async result delivery. Required for URL-based files. Optional for local files — when provided, skips polling and delivers results via webhook instead.'),
|
|
17
|
-
callbackSecret: z.string().optional()
|
|
18
|
-
.describe('HMAC-SHA256 secret for webhook signature verification.'),
|
|
19
|
-
threshold: z.number().min(0).max(1).default(0.3)
|
|
20
|
-
.describe('Confidence threshold for all files.'),
|
|
21
|
-
filterMinDurationSeconds: z.number().min(0.1).max(595).optional()
|
|
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.'),
|
|
27
|
-
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
7
|
+
server.tool('classifyBatch', toolDescriptions.classifyBatch, CLASSIFY_BATCH_SHAPE, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params, extra) => {
|
|
28
8
|
try {
|
|
29
9
|
const { onProgress, step } = createProgressReporter(extra);
|
|
30
10
|
// Validate GPS pair — both must be present if either is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-batch.js","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"classify-batch.js","sourceRoot":"","sources":["../../src/tools/classify-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-webhook.d.ts","sourceRoot":"","sources":["../../src/tools/create-webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-webhook.d.ts","sourceRoot":"","sources":["../../src/tools/create-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBpF"}
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CREATE_WEBHOOK_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerCreateWebhook(server, client) {
|
|
3
|
-
server.tool('createWebhook',
|
|
4
|
-
url: z.string().url()
|
|
5
|
-
.describe('HTTPS webhook URL where events will be POSTed.'),
|
|
6
|
-
events: z.array(z.string()).optional()
|
|
7
|
-
.describe('Event types to subscribe to (e.g. job.completed, job.failed). Defaults to all events if omitted.'),
|
|
8
|
-
description: z.string().max(200).optional()
|
|
9
|
-
.describe('Human-readable description for this webhook.'),
|
|
10
|
-
taxonomyFilter: z.array(z.string()).optional()
|
|
11
|
-
.describe('Scope notifications to specific taxonomies (e.g. audioset-yamnet-521, species).'),
|
|
12
|
-
notificationTierDepth: z.number().int().min(1).max(3).optional()
|
|
13
|
-
.describe('AudioSet tier depth for filtering: 1=coarse (Animal), 2=mid (Domestic animals, pets), 3=fine (Dog). Max depth is 3 — the taxonomy has tiers 4-5 but webhook filtering does not extend beyond tier 3. Must pair with notificationTierValues.'),
|
|
14
|
-
notificationTierValues: z.array(z.string()).optional()
|
|
15
|
-
.describe('Tier labels to match at the specified depth (e.g. ["Animal", "Music"]). Must pair with notificationTierDepth.'),
|
|
16
|
-
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params) => {
|
|
3
|
+
server.tool('createWebhook', toolDescriptions.createWebhook, CREATE_WEBHOOK_SHAPE, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (params) => {
|
|
17
4
|
try {
|
|
18
5
|
const result = await client.createEnterpriseWebhook(params);
|
|
19
6
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-webhook.js","sourceRoot":"","sources":["../../src/tools/create-webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-webhook.js","sourceRoot":"","sources":["../../src/tools/create-webhook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAqB;IAC1E,MAAM,CAAC,IAAI,CACP,eAAe,EACf,gBAAgB,CAAC,aAAa,EAC9B,oBAAoB,EACpB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3F,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC9H,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-webhook.d.ts","sourceRoot":"","sources":["../../src/tools/delete-webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-webhook.d.ts","sourceRoot":"","sources":["../../src/tools/delete-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBpF"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DELETE_WEBHOOK_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerDeleteWebhook(server, client) {
|
|
3
|
-
server.tool('deleteWebhook',
|
|
4
|
-
webhookId: z.string().min(1)
|
|
5
|
-
.describe('The webhook ID to delete.'),
|
|
6
|
-
}, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async (params) => {
|
|
3
|
+
server.tool('deleteWebhook', toolDescriptions.deleteWebhook, DELETE_WEBHOOK_SHAPE, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async (params) => {
|
|
7
4
|
try {
|
|
8
5
|
await client.deleteEnterpriseWebhook(params.webhookId);
|
|
9
6
|
return { content: [{ type: 'text', text: 'Webhook deleted successfully.' }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-webhook.js","sourceRoot":"","sources":["../../src/tools/delete-webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-webhook.js","sourceRoot":"","sources":["../../src/tools/delete-webhook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAqB;IAC1E,MAAM,CAAC,IAAI,CACP,eAAe,EACf,gBAAgB,CAAC,aAAa,EAC9B,oBAAoB,EACpB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EACzF,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC9H,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-audio.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-audio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-audio.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-audio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBlF"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GET_JOB_AUDIO_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerGetJobAudio(server, client) {
|
|
3
|
-
server.tool('getJobAudio',
|
|
4
|
-
'Returns a 1-hour URL for direct audio playback via HTML5 <audio> element or fetch. ' +
|
|
5
|
-
'The URL supports HTTP Range requests — browsers can seek without downloading the full file. ' +
|
|
6
|
-
'For event-specific playback, append a Media Fragment time range to the URL: audioUrl + "#t=1.92,5.76". ' +
|
|
7
|
-
'Only available for jobs submitted via file upload (not URL-submitted jobs). ' +
|
|
8
|
-
'Requires API key.', {
|
|
9
|
-
jobId: z.string().min(1)
|
|
10
|
-
.describe('Job ID from classifyAudio, classifyBatch, or listJobs.'),
|
|
11
|
-
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async (params) => {
|
|
3
|
+
server.tool('getJobAudio', toolDescriptions.getJobAudio, GET_JOB_AUDIO_SHAPE, { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async (params) => {
|
|
12
4
|
try {
|
|
13
5
|
const result = await client.getJobAudio(params.jobId);
|
|
14
6
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-audio.js","sourceRoot":"","sources":["../../src/tools/get-job-audio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-audio.js","sourceRoot":"","sources":["../../src/tools/get-job-audio.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAqB;IACxE,MAAM,CAAC,IAAI,CACP,aAAa,EACb,gBAAgB,CAAC,WAAW,EAC5B,mBAAmB,EACnB,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAC3F,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC7H,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-events.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-events.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA8BnF"}
|
|
@@ -1,38 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GET_JOB_EVENTS_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerGetJobEvents(server, client) {
|
|
3
|
-
server.tool('getJobEvents',
|
|
4
|
-
'Use minConfidence to filter by confidence threshold (e.g. 0.7 for ≥70%). ' +
|
|
5
|
-
'Use category/tier2/tier3 to filter by sound class hierarchy up to 3 tiers deep (e.g. "Animal" > "Domestic animals, pets" > "Dog"). ' +
|
|
6
|
-
'Use startTime/endTime to get events within a time window in seconds. ' +
|
|
7
|
-
'Returns startTime, endTime, tier1 class, confidence, decibelLevel, and realTimeStart for each event. ' +
|
|
8
|
-
'IMPORTANT: Long recordings can produce thousands of events. Always start with a small limit (10–50) and use filters (category, minConfidence, startTime/endTime) to narrow results before increasing. ' +
|
|
9
|
-
'For bulk export use getJobAudio to download the source file instead. ' +
|
|
10
|
-
'Requires API key.', {
|
|
11
|
-
jobId: z.string().min(1)
|
|
12
|
-
.describe('Job ID from classifyAudio, classifyBatch, or listJobs.'),
|
|
13
|
-
taxonomy: z.string().optional()
|
|
14
|
-
.describe('Filter by taxonomy: audioset-yamnet-521, audioset-panns-527, or species.'),
|
|
15
|
-
minConfidence: z.number().min(0).max(1).optional()
|
|
16
|
-
.describe('Minimum confidence threshold (0.0–1.0). e.g. 0.7 returns only events ≥70% confidence.'),
|
|
17
|
-
category: z.string().optional()
|
|
18
|
-
.describe('Filter by tier1 category (e.g. "Animal", "Music", "Vehicle", "Nature").'),
|
|
19
|
-
tier2: z.string().optional()
|
|
20
|
-
.describe('Filter by tier2 subcategory (e.g. "Domestic animals, pets", "Wild animals"). Narrows within a tier1 category.'),
|
|
21
|
-
tier3: z.string().optional()
|
|
22
|
-
.describe('Filter by tier3 class (e.g. "Dog", "Cat", "Bird"). Finest supported filter depth — tiers 4-5 exist in the taxonomy but are not filterable.'),
|
|
23
|
-
startTime: z.number().min(0).optional()
|
|
24
|
-
.describe('Only return events starting at or after this time in seconds.'),
|
|
25
|
-
endTime: z.number().min(0).optional()
|
|
26
|
-
.describe('Only return events ending at or before this time in seconds.'),
|
|
27
|
-
sourceId: z.string().optional()
|
|
28
|
-
.describe('Filter by noise source cluster ID.'),
|
|
29
|
-
sort: z.string().optional()
|
|
30
|
-
.describe('Sort field:direction — e.g. "startTime:asc", "confidence:desc", "decibelLevel:desc".'),
|
|
31
|
-
limit: z.number().int().positive().max(5000).default(50)
|
|
32
|
-
.describe('Max events per page (1–5000, default 50). Start small — a 12h recording can have 10,000+ events. Use filters to narrow before increasing.'),
|
|
33
|
-
offset: z.number().int().min(0).default(0)
|
|
34
|
-
.describe('Pagination offset.'),
|
|
35
|
-
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async (params) => {
|
|
3
|
+
server.tool('getJobEvents', toolDescriptions.getJobEvents, GET_JOB_EVENTS_SHAPE, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async (params) => {
|
|
36
4
|
try {
|
|
37
5
|
const result = await client.getJobEvents(params.jobId, {
|
|
38
6
|
taxonomy: params.taxonomy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-events.js","sourceRoot":"","sources":["../../src/tools/get-job-events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-events.js","sourceRoot":"","sources":["../../src/tools/get-job-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAqB;IACzE,MAAM,CAAC,IAAI,CACP,cAAc,EACd,gBAAgB,CAAC,YAAY,EAC7B,oBAAoB,EACpB,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAC1F,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE;gBACnD,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;aACxB,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC9H,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-job-report.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBnF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { GET_JOB_REPORT_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
|
+
export function registerGetJobReport(server, client) {
|
|
3
|
+
server.tool('getJobReport', toolDescriptions.getJobReport, GET_JOB_REPORT_SHAPE, { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async (params) => {
|
|
4
|
+
try {
|
|
5
|
+
const result = await client.getJobReport(params.jobId);
|
|
6
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: `Get job report failed: ${error instanceof Error ? error.message : String(error)}` }],
|
|
11
|
+
isError: true,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=get-job-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-job-report.js","sourceRoot":"","sources":["../../src/tools/get-job-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAqB;IACzE,MAAM,CAAC,IAAI,CACP,cAAc,EACd,gBAAgB,CAAC,YAAY,EAC7B,oBAAoB,EACpB,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAC3F,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC9H,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-waveform.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-waveform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-waveform.d.ts","sourceRoot":"","sources":["../../src/tools/get-job-waveform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBrF"}
|
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GET_JOB_WAVEFORM_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerGetJobWaveform(server, client) {
|
|
3
|
-
server.tool('getJobWaveform',
|
|
4
|
-
'Returns waveformUrl (peaks.js-compatible .dat binary) and audioUrl for synchronized playback. ' +
|
|
5
|
-
'Initialize peaks.js with: Peaks.init({ dataUri: { arraybuffer: waveformUrl }, mediaElement: audioEl }). ' +
|
|
6
|
-
'If waveformUrl is null, use wavesurfer.js with audioUrl instead (decodes via Web Audio API). ' +
|
|
7
|
-
'Zoom controls resolution: 256=high detail, 1024=standard (default), 4096=overview. ' +
|
|
8
|
-
'Both URLs expire in 1 hour. ' +
|
|
9
|
-
'For event navigation, combine with getJobEvents to get startTime values for seeking. ' +
|
|
10
|
-
'Requires API key.', {
|
|
11
|
-
jobId: z.string().min(1)
|
|
12
|
-
.describe('Job ID from classifyAudio, classifyBatch, or listJobs.'),
|
|
13
|
-
zoom: z.union([z.literal(256), z.literal(1024), z.literal(4096)]).default(1024)
|
|
14
|
-
.describe('Waveform resolution in samples-per-pixel: 256 (high detail), 1024 (default), 4096 (overview).'),
|
|
15
|
-
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async (params) => {
|
|
3
|
+
server.tool('getJobWaveform', toolDescriptions.getJobWaveform, GET_JOB_WAVEFORM_SHAPE, { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async (params) => {
|
|
16
4
|
try {
|
|
17
5
|
const result = await client.getJobWaveform(params.jobId, { zoom: params.zoom });
|
|
18
6
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job-waveform.js","sourceRoot":"","sources":["../../src/tools/get-job-waveform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job-waveform.js","sourceRoot":"","sources":["../../src/tools/get-job-waveform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAqB;IAC3E,MAAM,CAAC,IAAI,CACP,gBAAgB,EAChB,gBAAgB,CAAC,cAAc,EAC/B,sBAAsB,EACtB,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAC3F,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAyB,EAAE,CAAC,CAAC;YACrG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBAChI,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job.d.ts","sourceRoot":"","sources":["../../src/tools/get-job.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job.d.ts","sourceRoot":"","sources":["../../src/tools/get-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAkB7E"}
|
package/dist/tools/get-job.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GET_JOB_SHAPE, toolDescriptions } from '../schemas/index.js';
|
|
2
2
|
export function registerGetJob(server, client) {
|
|
3
|
-
server.tool('getJob',
|
|
4
|
-
jobId: z.string().min(1)
|
|
5
|
-
.describe('The job ID returned from classifyAudio or classifyBatch.'),
|
|
6
|
-
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async (params) => {
|
|
3
|
+
server.tool('getJob', toolDescriptions.getJob, GET_JOB_SHAPE, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async (params) => {
|
|
7
4
|
try {
|
|
8
5
|
const result = await client.getJob(params.jobId);
|
|
9
6
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-job.js","sourceRoot":"","sources":["../../src/tools/get-job.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-job.js","sourceRoot":"","sources":["../../src/tools/get-job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEtE,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,MAAqB;IACnE,MAAM,CAAC,IAAI,CACP,QAAQ,EACR,gBAAgB,CAAC,MAAM,EACvB,aAAa,EACb,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EACzF,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACvH,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-upload-status.d.ts","sourceRoot":"","sources":["../../src/tools/get-upload-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoB/D"}
|