PrismPoster Creator Tools

Social media frame sizes with sourced safe areas, plus aspect-ratio, bitrate and subtitle tools.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
94%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~5,006Tokens (tool definitions)
~6.4 KBTypical response size
Significant attention impact (3.91% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "creator-tools": {
      "command": "npx",
      "args": [
        "@prismposter/creator-tools"
      ]
    }
  }
}

Runnable packages

npm@prismposter/creator-tools1.0.0stdio

Remote endpoints

https://www.prismposter.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (7)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_social_media_placement(id, sourceWidth, sourceHeight)

Look up one social media placement by id and return its frame size, aspect ratio, first-party safe-area insets in px, usable box, and the official page the figures came from. Pass sourceWidth and sourceHeight together to also get the centre-crop and letterbox plan that fits your footage to this placement. Use this when you know the target placement; use list_social_media_placements to browse or compare, check_safe_area to test whether an element is clear of the platform UI, and calculate_aspect_ratio for a ratio that is not a platform placement. For TikTok the insets are null with a reason, because TikTok publishes no fixed safe area. Errors on an unknown id (the message lists valid ids) or on only one source dimension.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "enum": [
        "instagramReels",
        "instagramStory",
        "instagramFeedTall",
        "instagramFeedPortrait",
        "instagramFeedSquare",
        "instagramFeedLandscape",
        "tiktokInFeed",
        "tiktokSquare",
        "tiktokLandscape",
        "youtubeShorts",
        "youtubeLandscape",
        "youtubeThumbnail",
        "youtubeBanner",
        "facebookReels",
        "facebookFeed",
        "linkedinFeedSquare",
        "linkedinFeedLandscape",
        "xFeedLandscape",
        "xFeedPortrait",
        "instagram-reels",
        "instagram-story",
        "instagram-feed-tall",
        "instagram-feed-portrait",
        "instagram-feed-square",
        "instagram-feed-landscape",
        "tiktok-video",
        "tiktok-in-feed",
        "tiktok-square",
        "tiktok-landscape",
        "youtube-shorts",
        "youtube-video",
        "youtube-landscape",
        "youtube-thumbnail",
        "youtube-channel-banner",
        "youtube-banner",
        "facebook-reels",
        "facebook-feed",
        "linkedin-video",
        "linkedin-feed-square",
        "linkedin-feed-landscape",
        "x-video",
        "x-feed-landscape",
        "x-feed-portrait"
      ],
      "description": "Placement id, camelCase (instagramReels) or kebab-case (instagram-reels), e.g. tiktok-video, youtube-shorts, youtube-channel-banner."
    },
    "sourceWidth": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000,
      "description": "Width of your source footage in px. Requires sourceHeight."
    },
    "sourceHeight": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000,
      "description": "Height of your source footage in px. Requires sourceWidth."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "platform": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "enum": [
        "video",
        "image"
      ]
    },
    "ratio": {
      "type": "string"
    },
    "size": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height"
      ]
    },
    "safeAreaKind": {
      "type": "string",
      "enum": [
        "published",
        "unpublished",
        "noOverlay",
        "region"
      ]
    },
    "safeAreaInsetsPx": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "top": {
              "type": "integer"
            },
            "right": {
              "type": "integer"
            },
            "bottom": {
              "type": "integer"
            },
            "left": {
              "type": "integer"
            }
          },
          "required": [
            "top",
            "right",
            "bottom",
            "left"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "usableBoxPx": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "usableSharePct": {
      "type": [
        "number",
        "null"
      ]
    },
    "regionPx": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "unpublishedReason": {
      "type": [
        "string",
        "null"
      ]
    },
    "firstPartySourceUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "fit": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "source": {
              "type": "object",
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              },
              "required": [
                "width",
                "height"
              ]
            },
            "exact": {
              "type": "boolean"
            },
            "crop": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "kept": {
                      "type": "object",
                      "properties": {
                        "width": {
                          "type": "integer"
                        },
                        "height": {
                          "type": "integer"
                        }
                      },
                      "required": [
                        "width",
                        "height"
                      ]
                    },
                    "trim": {
                      "type": "object",
                      "properties": {
                        "top": {
                          "type": "integer"
                        },
                        "right": {
                          "type": "integer"
                        },
                        "bottom": {
                          "type": "integer"
                        },
                        "left": {
                          "type": "integer"
                        }
                      },
                      "required": [
                        "top",
                        "right",
                        "bottom",
                        "left"
                      ]
                    },
                    "areaLost": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "kept",
                    "trim",
                    "areaLost"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "pad": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "frame": {
                      "type": "object",
                      "properties": {
                        "width": {
                          "type": "integer"
                        },
                        "height": {
                          "type": "integer"
                        }
                      },
                      "required": [
                        "width",
                        "height"
                      ]
                    },
                    "bars": {
                      "type": "object",
                      "properties": {
                        "top": {
                          "type": "integer"
                        },
                        "right": {
                          "type": "integer"
                        },
                        "bottom": {
                          "type": "integer"
                        },
                        "left": {
                          "type": "integer"
                        }
                      },
                      "required": [
                        "top",
                        "right",
                        "bottom",
                        "left"
                      ]
                    },
                    "barShare": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "frame",
                    "bars",
                    "barShare"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "source",
            "exact",
            "crop",
            "pad"
          ]
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "id",
    "platform",
    "kind",
    "ratio",
    "size",
    "safeAreaKind",
    "safeAreaInsetsPx",
    "usableBoxPx",
    "usableSharePct",
    "regionPx",
    "unpublishedReason",
    "firstPartySourceUrl",
    "referenceToolUrl",
    "fit"
  ]
}
🟢list_social_media_placements(platform)

