Tapercraft — VHS Label Maker

Compose printable VHS, DVD, cassette, CD and vinyl packaging from any movie, show, or album.

Sollte ich dies verwenden

Qualität und Sicherheit

A
Qualität der Beschreibung
100%
Vollständigkeit des Schemas
83%
Qualität der Benennung
97%
Risiko der Vergiftung
60%
Übereinstimmung der Berechtigungen
100%
Einhaltung des Protokolls
100%

Befunde (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin upload_image
  • MEDIUMTool description contains URL to non-standard domainin get_account

Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.

Kontextkosten

~3,717Tokens (Tool-Definitionen)
~2.9 KBTypische Antwortgröße
Erhebliche Auswirkung auf die Aufmerksamkeit (2.90% von 128k Kontext)

Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.

Installieren

Installation mit einem Klick

Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:

{
  "mcpServers": {
    "tapercraft": {
      "url": "https://vhs.texs.org/mcp"
    }
  }
}

Remote-Endpunkte

https://vhs.texs.org/mcpstreamable-http

Was es kann

Tool-Inventar

Tools (12)

🟢 Nur lesen🟡 Schreiben🔴 Löschen⚪ Unbekannt
🟢list_formats

List the packaging formats that can be composed, with their printed dimensions. Call this first if you are unsure which format the user wants.

Eingabe-Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟢describe_format(format)

One format in detail: the printed sheet in px and inches at export DPI, every panel (front, spine, back, flaps…) as a rectangle with its pixel size, and which intent sections the format accepts. Call this BEFORE generating artwork for a format so each image is made at the right size and aspect.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "format": {
      "type": "string",
      "enum": [
        "slipcover",
        "side-load-vhs",
        "doublevhs",
        "betamax",
        "compact-tape",
        "bluray-cover",
        "bluray-slipcover",
        "dvd-cover",
        "steelcase",
        "clamshell",
        "polycase",
        "cardbox",
        "disc",
        "cassette",
        "cassingle",
        "jcard",
        "cd",
        "cd-tray",
        "cd-insert",
        "vinyl-label",
        "vinyl-jacket",
        "vinyl-sleeve",
        "minidisc-label",
        "minidisc-full-labels",
        "minidisc-jcard",
        "minidisc-cover",
        "minidisc-tray"
      ],
      "description": "A slug from list_formats"
    }
  },
  "required": [
    "format"
  ],
  "additionalProperties": false
}
🟢search_content(type, query)

Look up a movie, TV show, or music album by title and return candidate matches with years. Use when the user's title is ambiguous and you want to confirm which one they mean before composing.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "movie",
        "tv",
        "album"
      ],
      "description": "movie, tv, or album"
    },
    "query": {
      "type": "string",
      "description": "Title to search for, e.g. \"Predator 1987\" or \"Michael Jackson Thriller\""
    }
  },
  "required": [
    "type",
    "query"
  ],
  "additionalProperties": false
}
🟡compose_design(format, content, text, style, layout, ...)

