# Dunjn's 47 MCP tools and 6 prompts

> The exact list of what Dunjn's MCP server exposes to your AI: 19 read tools, 28 write tools, 6 prompts. Generated from the server code.

Source: https://dunjn.io/en/docs/mcp-tools-and-prompts/

Dunjn's MCP server (`https://app.dunjn.io/api/mcp/v1`) exposes 47 tools to your AI: 19 for reading and 28 for writing, all prefixed with dunjn_. On top of them, 6 prompts give the assistant a role. This page is generated from the server code: it describes exactly what tools/list returns.

The descriptions below are the ones the server sends to the model. They are in French and reproduced as is.

## Read tools (19)

### `dunjn_analyze_encounter`

Analyse l'équilibrage d'une rencontre existante selon le système de la campagne (XP/FP en D&D 5e, Points de Bataille en Daggerheart). Retourne la difficulté et des recommandations.

Parameters:

- `encounterId` (string, required): ID de la rencontre à analyser

### `dunjn_get_asset`

Récupère les métadonnées d'un asset + une URL signée R2 (10 min TTL) pour le télécharger. Inclut name, type, mimeType, fileSize, entityId.

Parameters:

- `assetId` (string, required)
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_get_campaign`

Récupère les métadonnées d'une campagne : nom, game system, tags disponibles, compteurs entités/sessions/world notes, calendrier in-game.

Parameters:

- `campaignId` (string, required): ID de la campagne (cuid)

### `dunjn_get_campaign_index`

Table des matières compacte de la campagne : entités (groupées par type), sessions et notes du monde, chacune avec son id mais SANS contenu. Point d'entrée recommandé pour explorer une campagne sans coût (mana-free) : lis l'index puis ouvre les pages voulues via get_entity_full / get_session / get_world_note.

Parameters:

- `campaignId` (string, optional): ID de la campagne (optionnel si une campagne est active)

### `dunjn_get_entity_full`

Récupère une entité complète AVEC ses relations entrantes ET sortantes (complémente read_entity qui n'expose pas les relations).

Parameters:

- `entityId` (string, required): ID de l'entité
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_get_roll_table`

Affiche une table de jet complète : ses entrées avec leur plage de tirage calculée (ex : 01–25). L'ID provient du contexte ou de list_roll_tables.

Parameters:

- `tableId` (string, required): ID de la table de jet

### `dunjn_get_session`

Récupère une session complète : metadata + entités liées + notes prep/rich en texte plain.

Parameters:

- `sessionId` (string, required): ID de la session
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_get_world_note`

Récupère une world note complète, contenu verbatim inclus. À utiliser avant update_world_note pour relire le texte exact sans l'écraser (search_rag paraphrase et ne convient pas).

Parameters:

- `noteId` (string, required): ID de la world note
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_list_assets`

Liste les assets binaires (image, PDF, audio, vidéo) liés à une campagne. Filtres optionnels par type ou entité associée.

Parameters:

- `campaignId` (string, optional)
- `type` (string, optional, values: `image`, `pdf`, `audio`, `video`): Filtre par type d'asset
- `entityId` (string, optional): Filtre les assets liés à une entité spécifique

### `dunjn_list_campaigns`

Liste les campagnes accessibles à cette clé API. Renvoie nom, gameSystem, créateur, nombre d'entités/sessions.

No parameters.

### `dunjn_list_entities`

Liste les entités d'une campagne, filtrables par type, tag, folder. type='Encounter' liste les rencontres ; chacune porte alors `completed` (true = déjà jouée/terminée). Pour clore ou rouvrir une rencontre : update_entity avec `completed`.

Parameters:

- `campaignId` (string, optional)
- `type` (string, optional): Filtre par type (PC, NPC, Monster, Location, Faction, Item, Quest, Religion, Spell, Race, Language, Event)
- `tag` (string, optional): Filtre par tag
- `folder` (string, optional): Filtre par dossier
- `limit` (integer, optional)

### `dunjn_list_roll_tables`

