Skip to main content
Glama
Txpple

fvtt-mcp-molten5e

by Txpple

manage-effect

Create, edit, delete, or list D&D 5e ActiveEffects on actors or items. Apply stat changes, resistances, or roll modifiers. Target by actor or item, set durations, and filter conditions to trigger effects in combat.

Instructions

[D&D 5e] Create / edit / delete / list ActiveEffects on an actor or an item. Effects carry changes ({key, value, type}) that modify the target — e.g. +1 AC ({key:"system.attributes.ac.bonus", value:"1", type:"add"}) or resist fire — or, with a dnd5e 6.0 RULES type, modify a ROLL: type "dnd5e.advantage" | "dnd5e.bonus" | "dnd5e.minimum" | "dnd5e.maximum" on key "attack" | "check" | "d20" | "save" (damage / healing: bonus only), e.g. +1d4 on History checks = {key:"check", value:"1d4", type:"dnd5e.bonus", conditions:{k:"roll.skill", v:"his"}}, disadvantage on STR d20 tests = {key:"d20", value:"-1", type:"dnd5e.advantage", conditions:{k:"roll.ability", v:"str"}}. 6.0 conditions (a Filter) gate the whole effect ("while Bloodied") or one change; duration.expiry takes the combat / rest / source-target turn events. Target the actor (actorIdentifier), an embedded item (actorIdentifier + itemIdentifier), or a world item (itemIdentifier alone). Use action="list" to find effectIds (it reads conditions + rules back). Item effects transfer to the owning actor by default. Authoring only — it sets effect data, it does not run combat.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoEffect name. Required (create); optional rename (edit).
patchNoEdit: extra dot-paths relative to the effect, e.g. {"duration.value": 10, "duration.units": "rounds"} or {"tint": "#ff0000"}. Changes live at "system.changes".
actionYescreate a new effect, edit/delete one by effectId, or list effects.
changesNoThe effect changes. On edit this REPLACES the whole changes list.
magicalNodnd5e 6.0: mark the effect as magical (e.g. a magic-item or spell effect).
disabledNoWhether the effect is disabled (inactive).
durationNoEffect duration ({value, units, expiry?}); omit for a permanent/passive effect.
effectIdNoEffect id — required for edit/delete. Get it from action "list".
statusesNoStatus/condition ids this effect confers (e.g. ["prone"]).
transferNoItem effects: whether the effect transfers to the owning actor. Default true for items.
conditionsNoEffect-level Filter — the WHOLE effect is suppressed while it is false, e.g. {k:"statuses.bloodied", v:1} ("while Bloodied") or, on an enchantment, {o:"OR", v:[{k:"item.type.value", o:"in", v:["simpleR","martialR"]}, {k:"item.properties", o:"has", v:"thr"}]}. roll.* keys are NOT available here (use a change condition). On edit, pass null / {} to clear.
descriptionNoEffect description (HTML).
itemIdentifierNoItem to target: embedded on the actor (with actorIdentifier) or a world item (alone). Omit to target the actor itself.
actorIdentifierNoActor that owns the effects (or owns the item when itemIdentifier is also set). Also accepts a placed TOKEN id (from list-tokens) — the effect then lands on that token INSTANCE's own delta, not the base actor.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changedv2.1.3
    • addedInput schema / properties / changes / items / properties / conditions
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "items": {
      +        "additionalProperties": {},
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Per-change Filter — this change applies only while it holds. roll.* keys work ONLY on a RULES-type change (dnd5e.advantage / bonus / minimum / maximum), the only changes evaluated at roll time: roll.ability, roll.skill, roll.type, roll.attack.type / .mode / .classification, roll.damage.type, roll.proficient, roll.tool …, e.g. {k:\"roll.attack.type\", v:\"ranged\"}. A core-type change is evaluated at data preparation, where there is no roll data."
      +}
    • changedInput schema / properties / changes / items / properties / key / description
      Previous value: -"Data path to modify, e.g. \"system.attributes.ac.bonus\" or \"system.traits.dr.value\"."New value: +"Data path to modify, e.g. \"system.attributes.ac.bonus\" or \"system.traits.dr.value\" — OR, for a dnd5e.* rules type, a roll CATEGORY: attack | check | d20 | save | damage | healing (damage/healing take dnd5e.bonus only)."
    • addedInput schema / properties / changes / items / properties / phase
      Added value: +{
      +  "description": "When the change applies during data preparation: \"initial\" (the default, before derived data) or \"final\" (after).",
      +  "enum": [
      +    "initial",
      +    "final"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / changes / items / properties / priority
      Added value: +{
      +  "description": "Application order (lower first). Omit for the default.",
      +  "type": "number"
      +}
    • addedInput schema / properties / changes / items / properties / replacement
      Added value: +{
      +  "description": "Substitute @attribute strings in the value with static data from the ORIGIN actor (the one applying the effect) or the TARGET actor, instead of evaluating them live. Omit = evaluate live.",
      +  "enum": [
      +    "origin",
      +    "target"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / changes / items / properties / type / description
      Previous value: -"How the value is applied. Default \"add\"."New value: +"How the value is applied. Core (CONST.ACTIVE_EFFECT_CHANGE_TYPES): add / subtract / multiply / override / upgrade / downgrade / custom on a data path. dnd5e 6.0 RULES (evaluated at roll time, key = a roll category): dnd5e.advantage, dnd5e.bonus, dnd5e.minimum, dnd5e.maximum. Default \"add\"."
    • changedInput schema / properties / changes / items / properties / type / enum
      Previous value: -[
      -  "add",
      -  "multiply",
      -  "override",
      -  "upgrade",
      -  "downgrade",
      -  "custom"
      -]New value: +[
      +  "add",
      +  "subtract",
      +  "multiply",
      +  "override",
      +  "upgrade",
      +  "downgrade",
      +  "custom",
      +  "dnd5e.advantage",
      +  "dnd5e.bonus",
      +  "dnd5e.maximum",
      +  "dnd5e.minimum"
      +]
    • changedInput schema / properties / changes / items / properties / value / description
      Previous value: -"The change value (stored as a string; e.g. \"2\", \"fire\")."New value: +"The change value (stored as a string; e.g. \"2\", \"fire\"). Rules: dnd5e.bonus = \"1d4\" / \"2\" / \"@prof\" / \"1d4[fire]\"; dnd5e.advantage = +1 -1 =+1 =-1 >=0 <=0 (+1 add advantage, -1 add disadvantage, =+1/=-1 force, >=0 ignore disadvantage, <=0 ignore advantage); dnd5e.minimum / maximum = a deterministic formula (\"10\", \"@prof\") — the d20 floor / ceiling."
    • addedInput schema / properties / conditions
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "additionalProperties": {},
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      ],
      +      "description": "A Filter: {k: \"<roll-data path>\", v: <value>, o?: \"<comparison>\"} (exact when o is omitted; comparisons: in has hasany hasall contains icontains startswith endswith empty gt gte lt lte subsetof), an operator {o: \"AND\"|\"OR\"|\"NAND\"|\"NOR\"|\"XOR\", v: [filters]} / {o: \"NOT\", v: filter}, or a bare array (AND). Examples: {k:\"statuses.bloodied\", v:1} · {k:\"item.properties\", o:\"has\", v:\"thr\"} · {k:\"roll.ability\", v:\"str\"} (roll.* keys only on a CHANGE). Also accepts the JSON string."
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Effect-level Filter — the WHOLE effect is suppressed while it is false, e.g. {k:\"statuses.bloodied\", v:1} (\"while Bloodied\") or, on an enchantment, {o:\"OR\", v:[{k:\"item.type.value\", o:\"in\", v:[\"simpleR\",\"martialR\"]}, {k:\"item.properties\", o:\"has\", v:\"thr\"}]}. roll.* keys are NOT available here (use a change condition). On edit, pass null / {} to clear."
      +}
    • addedInput schema / properties / duration
      Added value: +{
      +  "description": "Effect duration ({value, units, expiry?}); omit for a permanent/passive effect.",
      +  "properties": {
      +    "expiry": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "combatStart",
      +            "roundStart",
      +            "turnStart",
      +            "combatEnd",
      +            "roundEnd",
      +            "turnEnd",
      +            "shortRest",
      +            "longRest",
      +            "sourceStart",
      +            "sourceEnd",
      +            "targetStart",
      +            "targetEnd"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "When the effect lapses. Core combat events (combatStart roundStart turnStart combatEnd roundEnd turnEnd): with NO value the effect expires at the FIRST matching event; with a value+units, at the first matching event after the value elapses. The dnd5e events are duration-less and take no value: shortRest / longRest, and the source/target turn pseudo-expiries: \"until the end of the target's next turn\" = targetEnd, \"until the start of your next turn\" = sourceStart. Omit for the default; null clears."
      +    },
      +    "rounds": {
      +      "description": "DEPRECATED 5.x alias for value + units \"rounds\".",
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "seconds": {
      +      "description": "DEPRECATED 5.x alias for value + units \"seconds\".",
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "turns": {
      +      "description": "DEPRECATED 5.x alias for value + units \"turns\".",
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "units": {
      +      "description": "Foundry v14 duration units (CONST.ACTIVE_EFFECT_DURATION_UNITS; rounds/turns count in combat).",
      +      "enum": [
      +        "seconds",
      +        "minutes",
      +        "hours",
      +        "days",
      +        "months",
      +        "years",
      +        "rounds",
      +        "turns"
      +      ],
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "How long, in `units`.",
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / magical
      Added value: +{
      +  "description": "dnd5e 6.0: mark the effect as magical (e.g. a magic-item or spell effect).",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / patch / description
      Previous value: -"Edit: extra dot-paths relative to the effect, e.g. {\"duration.rounds\": 10}."New value: +"Edit: extra dot-paths relative to the effect, e.g. {\"duration.value\": 10, \"duration.units\": \"rounds\"} or {\"tint\": \"#ff0000\"}. Changes live at \"system.changes\"."
  2. Changed1 schema field changedv1.3.0
    • changedInput schema / properties / actorIdentifier / description
      Previous value: -"Actor that owns the effects (or owns the item when itemIdentifier is also set)."New value: +"Actor that owns the effects (or owns the item when itemIdentifier is also set). Also accepts a placed TOKEN id (from list-tokens) — the effect then lands on that token INSTANCE's own delta, not the base actor."
  3. First observedv1.2.2

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden entirely. It discloses key mutation semantics: it sets effect data but doesn't run combat, changes list is entirely replaced on edit, item effects transfer by default, and token support lands on token instance delta rather than base actor. It also explains the duration expiration behavior and the boundaries of conditions (roll.* keys only on change-level). The only minor omissions are permission requirements and rollback semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but justified given the tool's complexity; it front-loads the core purpose and main change examples before diving into parameter-specific details. Every section (targets, list for effectIds, transfer default, authoring-only) earns its place, and density is high with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter tool with nested objects and no output schema, this description is exceptionally complete. It covers action handling, targeting (actor, item, token), duration behavior, condition evaluation timing, and effect types. It even preempts common pitfalls like deprecated aliases and replacement semantics. The absence of explicit caveats about permission requirements is minor given the depth elsewhere.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds extensive semantic value: it explains the difference between core types and dnd5e rules types, clarifies value formats for advantage (e.g., +1/-1), disambiguates expiry semantics (no value vs value+units), and provides concrete filter examples. It also warns about deprecated aliases and substitutes static data for @attributes in replacement. This goes far beyond what the schema says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb set (create/edit/delete/list) and clear targets (actor or item), and distinguishes supported effect types (core data-path changes vs dnd5e 6.0 roll rules). It goes beyond a generic statement by naming concrete examples and clarifying that it is authoring-only, not for running combat, which further separates it from siblings like manage-activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use list to get effectIds, how to target different entities (actor, embedded item, world item), and clarifies that item effects transfer by default. It does not explicitly name alternatives or when not to use this tool, but its scope is substantial and self-contained; the clear targeting and list guidance provide strong usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools