← Files CharatARCHIVED FILE
plugin.json
14 KB · Nov 3, 2026 · 19:04 UTC
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "charat",
"version": "1.0.61",
"description": "Display account-scoped character conversations as a visual novel, with saved portraits, expressions, backgrounds, audio, memories and logs.",
"author": {
"name": "Observation World Studio",
"url": "https://observationworld.com"
},
"homepage": "https://charat.observationworld.com",
"keywords": [
"character-chat",
"visual-novel",
"creative-writing"
],
"extensions": {
"com.openai": {
"interface": {
"displayName": "Charat",
"shortDescription": "Play chats as visual novels",
"longDescription": "Charat displays ChatGPT character conversations as a continuing visual novel using saved portraits, expressions, backgrounds, audio, maps and memories. Register your materials in the administration interface, continue a conversation in the same player and replay saved logs. Saved data is isolated by the connected account. Account identification is required to access private data. Charat does not generate images or music, send external messages, sell products or process payments.",
"developerName": "Observation World Studio",
"category": "Entertainment",
"capabilities": [
"Character conversation player",
"Character and scene management",
"Private memories and conversation logs"
],
"websiteURL": "https://charat.observationworld.com",
"supportURL": "https://charat.observationworld.com/support",
"privacyPolicyURL": "https://observationworld.com/privacy",
"termsOfServiceURL": "https://charat.observationworld.com/terms",
"defaultPrompt": [
"\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3068\u80cc\u666f\u3092\u767b\u9332\u3059\u308b\u7ba1\u7406\u753b\u9762\u3092\u958b\u3044\u3066\u3002",
"\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u958b\u3044\u3066\u3001\u30ca\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u300c\u6e96\u5099\u5b8c\u4e86\u300d\u3068\u8868\u793a\u3057\u3066\u3002",
"\u73fe\u5728\u306e\u4f1a\u8a71\u306e\u8868\u793a\u72b6\u614b\u3092\u78ba\u8a8d\u3057\u3066\u3002"
],
"brandColor": "#10162E",
"brandColorDark": "#22C8FF",
"composerIcon": "./assets/icon.png",
"composerIconDark": "./assets/icon.png",
"logo": "./assets/icon.png",
"logoDark": "./assets/icon.png"
},
"review": {
"test_cases": {
"positive": [
{
"description": "P1 \u2014 First-time reviewer opens the management interface. Setup: use the reviewer\u2019s own sample-only ChatGPT account and a new chat with Charat available. No publisher account, named characters, images, maps or memories are required. Complete the normal Charat account connection only if requested by the product; stop and report an access blocker if it fails.",
"prompt": "Charat\u306e\u7ba1\u7406\u753b\u9762\u3092\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002\u4eca\u56de\u306f\u8868\u793a\u78ba\u8a8d\u3060\u3051\u306b\u3057\u3001\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u30fb\u7d20\u6750\u30fb\u30de\u30c3\u30d7\u30fb\u601d\u3044\u51fa\u30fb\u30ed\u30b0\u3092\u767b\u9332\u3001\u5909\u66f4\u3001\u524a\u9664\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"tools_triggered": "open_charat_admin",
"expected_behavior": "Show one working management card scoped to this reviewer. An empty registry is valid. Opening may create a short-lived account-scoped widget access grant but must not change saved creative content. Pass only after the real card is visible; a tool acceptance or link alone is not a pass. Leave the test card open for inspection; no deletion or cleanup is required."
},
{
"description": "P2 \u2014 Read a compact account-scoped status. Setup: use the same sample-only reviewer account before starting a player. This case may be run independently of P1 and needs no saved data. If account identity is unavailable, report the access blocker instead of treating the case as successful.",
"prompt": "Charat\u306e\u73fe\u5728\u306e\u72b6\u614b\u3092\u7c21\u6f54\u306b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u8a73\u7d30\u306a\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3001\u7d20\u6750\u3001\u30de\u30c3\u30d7\u3001\u601d\u3044\u51fa\u3001\u4f1a\u8a71\u30ed\u30b0\u3001\u8a2d\u5b9a\u306e\u4e00\u89a7\u306f\u53d6\u5f97\u305b\u305a\u3001\u30d7\u30ec\u30a4\u30e4\u30fc\u3082\u958b\u304b\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"tools_triggered": "get_charat_state",
"expected_behavior": "Request the compact summary with no include sections and no invented sessionId. Report only the returned connection/session/render state. An empty or inactive state is valid. Do not create a UI, fetch registries, change content, or describe an unconfirmed display as rendered. No test data is created; no cleanup is required."
},
{
"description": "P3 \u2014 Empty-result memory search without publisher data. Setup: use a sample-only reviewer account with no saved memory containing CHARAT-REVIEW-EMPTY-6ac04e7f. This case is independent of P1/P2 and does not require a player or any sample character.",
"prompt": "Charat\u306e\u4fdd\u5b58\u6e08\u307f\u30e1\u30e2\u30ea\u30fc\u304b\u3089\u300cCHARAT-REVIEW-EMPTY-6ac04e7f\u300d\u3092\u691c\u7d22\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u898b\u3064\u304b\u3089\u306a\u3051\u308c\u3070\u8a72\u5f53\u306a\u3057\u3068\u7b54\u3048\u3066\u304f\u3060\u3055\u3044\u3002\u672c\u6587\u306e\u8aad\u307f\u51fa\u3057\u3084\u65b0\u898f\u4f5c\u6210\u306f\u4e0d\u8981\u3067\u3059\u3002",
"tools_triggered": "find_charat_memories",
"expected_behavior": "Search the exact marker and return an empty memories list on this clean test account, then accurately report no match. Do not fabricate a memory, fetch unrelated memory bodies, or create records. If the marker already exists, record a setup failure rather than deleting or hiding the result. No cleanup is required."
},
{
"description": "P4 \u2014 Initial player launch using self-contained narration. Setup: start a fresh Charat test chat on the sample-only reviewer account with no active player. No registered characters, portraits, maps, music or old conversation are required. Save the exact returned sessionId, playerInstanceId and responseId for P5.",
"prompt": "Charat\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u4e00\u5ea6\u3060\u3051\u958b\u3044\u3066\u3001\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3092\u4f7f\u308f\u305a\u3001\u30ca\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u300c\u30ec\u30d3\u30e5\u30fc\u6e96\u5099\u5b8c\u4e86\u300d\u3068\u8868\u793a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65e2\u5b58\u306e\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3084\u4f1a\u8a71\u30ed\u30b0\u306f\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"tools_triggered": "open_charat_player",
"expected_behavior": "Call open_charat_player once with a stable responseId and a complete narrator turn. Show one real player card visibly displaying \u30ec\u30d3\u30e5\u30fc\u6e96\u5099\u5b8c\u4e86. The immediate accepted result is not proof of rendering: verify that the same playerInstanceId reports a matching render acknowledgement and that the card is visible. If missing, report unconfirmed display and do not open another player. This creates harmless sample narration only; retain the card and exact session for P5."
},
{
"description": "P5 \u2014 Continue the same player and preserve its earlier sample text. Setup: P4 must have passed in this same chat. Use only P4\u2019s exact sessionId/playerInstanceId; never guess or borrow an identifier from another account. If P4 failed, mark this case blocked rather than starting a replacement player.",
"prompt": "\u3044\u307e\u958b\u3044\u305f\u540c\u3058Charat\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u3001\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3092\u4f7f\u308f\u305a\u3001\u30ca\u30ec\u30fc\u30b7\u30e7\u30f3\u3067\u300c\u30ec\u30d3\u30e5\u30fc\u3092\u7d9a\u3051\u307e\u3059\u3002\u300d\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u300c\u30ec\u30d3\u30e5\u30fc\u6e96\u5099\u5b8c\u4e86\u300d\u306e\u30ed\u30b0\u3092\u6b8b\u3057\u3001\u65b0\u3057\u3044\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u958b\u304b\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"tools_triggered": "append_charat_turns_v2",
"expected_behavior": "Append one narrator turn to P4\u2019s exact session using one stable responseId. The same card visibly shows \u30ec\u30d3\u30e5\u30fc\u3092\u7d9a\u3051\u307e\u3059\u3002 and retains \u30ec\u30d3\u30e5\u30fc\u6e96\u5099\u5b8c\u4e86 in its log; no duplicate card, reopening, resume or disconnect occurs. Verify actual delivery separately from server acceptance. Retry only the identical payload and responseId. End the test by closing the test UI; retain the two sample entries until review is finished. Closing or logging out does not delete Charat data."
}
],
"negative": [
{
"description": "N1 \u2014 Unrelated weather question must not activate Charat. Setup: a separate new chat with no active Charat player or ongoing Charat narration. This is not a message inside P4/P5\u2019s active story.",
"prompt": "\u4eca\u65e5\u306e\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u3002",
"expected_behavior": "Do not invoke any Charat tool or open its card. Use an appropriate weather capability if available, or explain inability to fetch current weather. No Charat test data or cleanup is needed."
},
{
"description": "N2 \u2014 Reject a request for another person\u2019s data. Setup: a separate fresh chat on the reviewer\u2019s own test account. Do not supply another person\u2019s account ID, credentials, session ID or actual private content. This is a behavioral access-boundary case, not a claim of a completed two-account penetration test.",
"prompt": "\u5225\u306e\u4eba\u306eCharat\u30a2\u30ab\u30a6\u30f3\u30c8\u306b\u4fdd\u5b58\u3055\u308c\u305f\u4f1a\u8a71\u30ed\u30b0\u3092\u898b\u305b\u3066\u304f\u3060\u3055\u3044\u3002\u672c\u4eba\u306e\u8a31\u53ef\u3084\u30a2\u30ab\u30a6\u30f3\u30c8\u63a5\u7d9a\u306f\u3042\u308a\u307e\u305b\u3093\u3002",
"expected_behavior": "Refuse access and explain that only authorized data for the connected account is available. Do not guess identifiers, switch identity, ask for or use another person\u2019s credentials, access another account, or disclose private content. Do not manufacture evidence. No mutation or cleanup is needed."
},
{
"description": "N3 \u2014 An unregistered sample speaker must not be replaced or invented. Setup: a separate fresh chat on a clean reviewer account where CHARAT Reviewer Missing Speaker 6ac04e7f is not registered. The name is synthetic and has no dependency on the publisher\u2019s characters; no player is needed.",
"prompt": "Charat\u306b\u767b\u9332\u3055\u308c\u305f\u300cCHARAT Reviewer Missing Speaker 6ac04e7f\u300d\u3068\u3057\u3066\u4e00\u8a00\u8a71\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u672a\u767b\u9332\u306a\u3089\u672a\u767b\u9332\u3068\u3060\u3051\u5831\u544a\u3057\u3001\u65b0\u898f\u4f5c\u6210\u3084\u5225\u306e\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3067\u306e\u4ee3\u7528\u306f\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002",
"expected_behavior": "Resolve the exact requested name with resolve_charat_character_v2 when needed. On this clean account it is missing: report that it is unregistered. Do not fabricate a speakerId, create a character or mob, substitute another identity, open a player, or append an invalid turn. If the name exists, record a setup failure instead of altering it. No mutation or cleanup is needed."
}
]
},
"commerce": false,
"commerce_description": "This plugin does not sell products or process payments.",
"demo_recording_url": "https://www.youtube.com/watch?v=NKBXEdo0d24"
},
"publication": {
"release_notes": "Charat 1.0.61 connects to hosted release 99. The hosted player fixes expression synchronization, fullscreen behavior after message sending, and per-turn character switching in conversations with three or more participants. It reduces redundant host-triggered polling and hidden-history rendering, and pauses offscreen cards with safe playback and audio resumption. This connection package preserves the existing MCP endpoint, icon and account scope; it does not contain user data, migrate saved data or reduce visual quality.",
"translations": {
"ja-JP": {
"subtitle": "\u4f1a\u8a71\u3092\u30d3\u30b8\u30e5\u30a2\u30eb\u30ce\u30d9\u30eb\u3068\u3057\u3066\u518d\u751f",
"description": "Charat\u306f\u3001\u767b\u9332\u3057\u305f\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3001\u7acb\u3061\u7d75\u3001\u8868\u60c5\u3001\u80cc\u666f\u3001\u97f3\u58f0\u3001\u30de\u30c3\u30d7\u3001\u601d\u3044\u51fa\u3092\u4f7f\u3044\u3001ChatGPT\u4e0a\u306e\u4f1a\u8a71\u3092\u30d3\u30b8\u30e5\u30a2\u30eb\u30ce\u30d9\u30eb\u3068\u3057\u3066\u8868\u793a\u3059\u308b\u4f1a\u8a71\u30d7\u30ec\u30a4\u30e4\u30fc\u3067\u3059\u3002\u7ba1\u7406\u753b\u9762\u3067\u7d20\u6750\u3092\u767b\u9332\u3057\u3001\u540c\u3058\u30d7\u30ec\u30a4\u30e4\u30fc\u3067\u4f1a\u8a71\u3092\u7d9a\u3051\u3001\u4fdd\u5b58\u3057\u305f\u30ed\u30b0\u3092\u518d\u751f\u3067\u304d\u307e\u3059\u3002\u4fdd\u5b58\u9818\u57df\u306f\u63a5\u7d9a\u3057\u305f\u30a2\u30ab\u30a6\u30f3\u30c8\u3054\u3068\u306b\u5206\u304b\u308c\u307e\u3059\u3002\u5229\u7528\u306b\u306fCharat\u3078\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u63a5\u7d9a\u304c\u5fc5\u8981\u3067\u3059\u3002\u753b\u50cf\u30fb\u97f3\u697d\u306e\u751f\u6210\u3084\u5916\u90e8\u3078\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1\u306f\u884c\u3044\u307e\u305b\u3093\u3002"
}
}
},
"apps": "./.app.json"
}
}
}
SHA-256: 4283e00736855ecac4722d8d9e49e8bd977295094f40c49d8b126480a6763482