Liste les tables de jet (tables aléatoires : rencontres, butin, événements…) de la campagne, avec leur dé indicatif, nombre d'entrées et ID. Utilise get_roll_table pour le détail ou roll_on_table pour tirer.

No parameters.

### `dunjn_list_sessions`

Liste les sessions d'une campagne avec leur numéro, nom, date, statut.

Parameters:

- `campaignId` (string, optional): ID de la campagne

### `dunjn_list_world_notes`

Liste les world notes d'une campagne (titre, tags, updatedAt). Le contenu n'est PAS inclus — utilise get_world_note pour le lire.

Parameters:

- `campaignId` (string, optional)

### `dunjn_read_entity`

Lit les données complètes d'une entité existante : nom, type, contenu (statsblock), backstory, tags, sheet_data. Utilise cet outil AVANT de modifier une entité avec update_entity, pour connaître son état actuel.

Parameters:

- `entityId` (string, required): ID de l'entité à lire

### `dunjn_read_session`

Lit une session par son id : métadonnées, résumé, entités liées et notes (préparation + live) en texte brut. À utiliser pour consulter une session listée dans l'index (distinct de read_session_notes, qui lit la session active).

Parameters:

- `sessionId` (string, required): ID de la session à lire

### `dunjn_read_world_note`

Lit le contenu complet d'une note du monde (lore/worldbuilding) en texte brut : titre, tags, contenu. Utilise cet outil pour consulter une note listée dans l'index avant de répondre ou de la modifier.

Parameters:

- `noteId` (string, required): ID de la note du monde à lire

### `dunjn_roll_on_table`

Effectue un tirage aléatoire sur une table de jet et renvoie l'entrée tirée (pondérée par les poids). Idéal quand le MJ demande « lance sur la table des rencontres ».

Parameters:

- `tableId` (string, required): ID de la table de jet à lancer

### `dunjn_search_entities`

Recherche des entités par nom dans la campagne. Utile si l'ID n'est pas connu.

Parameters:

- `query` (string, required): Nom ou partie du nom
- `type` (string, optional, values: `PC`, `NPC`, `Location`, `Faction`, `Item`, `Quest`, `Monster`, `Religion`, `Spell`, `Race`, `Language`, `Event`): Filtrer par type (optionnel)

## Write tools (28)

### `dunjn_add_encounter_participant`

Ajoute un PJ ou un adversaire (monstre) à une rencontre existante. Pour ajouter plusieurs exemplaires du même monstre, utilise le paramètre count (ex: count=4 pour '4 gobelins'). Si le participant existe déjà, le count est mis à jour. Un PJ inactif (mis sur le banc) est refusé : réactive-le d'abord depuis la page Joueurs.

Parameters:

- `encounterId` (string, required): ID de la rencontre
- `entityId` (string, required): ID de l'entité à ajouter (PC ou Monster)
- `role` (string, required, values: `joueur`, `adversaire`): 'joueur' pour un PJ, 'adversaire' pour un monstre ou ennemi
- `count` (integer, optional): Nombre d'exemplaires de cet adversaire (défaut : 1). Ex : 4 pour '4 gobelins'. Ignoré pour role='joueur'.

### `dunjn_add_session_section`

Ajoute une nouvelle section (titre + corps optionnel) à un champ de notes de session. position='end' (défaut), 'start', 'before' ou 'after' — 'before'/'after' nécessitent `ref_index` ou `ref_title` (la section de référence). `content` accepte les mêmes marqueurs que update_session_section ([SKILL_CHECK:…], [ENTITY:id:Nom], [IMAGE:url], [ENCOUNTER:id:Nom], [ROLLTABLE:id:Nom], [NOTE:id:Titre], [ACCORDION:Titre]…[/ACCORDION]).

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (défaut) ou 'rich_text_notes'
- `title` (string, required): Titre de la nouvelle section
- `level` (integer, required): Niveau de titre 1-3 (défaut 2)
- `content` (string, optional): Corps de la section (optionnel ; marqueurs supportés)
- `position` (string, required, values: `start`, `end`, `before`, `after`): 'end' (défaut), 'start', 'before', 'after'
- `ref_index` (integer, optional): Section de référence (index) pour position before/after
- `ref_title` (string, optional): Section de référence (titre) pour position before/after

