| title | emoji | colorFrom | colorTo | sdk | app_port | hf_oauth | hf_oauth_scopes | |||
|---|---|---|---|---|---|---|---|---|---|---|
HF Agent |
π€ |
blue |
purple |
docker |
7860 |
true |
|
An MLE agent CLI with MCP (Model Context Protocol) integration and built-in tool support.
# Clone the repository
git clone git@github.com:huggingface/hf_agent.git
cd hf_agentuv sync --extra agent # or uv sync --extra alluv run python -m agent.mainThis starts an interactive chat session with the agent. Type your messages and the agent will respond, using tools as needed.
The agent will automatically discover and register all tools from configured MCP servers.
ANTHROPIC_API_KEY=<one-key-to-rule-them-all>
HF_TOKEN=<hf-token-to-access-the-hub>
GITHUB_TOKEN=<gh-pat-key-for-not-reinventing-the-wheel>
HF_NAMESPACE=<hf-namespace-to-use>βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User/CLI β
ββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ¬ββββββββββββ
β User request β Events
β β
submission_queue event_queue
β β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β submission_loop (agent_loop.py) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β 1. Receive Operation from queue β β β
β β 2. Route to Handler (run_agent/compact/...) β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β Handlers.run_agent() β βββββββββββ€
β β β β Emit β
β β ββββββββββββββββββββββββββββββββββββββββββ β β Events β
β β β Agentic Loop (max 10 iterations) β β β β
β β β β β β β
β β β ββββββββββββββββββββββββββββββββββββ β β β β
β β β β Session β β β β β
β β β β ββββββββββββββββββββββββββββββ β β β β β
β β β β β ContextManager β β β β β β
β β β β β β’ Message history β β β β β β
β β β β β (litellm.Message[]) β β β β β β
β β β β β β’ Auto-compaction (180k) β β β β β β
β β β β ββββββββββββββββββββββββββββββ β β β β β
β β β β β β β β β
β β β β ββββββββββββββββββββββββββββββ β β β β β
β β β β β ToolRouter β β β β β β
β β β β β ββ explore_hf_docs β β β β β β
β β β β β ββ fetch_hf_docs β β β β β β
β β β β β ββ find_hf_api β β β β β β
β β β β β ββ plan_tool β β β β β β
β β β β β ββ hf_jobs* β β β β β β
β β β β β ββ hf_private_repos* β β β β β β
β β β β β ββ github_* (3 tools) β β β β β β
β β β β β ββ MCP tools (e.g., β β β β β β
β β β β β model_search, etc.) β β β β β β
β β β β ββββββββββββββββββββββββββββββ β β β β β
β β β ββββββββββββββββββββββββββββββββββββ β β β β
β β β β β β β
β β β Loop: β β β β
β β β 1. LLM call (litellm.acompletion) β β β β
β β β β β β β β
β β β 2. Parse tool_calls[] β β β β
β β β β β β β β
β β β 3. Execute via ToolRouter β β β β
β β β β β β β β
β β β 4. Add results to ContextManager β β β β
β β β β β β β β
β β β 5. Repeat if tool_calls exist β β β β
β β ββββββββββββββββββββββββββββββββββββββββββ β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββ
User Message
β
[Add to ContextManager]
β
βββββββββββββββββββββββββββββββββββββββββ
β Iteration Loop (max 10) β
β β
β Get messages + tool specs β
β β β
β litellm.acompletion() β
β β β
β Has tool_calls? ββNoββ> Done β
β β β
β Yes β
β β β
β Add assistant msg (with tool_calls) β
β β β
β For each tool_call: β
β β’ ToolRouter.execute_tool() β
β β’ Add result to ContextManager β
β β β
β Continue loop ββββββββββββββββββ β
β β β β
βββββββββββ§ββββββββββββββββββββββββ§ββββββ
agent/
βββ config.py # Configuration models
βββ main.py # Interactive CLI entry point
βββ prompts/
β βββ system_prompt.yaml # Agent behavior and personality
βββ context_manager/
β βββ manager.py # Message history & auto-compaction
βββ core/
βββ agent_loop.py # Main agent loop and handlers
βββ session.py # Session management
βββ mcp_client.py # MCP SDK integration
βββ tools.py # ToolRouter and built-in tools
configs/
βββ main_agent_config.json # Model and MCP server configuration
tests/ # Integration and unit tests
eval/ # Evaluation suite (see eval/README.md)
The agent emits the following events via event_queue:
processing- Starting to process user inputassistant_message- LLM response texttool_call- Tool being called with argumentstool_output- Tool execution resultapproval_request- Requesting user approval for sensitive operationsturn_complete- Agent finished processingerror- Error occurred during processinginterrupted- Agent was interruptedcompacted- Context was compactedundo_complete- Undo operation completedshutdown- Agent shutting down
Edit agent/core/tools.py:
def create_builtin_tools() -> list[ToolSpec]:
return [
ToolSpec(
name="your_tool",
description="What your tool does",
parameters={
"type": "object",
"properties": {
"param": {"type": "string", "description": "Parameter description"}
},
"required": ["param"]
},
handler=your_async_handler
),
# ... existing tools
]Edit configs/main_agent_config.json:
{
"model_name": "anthropic/claude-sonnet-4-5-20250929",
"mcpServers": {
"your-server-name": {
"transport": "http",
"url": "https://example.com/mcp",
"headers": {
"Authorization": "Bearer ${YOUR_TOKEN}"
}
}
}
}Note: Environment variables like ${YOUR_TOKEN} are auto-substituted from .env.