Protokoll #15196

ID15196
Zeitstempel2025-12-25 15:40:47.531409
Clientroot
IP145.224.72.140
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens900 (Input: 37, Output: 863)
Dauer134 ms
Request-Zeit2025-12-25 15:40:47.531409
Response-Zeit2025-12-25 15:40:47.665832

Request

{
    "event": "PreToolUse",
    "tool_name": "Read",
    "tool_input": {
        "file_path": "\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py",
        "limit": 100
    }
}

Response

{
    "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
        }
    }
}
← Vorheriger Zur Liste Nächster →