### `dunjn_create_encounter`

Crée une nouvelle rencontre (combat) dans la campagne avec ses participants. Le combat vit dans `participants`, PAS uniquement dans le texte de `content` : chaque adversaire doit être une entité de type 'Monster' EXISTANTE — crée-la d'abord avec create_entity (type='Monster') pour obtenir son id, puis passe-la dans `participants` avec role='adversaire' et son `count`. Ajoute aussi les PJ avec role='joueur'. Passe TOUS les participants en une seule opération atomique (sans participants, la rencontre est vide dans le tracker de combat). Les PJ marqués inactifs (mis sur le banc) sont automatiquement ignorés — seuls les PJ actifs entrent dans la rencontre. Utiliser link_entity_to_session pour la lier à la session en cours.

Parameters:

- `name` (string, required): Nom de la rencontre
- `content` (string, optional): Description de la rencontre : contexte, lieu, déclencheur, objectifs
- `participants` (object[], optional): Liste des participants à ajouter immédiatement à la rencontre

### `dunjn_create_entity`

Crée une nouvelle entité dans la campagne. Types : NPC (PNJ humanoïde), Monster (monstre/adversaire du bestiaire — le contenu doit être un statsblock Markdown complet), Location (lieu), Faction, Item (objet), Quest (quête), PC (personnage joueur).

Parameters:

- `name` (string, required): Nom de l'entité
- `type` (string, required, values: `PC`, `NPC`, `Location`, `Faction`, `Item`, `Quest`, `Monster`, `Religion`, `Spell`, `Race`, `Language`, `Event`): Type : NPC, Monster, Location, Faction, Item, Quest, PC
- `content` (string, optional): UNIQUEMENT pour Monster et NPC : statbloc Markdown complet selon le système de la campagne (D&D 5e : CA/PV/vitesse/caractéristiques/actions ; Daggerheart : Difficulté/Seuils/PB/Stress/attaque). Pour tous les autres types (Location, Faction, Item, Quest, Religion, Spell, Race, Language, Event) : NE PAS utiliser content — mettre les données dans sheet_data avec les clés du template. Un marqueur [ROLLTABLE:id:Nom] seul sur sa ligne intègre une table de jet interactive sur la fiche (id via list_roll_tables).
- `backstory` (string, optional): Historique ou lore du personnage (NPC/PC uniquement)
- `tags` (string[], optional): Tags à assigner (UNIQUEMENT parmi les tags disponibles listés dans le contexte de campagne sous '## Tags disponibles' — les tags inconnus sont écartés). Pour introduire un nouveau tag, appelle d'abord create_tag, puis assigne-le ici.
- `sheet_data` (object, optional): Données structurées de la fiche. OBLIGATOIRE pour tous les types sauf PC. Pour Monster — les clés dépendent du système de jeu de la campagne (cf. get_campaign → gameSystemMechanics). Monster (D&D 5e) : stats numériques { "cr": "2", "xp": "450", "ac": 15, "ac_desc": "(armure naturelle)", "hp": 45, "hp_formula": "(6d10 + 12)", "speed": "9 m", "str": 16, "dex": 12, "con": 14, "int": 6, "wis": 11, "cha": 7, "saves": "", "skills": "", "senses": "", "languages": "", "subtitle": "", "resistances": "", "damage_immunities": "", "condition_immunities": "" } — les 6 caractéristiques (str/dex/con/int/wis/cha) sont des NOMBRES. Monster (Daggerheart) : { "tier": 2, "type": "Cogneur", "difficulty": 14, "threshold_major": 8, "threshold_severe": 15, "hp": 6, "stress": 3, "atk": "+3", "attack_name": "Lame rouillée", "attack_range": "Mêlée", "attack_damage": "2d8+3 phy", "experience": "", "motives": "" }. Pour NPC : { "appearance": "", "personality": "", "background": "", "motivations": "", "keyPhrases": "", "secrets": "" }. Pour Location : { "description": "", "history": "", "notableInhabitants": "", "dangers": "", "secrets": "" }. Pour Faction : { "description": "", "goals": "", "structure": "", "resources": "", "secrets": "" }. Pour Item : { "description": "", "properties": "", "history": "", "currentLocation": "" }. Pour Quest : { "summary": "", "objectives": "", "rewards": "", "complications": "", "npcsInvolved": "" }. Pour Religion : { "deity": "", "dogma": "", "temples": "", "followers": "" }. Pour Spell : { "level": "", "school": "", "components": "", "description": "", "effects": "" }. Pour Race : { "description": "", "traits": "", "culture": "", "history": "" }. Pour Language : { "description": "", "script": "", "speakers": "" }. Pour Event : { "description": "", "date": "", "location": "", "participants": "", "consequences": "" }. Chaque valeur est un texte libre (plusieurs paragraphes OK). À la création, sheet_data définit l'objet complet ; une mise à jour ultérieure via update_entity FUSIONNE (les clés non fournies sont conservées).