List every supported social media placement (or one platform's) with frame size, aspect ratio, safe-area insets in px, usable box and first-party source URL, plus links to the same dataset as CSV, JSON and its DOI. Use this to browse, compare platforms, or find a placement id; use get_social_media_placement when you already know the id and also need a crop/letterbox plan for your footage. The list is a fixed dataset returned whole, with no paging.

Input Schema

{
  "type": "object",
  "properties": {
    "platform": {
      "type": "string",
      "enum": [
        "instagram",
        "tiktok",
        "youtube",
        "facebook",
        "linkedin",
        "x"
      ],
      "description": "Only return placements for this platform. Omit for all platforms."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "count": {
      "type": "integer"
    },
    "platform": {
      "type": [
        "string",
        "null"
      ]
    },
    "canonicalDatasetUrl": {
      "type": "string"
    },
    "datasetDoiUrl": {
      "type": "string"
    },
    "datasetCsvUrl": {
      "type": "string"
    },
    "datasetJsonUrl": {
      "type": "string"
    },
    "placements": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "video",
              "image"
            ]
          },
          "ratio": {
            "type": "string"
          },
          "size": {
            "type": "object",
            "properties": {
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              }
            },
            "required": [
              "width",
              "height"
            ]
          },
          "safeAreaKind": {
            "type": "string",
            "enum": [
              "published",
              "unpublished",
              "noOverlay",
              "region"
            ]
          },
          "safeAreaInsetsPx": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "top": {
                    "type": "integer"
                  },
                  "right": {
                    "type": "integer"
                  },
                  "bottom": {
                    "type": "integer"
                  },
                  "left": {
                    "type": "integer"
                  }
                },
                "required": [
                  "top",
                  "right",
                  "bottom",
                  "left"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "usableBoxPx": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  }
                },
                "required": [
                  "width",
                  "height"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "usableSharePct": {
            "type": [
              "number",
              "null"
            ]
          },
          "regionPx": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  }
                },
                "required": [
                  "width",
                  "height"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "unpublishedReason": {
            "type": [
              "string",
              "null"
            ]
          },
          "firstPartySourceUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "referenceToolUrl": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "platform",
          "kind",
          "ratio",
          "size",
          "safeAreaKind",
          "safeAreaInsetsPx",
          "usableBoxPx",
          "usableSharePct",
          "regionPx",
          "unpublishedReason",
          "firstPartySourceUrl",
          "referenceToolUrl"
        ]
      }
    }
  },
  "required": [
    "count",
    "platform",
    "canonicalDatasetUrl",
    "datasetDoiUrl",
    "datasetCsvUrl",
    "datasetJsonUrl",
    "placements"
  ]
}
🟢check_safe_area(placementId, x, y, width, height)

