{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py",
"limit": 100
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py",
"content": "\"\"\"Contract Tools für MCP-Contracts Server\"\"\"\nimport sys\nimport time\nimport json\nfrom typing import Optional\nfrom datetime import datetime\n\nimport yaml\n\nsys.path.insert(0, \"\/opt\/mcp-servers\/mcp-contracts\")\n\nfrom domain.contracts import (\n LogEntry, Contract, ContractValidation, ContractStatus\n)\nfrom infrastructure.protokoll_logger import get_logger\nfrom infrastructure.contract_repository import ContractRepository\nfrom validators.contract_validator import run_contract_validation\n\n\ndef register_contract_tools(mcp):\n \"\"\"Registriert alle Contract-Tools\"\"\"\n\n logger = get_logger()\n repo = ContractRepository()\n\n # ==================== contracts_list ====================\n @mcp.tool()\n def contracts_list(\n status: Optional[str] = None,\n search: Optional[str] = None,\n compact: bool = True,\n limit: int = 20,\n ) -> dict:\n \"\"\"\n Listet alle Contracts aus der Datenbank.\n\n Args:\n status: Filter nach Status (draft, active, deprecated)\n search: Volltextsuche in Name\/Scope\n compact: True = nur id\/name\/version\/status (Token-sparend)\n limit: Maximale Anzahl Ergebnisse\n\n Returns:\n Liste der Contracts\n \"\"\"\n start = time.time()\n request_str = json.dumps({\"status\": status, \"search\": search, \"limit\": limit})\n\n try:\n contracts = repo.find_all(status=status, search=search, limit=limit)\n total = repo.count(status=status, search=search)\n\n duration = int((time.time() - start) * 1000)\n logger.log(LogEntry(\n tool_name=\"contracts_list\",\n request=request_str,\n status=\"success\",\n duration_ms=duration,\n ))\n\n return {\n \"success\": True,\n \"contracts\": [c.to_dict_compact() if compact else c.to_dict() for c in contracts],\n \"total\": total,\n \"limit\": limit,\n }\n\n except Exception as e:\n duration = int((time.time() - start) * 1000)\n logger.log(LogEntry(\n tool_name=\"contracts_list\",\n request=request_str,\n status=\"error\",\n duration_ms=duration,\n error_message=str(e)[:200],\n ))\n return {\"success\": False, \"error\": str(e)}\n\n # ==================== contracts_get ====================\n @mcp.tool()\n def contracts_get(\n id: Optional[int] = None,\n name: Optional[str] = None,\n version: Optional[str] = None,\n include_history: bool = False,\n include_validations: bool = False,\n ) -> dict:\n \"\"\"\n Holt einen Contract nach ID oder Name.\n\n Args:\n id: Contract-ID\n name: Contract-Name (alternativ zu ID)\n version: Spezifische Version (optional, sonst neueste aktive)\n include_history: Änderungshistorie einschließen\n include_validations: Letzte Validierungen einschließen\n\n Returns:\n Contract mit Details\n \"\"\"",
"numLines": 100,
"startLine": 1,
"totalLines": 587
}
}
}