### `dunjn_create_entity_relation`

Crée un lien nommé entre deux entités existantes.

Parameters:

- `fromEntityId` (string, required): ID de l'entité source
- `toEntityId` (string, required): ID de l'entité cible
- `label` (string, required): Libellé du lien (ex: 'habite à', 'membre de', 'ennemi de', 'allié de')

### `dunjn_create_roll_table`

Crée une table de jet (table aléatoire). Chaque entrée a un libellé (le résultat) et un poids optionnel (défaut 1) qui détermine sa probabilité ; les plages de tirage sont calculées automatiquement à partir des poids. `dice` est une formule de dé indicative (ex : 'd100', 'd20' ; défaut 'd100').

Parameters:

- `name` (string, required): Nom de la table (ex : 'Rencontres aléatoires en forêt')
- `description` (string, optional): Description / usage de la table (optionnel)
- `dice` (string, optional): Formule de dé indicative (ex : 'd100', 'd20'). Défaut 'd100'.
- `entries` (object[], required): Entrées de la table (au moins une).

### `dunjn_create_session`

Crée une nouvelle session dans la campagne. Utilise le prochain numéro de session disponible (visible dans le contexte). La date doit être au format ISO 8601 (YYYY-MM-DD).

Parameters:

- `session_number` (integer, required): Numéro de la session (entier, ex: 5)
- `name` (string, optional): Nom descriptif optionnel de la session (ex: 'La Crypte de Keldurn')
- `real_date` (string, required): Date de la session au format YYYY-MM-DD (ex: 2026-03-15)
- `status` (string, required, values: `planned`, `active`, `completed`): Statut : 'planned' (défaut), 'active' ou 'completed'

### `dunjn_create_tag`

Ajoute un ou plusieurs tags à la bibliothèque de tags de la campagne. IMPORTANT : create_entity et update_entity n'acceptent QUE des tags déjà présents dans cette bibliothèque (les tags inconnus sont silencieusement écartés). Pour introduire un nouveau tag, appelle donc create_tag d'ABORD, puis assigne-le à une entité. Réutilise les tags existants (section '## Tags disponibles' du contexte) quand c'est pertinent — ne crée que des tags réellement nouveaux. Les tags déjà présents sont ignorés (pas de doublon).

Parameters:

- `tags` (string[], required): Tags à ajouter à la bibliothèque (1 à 30). Ex : ['allié', 'noble', 'magie']. Les tags déjà présents sont ignorés sans erreur.

### `dunjn_create_world_note`

Crée une nouvelle note du monde (lore, worldbuilding, cosmologie, histoire, géographie, etc.) dans le wiki de la campagne.

Parameters:

- `title` (string, required): Titre de la note
- `content` (string, optional): Contenu de la note en texte/Markdown (optionnel). Marqueurs acceptés : [ENTITY:id:Nom], [ENCOUNTER:id:Nom], [ROLLTABLE:id:Nom], [NOTE:id:Titre], [IMAGE:url], [SKILL_CHECK:{…}], et le bloc dépliable [ACCORDION:Titre] … [/ACCORDION] (balises seules sur leur ligne).
- `tags` (string[], optional): Tags pour catégoriser la note

