Koskamo

PrismPoster Creator Tools MCP

An official remote MCP server provided by PrismPoster for accessing creator utility tools. It allows AI agents to retrieve social media platform frame sizes, safe areas, caption timing data, and aspect ratio information without requiring user authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

PrismPoster Creator Tools MCP logo, by PrismLabs OÜVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by PrismLabs OÜ
MCP endpoint (Streamable HTTP)
https://www.prismposter.com/api/mcp
Vendor documentation

What you can do with it

  • Retrieve social media safe areas and frame sizes
  • Get caption timing and aspect ratio data
  • Access platform-specific design constraints

Source and maintenance

Vendor evidenceRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
prismposter-creator-tools 1.0.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Deterministic calculators for video and social creators. Every tool is read-only with no side effects, and the same input always returns the same output. Platform figures come from first-party documentation and carry their source URL; where a platform publishes no fixed safe area (TikTok), tools say so instead of inventing one.

Tools

7 advertised

get_social_media_placement — Get one social media placement spec
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_social_media_placement input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "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"
      ],
      "type": "string",
      "description": "Placement id, camelCase (instagramReels) or kebab-case (instagram-reels), e.g. tiktok-video, youtube-shorts, youtube-channel-banner."
    },
    "sourceWidth": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 1,
      "description": "Width of your source footage in px. Requires sourceHeight."
    },
    "sourceHeight": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 1,
      "description": "Height of your source footage in px. Requires sourceWidth."
    }
  },
  "additionalProperties": false
}
get_social_media_placement output schema
{
  "type": "object",
  "required": [
    "id",
    "platform",
    "kind",
    "ratio",
    "size",
    "safeAreaKind",
    "safeAreaInsetsPx",
    "usableBoxPx",
    "usableSharePct",
    "regionPx",
    "unpublishedReason",
    "firstPartySourceUrl",
    "referenceToolUrl",
    "fit"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "fit": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "source",
            "exact",
            "crop",
            "pad"
          ],
          "properties": {
            "pad": {
              "anyOf": [
                {
                  "type": "object",
                  "required": [
                    "frame",
                    "bars",
                    "barShare"
                  ],
                  "properties": {
                    "bars": {
                      "type": "object",
                      "required": [
                        "top",
                        "right",
                        "bottom",
                        "left"
                      ],
                      "properties": {
                        "top": {
                          "type": "integer"
                        },
                        "left": {
                          "type": "integer"
                        },
                        "right": {
                          "type": "integer"
                        },
                        "bottom": {
                          "type": "integer"
                        }
                      }
                    },
                    "frame": {
                      "type": "object",
                      "required": [
                        "width",
                        "height"
                      ],
                      "properties": {
                        "width": {
                          "type": "integer"
                        },
                        "height": {
                          "type": "integer"
                        }
                      }
                    },
                    "barShare": {
                      "type": "number"
                    }
                  }
                },
                {
                  "type": "null"
                }
              ]
            },
            "crop": {
              "anyOf": [
                {
                  "type": "object",
                  "required": [
                    "kept",
                    "trim",
                    "areaLost"
                  ],
                  "properties": {
                    "kept": {
                      "type": "object",
                      "required": [
                        "width",
                        "height"
                      ],
                      "properties": {
                        "width": {
                          "type": "integer"
                        },
                        "height": {
                          "type": "integer"
                        }
                      }
                    },
                    "trim": {
                      "type": "object",
                      "required": [
                        "top",
                        "right",
                        "bottom",
                        "left"
                      ],
                      "properties": {
                        "top": {
                          "type": "integer"
                        },
                        "left": {
                          "type": "integer"
                        },
                        "right": {
                          "type": "integer"
                        },
                        "bottom": {
                          "type": "integer"
                        }
                      }
                    },
                    "areaLost": {
                      "type": "number"
                    }
                  }
                },
                {
                  "type": "null"
                }
              ]
            },
            "exact": {
              "type": "boolean"
            },
            "source": {
              "type": "object",
              "required": [
                "width",
                "height"
              ],
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              }
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "kind": {
      "enum": [
        "video",
        "image"
      ],
      "type": "string"
    },
    "size": {
      "type": "object",
      "required": [
        "width",
        "height"
      ],
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      }
    },
    "ratio": {
      "type": "string"
    },
    "platform": {
      "type": "string"
    },
    "regionPx": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "width",
            "height"
          ],
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "usableBoxPx": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "width",
            "height"
          ],
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "safeAreaKind": {
      "enum": [
        "published",
        "unpublished",
        "noOverlay",
        "region"
      ],
      "type": "string"
    },
    "usableSharePct": {
      "type": [
        "number",
        "null"
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "safeAreaInsetsPx": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "top",
            "right",
            "bottom",
            "left"
          ],
          "properties": {
            "top": {
              "type": "integer"
            },
            "left": {
              "type": "integer"
            },
            "right": {
              "type": "integer"
            },
            "bottom": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "unpublishedReason": {
      "type": [
        "string",
        "null"
      ]
    },
    "firstPartySourceUrl": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
get_social_media_placement annotations
{
  "title": "Get one social media placement spec",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_social_media_placements — List social media placement specs
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

list_social_media_placements input schema
{
  "type": "object",
  "properties": {
    "platform": {
      "enum": [
        "instagram",
        "tiktok",
        "youtube",
        "facebook",
        "linkedin",
        "x"
      ],
      "type": "string",
      "description": "Only return placements for this platform. Omit for all platforms."
    }
  },
  "additionalProperties": false
}
list_social_media_placements output schema
{
  "type": "object",
  "required": [
    "count",
    "platform",
    "canonicalDatasetUrl",
    "datasetDoiUrl",
    "datasetCsvUrl",
    "datasetJsonUrl",
    "placements"
  ],
  "properties": {
    "count": {
      "type": "integer"
    },
    "platform": {
      "type": [
        "string",
        "null"
      ]
    },
    "placements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "platform",
          "kind",
          "ratio",
          "size",
          "safeAreaKind",
          "safeAreaInsetsPx",
          "usableBoxPx",
          "usableSharePct",
          "regionPx",
          "unpublishedReason",
          "firstPartySourceUrl",
          "referenceToolUrl"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "video",
              "image"
            ],
            "type": "string"
          },
          "size": {
            "type": "object",
            "required": [
              "width",
              "height"
            ],
            "properties": {
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              }
            }
          },
          "ratio": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "regionPx": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "width",
                  "height"
                ],
                "properties": {
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "usableBoxPx": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "width",
                  "height"
                ],
                "properties": {
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "safeAreaKind": {
            "enum": [
              "published",
              "unpublished",
              "noOverlay",
              "region"
            ],
            "type": "string"
          },
          "usableSharePct": {
            "type": [
              "number",
              "null"
            ]
          },
          "referenceToolUrl": {
            "type": "string"
          },
          "safeAreaInsetsPx": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "top",
                  "right",
                  "bottom",
                  "left"
                ],
                "properties": {
                  "top": {
                    "type": "integer"
                  },
                  "left": {
                    "type": "integer"
                  },
                  "right": {
                    "type": "integer"
                  },
                  "bottom": {
                    "type": "integer"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "unpublishedReason": {
            "type": [
              "string",
              "null"
            ]
          },
          "firstPartySourceUrl": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "datasetCsvUrl": {
      "type": "string"
    },
    "datasetDoiUrl": {
      "type": "string"
    },
    "datasetJsonUrl": {
      "type": "string"
    },
    "canonicalDatasetUrl": {
      "type": "string"
    }
  }
}
list_social_media_placements annotations
{
  "title": "List social media placement specs",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_safe_area — Check an element against a placement safe area
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

check_safe_area input schema
{
  "type": "object",
  "required": [
    "placementId",
    "x",
    "y",
    "width",
    "height"
  ],
  "properties": {
    "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."
    },
    "placementId": {
      "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"
      ],
      "type": "string",
      "description": "Placement id, camelCase or kebab-case, e.g. instagram-reels."
    }
  },
  "additionalProperties": false
}
check_safe_area output schema
{
  "type": "object",
  "required": [
    "placementId",
    "frame",
    "box",
    "verdict",
    "withinFrame",
    "safeAreaKind",
    "safeRectPx",
    "intrusionPx",
    "unpublishedReason",
    "firstPartySourceUrl",
    "referenceToolUrl"
  ],
  "properties": {
    "box": {
      "type": "object",
      "required": [
        "x",
        "y",
        "width",
        "height"
      ],
      "properties": {
        "x": {
          "type": "integer"
        },
        "y": {
          "type": "integer"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      }
    },
    "frame": {
      "type": "object",
      "required": [
        "width",
        "height"
      ],
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      }
    },
    "verdict": {
      "enum": [
        "inside",
        "intrudes",
        "unknown"
      ],
      "type": "string"
    },
    "safeRectPx": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "x",
            "y",
            "width",
            "height"
          ],
          "properties": {
            "x": {
              "type": "integer"
            },
            "y": {
              "type": "integer"
            },
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "intrusionPx": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "top",
            "right",
            "bottom",
            "left"
          ],
          "properties": {
            "top": {
              "type": "integer"
            },
            "left": {
              "type": "integer"
            },
            "right": {
              "type": "integer"
            },
            "bottom": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "placementId": {
      "type": "string"
    },
    "withinFrame": {
      "type": "boolean"
    },
    "safeAreaKind": {
      "enum": [
        "published",
        "unpublished",
        "noOverlay",
        "region"
      ],
      "type": "string"
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "unpublishedReason": {
      "type": [
        "string",
        "null"
      ]
    },
    "firstPartySourceUrl": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
check_safe_area annotations
{
  "title": "Check an element against a placement safe area",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
calculate_aspect_ratio — Calculate aspect ratio and crop/pad plan
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

calculate_aspect_ratio input schema
{
  "type": "object",
  "required": [
    "width",
    "height"
  ],
  "properties": {
    "width": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 1,
      "description": "Frame width in px."
    },
    "height": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 1,
      "description": "Frame height in px."
    },
    "targetRatioH": {
      "type": "number",
      "description": "Height term of the target ratio, e.g. 16 for 9:16. Requires targetRatioW.",
      "exclusiveMinimum": 0
    },
    "targetRatioW": {
      "type": "number",
      "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.",
      "exclusiveMinimum": 0
    }
  },
  "additionalProperties": false
}
calculate_aspect_ratio output schema
{
  "type": "object",
  "required": [
    "input",
    "ratio",
    "formattedRatio",
    "evenEncoderSize",
    "targetRatio",
    "solvedHeightForWidth",
    "solvedWidthForHeight",
    "cropPlan",
    "padPlan",
    "referenceToolUrl"
  ],
  "properties": {
    "input": {
      "type": "object",
      "required": [
        "width",
        "height"
      ],
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      }
    },
    "ratio": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "w",
            "h"
          ],
          "properties": {
            "h": {
              "type": "number"
            },
            "w": {
              "type": "number"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "padPlan": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "frame",
            "bars",
            "barShare"
          ],
          "properties": {
            "bars": {
              "type": "object",
              "required": [
                "top",
                "right",
                "bottom",
                "left"
              ],
              "properties": {
                "top": {
                  "type": "integer"
                },
                "left": {
                  "type": "integer"
                },
                "right": {
                  "type": "integer"
                },
                "bottom": {
                  "type": "integer"
                }
              }
            },
            "frame": {
              "type": "object",
              "required": [
                "width",
                "height"
              ],
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              }
            },
            "barShare": {
              "type": "number"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "cropPlan": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "kept",
            "trim",
            "areaLost"
          ],
          "properties": {
            "kept": {
              "type": "object",
              "required": [
                "width",
                "height"
              ],
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                }
              }
            },
            "trim": {
              "type": "object",
              "required": [
                "top",
                "right",
                "bottom",
                "left"
              ],
              "properties": {
                "top": {
                  "type": "integer"
                },
                "left": {
                  "type": "integer"
                },
                "right": {
                  "type": "integer"
                },
                "bottom": {
                  "type": "integer"
                }
              }
            },
            "areaLost": {
              "type": "number"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "targetRatio": {
      "type": [
        "string",
        "null"
      ]
    },
    "formattedRatio": {
      "type": [
        "string",
        "null"
      ]
    },
    "evenEncoderSize": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "width",
            "height"
          ],
          "properties": {
            "width": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "solvedHeightForWidth": {
      "type": [
        "number",
        "null"
      ]
    },
    "solvedWidthForHeight": {
      "type": [
        "number",
        "null"
      ]
    }
  }
}
calculate_aspect_ratio annotations
{
  "title": "Calculate aspect ratio and crop/pad plan",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_video_bitrate — Estimate video file size and bitrate
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

estimate_video_bitrate input schema
{
  "type": "object",
  "required": [
    "durationSec"
  ],
  "properties": {
    "audioKbps": {
      "type": "number",
      "default": 192,
      "minimum": 0,
      "description": "Audio track bitrate in kbps. Default 192; 0 for a silent clip."
    },
    "videoKbps": {
      "type": "number",
      "description": "Video track bitrate in kbps, to estimate the file size.",
      "exclusiveMinimum": 0
    },
    "durationSec": {
      "type": "number",
      "description": "Clip length in seconds.",
      "exclusiveMinimum": 0
    },
    "targetCapMb": {
      "type": "number",
      "description": "File-size ceiling in MB (decimal), to solve for the maximum video bitrate.",
      "exclusiveMinimum": 0
    }
  },
  "additionalProperties": false
}
estimate_video_bitrate output schema
{
  "type": "object",
  "required": [
    "durationSec",
    "videoKbps",
    "audioKbps",
    "estimatedSize",
    "targetCapMb",
    "requiredBitrateForCap",
    "discordFreeUploadCapMb",
    "discordFreeMaxVideoMbps",
    "referenceToolUrl"
  ],
  "properties": {
    "audioKbps": {
      "type": "number"
    },
    "videoKbps": {
      "type": [
        "number",
        "null"
      ]
    },
    "durationSec": {
      "type": "number"
    },
    "targetCapMb": {
      "type": [
        "number",
        "null"
      ]
    },
    "estimatedSize": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "bytes",
            "megabytes",
            "gigabytes",
            "mebibytes",
            "gibibytes",
            "totalKbps",
            "bytesPerMinute"
          ],
          "properties": {
            "bytes": {
              "type": "number"
            },
            "gibibytes": {
              "type": "number"
            },
            "gigabytes": {
              "type": "number"
            },
            "mebibytes": {
              "type": "number"
            },
            "megabytes": {
              "type": "number"
            },
            "totalKbps": {
              "type": "number"
            },
            "bytesPerMinute": {
              "type": "number"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "requiredBitrateForCap": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "totalKbps",
            "videoKbps",
            "audioKbps",
            "audioOverBudget"
          ],
          "properties": {
            "audioKbps": {
              "type": "number"
            },
            "totalKbps": {
              "type": "number"
            },
            "videoKbps": {
              "type": "number"
            },
            "audioOverBudget": {
              "type": "boolean"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "discordFreeUploadCapMb": {
      "type": "number"
    },
    "discordFreeMaxVideoMbps": {
      "type": "number"
    }
  }
}
estimate_video_bitrate annotations
{
  "title": "Estimate video file size and bitrate",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
convert_subtitles — Convert subtitles between SRT and WebVTT
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

convert_subtitles input schema
{
  "type": "object",
  "required": [
    "input",
    "toFormat"
  ],
  "properties": {
    "input": {
      "type": "string",
      "minLength": 1,
      "description": "The full SRT or WebVTT file contents as text."
    },
    "shiftMs": {
      "type": "integer",
      "maximum": 3600000,
      "minimum": -3600000,
      "description": "Move every cue by this many ms: positive is later, negative earlier."
    },
    "toFormat": {
      "enum": [
        "srt",
        "vtt"
      ],
      "type": "string",
      "description": "Format to convert to."
    }
  },
  "additionalProperties": false
}
convert_subtitles output schema
{
  "type": "object",
  "required": [
    "sourceFormat",
    "targetFormat",
    "cueCount",
    "shiftMs",
    "warnings",
    "issues",
    "endMs",
    "output",
    "referenceToolUrl"
  ],
  "properties": {
    "endMs": {
      "type": [
        "number",
        "null"
      ]
    },
    "issues": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "kind",
          "cue"
        ],
        "properties": {
          "cue": {
            "type": "integer"
          },
          "kind": {
            "type": "string"
          },
          "otherCue": {
            "type": "integer"
          }
        }
      }
    },
    "output": {
      "type": "string"
    },
    "shiftMs": {
      "type": "integer"
    },
    "cueCount": {
      "type": "integer"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "kind",
          "line"
        ],
        "properties": {
          "kind": {
            "type": "string"
          },
          "line": {
            "type": "integer"
          }
        }
      }
    },
    "sourceFormat": {
      "enum": [
        "srt",
        "vtt"
      ],
      "type": "string"
    },
    "targetFormat": {
      "enum": [
        "srt",
        "vtt"
      ],
      "type": "string"
    },
    "referenceToolUrl": {
      "type": "string"
    }
  }
}
convert_subtitles annotations
{
  "title": "Convert subtitles between SRT and WebVTT",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_tempo — Estimate tempo, delay times and bar lengths
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

estimate_tempo input schema
{
  "type": "object",
  "properties": {
    "bpm": {
      "type": "number",
      "maximum": 300,
      "minimum": 30,
      "description": "Known tempo in beats per minute. Used instead of the tap estimate when both are given."
    },
    "bars": {
      "type": "number",
      "default": 16,
      "description": "Number of bars to convert into seconds. Default 16.",
      "exclusiveMinimum": 0
    },
    "timestampsMs": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "minItems": 2,
      "description": "Tap times in ms from a monotonic clock (performance.now()), in order."
    },
    "timeSignature": {
      "enum": [
        "4/4",
        "3/4",
        "2/4",
        "6/8",
        "5/4",
        "7/8",
        "12/8"
      ],
      "type": "string",
      "default": "4/4",
      "description": "Time signature for the bar length. Default 4/4."
    }
  },
  "additionalProperties": false
}
estimate_tempo output schema
{
  "type": "object",
  "required": [
    "bpm",
    "quarterNoteMs",
    "tapAnalysis",
    "delaysMs",
    "timeSignature",
    "bars",
    "barsDurationSeconds",
    "referenceToolUrl"
  ],
  "properties": {
    "bpm": {
      "type": "number"
    },
    "bars": {
      "type": "number"
    },
    "delaysMs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "fraction",
          "beats",
          "straight",
          "dotted",
          "triplet"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "beats": {
            "type": "number"
          },
          "dotted": {
            "type": "number"
          },
          "triplet": {
            "type": "number"
          },
          "fraction": {
            "type": "string"
          },
          "straight": {
            "type": "number"
          }
        }
      }
    },
    "tapAnalysis": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "bpm",
            "taps",
            "intervalsUsed",
            "discarded",
            "spreadMs",
            "stability",
            "confidence"
          ],
          "properties": {
            "bpm": {
              "type": [
                "number",
                "null"
              ]
            },
            "taps": {
              "type": "integer"
            },
            "spreadMs": {
              "type": "number"
            },
            "discarded": {
              "type": "integer"
            },
            "stability": {
              "type": "number"
            },
            "confidence": {
              "enum": [
                "none",
                "low",
                "medium",
                "high"
              ],
              "type": "string"
            },
            "intervalsUsed": {
              "type": "integer"
            }
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "quarterNoteMs": {
      "type": "number"
    },
    "timeSignature": {
      "type": "string"
    },
    "referenceToolUrl": {
      "type": "string"
    },
    "barsDurationSeconds": {
      "type": "number"
    }
  }
}
estimate_tempo annotations
{
  "title": "Estimate tempo, delay times and bar lengths",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1134 ms
95th percentile latency
1134 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1134 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http prismposter-creator-tools-mcp https://www.prismposter.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add prismposter-creator-tools-mcp --url https://www.prismposter.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable prismposter-creator-tools-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "prismposter-creator-tools-mcp": {
      "url": "https://www.prismposter.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "prismposter-creator-tools-mcp": {
      "type": "streamableHttp",
      "url": "https://www.prismposter.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start prismposter-creator-tools-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "prismposter-creator-tools-mcp": {
      "type": "http",
      "url": "https://www.prismposter.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http prismposter-creator-tools-mcp https://www.prismposter.com/api/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "prismposter-creator-tools-mcp": {
      "url": "https://www.prismposter.com/api/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "prismposter-creator-tools-mcp": {
      "serverUrl": "https://www.prismposter.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like PrismPoster Creator Tools MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run PrismPoster Creator Tools MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing