Skip to content

questportal/call-of-cthulhu-plugin

v0.4.3

Create and revise populated guest Call of Cthulhu 7e investigators, in batches up to 20, and roll dice with optional private sessions.

MCP servers

Declared configuration, as published in mcp.json. The directory shows indexed content; it never connects to or executes these servers.

cthulhu-sheetsstreamable-http
{
  "type": "streamable-http",
  "url": "https://cthulhu.questportal.com/mcp"
}

What this package declares

The files a client reads when it loads this plugin, exactly as this revision carries them.

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "call-of-cthulhu-plugin",
  "version": "0.4.3",
  "description": "Create and revise populated guest Call of Cthulhu 7e investigators, in batches up to 20, and roll dice with optional private sessions.",
  "author": {
    "name": "Quest Portal"
  },
  "extensions": {
    "com.openai": {
      "interface": {
        "displayName": "Call of Cthulhu",
        "shortDescription": "Your investigator dossier",
        "longDescription": "Create editable Call of Cthulhu 7th edition investigators with custom assigned stats, skills and backstories, individually or in batches of up to 20. Revise an explicitly attached current sheet while preserving unrelated fields. Custom builds are not verified rules-legal. The sheet distinguishes prepared payloads from loaded and locally saved drafts. Responsive layouts, roll/edit switching and light/dark preferences are included. Use Sheet tools for Attach, JSON backup and Settings. No account required; browser-local drafts have no cloud library or cross-device sync. Roll dice inline in supporting hosts without automatically changing resources. Optional private 24-hour sessions retain up to 1,000 rolls; dice monitoring requires an explicit subscription and compatible host. No rulebook retrieval or official Chaosium endorsement.",
        "developerName": "Quest Portal",
        "category": "Entertainment",
        "capabilities": [
          "Interactive",
          "Read",
          "Write"
        ],
        "logo": "./assets/icon.svg",
        "composerIcon": "./assets/icon.svg",
        "defaultPrompt": [
          "Open my Call of Cthulhu investigator sheets.",
          "Create five characters, each with different stats, skills, and backstory."
        ],
        "websiteURL": "https://cthulhu.questportal.com/about",
        "supportURL": "https://cthulhu.questportal.com/support",
        "privacyPolicyURL": "https://cthulhu.questportal.com/privacy",
        "termsOfServiceURL": "https://cthulhu.questportal.com/terms"
      },
      "review": {
        "test_cases": {
          "positive": [
            {
              "description": "Open the guest sheet in a host supporting its native UI. No account or existing investigator is required.",
              "prompt": "Open the Call of Cthulhu investigator sheet.",
              "tools_triggered": "open_sheet",
              "expected_behavior": "Call open_sheet with {}. Render the guest sheet without requesting login. Explain browser-local drafts and JSON backup without claiming a server library or that existing draft contents are visible to the assistant."
            },
            {
              "description": "Create a synthetic draft in a fresh guest view. Delete this browser-local test draft after review.",
              "prompt": "Create a new investigator named Morgan Vale for this test.",
              "tools_triggered": "create_investigator",
              "expected_behavior": "Call create_investigator with name=\"Morgan Vale\". Show an editable guest draft with that name. Describe its values as editable starting placeholders; do not claim occupation allocation, complete character generation, or cloud saving."
            },
            {
              "description": "Stateless percentile variation with an explicit value, hard difficulty and one bonus die. No session is connected.",
              "prompt": "My Spot Hidden is 60. Make a hard check with one bonus die.",
              "tools_triggered": "roll_check",
              "expected_behavior": "Call roll_check with value=60, difficulty=\"hard\", modifier=1 and a Spot Hidden label, without sessionToken. The result must be a percentile from 1 through 100, target 30, and two candidate rolls with the lower selected. Report the returned outcome and success accurately, show its card where supported, and do not spend luck or change the sheet."
            },
            {
              "description": "Stateless damage with a supplied damage bonus and visible arithmetic. No session is connected.",
              "prompt": "Roll 1d6+db damage with a damage bonus of 1d4.",
              "tools_triggered": "roll_damage",
              "expected_behavior": "Call roll_damage with formula=\"1d6+db\" and damageBonus=\"1d4\", without sessionToken. Return one d6 result and one d4 result, total 2 through 10 equal to their sum. Display the returned total and breakdown without applying damage to a character."
            },
            {
              "description": "First run the preceding damage prompt in the same conversation and retain the actual complete returned roll object. Then issue this prompt. Do not fabricate a fixture.",
              "prompt": "Show that exact damage result again without rolling any new dice.",
              "tools_triggered": "show_roll_result",
              "expected_behavior": "Call show_roll_result with the exact prior roll object. Preserve its ID, timestamp, dice, request, detail and total. Display the same result, without calling roll_damage or roll_check and without claiming another random result was generated."
            },
            {
              "description": "Unrun installed-host gate: populated single creation with synthetic data; remove the local test draft after review.",
              "prompt": "Create a custom 1920s archivist named Ada Wren with EDU 80, Library Use 70, Luck 45, a missing mentor, and distinct suitable remaining stats and backstory.",
              "tools_triggered": "create_investigator",
              "expected_behavior": "Send populated top-level profile, characteristics, resources, skills and backstory with a fresh requestId. Use canonical or supported short skill IDs. Label assigned values custom and not rules-verified. Inspect validation errors. Tool success means payload prepared; claim loaded or saved locally only with sheet receipt evidence. Do not stop at JSON in chat or claim cloud saving."
            },
            {
              "description": "Unrun installed-host gate: five populated characters, then an identical retry. Make a manual edit before replay; remove synthetic drafts after review.",
              "prompt": "Create five 1920s investigators: an archivist, dockworker, physician, journalist and mechanic, each with different stats, skills and backstory.",
              "tools_triggered": "create_investigators",
              "expected_behavior": "Use one requestId and five distinct investigator objects in stable array order, within the 20-member limit. Report each indexed result and custom-build status. Replay with identical requestId/inputs/order; sheet application must not duplicate characters or overwrite the intervening edit. Distinguish payload preparation, loading, local saving and already-applied receipts."
            },
            {
              "description": "Unrun installed-host gate: use a controlled batch fixture with a valid member and a second member whose skill is outside the schema bounds, then correct only that failed member. Do not rely on the model inventing malformed data during normal creation.",
              "prompt": "Retry the failed investigator in the original batch after correcting its invalid skill value; keep the already successful investigator unchanged.",
              "tools_triggered": "create_investigators",
              "expected_behavior": "Confirm the original per-index field error. Reuse the original requestId and array positions, leaving successful members identical and fixing only the failed member. Do not create a new batch of successful characters. Confirm no duplicate/overwritten successful draft and report per-member receipt status; do not mark failed members created."
            },
            {
              "description": "Unrun installed-host gate: first create a synthetic populated sheet and explicitly Attach its current full snapshot. After successful revision, test a stale snapshot against a newer manual edit.",
              "prompt": "In the investigator I just attached, increase Library Use to 75 and add that she trusts the mechanic; preserve everything else.",
              "tools_triggered": "revise_investigator",
              "expected_behavior": "Use the exact attached character, a fresh requestId and only intended changes. Preserve existing text when appending to a string field, and merge the skill by ID. Verify unrelated fields and current resources remain. An identical replay is already applied; a stale base must not overwrite newer edits. Ask for fresh Attach and a new requestId after a stale error. A prepared revision alone is not evidence of application or saving."
            }
          ],
          "negative": [
            {
              "description": "Fresh conversation without an attached draft or exported JSON. Explain that browser drafts on another device cannot be retrieved. Ask for exported JSON or explicit attachment. Do not invoke any plugin tool to search for, retrieve, or replace the missing investigator.",
              "prompt": "Retrieve the investigator I made on my other laptop and tell me their current sanity."
            },
            {
              "description": "No sheet is shared. Explain that automatic cloud saving and device synchronization are unavailable. Suggest local editing and JSON export/import; do not invoke plugin tools or claim to have synchronized anything.",
              "prompt": "Save my current investigator to my Quest Portal account and sync it to my phone."
            },
            {
              "description": "The plugin has no rulebook retrieval capability. Explain that limitation without invoking any plugin tools or claiming access to licensed book text.",
              "prompt": "Use the Call of Cthulhu plugin to retrieve the complete Keeper Rulebook chapter about sanity."
            },
            {
              "description": "No current attached snapshot or exported character is available. Request a fresh explicit attachment before revision; do not reconstruct the base from memory or claim browser access.",
              "prompt": "Use the investigator I mentioned yesterday and change her current sanity to 40."
            }
          ]
        },
        "commerce": false,
        "commerce_description": "This plugin involves no payments or purchases.",
        "demo_recording_url": "https://cthulhu.questportal.com/walkthrough.mp4"
      }
    }
  }
}

Client extensions

Data this package carries for particular clients. The directory lists the clients named and never reads what is addressed to them.

  • com.openai