Check whether a rectangle (a caption, logo or button, in px on the placement's own frame, origin top-left) stays inside the placement's safe area, and by how many px it intrudes past each edge if not. Use this to validate a layout before export; use get_social_media_placement for the raw insets. Returns verdict "inside", "intrudes" or "unknown"; "unknown" means the platform publishes no fixed safe area (TikTok) and comes with the reason instead of a guess. Errors on an unknown placement id or a box with non-positive size.

Input Schema

{
  "type": "object",
  "properties": {
    "placementId": {
      "type": "string",
      "enum": [
        "instagramReels",
        "instagramStory",
        "instagramFeedTall",
        "instagramFeedPortrait",
        "instagramFeedSquare",
        "instagramFeedLandscape",
        "tiktokInFeed",
        "tiktokSquare",
        "tiktokLandscape",
        "youtubeShorts",
        "youtubeLandscape",
        "youtubeThumbnail",
        "youtubeBanner",
        "facebookReels",
        "facebookFeed",
        "linkedinFeedSquare",
        "linkedinFeedLandscape",
        "xFeedLandscape",
        "xFeedPortrait",
        "instagram-reels",
        "instagram-story",
        "instagram-feed-tall",
        "instagram-feed-portrait",
        "instagram-feed-square",
        "instagram-feed-landscape",
        "tiktok-video",
        "tiktok-in-feed",
        "tiktok-square",
        "tiktok-landscape",
        "youtube-shorts",
        "youtube-video",
        "youtube-landscape",
        "youtube-thumbnail",
        "youtube-channel-banner",
        "youtube-banner",
        "facebook-reels",
        "facebook-feed",
        "linkedin-video",
        "linkedin-feed-square",
        "linkedin-feed-landscape",
        "x-video",
        "x-feed-landscape",
        "x-feed-portrait"
      ],
      "description": "Placement id, camelCase or kebab-case, e.g. instagram-reels."
    },
    "x": {
      "type": "integer",
      "description": "Element's left edge in px from the frame's left edge."
    },
    "y": {
      "type": "integer",
      "description": "Element's top edge in px from the frame's top edge."
    },
    "width": {
      "type": "integer",
      "minimum": 1,
      "description": "Element width in px."
    },
    "height": {
      "type": "integer",
      "minimum": 1,
      "description": "Element height in px."
    }
  },
  "required": [
    "placementId",
    "x",
    "y",
    "width",
    "height"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "placementId": {
      "type": "string"
    },
    "frame": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height"
      ]
    },
    "box": {
      "type": "object",
      "properties": {
        "x": {
          "type": "integer"
        },
        "y": {
          "type": "integer"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "required": [
        "x",
        "y",
        "width",
        "height"
      ]
    },
    "verdict": {
      "type": "string",
      "enum": [
        "inside",
        "intrudes",
        "unknown"
      ]
    },
    "withinFrame": {
      "type": "boolean"
    },
    "safeAreaKind": {
      "type": "string",
      "enum": [
        "published",
        "unpublished",
        "noOverlay",
        "region"
      ]
    },
    "safeRectPx": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "x": {
              "type": "integer"
            },
            "y": {
              "type": "integer"
            },
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          },
          "required": [
            "x",
            "y",
            "width",
            "height"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "intrusionPx": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "top": {
              "type": "integer"
            },
            "right": {
              "type": "integer"
            },
            "bottom": {
              "type": "integer"
            },
            "left": {
              "type": "integer"
            }
          },
          "required": [
            "top",
            "right",
            "bottom",
            "left"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "unpublishedReason": {
      "type": [
        "string",
        "null"
      ]
    },
    "firstPartySourceUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    }
  },
  "required": [
    "placementId",
    "frame",
    "box",
    "verdict",
    "withinFrame",
    "safeAreaKind",
    "safeRectPx",
    "intrusionPx",
    "unpublishedReason",
    "firstPartySourceUrl",
    "referenceToolUrl"
  ]
}
🟢calculate_aspect_ratio(width, height, targetRatioW, targetRatioH)

Reduce any pixel size to its simplest aspect ratio (1920x1080 is 16:9) and the nearest even size an H.264 encoder accepts, and, given a target ratio, solve the missing width or height and return the centre-crop and letterbox/pillarbox plans with the px trimmed or added per edge. Use this for arbitrary sizes and ratios (cinema 2.39:1, a client's 4:5); when the target is a named platform placement, use get_social_media_placement with sourceWidth/sourceHeight instead, which picks the right ratio for you. Errors on a non-integer or out-of-range size, or on only one of targetRatioW/targetRatioH.

Input Schema

{
  "type": "object",
  "properties": {
    "width": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000,
      "description": "Frame width in px."
    },
    "height": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000,
      "description": "Frame height in px."
    },
    "targetRatioW": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Width term of the ratio to crop or pad to, e.g. 9 for 9:16 or 2.39 for 2.39:1. Requires targetRatioH."
    },
    "targetRatioH": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Height term of the target ratio, e.g. 16 for 9:16. Requires targetRatioW."
    }
  },
  "required": [
    "width",
    "height"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "input": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height"
      ]
    },
    "ratio": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "w": {
              "type": "number"
            },
            "h": {
              "type": "number"
            }
          },
          "required": [
            "w",
            "h"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "formattedRatio": {
      "type": [
        "string",
        "null"
      ]
    },
    "evenEncoderSize": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "targetRatio": {
      "type": [
        "string",
        "null"
      ]
    },
    "solvedHeightForWidth": {
      "type": [
        "number",
        "null"
      ]
    },
    "solvedWidthForHeight": {
      "type": [
        "number",
        "null"
      ]
    },
    "cropPlan": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "kept": {
              "type": "object",
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              },
              "required": [
                "width",
                "height"
              ]
            },
            "trim": {
              "type": "object",
              "properties": {
                "top": {
                  "type": "integer"
                },
                "right": {
                  "type": "integer"
                },
                "bottom": {
                  "type": "integer"
                },
                "left": {
                  "type": "integer"
                }
              },
              "required": [
                "top",
                "right",
                "bottom",
                "left"
              ]
            },
            "areaLost": {
              "type": "number"
            }
          },
          "required": [
            "kept",
            "trim",
            "areaLost"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "padPlan": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "frame": {
              "type": "object",
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              },
              "required": [
                "width",
                "height"
              ]
            },
            "bars": {
              "type": "object",
              "properties": {
                "top": {
                  "type": "integer"
                },
                "right": {
                  "type": "integer"
                },
                "bottom": {
                  "type": "integer"
                },
                "left": {
                  "type": "integer"
                }
              },
              "required": [
                "top",
                "right",
                "bottom",
                "left"
              ]
            },
            "barShare": {
              "type": "number"
            }
          },
          "required": [
            "frame",
            "bars",
            "barShare"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    }
  },
  "required": [
    "input",
    "ratio",
    "formattedRatio",
    "evenEncoderSize",
    "targetRatio",
    "solvedHeightForWidth",
    "solvedWidthForHeight",
    "cropPlan",
    "padPlan",
    "referenceToolUrl"
  ]
}
🟢estimate_video_bitrate(durationSec, videoKbps, audioKbps, targetCapMb)