Build a label design and return a URL the user opens to finish it. Designing and previewing are free; exporting a print-ready file requires a membership, so present the URL as a starting point the user completes in their browser. Fields listed in the response as "unsupported" were NOT applied — tell the user rather than reporting them as done. The user's own artwork goes in through `images` (upload it first with upload_image; needs an API key): `images.background` covers the whole sheet, `images.panels.<key>` one panel each (keys from describe_format), `images.logo` a custom studio logo. Without a key, compose from format + content and tell the user to drag images in after opening the URL.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "format": {
      "type": "string",
      "enum": [
        "slipcover",
        "side-load-vhs",
        "doublevhs",
        "betamax",
        "compact-tape",
        "bluray-cover",
        "bluray-slipcover",
        "dvd-cover",
        "steelcase",
        "clamshell",
        "polycase",
        "cardbox",
        "disc",
        "cassette",
        "cassingle",
        "jcard",
        "cd",
        "cd-tray",
        "cd-insert",
        "vinyl-label",
        "vinyl-jacket",
        "vinyl-sleeve",
        "minidisc-label",
        "minidisc-full-labels",
        "minidisc-jcard",
        "minidisc-cover",
        "minidisc-tray"
      ],
      "description": "Which packaging format"
    },
    "content": {
      "type": "object",
      "description": "What the design is of. Provide a query, or an id from search_content. Video formats take movie/tv; audio formats (cassette, jcard, cd*, vinyl*, minidisc*) take album. For audio, the album alone builds the complete design — cover art, tracklist sides, QR code — and style.font / labelColor / background restyle it.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "movie",
            "tv",
            "album"
          ]
        },
        "query": {
          "type": "string"
        },
        "id": {
          "type": "string",
          "description": "TMDB id (movie/tv) or iTunes collection id (album), if already known"
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    "text": {
      "type": "object",
      "description": "Overrides for the fetched metadata (video formats only — on audio formats these come back as unsupported). Omit a field to keep the provider value.",
      "properties": {
        "title": {
          "type": "string"
        },
        "tagline": {
          "type": "string"
        },
        "overview": {
          "type": "string"
        },
        "year": {
          "type": "string"
        },
        "runtime": {
          "type": "string"
        },
        "rating": {
          "type": "string"
        },
        "starring": {
          "type": "string"
        },
        "director": {
          "type": "string"
        },
        "writers": {
          "type": "string"
        },
        "composer": {
          "type": "string"
        },
        "producer": {
          "type": "string"
        },
        "budget": {
          "type": "string"
        },
        "revenue": {
          "type": "string"
        },
        "seasonEpisode": {
          "type": "string"
        },
        "origin": {
          "type": "string"
        },
        "texsOrg": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "style": {
      "type": "object",
      "properties": {
        "font": {
          "type": "string",
          "description": "Font family for the whole design (on audio formats, every text section). Curated: Futura, Arial, Times New Roman, Impact, Courier New, Roboto Flex, Bebas Neue, League Gothic, Sofia Sans Extra Condensed, Nunito Sans, Stint Ultra Condensed, EB Garamond…"
        },
        "labelColor": {
          "type": "string",
          "description": "Label / text color, 6-digit hex, e.g. #e8dcc0"
        },
        "background": {
          "type": "object",
          "properties": {
            "color": {
              "type": "string",
              "description": "6-digit hex"
            }
          },
          "additionalProperties": false
        },
        "useLogo": {
          "type": "boolean",
          "description": "true paints the provider's logo artwork for the title; false renders your title as text. Defaults to false when you set text.title, so a title you set is visible."
        },
        "finish": {
          "type": "string",
          "enum": [
            "worn",
            "clean",
            "plain"
          ],
          "description": "'worn' (default) fills the back panel with the title's stills and adds a worn-paper texture; 'clean' is stills without the texture; 'plain' skips both. Video formats and jcard only (on jcard 'worn' is the texture alone); other audio formats report it as unsupported."
        }
      },
      "additionalProperties": false
    },
    "layout": {
      "type": "object",
      "properties": {
        "hide": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "rating",
              "texsOrg",
              "overview",
              "labelOverview",
              "fbiWarning",
              "rules",
              "pullquote",
              "pullquoteCredit",
              "spineMeta",
              "barcode",
              "qrCode",
              "spineLogo",
              "title",
              "tagline",
              "year",
              "origin",
              "runtime",
              "starring",
              "director",
              "budget",
              "revenue",
              "movieId",
              "seasonEpisode",
              "writers",
              "composer",
              "producer",
              "productionLogos"
            ]
          },
          "description": "Fields to hide on the design"
        }
      },
      "additionalProperties": false
    },
    "images": {
      "type": "object",
      "description": "The user's own artwork by upload ref (from upload_image). Needs the API key that owns the uploads. Single-surface formats only (describe_format → singleSurface). Each value is a ref string or { ref, fit, opacity }.",
      "properties": {
        "background": {
          "description": "One image over the whole sheet (all panels).",
          "oneOf": [
            {
              "type": "string",
              "pattern": "^upload:"
            },
            {
              "type": "object",
              "properties": {
                "ref": {
                  "type": "string"
                },
                "fit": {
                  "type": "string",
                  "enum": [
                    "fit",
                    "fill",
                    "stretch"
                  ]
                },
                "opacity": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                }
              },
              "required": [
                "ref"
              ],
              "additionalProperties": false
            }
          ]
        },
        "logo": {
          "type": "string",
          "pattern": "^upload:",
          "description": "A custom studio / production logo (video formats). It replaces the title's own studio logos on the spine and back panel. Upload a transparent PNG."
        },
        "panels": {
          "type": "object",
          "description": "Per-panel images keyed by the panel key describe_format reports (e.g. front, back, spine1). Unknown keys come back as unsupported.",
          "additionalProperties": {
            "oneOf": [
              {
                "type": "string",
                "pattern": "^upload:"
              },
              {
                "type": "object",
                "properties": {
                  "ref": {
                    "type": "string"
                  },
                  "fit": {
                    "type": "string",
                    "enum": [
                      "fit",
                      "fill",
                      "stretch"
                    ]
                  },
                  "opacity": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  }
                },
                "required": [
                  "ref"
                ],
                "additionalProperties": false
              }
            ]
          }
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "format"
  ],
  "additionalProperties": false
}
🟡upload_image(data, mimeType, name)

