diff --git a/mcp_server.py b/mcp_server.py index 20a58b5..1355f7a 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -248,6 +248,21 @@ TOOLS = [ "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", "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) 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): ok, message = add_relation_safe(source_id, nom, cible_id) return {"success": ok, "message": message} @@ -521,7 +569,7 @@ DISPATCH = { "close_session": tool_close_session, "get_skills": tool_get_skills, "add_skill": tool_add_skill, "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, "get_note": tool_get_note, "get_children": tool_get_children, }