{
  "markdown": "# media-mcp (Node.js)\n\n> Deployment update (2026-09-06): the SAM3 source and release scripts are now maintained in `sam3-http-server`, rooted at `/opt/ai/sam3`. API schema candidate head is `20260906_0007`. SAM3 production bootstrap and nine-tool E2E remain pending. See the [four-project rollout](https://github.com/avclabs/mcp-portal-web/blob/main/docs/FOUR-PROJECT-ROLLOUT.md).\n\nEnglish | [中文](https://github.com/avclabs/media-mcp/blob/main/README_CN.md)\n\n[![npm version](https://img.shields.io/npm/v/@avclabs.ai/media-mcp)](https://www.npmjs.com/package/@avclabs.ai/media-mcp)\n[![Node.js >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA video enhancement, image enhancement/colorization/denoising, and image segmentation service based on the MCP protocol, acting as an MCP Client-Server to interact with backend HTTP Servers.\n\n> **Release status (2026-09-06):** npm `latest` is `0.2.1`; that published artifact contains 5 tools (3 video + 2 SAM3) and its runtime metadata incorrectly reports `0.3.0`. This repository is the unreleased `0.3.0` candidate, which fixes version consistency and adds 4 image tools plus an optional `IMAGE_API_BASE_URL` override. Image and video share the same public HTTP server and `/enhance` base URL; the candidate backend keeps their prepare concurrency, Redis queues, workers, and processing concurrency separate. The image routes now exist in candidate code but are not deployed or real-AI/TOS verified, so the image tools below are not a production npm capability until all 9 tools pass smoke tests and `0.3.0` is published.\n\n## Features\n\nProvides the following MCP Tools:\n\n**Video Enhancement**\n- `create_task` - Create a video enhancement task (supports URL or local file upload)\n- `get_task_status` - Query task status\n- `enhance_video_sync` - Synchronously enhance video (blocking wait, truncated at ~50s by default)\n\n**Image Enhancement (unreleased 0.3.0 candidate)**\n- `enhance_image_sync` - Enhance image quality and optimize faces (supports URL or local file upload)\n- `colorize_image_sync` - Colorize black-and-white photos (supports URL or local file upload)\n- `denoise_image_sync` - Remove noise from images (supports URL or local file upload)\n- `get_image_task_status` - Query image task status (for polling after sync timeout)\n\n**Image Segmentation (SAM3)**\n- `sam3_predict` - SAM3 image segmentation (supports local path, URL, or Base64 image)\n- `get_sam3_task_status` - Query SAM3 task status (for polling after sync timeout)\n\n## Prerequisites\n\n- **Node.js >= 18** (check: `node --version`)\n- **API Key** (required for authentication)\n\n## Lazy Install (Recommended)\n\nIf your AI Agent has a known MCP config path, just copy the line below and send it to your AI:\n\n```\nInstall the npm package @avclabs.ai/media-mcp as an MCP server. My API Key is: sk-xxxxxxxx.\n```\n\nThe AI will automatically:\n1. Detect your MCP client\n2. Find the config file path\n3. Write the correct configuration\n4. Prompt you to restart the client\n\n## Manual Install\n\nNo installation needed. Use `npx` directly in your MCP client config.\n\n### 1. Claude Code (CLI)\n\nRun in Claude Code:\n\n```\n/mcp\n```\n\nCheck the output for the **\"User MCPs\"** section to find the config file path, then edit that file.\n\nCommon paths (if `/mcp` is unavailable):\n- **Windows**: `%USERPROFILE%\\.claude.json`\n- **macOS**: `~/.claude.json`\n- **Linux**: `~/.claude.json`\n- **Legacy/Alternative**: `~/.claude/mcp.json`\n\nPaste this (replace `your-api-key`):\n\n```json\n{\n  \"mcpServers\": {\n    \"video-enhancement\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@avclabs.ai/media-mcp@latest\"],\n      \"env\": {\n        \"API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\nSave and run `/mcp` to verify it's loaded.\n\n### 2. Cursor\n\nGo to **Settings > Tools & MCPs > Add New MCP Server**:\n\n- **Name**: `video-enhancement`\n- **Type**: `command`\n- **Command**:\n  ```bash\n  env API_KEY=your-api-key npx -y @avclabs.ai/media-mcp@latest\n  ```\n\nOr edit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"video-enhancement\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@avclabs.ai/media-mcp@latest\"],\n      \"env\": {\n        \"API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n## Verify Installation\n\nAfter restarting your client, check if the tools are available:\n\n1. Or ask: \"What tools do you have available?\"\n2. With the current npm `latest=0.2.1`, you should see `create_task`, `get_task_status`, `enhance_video_sync`, `sam3_predict`, and `get_sam3_task_status`.\n3. After `0.3.0` is published, you should additionally see `enhance_image_sync`, `colorize_image_sync`, `denoise_image_sync`, and `get_image_task_status`.\n\n## Configuration Options\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `API_KEY` | **Yes** | - | API authentication key (shared by video, image, and SAM3 services) |\n| `HTTP_API_BASE_URL` | No | `https://mcp.avc.ai/enhance` | Shared video and image HTTP service endpoint |\n| `IMAGE_API_BASE_URL` | No | Same as `HTTP_API_BASE_URL` | Optional image endpoint override; omit for the shared production server |\n| `SAM3_API_BASE_URL` | No | `https://mcp.avc.ai/sam` | SAM3 service endpoint |\n| `SAM3_POLL_INTERVAL` | No | `2000` | SAM3 polling interval (milliseconds) |\n| `SAM3_POLL_MAX_ATTEMPTS` | No | `25` | SAM3 maximum polling attempts |\n\n`IMAGE_API_BASE_URL` is implemented by the unreleased `0.3.0` candidate as an optional override. Production uses the shared `/enhance` service, so it should normally be omitted; the candidate then resolves image and video calls to the same base URL.\n\n### Custom Endpoint (0.3.0 candidate)\n\n```json\n{\n  \"env\": {\n    \"HTTP_API_BASE_URL\": \"https://your-media-endpoint.com\",\n    \"API_KEY\": \"your-api-key\",\n    \"SAM3_API_BASE_URL\": \"https://your-sam3-endpoint.com\"\n  }\n}\n```\n\nOr via CLI args:\n```bash\nnpx -y @avclabs.ai/media-mcp@0.3.0 --base-url https://your-media-endpoint.com --api-key your-api-key --sam3-base-url https://your-sam3-endpoint.com\n```\n\nRun this command only after `0.3.0` is published. The optional `--image-base-url` remains available only for deployments that intentionally split the public image endpoint; npm `0.2.1` does not support it.\n\n## Recommended Workflow\n\nThis project provides both **synchronous** and **asynchronous** modes.\n\n**Because MCP Agents typically enforce a ~60-second timeout per tool call**, tasks with longer processing times (video enhancement) are strongly recommended to use **asynchronous mode**:\n\n### Asynchronous Mode (Recommended)\n\n**Video Enhancement:**\n1. Call `create_task` to create a task → immediately get `task_id`\n2. Wait a few seconds, then call `get_task_status` to query the status\n3. If `status` is `processing`, continue waiting and repeat step 2\n4. If `status` is `completed`, the task is done and the result contains `video_url`\n5. If `status` is `failed`, the task failed and the result contains `error_message`\n\n### Synchronous Mode (Simple Scenarios)\n\n**Video Enhancement:**\n- Call `enhance_video_sync` → the server polls internally\n- Defaults to a maximum wait of 50 seconds\n- If completed within 50 seconds, returns the result directly\n- If not completed within 50 seconds, returns `task_id` and instructions for the Agent to switch to `get_task_status`\n\n**Image Segmentation (SAM3):**\n- Call `sam3_predict` → the server polls internally\n- Defaults to a maximum wait of 50 seconds (25 attempts × 2-second polling interval)\n- If completed within 50 seconds, returns the segmentation result directly\n- If not completed within 50 seconds, returns a truncation notice indicating the task is still processing\n\n## Usage Examples\n\nOnce configured, ask your AI agent naturally:\n\n> \"Enhance this video to 1080p: https://example.com/video.mp4\"\n\n> \"Improve the quality of /Users/me/Desktop/video.mp4 to 2k\"\n\n> \"Enhance this image: https://example.com/photo.jpg\"\n\n> \"Colorize this black-and-white photo: /Users/me/Desktop/old_photo.png\"\n\n> \"Remove noise from this image: C:\\\\Users\\\\xxx\\\\noisy.jpg\"\n\n> \"Analyze this image and find all objects: C:\\\\Users\\\\xxx\\\\photo.png\"\n\n> \"Use SAM3 to segment this image, prompt: 'find all cars'\"\n\nThe agent will automatically choose sync or async tools based on task complexity.\n\n## Provided Tools\n\n### Video Enhancement\n\n#### create_task\n\nCreate an asynchronous video enhancement task.\n\n> **Recommended for most use cases.** Ideal for longer videos (over 10 seconds) to avoid timeouts and blocking the connection.\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `video_source` | string | Yes | - | Video URL or local file path (URL must be publicly accessible, links requiring login or signatures are not supported) |\n| `type` | string | No | `url` | `url` or `local` |\n| `resolution` | string | No | `720p` | `480p`, `540p`, `720p`, `1080p`, `2k` |\n\n**Returns:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"processing\"\n}\n```\n\n#### get_task_status\n\nQuery video enhancement task status.\n\n> The returned `status` field can be: `processing`, `completed`, or `failed`. If `status` is `processing`, you need to wait a few seconds and call this tool again.\n\n| Parameter | Type | Required |\n|---|---|---|\n| `task_id` | string | Yes |\n\n**Returns:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"completed\",\n  \"progress\": 100,\n  \"video_url\": \"https://...\",\n  \"message\": \"Task is still processing, please check again later\"\n}\n```\n\nThe `message` field only appears when `status` is `processing`, prompting the Agent to continue waiting.\n\n#### enhance_video_sync\n\nSynchronously enhance video (blocks until completion).\n\n> **Best for short videos (estimated processing time < 1 minute).** If the task is not completed within 50 seconds, the tool returns early with a `task_id`, and you need to use `get_task_status` to continue querying.\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `video_source` | string | Yes | - | Video URL or local file path |\n| `type` | string | No | `url` | `url` or `local` |\n| `resolution` | string | No | `720p` | Target resolution |\n| `poll_interval` | number | No | `5` | Poll interval (seconds) |\n| `timeout` | number | No | `50` | Sync wait timeout (seconds), returns early when exceeded |\n\n**Truncated return example (not completed within 50s):**\n```json\n{\n  \"success\": true,\n  \"status\": \"processing\",\n  \"task_id\": \"xxx\",\n  \"message\": \"Task is still processing (waited 50 seconds). Please use get_task_status to continue polling.\",\n  \"note\": \"The synchronous wait for this long-running task has been truncated. Switch to get_task_status polling.\"\n}\n```\n\n### Image Enhancement\n\nThree image processing tools are provided, each targeting a specific use case:\n\n| Tool | Function | Use Case |\n|---|---|---|\n| `enhance_image_sync` | Image quality enhancement & face optimization | Blurry, low-resolution, or degraded photos |\n| `colorize_image_sync` | Black-and-white photo colorization | Restoring old B&W photos with realistic colors |\n| `denoise_image_sync` | Image noise removal | Noisy/grainy photos taken in low light |\n\nAll three tools share the same parameters and behavior pattern. They are **synchronous** — the tool blocks until the image is processed or the timeout is reached.\n\n**Supported image formats**: PNG, JPG, JPEG, BMP, WebP, etc.\n\n**Two upload methods**:\n1. **URL upload**: provide a publicly accessible image URL (`type: \"url\"`)\n2. **Local upload**: provide a local file path, the MCP Server auto-uploads to TOS object storage (`type: \"local\"`, max file size: 100MB)\n\n#### enhance_image_sync\n\nSynchronously enhance an image to improve quality and optimize faces.\n\n> The tool internally creates a task and polls for the result. If processing completes within the timeout (default 50s), the result is returned directly. If not, the tool returns early with a `task_id` — use `get_image_task_status` to continue polling.\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `image_source` | string | Yes | - | Image URL or local file path (URL must be publicly accessible, links requiring login or signatures are not supported) |\n| `type` | string | No | `url` | `url` or `local` |\n| `scale` | number | No | `2` | Enhancement scale multiplier (e.g. `2` for 2x, `4` for 4x upscaling) |\n| `poll_interval` | number | No | `5` | Poll interval in seconds |\n| `timeout` | number | No | `50` | Sync wait timeout in seconds, returns early when exceeded |\n\n**Normal completion return:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"completed\",\n  \"progress\": 100,\n  \"image_url\": \"https://...\"\n}\n```\n\n**Truncated return (not completed within 50s):**\n```json\n{\n  \"success\": true,\n  \"status\": \"processing\",\n  \"task_id\": \"xxx\",\n  \"message\": \"Task is still processing (waited 50 seconds). Please use get_image_task_status to continue polling.\",\n  \"note\": \"The synchronous wait for this long-running task has been truncated. Switch to get_image_task_status polling.\"\n}\n```\n\n#### colorize_image_sync\n\nSynchronously colorize a black-and-white photo with AI.\n\n> Best for old black-and-white photos. The AI will add realistic colors to the image. Supports the same parameters and return format as `enhance_image_sync`.\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `image_source` | string | Yes | - | Image URL or local file path (URL must be publicly accessible, links requiring login or signatures are not supported) |\n| `type` | string | No | `url` | `url` or `local` |\n| `poll_interval` | number | No | `5` | Poll interval in seconds |\n| `timeout` | number | No | `50` | Sync wait timeout in seconds, returns early when exceeded |\n\n**Returns:** Same format as `enhance_image_sync`.\n\n#### denoise_image_sync\n\nSynchronously remove noise from an image.\n\n> Best for grainy/noisy photos taken in low-light conditions or with high ISO settings. Supports the same parameters and return format as `enhance_image_sync`.\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `image_source` | string | Yes | - | Image URL or local file path (URL must be publicly accessible, links requiring login or signatures are not supported) |\n| `type` | string | No | `url` | `url` or `local` |\n| `poll_interval` | number | No | `5` | Poll interval in seconds |\n| `timeout` | number | No | `50` | Sync wait timeout in seconds, returns early when exceeded |\n\n**Returns:** Same format as `enhance_image_sync`.\n\n#### get_image_task_status\n\nQuery image processing task status. Used to poll for results when a sync tool times out.\n\n> The returned `status` field can be: `processing`, `completed`, or `failed`. If `status` is `processing`, wait a few seconds and call this tool again.\n\n| Parameter | Type | Required |\n|---|---|---|\n| `task_id` | string | Yes |\n\n**Returns:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"completed\",\n  \"progress\": 100,\n  \"image_url\": \"https://...\",\n  \"message\": \"Task is still processing, please check again later\"\n}\n```\n\nThe `message` field only appears when `status` is `processing`, prompting the Agent to continue waiting.\n\n#### Recommended Workflow for Image Tools\n\n1. **For most images**: Call `enhance_image_sync` / `colorize_image_sync` / `denoise_image_sync` directly — the tool handles everything and returns the result\n2. **If truncated**: The tool returns a `task_id`, then use `get_image_task_status` to poll until `status` becomes `completed` or `failed`\n3. **If failed**: Check the `error_message` field for details\n\n### Image Segmentation (SAM3)\n\n#### sam3_predict\n\nAnalyze an image using the SAM3 segmentation API to generate inference results (masks, boxes, scores).\n\n**Parameters:**\n\nImage input (choose one, must provide exactly one):\n\n- `imagePath` (string): Absolute path of a local image file. Supports common formats (PNG, JPG, JPEG).\n  - Example: `\"C:\\\\Users\\\\xxx\\\\photo.png\"`, `\"/home/user/images/cat.jpg\"`\n  - Use when: The user explicitly provides a local file path\n\n- `imageUrl` (string): Publicly accessible URL of the image.\n  - Example: `\"https://example.com/photo.jpg\"`\n  - Use when: The image is already online and the user provides a link\n  - Note: The URL must be publicly accessible. Links requiring login or signatures are not supported\n\n- `imageBase64` (string): Base64-encoded image data.\n  - Example: `\"iVBORw0KGgoAAAANSUhEUgAA...\"`\n  - Use when: The user drags or uploads an image attachment, and the Agent encodes it as base64\n  - Note: Large images will produce very large base64 strings, which may slow transmission\n\nOther parameters:\n\n- `prompt` (string, required): English text prompt specifying the target object to segment. Since the SAM3 model only accepts English prompts, provide an English description. If the user provides Chinese or other non-English text, the Agent will automatically translate it before calling the tool.\n\n**Normal completion return:**\n\nAfter inference completes, returns a JSON string containing three fields:\n\n- **`masks`**: 2D array. Each element is a binary mask (values 0 or 1) with the same dimensions as the input image, marking the pixel-level location of detected objects. The i-th mask corresponds to the i-th detected object instance.\n- **`boxes`**: 2D array. Each element is a bounding box in `[x1, y1, x2, y2]` format, representing the rectangular region of the detected object. `x1`, `y1` are the top-left coordinates; `x2`, `y2` are the bottom-right coordinates.\n\n  Coordinate system: The top-left corner of the image is the origin `(0, 0)`. The x-axis increases to the right, and the y-axis increases downward, in pixels. For example, `[120, 80, 300, 450]` means the region starts 120px from the left edge and 80px from the top edge, extending to 300px from the left and 450px from the top. Width = `x2 - x1 = 180px`, Height = `y2 - y1 = 370px`.\n- **`scores`**: 1D array. Each element is a confidence score for the corresponding detection result, ranging from 0 to 1. Higher scores indicate greater model confidence.\n\nExample result JSON:\n\n```json\n{\n  \"masks\": [\n    [[0, 0, 1, ...], [0, 1, 1, ...], ...],\n    [[0, 0, 0, ...], [0, 0, 1, ...], ...]\n  ],\n  \"boxes\": [\n    [120, 80, 300, 450],\n    [400, 200, 600, 500]\n  ],\n  \"scores\": [0.95, 0.87]\n}\n```\n\n**Truncated return example (not completed within 50s):**\n```json\n{\n  \"success\": true,\n  \"status\": \"processing\",\n  \"task_id\": \"xxx\",\n  \"message\": \"Task is still processing (waited about 50 seconds). Please retry later or record this task_id for manual follow-up.\",\n  \"note\": \"The synchronous wait for this long-running task has been truncated.\"\n}\n```\n\n#### get_sam3_task_status\n\nQuery SAM3 segmentation task status. Used to poll for results when `sam3_predict` times out.\n\n> The returned `status` field can be: `processing`, `completed`, or `failed`. If `status` is `processing`, wait a few seconds and call this tool again.\n\n| Parameter | Type | Required |\n|---|---|---|\n| `task_id` | string | Yes |\n\n**Completed return:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"completed\",\n  \"result_url\": \"https://...\"\n}\n```\n\n**Processing return:**\n```json\n{\n  \"success\": true,\n  \"task_id\": \"xxx\",\n  \"status\": \"processing\",\n  \"message\": \"Task is still processing, please check again later.\"\n}\n```\n\n**Failed return:**\n```json\n{\n  \"success\": false,\n  \"task_id\": \"xxx\",\n  \"status\": \"failed\",\n  \"error\": \"Task failed\"\n}\n```\n\n## FAQ\n\n### Agent reports timeout when calling tools?\n\nThis is the primary issue this project addresses. MCP Agents (such as Claude, Cursor) typically enforce a ~60-second timeout per tool call. If task processing exceeds this limit, the Agent will error and disconnect.\n\n**Solutions:**\n\n1. **Prefer asynchronous tools**: For video enhancement and other time-consuming tasks, always use `create_task` + `get_task_status`. These tools return instantly on each call and will not trigger timeouts.\n\n2. **Sync tool truncation mechanism**: `enhance_video_sync` has an internal 50-second truncation limit. If the task is not completed within 50 seconds, the tool proactively returns a `task_id` and instructs the Agent to use `get_task_status` to follow up.\n\n3. **SAM3 truncation mechanism**: `sam3_predict` defaults to 25 polling attempts (~50 seconds). If the task is not completed, it returns a truncation notice indicating the task is still processing.\n\n4. **Adjust SAM3 polling parameters** (advanced): If you are confident that SAM3 tasks are usually fast (e.g., under 10 seconds), you can increase polling attempts via environment variable:\n   ```bash\n   SAM3_POLL_MAX_ATTEMPTS=60\n   ```\n   But ensure the total wait time does not exceed your Agent's timeout limit.\n\n### Drag-and-drop attachment says file not found?\n\nThis is a known limitation of stdio MCP. When dragging or uploading an attachment through the Agent interface, the file path is usually not automatically passed to the MCP Server.\n\n**Solutions:**\n\n1. **Provide the path simultaneously** (recommended): After dragging the image, add the local absolute path in your message:\n   > \"Please analyze this image `D:\\\\photos\\\\cat.jpg` and find the cat\"\n\n2. **Wait for auto-encoding**: Claude may automatically encode the image as base64. If successful, no extra action is needed.\n\n3. **Reply to path inquiry**: If Claude asks for the image path, simply reply with the local absolute path.\n\n### Is there a priority among the three input methods?\n\nThere is no strict priority. Claude will automatically choose the most appropriate method based on conversation context:\n\n- You provided a local path → uses `imagePath`\n- You provided a web link → uses `imageUrl`\n- You dragged an attachment without a path → tries `imageBase64`\n\n### What image formats are supported?\n\nCommon formats: PNG, JPG, JPEG, BMP, WebP, etc. PNG or JPG is recommended.\n\n### What if URL image download fails?\n\nEnsure the URL is **publicly accessible**, requiring no login, cookies, or signatures. If the image is on a service requiring authentication (e.g., private S3 Bucket, login-required image host), download it locally first and use `imagePath`.\n\n### What if the base64 image is too large?\n\nIf the image is very large (e.g., 4K resolution), the base64-encoded data will be very large and may slow transmission. Suggestions:\n\n1. Use `imagePath` instead\n2. Or compress the image before encoding\n\n## File Upload Notes\n\nWhen `type` is `\"local\"`:\n1. File is read locally by the MCP Server\n2. Uploaded directly to TOS object storage via pre-signed URL\n3. **Max file size: 100MB**\n\n## Troubleshooting\n\n### \"command not found: npx\"\n\nInstall Node.js >= 18: https://nodejs.org/\n\n### \"Error: --api-key argument or API_KEY environment variable is required\"\n\nYour API Key is missing. Double-check the `env.API_KEY` in your config.\n\n### MCP Server shows red/error in client\n\nCheck logs:\n- **Claude Desktop macOS**: `~/Library/Logs/Claude/mcp*.log`\n- **Claude Desktop Windows**: `%APPDATA%\\Claude\\logs\\mcp*.log`\n- **Cursor**: Output panel > MCP\n\n### \"TOS upload failed\"\n\nUsually a signature mismatch. Ensure your `IMAGE_API_BASE_URL` (or its `HTTP_API_BASE_URL` fallback) and `API_KEY` are correct and active.\n\n## Global Install (Alternative)\n\nIf you prefer not using `npx` every time:\n\n```bash\nnpm install -g @avclabs.ai/media-mcp\n```\n\nThen use `\"command\": \"media-mcp\"` with `\"args\": [\"--api-key\", \"your-api-key\"]` in your config.\n\n## Development and Release\n\nThis package runs locally in the MCP client and is released through npm; it is not a remote Node daemon. The sibling `media-mcp-api-http-server` is live as the shared `/enhance` video/image/account owner, although its current production release only implements video routes; candidate code adds the image routes, durable prepare/dispatch outboxes, task-level credit idempotency, and separate image/video queues. The Portal is live and SAM3 remains an external production dependency. Real image AI/TOS E2E, production backend rollout, and SAM3 JSON health are still pending, so `0.3.0` must not be published yet. Before publishing, run:\n\n```bash\nnpm ci\nnpm run release:verify\n```\n\nSee the [release guide](https://github.com/avclabs/media-mcp/blob/main/docs/RELEASE.md) for version synchronization, publish order, smoke tests, and the relationship with the portal/backend deployment.\n\n## License\n\nMIT License - See [LICENSE](LICENSE) file for details\n",
  "bytes": 24364,
  "sha": "626f7fb374dabe77735ce534c046e1e312a4ce37bf580efae7eded7e63e832d1",
  "repo_slug": "avclabs/media-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_avclabs_media_mcp_3fae7640/readme"
}