Put an image into the user's Uploads library ("Your Uploads" in every picker) and get back a ref for compose_design's images.* fields. Needs an API key with design:write. Send the file as base64 (JPEG/PNG/WebP preferred, at the panel size describe_format reports; keep it under 3 MB — bigger files go through POST https://vhs.texs.org/api/v1/uploads as multipart). Identical bytes already in the library return the existing item instead of a copy.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "data": {
      "type": "string",
      "description": "Base64 of the image bytes (no data: prefix needed; one is tolerated)"
    },
    "mimeType": {
      "type": "string",
      "enum": [
        "image/jpeg",
        "image/jpg",
        "image/png",
        "image/webp",
        "image/gif",
        "image/avif",
        "image/heic",
        "image/heif",
        "image/bmp",
        "image/tiff"
      ],
      "description": "e.g. image/png"
    },
    "name": {
      "type": "string",
      "description": "A filename or label shown in the library, e.g. \"predator-front.png\""
    }
  },
  "required": [
    "data",
    "mimeType"
  ],
  "additionalProperties": false
}
🔴save_design(format, content, text, style, layout, ...)

Save a design straight to the user's dashboard and return its link. Takes the SAME fields as compose_design plus a name; needs an API key with design:write. Use it when the user wants the design kept on their account without opening a link first. Images are copied into the design (safe to delete from the library afterwards). The preview thumbnail and the frozen content snapshot are captured the first time the owner opens and saves it in the browser — say so.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "format": {
      "type": "string",
      "enum": [
        "slipcover",
        "side-load-vhs",
        "doublevhs",
        "betamax",
        "compact-tape",
        "bluray-cover",
        "bluray-slipcover",
        "dvd-cover",
        "steelcase",
        "clamshell",
        "polycase",
        "cardbox",
        "disc",
        "cassette",
        "cassingle",
        "jcard",
        "cd",
        "cd-tray",
        "cd-insert",
        "vinyl-label",
        "vinyl-jacket",
        "vinyl-sleeve",
        "minidisc-label",
        "minidisc-full-labels",
        "minidisc-jcard",
        "minidisc-cover",
        "minidisc-tray"
      ],
      "description": "Which packaging format"
    },
    "content": {
      "type": "object",
      "description": "What the design is of. Provide a query, or an id from search_content. Video formats take movie/tv; audio formats (cassette, jcard, cd*, vinyl*, minidisc*) take album. For audio, the album alone builds the complete design — cover art, tracklist sides, QR code — and style.font / labelColor / background restyle it.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "movie",
            "tv",
            "album"
          ]
        },
        "query": {
          "type": "string"
        },
        "id": {
          "type": "string",
          "description": "TMDB id (movie/tv) or iTunes collection id (album), if already known"
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    "text": {
      "type": "object",
      "description": "Overrides for the fetched metadata (video formats only — on audio formats these come back as unsupported). Omit a field to keep the provider value.",
      "properties": {
        "title": {
          "type": "string"
        },
        "tagline": {
          "type": "string"
        },
        "overview": {
          "type": "string"
        },
        "year": {
          "type": "string"
        },
        "runtime": {
          "type": "string"
        },
        "rating": {
          "type": "string"
        },
        "starring": {
          "type": "string"
        },
        "director": {
          "type": "string"
        },
        "writers": {
          "type": "string"
        },
        "composer": {
          "type": "string"
        },
        "producer": {
          "type": "string"
        },
        "budget": {
          "type": "string"
        },
        "revenue": {
          "type": "string"
        },
        "seasonEpisode": {
          "type": "string"
        },
        "origin": {
          "type": "string"
        },
        "texsOrg": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "style": {
      "type": "object",
      "properties": {
        "font": {
          "type": "string",
          "description": "Font family for the whole design (on audio formats, every text section). Curated: Futura, Arial, Times New Roman, Impact, Courier New, Roboto Flex, Bebas Neue, League Gothic, Sofia Sans Extra Condensed, Nunito Sans, Stint Ultra Condensed, EB Garamond…"
        },
        "labelColor": {
          "type": "string",
          "description": "Label / text color, 6-digit hex, e.g. #e8dcc0"
        },
        "background": {
          "type": "object",
          "properties": {
            "color": {
              "type": "string",
              "description": "6-digit hex"
            }
          },
          "additionalProperties": false
        },
        "useLogo": {
          "type": "boolean",
          "description": "true paints the provider's logo artwork for the title; false renders your title as text. Defaults to false when you set text.title, so a title you set is visible."
        },
        "finish": {
          "type": "string",
          "enum": [
            "worn",
            "clean",
            "plain"
          ],
          "description": "'worn' (default) fills the back panel with the title's stills and adds a worn-paper texture; 'clean' is stills without the texture; 'plain' skips both. Video formats and jcard only (on jcard 'worn' is the texture alone); other audio formats report it as unsupported."
        }
      },
      "additionalProperties": false
    },
    "layout": {
      "type": "object",
      "properties": {
        "hide": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "rating",
              "texsOrg",
              "overview",
              "labelOverview",
              "fbiWarning",
              "rules",
              "pullquote",
              "pullquoteCredit",
              "spineMeta",
              "barcode",
              "qrCode",
              "spineLogo",
              "title",
              "tagline",
              "year",
              "origin",
              "runtime",
              "starring",
              "director",
              "budget",
              "revenue",
              "movieId",
              "seasonEpisode",
              "writers",
              "composer",
              "producer",
              "productionLogos"
            ]
          },
          "description": "Fields to hide on the design"
        }
      },
      "additionalProperties": false
    },
    "images": {
      "type": "object",
      "description": "The user's own artwork by upload ref (from upload_image). Needs the API key that owns the uploads. Single-surface formats only (describe_format → singleSurface). Each value is a ref string or { ref, fit, opacity }.",
      "properties": {
        "background": {
          "description": "One image over the whole sheet (all panels).",
          "oneOf": [
            {
              "type": "string",
              "pattern": "^upload:"
            },
            {
              "type": "object",
              "properties": {
                "ref": {
                  "type": "string"
                },
                "fit": {
                  "type": "string",
                  "enum": [
                    "fit",
                    "fill",
                    "stretch"
                  ]
                },
                "opacity": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                }
              },
              "required": [
                "ref"
              ],
              "additionalProperties": false
            }
          ]
        },
        "logo": {
          "type": "string",
          "pattern": "^upload:",
          "description": "A custom studio / production logo (video formats). It replaces the title's own studio logos on the spine and back panel. Upload a transparent PNG."
        },
        "panels": {
          "type": "object",
          "description": "Per-panel images keyed by the panel key describe_format reports (e.g. front, back, spine1). Unknown keys come back as unsupported.",
          "additionalProperties": {
            "oneOf": [
              {
                "type": "string",
                "pattern": "^upload:"
              },
              {
                "type": "object",
                "properties": {
                  "ref": {
                    "type": "string"
                  },
                  "fit": {
                    "type": "string",
                    "enum": [
                      "fit",
                      "fill",
                      "stretch"
                    ]
                  },
                  "opacity": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  }
                },
                "required": [
                  "ref"
                ],
                "additionalProperties": false
              }
            ]
          }
        }
      },
      "additionalProperties": false
    },
    "name": {
      "type": "string",
      "description": "Design name shown on the dashboard (max 120 chars)"
    }
  },
  "required": [
    "format"
  ],
  "additionalProperties": false
}
🟢list_designs(limit)