Video size and bitrate arithmetic for a clip of durationSec. Pass videoKbps to get the encoded file size (MB, GB, MiB, GiB); pass targetCapMb to get the highest video bitrate that fits that file size. Audio is added at audioKbps (default 192). Every answer also gives the highest video bitrate that fits Discord's 20 MB free upload limit. Kbps is decimal (1 kbps = 1000 bit/s) and MB is 1,000,000 bytes. Use it to plan an export or hit an upload cap; it does not inspect or encode files. Errors when neither videoKbps nor targetCapMb is given.

Input Schema

{
  "type": "object",
  "properties": {
    "durationSec": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Clip length in seconds."
    },
    "videoKbps": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Video track bitrate in kbps, to estimate the file size."
    },
    "audioKbps": {
      "type": "number",
      "minimum": 0,
      "default": 192,
      "description": "Audio track bitrate in kbps. Default 192; 0 for a silent clip."
    },
    "targetCapMb": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "File-size ceiling in MB (decimal), to solve for the maximum video bitrate."
    }
  },
  "required": [
    "durationSec"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "durationSec": {
      "type": "number"
    },
    "videoKbps": {
      "type": [
        "number",
        "null"
      ]
    },
    "audioKbps": {
      "type": "number"
    },
    "estimatedSize": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "bytes": {
              "type": "number"
            },
            "megabytes": {
              "type": "number"
            },
            "gigabytes": {
              "type": "number"
            },
            "mebibytes": {
              "type": "number"
            },
            "gibibytes": {
              "type": "number"
            },
            "totalKbps": {
              "type": "number"
            },
            "bytesPerMinute": {
              "type": "number"
            }
          },
          "required": [
            "bytes",
            "megabytes",
            "gigabytes",
            "mebibytes",
            "gibibytes",
            "totalKbps",
            "bytesPerMinute"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "targetCapMb": {
      "type": [
        "number",
        "null"
      ]
    },
    "requiredBitrateForCap": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "totalKbps": {
              "type": "number"
            },
            "videoKbps": {
              "type": "number"
            },
            "audioKbps": {
              "type": "number"
            },
            "audioOverBudget": {
              "type": "boolean"
            }
          },
          "required": [
            "totalKbps",
            "videoKbps",
            "audioKbps",
            "audioOverBudget"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "discordFreeUploadCapMb": {
      "type": "number"
    },
    "discordFreeMaxVideoMbps": {
      "type": "number"
    },
    "referenceToolUrl": {
      "type": "string"
    }
  },
  "required": [
    "durationSec",
    "videoKbps",
    "audioKbps",
    "estimatedSize",
    "targetCapMb",
    "requiredBitrateForCap",
    "discordFreeUploadCapMb",
    "discordFreeMaxVideoMbps",
    "referenceToolUrl"
  ]
}
🟢convert_subtitles(input, toFormat, shiftMs)

