mcp-agent-template

io.github.amineutronPublished by GitHub account amineutronv0.2.0Updated Nov 7, 2026

Enterprise MCP guard: roles, allowlist policy, human confirmation, JSONL audit log, example tools.

Overview

AI-generated overview

A guarded enterprise MCP template with role-based access, allowlist policy, human confirmation and JSONL audit logging, plus demo ticket, directory and…

What you can do
  • Manage support tickets: list, read, create, close and delete them, with critical priority reserved for humans by policy
  • Look up people in a read-only directory: search by name, ID, email, role or department, get a person's record and groups, list group members
  • Inspect a read-only SQL inventory: list tables and columns, run SELECT queries that the database itself blocks from writing
  • Every call is checked against an allowlist policy and caller role, and destructive actions require human confirmation
  • Record each call in a JSONL audit log with a correlation ID, masking secret-like parameters
  • Serve as a template for building your own guarded MCP server with the same policy and audit layer
When to use it
Useful when an IT team wants to let an AI agent touch internal tools but needs role limits, an allowlist, human sign-off on destructive actions and an audit trail. Also a starting point for writing your own guarded MCP server; the bundled examples run on fictitious local data.
Requirements
Runs locally as a Python package via uvx (stdio transport), desktop only. Optional environment variables: MCP_AGENT_TEMPLATE_ROLE (lecteur, operateur or admin; defaults to lecteur), MCP_AGENT_TEMPLATE_CONFIRM (elicit or client), MCP_AGENT_TEMPLATE_AUDIT_DIR and MCP_AGENT_TEMPLATE_DATA_DIR. No authentication or API keys declared; no cloud or telemetry.
Before you install
The caller role comes from client configuration, so anyone who can edit that config can grant themselves admin. Destructive tools such as delete_ticket permanently delete data and need admin plus human confirmation; if the client cannot ask, the action is refused. Audit logs are written to disk (mode 0600) and secret-like parameters are masked, but review what is logged. The bundled data is fictitious; replacing stores with real systems changes what the agent can reach.

Installation

In SourceWeft

  1. Open mcp-agent-template in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

mcp-agent-template — un agent MCP d'entreprise, garde

[CI] [License: AGPL-3.0 + commercial] [Python 3.11+]

English summary. A template for MCP servers that an IT department can let an LLM agent use: every tool call goes through an allowlist policy (policy.yaml), a caller role (lecteur / operateur / admin, derived from the MCP tool annotations), per-parameter allowed values, a human confirmation for destructive actions (MCP elicitation, both the 2025-11-25 and 2026-07-28 protocols), and a JSONL audit log (mode 0600, one correlation id per call). The mcp-agent-template package ships two runnable examples: an enterprise one (tickets, a read-only LDAP-like directory, a read-only SQL inventory, all on fictitious local data) and a generic ops one (systemd and docker status, restart with confirmation). Local-first, self-hosted, on-prem; no cloud, no telemetry. Dual licensed: AGPL-3.0, or a commercial licence for companies of any size.


Donner des outils a un agent IA dans une entreprise pose toujours les memes questions : qui a le droit de faire quoi, qui a valide une action dangereuse, et ou est la trace. Ce depot est un modele (bouton « Use this template ») qui y repond une fois pour toutes, autour du SDK MCP officiel.

Ce que fait la garde

Chaque appel d'outil passe, dans l'ordre :

  1. Liste blanche (policy.yaml) : un outil absent est refuse.

  2. Role de l'appelant : le role minimal vient du type d'outil, et la politique peut seulement le durcir.

    Type d'outilAnnotation MCP publieeRole minimal
    lecturereadOnlyHintlecteur
    ecriture non destructrice—operateur
    destructifdestructiveHintadmin + confirmation humaine
  3. Valeurs permises : par exemple, seules certaines unites systemd peuvent etre redemarrees.

  4. Confirmation humaine pour les outils destructifs : le client affiche la question a l'humain (elicitation MCP). Les controles 1 a 3 passent AVANT : on ne demande jamais a l'humain d'approuver ce que le role n'autorise pas. Tout ce qui n'est pas un « oui » explicite vaut refus, y compris un client qui ne sait pas poser la question.

  5. Journal d'audit JSONL, fichier en 0600, un identifiant de correlation par appel qui relie la decision, la confirmation et le resultat. Les parametres qui ressemblent a des secrets (password, token, api_key...) sont masques.

Un refus renvoie une erreur lisible a l'agent, jamais un faux succes.

Essayer

bash
uvx mcp-agent-template --helpuvx mcp-agent-template serve --example enterprise   # tickets, annuaire, inventaire (donnees fictives)uvx mcp-agent-template serve --example ops          # systemd et dockeruvx mcp-agent-template check-policy policy.yaml     # valide une politique et resume ses regles

Dans un client MCP (Claude Code, Claude Desktop...) :