The user's saved designs, newest first, with their links. Needs an API key with read.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "Default 25"
    }
  },
  "additionalProperties": false
}
🟢get_design(designId)

One saved design by id: name, format, link and its raw design params. Needs an API key with read.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "designId": {
      "type": "string",
      "description": "From list_designs or save_design"
    }
  },
  "required": [
    "designId"
  ],
  "additionalProperties": false
}
🔴delete_design(designId)

Delete one of the user's saved designs (and the image copies it owns). Irreversible — confirm with the user first. Needs an API key with design:write.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "designId": {
      "type": "string"
    }
  },
  "required": [
    "designId"
  ],
  "additionalProperties": false
}
🟢export_design(designId, output)

Render a saved design to a print file (members only). Queues a job — the file is produced by a headless renderer in ~15–60 s — and returns a jobId; poll get_export for the download link. output 'png' is the Original full-resolution PNG (600 DPI), 'pdf' its design-size PDF. Needs an API key with export on a membership account.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "designId": {
      "type": "string",
      "description": "From save_design or list_designs"
    },
    "output": {
      "type": "string",
      "enum": [
        "png",
        "pdf"
      ],
      "description": "'png' (default) or 'pdf'"
    }
  },
  "required": [
    "designId"
  ],
  "additionalProperties": false
}
🟢get_export(jobId)

Status of an export job from export_design. When status is done, `file.url` is a download link valid for an hour.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string"
    }
  },
  "required": [
    "jobId"
  ],
  "additionalProperties": false
}
🟡get_account

Who the API key belongs to: membership tier, today's remaining agent quotas, saved-design and upload-library counts. Needs an API key (Authorization: Bearer tc_live_…, created at https://vhs.texs.org/en/dashboard?tab=settings). Call it once to confirm the key works before uploading or saving.

Eingabe-Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Community

Diesen Server bewerten

Nachweis

Aktuelle Beobachtungen

verifiziertVersion nicht aufgezeichnet12 Tools
verifiziertVersion nicht aufgezeichnet3 Tools