### `dunjn_delete_entity`

Supprime définitivement une entité (wiki, bestiaire, etc.). À utiliser avec précaution.

Parameters:

- `entityId` (string, required): ID de l'entité à supprimer

### `dunjn_delete_session`

Supprime définitivement une session et ses liens d'entités (les entités elles-mêmes sont conservées). À utiliser avec précaution — irréversible.

Parameters:

- `sessionId` (string, required): ID de la session à supprimer
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_delete_session_section`

Supprime UNE section (titre + corps, sous-sections incluses) d'un champ de notes de session. Cible par `index` (via list_session_sections) ou `title` exact. Irréversible — utilise avec précaution.

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (défaut) ou 'rich_text_notes'
- `index` (integer, optional): Index 0-based de la section
- `title` (string, optional): Titre exact (alternative à index)

### `dunjn_delete_world_note`

Supprime définitivement une note du monde. À utiliser avec précaution.

Parameters:

- `noteId` (string, required): ID de la note à supprimer

### `dunjn_link_entity_to_session`

Lie une entité (PNJ, lieu, objet, rencontre, monstre, etc.) à une session, pour qu'elle apparaisse dans les éléments liés. Cible la session active par défaut ; passe sessionId pour lier à une autre session (utile pour préparer plusieurs séances sans rebasculer la session active).

Parameters:

- `entityId` (string, required): ID de l'entité à lier à la session
- `sessionId` (string, optional): ID de la session cible (optionnel — défaut : session active)

### `dunjn_list_session_sections`

Liste les sections d'un champ de notes de session, découpées par titres (#/##/###). Pour chaque section : `index` (0-based, à réutiliser dans update/move/delete_session_section), `level` (1-3 ; 0 = préambule avant le 1er titre), `title`, et un aperçu du corps. À APPELER EN PREMIER pour obtenir l'index exact avant toute modification de section.

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (préparation, défaut) ou 'rich_text_notes' (session live)

### `dunjn_move_session_section`

Déplace une section (avec ses sous-sections) dans un champ de notes de session. Cible par `index` ou `title`. position='start'/'end', ou 'before'/'after' (nécessitent `ref_index` ou `ref_title`). Un déplacement sans effet (déjà à cette position) est refusé.

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (défaut) ou 'rich_text_notes'
- `index` (integer, optional): Index 0-based de la section à déplacer
- `title` (string, optional): Titre exact (alternative à index)
- `position` (string, required, values: `start`, `end`, `before`, `after`): 'start', 'end', 'before', 'after'
- `ref_index` (integer, optional): Section de référence (index) pour before/after
- `ref_title` (string, optional): Section de référence (titre) pour before/after

### `dunjn_read_session_notes`

Lit les notes existantes d'une session sous forme de texte brut (avec marqueurs [ENTITY:...] et [SKILL_CHECK:...] préservés). À utiliser avant de reformater pour ne pas perdre le contenu.

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (préparation, défaut) ou 'rich_text_notes' (session live)

### `dunjn_remove_encounter_participant`

Retire un participant (PJ, PNJ ou monstre) d'une rencontre existante. Utilise search_entities si l'ID de l'entité ou de la rencontre n'est pas connu.

Parameters:

- `encounterId` (string, required): ID de la rencontre
- `entityId` (string, required): ID de l'entité à retirer

### `dunjn_set_active_campaign`

Définit la campagne active de la session MCP courante. Les tools/call suivants n'auront plus besoin de repasser campaignId.

Parameters:

- `campaignId` (string, required)

### `dunjn_set_active_session`

Définit la session active de la session MCP courante. Les tools/call suivants n'auront plus besoin de repasser sessionId.

Parameters:

- `sessionId` (string, required)
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_unlink_entity_from_session`

Supprime le lien entre une entité et une session. Cible la session active par défaut ; passe sessionId pour viser une autre session.

Parameters:

- `entityId` (string, required): ID de l'entité à dissocier de la session
- `sessionId` (string, optional): ID de la session cible (optionnel — défaut : session active)

