Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added hc_agent/__init__.py
Empty file.
Empty file added hc_agent/core/__init__.py
Empty file.
45 changes: 45 additions & 0 deletions hc_agent/core/tool_registry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""Registry for tool schemas used by hc_agent."""

from __future__ import annotations

from dataclasses import asdict, dataclass
from typing import Any, Iterable
import copy


@dataclass(frozen=True)
class ToolSpec:
name: str
description: str
risk: str
input_schema: dict[str, Any]
output_schema: dict[str, Any]
examples: tuple[dict[str, Any], ...] = ()


class ToolRegistry:
"""Central registry for tool schemas.

Tool specifications should be added here to avoid duplicate definitions.
"""

_tools: list[ToolSpec] = []

@classmethod
def register(cls, tool: ToolSpec) -> None:
cls._tools.append(tool)

@classmethod
def schema(cls) -> tuple[dict[str, Any], ...]:
"""Return a deterministic catalog of tool schemas."""
tools = sorted(cls._tools, key=lambda tool: tool.name)
return tuple(cls._serialize(tool) for tool in tools)

@staticmethod
def _serialize(tool: ToolSpec) -> dict[str, Any]:
data = asdict(tool)
data["examples"] = list(tool.examples)
return copy.deepcopy(data)


__all__: Iterable[str] = ["ToolRegistry", "ToolSpec"]
Empty file added hc_agent/mcp/__init__.py
Empty file.
23 changes: 23 additions & 0 deletions hc_agent/mcp/tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Handlers for MCP tool discovery."""

from __future__ import annotations

from typing import Any

from hc_agent.core.tool_registry import ToolRegistry


def hc_tools_search() -> list[dict[str, Any]]:
"""Return the tool catalog for MCP tool discovery."""
catalog = ToolRegistry.schema()
return [
{
"name": tool["name"],
"description": tool["description"],
"risk": tool["risk"],
"input_schema": tool["input_schema"],
"output_schema": tool["output_schema"],
"examples": tool["examples"],
}
for tool in catalog
]