Convert subtitle text between SubRip (srt) and WebVTT (vtt), optionally shifting every cue by shiftMs, and return the converted text with the detected source format, cue count, parse warnings (with line numbers) and timing issues (overlapping, zero-length or out-of-order cues). Pass the file contents, not a path. Malformed blocks are skipped with a warning instead of failing the whole file. ASS/SSA input is not supported here; the @prismposter/creator-tools package converts it. Errors when no cue could be parsed, the input is over 2 MB, or the shift is beyond one hour.

Input Schema

{
  "type": "object",
  "properties": {
    "input": {
      "type": "string",
      "minLength": 1,
      "description": "The full SRT or WebVTT file contents as text."
    },
    "toFormat": {
      "type": "string",
      "enum": [
        "srt",
        "vtt"
      ],
      "description": "Format to convert to."
    },
    "shiftMs": {
      "type": "integer",
      "minimum": -3600000,
      "maximum": 3600000,
      "description": "Move every cue by this many ms: positive is later, negative earlier."
    }
  },
  "required": [
    "input",
    "toFormat"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "sourceFormat": {
      "type": "string",
      "enum": [
        "srt",
        "vtt"
      ]
    },
    "targetFormat": {
      "type": "string",
      "enum": [
        "srt",
        "vtt"
      ]
    },
    "cueCount": {
      "type": "integer"
    },
    "shiftMs": {
      "type": "integer"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "line"
        ]
      }
    },
    "issues": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string"
          },
          "cue": {
            "type": "integer"
          },
          "otherCue": {
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "cue"
        ]
      }
    },
    "endMs": {
      "type": [
        "number",
        "null"
      ]
    },
    "output": {
      "type": "string"
    },
    "referenceToolUrl": {
      "type": "string"
    }
  },
  "required": [
    "sourceFormat",
    "targetFormat",
    "cueCount",
    "shiftMs",
    "warnings",
    "issues",
    "endMs",
    "output",
    "referenceToolUrl"
  ]
}
🟢estimate_tempo(timestampsMs, bpm, timeSignature, bars)