### `dunjn_update_campaign_notes`

Met à jour les notes globales de la campagne (lore/MJ, distinctes des notes de session). Mode 'replace' (défaut) ou 'append'. Le contenu accepte les marqueurs : [ENTITY:id:Nom] (via search_entities/create_entity), [IMAGE:url] (via upload_image), [SKILL_CHECK:{…}], [NOTE:id:Titre], et le bloc dépliable [ACCORDION:Titre] … [/ACCORDION] (balises seules sur leur ligne).

Parameters:

- `content` (string, required): Texte/Markdown des notes globales (marqueurs supportés : [ENTITY:], [IMAGE:], [SKILL_CHECK:], [NOTE:], [ACCORDION:]…[/ACCORDION]).
- `mode` (string, optional, values: `append`, `replace`): 'replace' écrase (défaut), 'append' ajoute à la fin.
- `campaignId` (string, optional): ID de la campagne (optionnel si une campagne est active).

### `dunjn_update_entity`

Met à jour une entité existante (PNJ, monstre, PJ, lieu, rencontre…). L'ID est fourni dans le contexte de campagne. Utilise sheet_data pour mettre à jour les attributs système d'un PJ (niveau, classe, CA, initiative, etc.). RENCONTRES : `completed: true` marque le combat comme terminé — il quitte la liste principale des rencontres pour la section « Terminées » ; `completed: false` le rouvre. Récupère l'id d'une rencontre avec list_entities (type='Encounter'), qui indique aussi son état `completed`.

Parameters:

- `entityId` (string, required): ID de l'entité à modifier
- `name` (string, optional): Nouveau nom
- `type` (string, optional, values: `PC`, `NPC`, `Location`, `Faction`, `Item`, `Quest`, `Monster`, `Religion`, `Spell`, `Race`, `Language`, `Event`): Nouveau type
- `content` (string, optional): Nouveau statsblock (Monster/NPC uniquement). Pour les autres types, utiliser sheet_data. Un marqueur [ROLLTABLE:id:Nom] seul sur sa ligne intègre une table de jet interactive sur la fiche.
- `backstory` (string, optional): Nouvel historique (NPC/PC uniquement)
- `tags` (string[], optional): Nouveaux tags à assigner (UNIQUEMENT parmi les tags disponibles listés dans le contexte de campagne sous '## Tags disponibles' — les tags inconnus sont écartés ; appelle create_tag d'abord pour un nouveau tag). Remplace les anciens.
- `sheet_data` (object, optional): Données structurées à mettre à jour (merge avec l'existant). Mêmes clés que create_entity selon le type et le système de jeu. Pour PC : clés du template système (level, class, ac…). Pour Monster : clés D&D 5e (cr, ac, hp, str…) ou Daggerheart (tier, difficulty, hp, stress, atk…) selon le système. Les valeurs non fournies sont conservées.
- `completed` (boolean, optional): Rencontres uniquement : true = marquer la rencontre comme terminée (elle sort de la liste principale des rencontres), false = la rouvrir.

### `dunjn_update_session`

Met à jour les métadonnées d'une session existante : nom, numéro, date, statut, ordre, résumé. Au moins un champ doit être fourni. Changer session_number vers un numéro déjà pris est refusé (erreur explicite) — pour insérer/réordonner une séance sans renuméroter, utilise plutôt sort_order (les sessions de la timeline se trient par sort_order croissant, puis session_number).

Parameters:

- `sessionId` (string, required): ID de la session à modifier
- `name` (string|null, optional): Nouveau nom (null pour effacer)
- `session_number` (integer, optional): Nouveau numéro (doit être libre)
- `real_date` (string, optional): Nouvelle date réelle au format YYYY-MM-DD
- `status` (string, optional, values: `planned`, `active`, `completed`): Nouveau statut
- `sort_order` (integer|null, optional): Ordre dans la timeline (null pour effacer)
- `summary` (string|null, optional): Résumé de la session (null pour effacer)
- `campaignId` (string, optional): ID de la campagne (optionnel)

### `dunjn_update_session_notes`

Modifie les notes d'une session. field='prep_notes' (préparation, avant la session) ou 'rich_text_notes' (notes en direct). Mode 'replace' (défaut) ou 'append'.
FORMATAGE (texte/Markdown enrichi de marqueurs) :
• Jet de compétence : [SKILL_CHECK:{"s":"Perception","a":"SAG","d":15,"ok":"si réussite","ko":"si échec"}] — s=compétence, a=attribut (FOR/DEX/CON/INT/SAG/CHA), d=DD entier, ok/ko optionnels. Le format JSON est requis (pas "[SKILL_CHECK:Perception DD 15]").
• Lien d'entité (PNJ/lieu/objet…) : [ENTITY:id:Nom] seul sur sa ligne. L'id DOIT provenir de search_entities ou create_entity — ne JAMAIS inventer d'id.
• Image : [IMAGE:url] seul sur sa ligne. L'url DOIT provenir d'un upload (stockage Dunjn) — une URL externe est ignorée et dégradée en texte.
• Lien de rencontre : [ENCOUNTER:id:Nom]. Crée d'abord la rencontre avec create_encounter pour obtenir l'id ; ne décris JAMAIS une rencontre sous forme de table Markdown.
• Lien de table de jet (table aléatoire) : [ROLLTABLE:id:Nom] seul sur sa ligne. L'id DOIT provenir de list_roll_tables ou create_roll_table — jamais inventé.
• Lien de note du monde : [NOTE:id:Titre] seul sur sa ligne. L'id DOIT provenir de list_world_notes, get_campaign_index ou create_world_note — jamais inventé.
• Bloc dépliable (infos complémentaires sans alourdir la relecture) :
  [ACCORDION:Titre]
  …contenu Markdown (les autres marqueurs y sont acceptés)…
  [/ACCORDION]
  Les deux balises doivent être SEULES sur leur ligne.

Parameters:

- `notes` (string, required): Contenu des notes en texte/Markdown
- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (préparation) ou 'rich_text_notes' (session live). OBLIGATOIRE.
- `mode` (string, required, values: `replace`, `append`): 'replace' pour remplacer (défaut), 'append' pour ajouter à la fin

### `dunjn_update_session_section`

Modifie UNE section d'un champ de notes de session, sans réécrire le reste du document (les autres sections sont préservées à l'identique). Cible la section par `index` (recommandé, via list_session_sections) ou par `title` (titre exact ; ambigu → erreur). mode='replace' (défaut) remplace le corps de la section ; 'append' ajoute à sa fin. `new_title` renomme le titre.
FORMATAGE de `content` (texte/Markdown enrichi de marqueurs, comme update_session_notes) :
• Jet : [SKILL_CHECK:{"s":"Perception","a":"SAG","d":15,"ok":"si réussite","ko":"si échec"}] (JSON requis).
• Entité : [ENTITY:id:Nom] seul sur sa ligne (id via search_entities/create_entity — jamais inventé).
• Image : [IMAGE:url] (url via upload_image). • Rencontre : [ENCOUNTER:id:Nom] (via create_encounter).
• Table de jet : [ROLLTABLE:id:Nom] (id via list_roll_tables/create_roll_table — jamais inventé).
• Note du monde : [NOTE:id:Titre] (id via list_world_notes/get_campaign_index — jamais inventé).
• Bloc dépliable : [ACCORDION:Titre] / …contenu… / [/ACCORDION], les deux balises SEULES sur leur ligne.

Parameters:

- `field` (string, required, values: `prep_notes`, `rich_text_notes`): 'prep_notes' (défaut) ou 'rich_text_notes'
- `index` (integer, optional): Index 0-based de la section (via list_session_sections)
- `title` (string, optional): Titre exact de la section (alternative à index)
- `content` (string, required): Nouveau contenu de la section (marqueurs supportés)
- `mode` (string, required, values: `replace`, `append`): 'replace' (défaut) ou 'append'
- `new_title` (string, optional): Renomme le titre de la section (optionnel)

### `dunjn_update_world_note`

Met à jour une note du monde existante. L'ID est fourni dans le contexte de campagne (section 'Notes du monde').

Parameters:

- `noteId` (string, required): ID de la note à modifier
- `title` (string, optional): Nouveau titre (optionnel)
- `content` (string, optional): Nouveau contenu en texte/Markdown (optionnel). Marqueurs acceptés : [ENTITY:id:Nom], [ENCOUNTER:id:Nom], [ROLLTABLE:id:Nom], [NOTE:id:Titre], [IMAGE:url], [SKILL_CHECK:{…}], et le bloc dépliable [ACCORDION:Titre] … [/ACCORDION] (balises seules sur leur ligne).
- `tags` (string[], optional): Nouveaux tags (remplace les anciens)

### `dunjn_upload_image`

Upload une image (JPEG/PNG/GIF/WebP, max 5 Mo) dans la campagne et renvoie son URL publique + un marqueur `[IMAGE:url]` prêt à intégrer dans des notes. Les octets sont passés en base64 dans `data` (un data-URL `data:image/png;base64,…` est accepté). Option `insertInto` pour intégrer l'image en un seul appel dans une note de session, du monde, ou les notes de campagne (mode append par défaut). Seules les images uploadées via cet outil (hébergées sur le stockage Dunjn) peuvent être intégrées — une URL externe est refusée.

Parameters:

- `data` (string, required): Image encodée en base64 (data-URL `data:<mime>;base64,…` accepté).
- `fileName` (string, optional): Nom de fichier d'origine — sert de nom d'asset et à déduire le type si mimeType absent.
- `mimeType` (string, optional, values: `image/jpeg`, `image/png`, `image/gif`, `image/webp`): Type MIME de l'image (sinon déduit du data-URL ou de l'extension de fileName).
- `name` (string, optional): Nom de l'asset (défaut : fileName ou 'image').
- `campaignId` (string, optional): ID de la campagne (optionnel si une campagne est active).
- `entityId` (string, optional): Lie l'asset à une entité de la campagne (optionnel).
- `insertInto` (object, optional): Intègre le marqueur [IMAGE:url] dans une note en un seul appel.

## Prompts (6)

Your AI client invokes a prompt like a command; the assistant then takes on the described role and works with the tools above. The names come from the Council of Mages.

### `dunjn_salmanazar`

Adopte le rôle de Salmanazar — assistant MJ généraliste qui pilote Dunjn via les outils MCP. Le contexte RAG de la campagne est opt-in (include_context, désactivé par défaut car il consomme du mana ; sinon bootstrap via les outils de découverte).

Arguments:

- `campaignId` (required): ID de la campagne
- `sessionId` (optional): ID de la session active (optionnel)
- `lang` (optional): Langue ('fr' ou 'en', défaut 'fr')
- `include_context` (optional): Inclure le contexte RAG de la campagne. CONSOMME DU MANA (embedding Gemini). false par défaut.

### `dunjn_melchizedek`

Sous-agent Melchizedek — expert création d'entités (PNJ/Monstres/Lieux).

Arguments:

- `campaignId` (required): ID de la campagne
- `lang` (optional): Langue

### `dunjn_balthazar`

Sous-agent Balthazar — rédaction de notes de session et world notes (lore).

Arguments:

- `campaignId` (required): ID de la campagne
- `lang` (optional): Langue

### `dunjn_nabuchodonosor`

Sous-agent Nabuchodonosor — conception de rencontres complètes.

Arguments:

- `campaignId` (required): ID de la campagne
- `lang` (optional): Langue

### `dunjn_jeroboam`

Sous-agent Jéroboam — préparation COMPLÈTE de session.

Arguments:

- `campaignId` (required): ID de la campagne
- `sessionId` (required): ID de la session cible
- `lang` (optional): Langue

### `dunjn_rehoboam`

Sous-agent Réhoboam — MISE EN FORME uniquement de notes existantes.

Arguments:

- `campaignId` (required): ID de la campagne
- `sessionId` (required): ID de la session cible
- `lang` (optional): Langue