json
{  "mcpServers": {    "entreprise": {      "command": "uvx",      "args": ["mcp-agent-template", "serve", "--example", "enterprise"],      "env": { "MCP_AGENT_TEMPLATE_ROLE": "operateur" }    }  }}
VariableRoleDefaut
MCP_AGENT_TEMPLATE_ROLErole de l'appelant : lecteur, operateur, adminlecteur
MCP_AGENT_TEMPLATE_CONFIRMelicit : l'humain confirme via le client ; client : le client confirme deja lui-meme (il lit destructiveHint)elicit
MCP_AGENT_TEMPLATE_AUDIT_DIRdossier du journal d'audit~/.local/state/mcp-agent-template
MCP_AGENT_TEMPLATE_DATA_DIRbases SQLite des exemples~/.local/state/mcp-agent-template-demo

Le role vient pour l'instant de la configuration du client : chaque poste ou chaque profil recoit le sien. La source du role est une petite interface (RoleSource) : une authentification par jeton pourra s'y brancher sans toucher aux outils.

Les exemples

Entreprise (--example enterprise), sur des donnees FICTIVES d'une societe « Exemple SA » creees en local, sans aucun service externe :

  • support : list_tickets, get_ticket, create_ticket (la priorite « critique » est reservee aux humains par la politique), close_ticket, delete_ticket (admin + confirmation) ;
  • annuaire en lecture seule, facon LDAP : search_directory, get_user, group_members ;
  • inventaire en SQL lecture seule : list_tables, query_inventory. Deux verrous : la base est ouverte en mode=ro, et un autorisateur SQLite refuse toute ecriture, PRAGMA ou ATTACH, meme cachee dans un WITH.

Ops (--example ops) : service_status et list_containers en lecture, restart_service limite aux unites listees par la politique, apres confirmation.

Ecrire son propre serveur

python
from mcp.server.mcpserver import MCPServerfrom mcp_agent_template import Guard, Policy, ToolKind
server = MCPServer("mon-agent")guard = Guard(server, Policy.load("policy.yaml"))
@guard.tool(ToolKind.READ, title="Lister les commandes")def list_orders(status: str = "ouverte") -> list[dict]:    """Commandes du jour."""    ...
@guard.tool(ToolKind.DESTRUCTIVE, title="Annuler une commande")def cancel_order(order_id: int) -> dict:    """Annule une commande (admin + confirmation humaine)."""    ...
server.run()
yaml
# policy.yamlversion: 1default: denytools:  list_orders: {}  cancel_order:    allowed_values:      order_id: ["1042", "1043"]

Pour brancher un vrai outil de tickets, un vrai annuaire LDAP ou une vraie base, remplacer les classes de src/mcp_agent_template/examples/stores.py : les outils MCP et la garde ne changent pas.

Developpement

bash
uv syncuv run pytest        # garde, politique, audit, exemples, protocoles 2025-11-25 et 2026-07-28, stdiouv run ruff check src tests

Un devcontainer est fourni (.devcontainer/).

Licence

Double licence :

  • AGPL-3.0 (LICENSE) : gratuite pour les particuliers, les associations et l'enseignement ou la recherche ;
  • licence commerciale pour les entreprises, quelle que soit leur taille : voir COMMERCIAL-LICENSE.md.

Les contributions sont acceptees sous l'accord CLA.md.

Fait partie de l'ecosysteme Lyra

Meme approche que fedora-agents (journal d'audit avec identifiant de correlation, annotations MCP) et Lyra, l'assistant vocal French-first qui fait confirmer l'humain avant chaque action sensible.

Source: README.md at commit 6a8960a

Tools

10

list_tickets

Lister les tickets

Tickets du support, les plus recents d'abord. status : ouvert, en_cours, resolu ou ferme.

Parameterslimitstatus

get_ticket

Lire un ticket

Detail d'un ticket.

Parametersticket_idrequired

create_ticket

Creer un ticket

Ouvre un ticket. priority : basse, normale, haute ou critique.

Parameterstitlerequiredpriorityrequesterdescription

close_ticket

Clore un ticket

Passe un ticket a l'etat ferme avec sa resolution.

Parametersticket_idrequiredresolutionrequired

delete_ticket

Supprimer un ticket

Supprime definitivement un ticket (confirmation humaine, role admin).

Parametersticket_idrequired

search_directory

Chercher dans l'annuaire

Personnes dont le nom, l'identifiant, le mail, la fonction ou le service contient query.

Parametersqueryrequiredinclude_inactive

get_user

Fiche annuaire

Fiche d'une personne et ses groupes.

Parametersuidrequired

group_members

Membres d'un groupe

Identifiants des membres actifs d'un groupe de l'annuaire.

Parametersgrouprequired

list_tables

Tables de l'inventaire

Tables et colonnes de la base d'inventaire (parc, licences, sauvegardes).

Takes no parameters.

query_inventory

Requete SQL (lecture seule)

Une requete SELECT sur l'inventaire ; toute ecriture est refusee par la base elle-meme.

Parameterssqlrequiredlimit

Version history

1
  1. v0.2.0LatestNov 4, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts