A Model Context Protocol (MCP) server for MediaCAT's subtitle generation workflow with XL8.ai integration. Supports local file processing, real-time SSE updates, and dynamic language detection.
-
Unified Workflow: Single
run_sync
function consolidates entire subtitle generation process - Local File Optimization: Direct file path support for local servers (avoids base64 encoding)
- Real-time Progress: Server-Sent Events (SSE) for live progress updates
- Dynamic Language Support: Automatically fetches supported languages from XL8.ai API
- Flexible Deployment: Works as CLI tool, Docker container, or cloud service
- Optional Server API Key: Configure once on server to simplify client requests
npm install mediacat-mcp
# Start the server
mediacat-mcp
# With environment variables
XL8_API_KEY=your_api_key mediacat-mcp
import { MediaCatMCPServer } from 'mediacat-mcp';
const server = new MediaCatMCPServer();
await server.start();
Generates subtitles for video files using XL8.ai.
Parameters:
-
fileData
(string, optional): Base64 encoded file data (for remote servers) -
filePath
(string, optional): Local file path (for local servers - more efficient) -
filename
(string, required): Name of the video file -
mimeType
(string, required): MIME type (e.g., 'video/mp4') -
language
(string, required): Target language code (e.g., 'en-US', 'ko-KR') -
format
(string, required): Output format ('srt', 'vtt', 'ttml', 'json') -
apiKey
(string, optional): XL8.ai API key (if not configured on server) -
transcriptS3Key
(string, optional): S3 key of transcript file for reference
Note: Provide exactly one of fileData
OR filePath
.
Returns:
{
"success": true,
"requestId": "xl8_request_id",
"message": "Sync request initiated",
"tracking": {
"sseChannel": "/events/xl8_request_id",
"events": ["sync_progress", "sync_completed", "sync_failed"]
}
}
Connect to /events/{requestId}
to receive real-time updates:
-
{requestId}_sync_progress
: Processing progress updates -
{requestId}_sync_completed
: Subtitle generation completed with content -
{requestId}_sync_failed
: Error occurred during processing
-
POST /mcp
- MCP JSON-RPC endpoint -
POST /api/run-sync
- Direct HTTP API for run_sync -
GET /api/sync-status/:requestId
- Get sync status -
GET /api/info
- Server info and capabilities -
GET /health
- Health check -
GET /events/:requestId
- SSE endpoint for progress updates
-
XL8_API_KEY
- XL8.ai API key (optional, enables keyless client requests) -
PORT
- Server port (default: 3000) -
DOCKER_ENV
- Set to disable MCP stdio transport in containers
// Connect to MCP server
const response = await fetch('http://localhost:3000/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {
name: 'run_sync',
arguments: {
filePath: './video.mp4', // Local file (efficient)
filename: 'video.mp4',
mimeType: 'video/mp4',
language: 'en-US',
format: 'srt'
}
}
})
});
const result = await response.json();
const requestId = JSON.parse(result.result.content[0].text).requestId;
// Connect to SSE for progress updates
const eventSource = new EventSource(`http://localhost:3000/events/${requestId}`);
eventSource.addEventListener(`${requestId}_sync_completed`, (event) => {
const data = JSON.parse(event.data);
console.log('Subtitles:', data.data.content);
});
// For remote servers using base64 upload
const videoBuffer = fs.readFileSync('video.mp4');
const response = await fetch('http://localhost:3000/api/run-sync', {
method: 'POST',
headers: {
'Content-Type': 'application/octet-stream',
'X-Filename': 'video.mp4',
'X-Language': 'en-US',
'X-Format': 'srt',
'X-Api-Key': 'your_api_key'
},
body: videoBuffer
});
The server automatically fetches supported languages from XL8.ai API. Common languages include:
- en-US, en-GB (English)
- ko-KR (Korean)
- ja-JP (Japanese)
- es-ES, es-US (Spanish)
- fr-FR (French)
- de-DE (German)
- zh, zh-TW (Chinese)
- And many more...
MIT