feat(mcp): synchronise les permissions MCP avec les tools réellement exposés

Les permissions déclarées ne reflétaient pas toujours les tools
effectivement exposés aux agents (contexte requester/projet lié après
coup). Ajoute ToolInvoker::tools_for_bound_context/tools_for_context
pour exposer la liste effective au moment de l'injection dans une
requête OpenAI-compatible, et propage le calcul dans la policy MCP,
le serveur, la factory de session et l'adapter openai_compat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 15:57:45 +02:00
parent 5955ea37a2
commit 21a84ab8f2
8 changed files with 462 additions and 223 deletions

View File

@ -660,6 +660,29 @@ pub trait ToolInvoker: Send + Sync {
/// Liste des outils exposés au modèle.
fn tools(&self) -> Vec<ToolSpec>;
/// Liste des outils exposés dans le contexte déjà lié par l'adapter appelant.
///
/// Les invokers simples peuvent conserver le comportement historique via
/// [`Self::tools`]. Les wrappers qui portent déjà l'identité requester et le
/// projet peuvent surcharger cette méthode pour refléter les permissions
/// effectives au moment où les outils sont exposés au modèle.
async fn tools_for_bound_context(&self) -> Result<Vec<ToolSpec>, ToolInvocationError> {
Ok(self.tools())
}
/// Liste des outils exposés pour un projet et un requester explicites.
///
/// Sert aux adapters qui savent résoudre la policy durable à partir du root
/// projet et de l'identité agent avant d'injecter les tools dans une requête
/// OpenAI-compatible.
async fn tools_for_context(
&self,
_project_root: &str,
_requester: &str,
) -> Result<Vec<ToolSpec>, ToolInvocationError> {
Ok(self.tools())
}
/// Appelle un outil avec ses arguments JSON bruts.
///
/// # Errors