Tempo arithmetic for editing to music: pass tap timestamps (ms) to estimate BPM with a stability and confidence rating, or pass a known bpm. Either way it returns the beat length, a delay table (straight, dotted and triplet ms for each note value) and how many seconds a number of bars lasts in a time signature. It works on numbers you supply and does not analyse audio. Errors when neither input is given, the taps do not yield a tempo, bpm is outside 30-300, or the time signature is not one listed.

Input Schema

{
  "type": "object",
  "properties": {
    "timestampsMs": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "minItems": 2,
      "description": "Tap times in ms from a monotonic clock (performance.now()), in order."
    },
    "bpm": {
      "type": "number",
      "minimum": 30,
      "maximum": 300,
      "description": "Known tempo in beats per minute. Used instead of the tap estimate when both are given."
    },
    "timeSignature": {
      "type": "string",
      "enum": [
        "4/4",
        "3/4",
        "2/4",
        "6/8",
        "5/4",
        "7/8",
        "12/8"
      ],
      "default": "4/4",
      "description": "Time signature for the bar length. Default 4/4."
    },
    "bars": {
      "type": "number",
      "exclusiveMinimum": 0,
      "default": 16,
      "description": "Number of bars to convert into seconds. Default 16."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "bpm": {
      "type": "number"
    },
    "quarterNoteMs": {
      "type": "number"
    },
    "tapAnalysis": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "bpm": {
              "type": [
                "number",
                "null"
              ]
            },
            "taps": {
              "type": "integer"
            },
            "intervalsUsed": {
              "type": "integer"
            },
            "discarded": {
              "type": "integer"
            },
            "spreadMs": {
              "type": "number"
            },
            "stability": {
              "type": "number"
            },
            "confidence": {
              "type": "string",
              "enum": [
                "none",
                "low",
                "medium",
                "high"
              ]
            }
          },
          "required": [
            "bpm",
            "taps",
            "intervalsUsed",
            "discarded",
            "spreadMs",
            "stability",
            "confidence"
          ]
        },
        {
          "type": "null"
        }
      ]
    },
    "delaysMs": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "fraction": {
            "type": "string"
          },
          "beats": {
            "type": "number"
          },
          "straight": {
            "type": "number"
          },
          "dotted": {
            "type": "number"
          },
          "triplet": {
            "type": "number"
          }
        },
        "required": [
          "id",
          "fraction",
          "beats",
          "straight",
          "dotted",
          "triplet"
        ]
      }
    },
    "timeSignature": {
      "type": "string"
    },
    "bars": {
      "type": "number"
    },
    "barsDurationSeconds": {
      "type": "number"
    },
    "referenceToolUrl": {
      "type": "string"
    }
  },
  "required": [
    "bpm",
    "quarterNoteMs",
    "tapAnalysis",
    "delaysMs",
    "timeSignature",
    "bars",
    "barsDurationSeconds",
    "referenceToolUrl"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded7 tools