A SillyTavern extension that let you create/play interactive character cards. Do you want to ask a question before starting the scenario? Like the character traits, starting location, etc. You can do it here.
Install via the SillyTavern extension installer.
https://github.com/bmen25124/SillyTavern-Custom-Scenario
Click the puzzle icon on the character create/edit sidebar.
![]()
Fill out the form.

Open script accordion and test it with the preview button

Export it.
Click the play icon on the characters sidebar and select the JSON/PNG file.
![]()
Fill inputs.

Created card

Check rentry page(half NSFW) for examples. You can import on Create Dialog to see how scripts are working.
You can write basic JavaScript to manipulate variables. For example:
If your description is:
{{user}} just received a package with a gift from an unknown sender. The package is labeled as containing {{gift}}.
You also received a card with the following message: {{occasionMessage}}
Assume this was the answer to the question:
gift: "a book"
message: "birthday"
# As you see, there is no `occasionMessage`
You can write a script for setting occasionMessage
variables.occasionMessage = `Happy {{message}}! Enjoy your new {{gift}}`;
Or:
variables.occasionMessage = `Happy ${variables.message}! Enjoy your new ${variables.gift}`;
Or:
variables.occasionMessage = "Happy " + variables.message + "! Enjoy your new " + variables.gift;
Output will be:
{{user}} just received a package with a gift from an unknown sender. The package is labeled as containing a book.
You also received a card with the following message: Happy birthday! Enjoy your new book
variables is an object that holds all the variables. Aka the answers to the questions.gift)variables.giftvariables.gift.value and variables.gift.label. When creating the card, variables.gift.label is used.variables.gift. (boolean)Show Script is a script that decides whether to show the question or not in the play dialog. Example: return variables.gift === "birthday" will show the question only if the answer is "birthday".{{variable}} but in the created card, they are not shown.await world.getFirst({name?: string, keyword: string}). Example usage:const info = await world.getFirst({keyword: "triggerWord"}); // name is optional, default name is character lorebook
if (info) {
variables.f_companion_content = info.content;
}
await world.getAll({name?: string, keyword: string}). Example usage:const infos = await world.getAll({keyword: "triggerWord"}); // name is optional, default name is character lorebook
if (infos && infos.length > 0) {
variables.f_companion_content = infos[0].content;
}
I saw this on AIDungeon and liked it. You can see in this reddit post with an example.
It is because of UI, not functionality.
Import Tags dialog for each play. So I'm planning to add a extension setting to enable/disable this.$ claude mcp add SillyTavern-Custom-Scenario \
-- python -m otcore.mcp_server <graph>