mcp-agent-template

io.github.amineutron由 GitHub 帳號 amineutron 發布v0.2.0更新於 Nov 7, 2026

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

概覽

AI 產生的概覽

具防護機制的企業 MCP 範本:角色權限、白名單政策、人工確認與 JSONL 稽核日誌,並附工單、通訊錄與盤點範例工具。

可以做什麼
  • 管理支援工單:列出、檢視、建立、關閉與刪除工單,依政策「緊急」優先級僅限人工設定
  • 查詢唯讀通訊錄:依姓名、識別碼、電子郵件、職務或部門搜尋,取得人員資料與所屬群組,列出群組成員
  • 檢視唯讀 SQL 盤點資料庫:列出資料表與欄位,執行 SELECT 查詢,寫入由資料庫本身拒絕
  • 每次呼叫都經過白名單與呼叫者角色檢查,破壞性操作需人工確認
  • 以關聯 ID 將每次呼叫寫入 JSONL 稽核日誌,並遮蔽疑似機密的參數
  • 可作為範本,用同一套政策與稽核層建立自己的受控 MCP 伺服器
適用情境
適合 IT 團隊想讓 AI 助理存取內部工具,但需要角色限制、白名單、破壞性操作人工核准與稽核紀錄的情境。也可作為撰寫自有受控 MCP 伺服器的起點;內建範例使用本機虛構資料。
執行需求
以 Python 套件透過 uvx 在本機執行(stdio 傳輸),僅限桌面。選用環境變數:MCP_AGENT_TEMPLATE_ROLE(lecteur、operateur 或 admin,預設 lecteur)、MCP_AGENT_TEMPLATE_CONFIRM(elicit 或 client)、MCP_AGENT_TEMPLATE_AUDIT_DIR 與 MCP_AGENT_TEMPLATE_DATA_DIR。未宣告驗證或 API 金鑰;無雲端、無遙測。
安裝前請注意
呼叫者角色來自用戶端設定,能修改該設定的人即可自行取得 admin 權限。delete_ticket 等破壞性工具會永久刪除資料,需 admin 加人工確認;用戶端無法提問時操作會被拒絕。稽核日誌寫入磁碟(權限 0600),疑似機密的參數會被遮蔽,但仍應確認記錄內容。內建資料為虛構;換成真實系統後助理可觸及的範圍也隨之改變。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 mcp-agent-template,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

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.

來源:README.md,提交 6a8960a

工具

10

list_tickets

Lister les tickets

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

輸入參數limitstatus

get_ticket

Lire un ticket

Detail d'un ticket.

輸入參數ticket_id必填

create_ticket

Creer un ticket

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

輸入參數title必填priorityrequesterdescription

close_ticket

Clore un ticket

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

輸入參數ticket_id必填resolution必填

delete_ticket

Supprimer un ticket

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

輸入參數ticket_id必填

search_directory

Chercher dans l'annuaire

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

輸入參數query必填include_inactive

get_user

Fiche annuaire

Fiche d'une personne et ses groupes.

輸入參數uid必填

group_members

Membres d'un groupe

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

輸入參數group必填

list_tables

Tables de l'inventaire

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

無需輸入參數。

query_inventory

Requete SQL (lecture seule)

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

輸入參數sql必填limit

版本歷史

1
  1. v0.2.0最新Nov 4, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分