feat: tool MCP create_entite (concept, composantLogiciel, service)

Comble le manque revele par le test Phase 3 : creation autonome d'entites de la
couche connaissance/technique, la ou seul le pilotage etait creable via MCP.
Tool generique cadre : type valide contre liste blanche, dossier resolu via
trilium_ids.json (pas d'ID en dur), garde-fou anti-doublon, definition posee
seulement pour les concepts. Passe le serveur a 20 tools. Teste de bout en bout.
This commit is contained in:
2026-07-02 22:36:32 +02:00
parent 1ed84bf614
commit f883af4dcc
+49 -1
View File
@@ -248,6 +248,21 @@ TOOLS = [
"required": ["source_id", "nom", "cible_id"], "required": ["source_id", "nom", "cible_id"],
}, },
}, },
{
"name": "create_entite",
"description": "Cree une entite de la couche connaissance/technique. type : concept, composantLogiciel ou service. Range automatiquement dans le bon dossier. definition (optionnelle) n est posee que pour les concepts (les fait remonter dans le briefing). Garde-fou anti-doublon sur le titre.",
"inputSchema": {
"type": "object",
"properties": {
"type": {"type": "string", "description": "concept | composantLogiciel | service"},
"projet": {"type": "string"},
"titre": {"type": "string"},
"contenu": {"type": "string"},
"definition": {"type": "string", "description": "concept uniquement"},
},
"required": ["type", "projet", "titre"],
},
},
{ {
"name": "move_note", "name": "move_note",
"description": "Deplace une note d un parent vers un autre (3 args : note_id, ancien_parent_id, nouveau_parent_id). Gere les clones.", "description": "Deplace une note d un parent vers un autre (3 args : note_id, ancien_parent_id, nouveau_parent_id). Gere les clones.",
@@ -483,6 +498,39 @@ def tool_update_note(note_id, contenu, format="markdown"):
update_note_content(note_id, body) update_note_content(note_id, body)
return {"id": note_id, "titre": note.get("title", ""), "format": format, "status": "mis a jour"} return {"id": note_id, "titre": note.get("title", ""), "format": format, "status": "mis a jour"}
def tool_create_entite(type, projet, titre, contenu=None, definition=None):
"""Cree une entite de la couche connaissance/technique (concept, composantLogiciel,
service). Le type est valide contre une liste blanche ; le dossier cible est resolu
via trilium_ids.json. Garde-fou anti-doublon sur le titre dans le dossier cible.
La permission projet est comportementale (le tool accepte tout projet)."""
import json, os
from trilium_api import create_note, get_note_id, set_label, find_note_by_title
MAPPING = {
"concept": "Concepts",
"composantLogiciel": "EnvironnementTechnique",
"service": "EnvironnementTechnique",
}
if type not in MAPPING:
return {"error": "Type non supporte : %s. Types valides : %s" % (type, ", ".join(MAPPING.keys()))}
with open(os.path.expanduser("~/App/Context_continuity/trilium_ids.json")) as f:
ids = json.load(f)
dossier_cle = MAPPING[type]
if dossier_cle not in ids:
return {"error": "Dossier cible absent de trilium_ids.json : %s" % dossier_cle}
parent_id = ids[dossier_cle]
# Anti-doublon : refuse si une note du meme titre existe deja dans le dossier cible
existant = find_note_by_title(titre, parent_id)
if existant:
return {"error": "Doublon : une note '%s' existe deja dans le dossier (%s)" % (titre, existant)}
body = contenu if contenu else " "
res = create_note(parent_id, titre, content=body)
nid = get_note_id(res)
set_label(nid, "type", type)
set_label(nid, "projet", projet)
if type == "concept" and definition:
set_label(nid, "definition", definition)
return {"id": nid, "titre": titre, "type": type, "projet": projet, "status": "cree"}
def tool_add_relation(source_id, nom, cible_id): def tool_add_relation(source_id, nom, cible_id):
ok, message = add_relation_safe(source_id, nom, cible_id) ok, message = add_relation_safe(source_id, nom, cible_id)
return {"success": ok, "message": message} return {"success": ok, "message": message}
@@ -521,7 +569,7 @@ DISPATCH = {
"close_session": tool_close_session, "get_skills": tool_get_skills, "close_session": tool_close_session, "get_skills": tool_get_skills,
"add_skill": tool_add_skill, "add_skill": tool_add_skill,
"move_note": tool_move_note, "move_note": tool_move_note,
"add_relation": tool_add_relation, "add_relation": tool_add_relation, "create_entite": tool_create_entite,
"update_note": tool_update_note, "update_note": tool_update_note,
"get_note": tool_get_note, "get_children": tool_get_children, "get_note": tool_get_note, "get_children": tool_get_children,
} }