# Catalog Structure
The tool catalog uses a directory-based structure with YAML files for metadata.
## Directory Layout
```
catalog/
├── _config.yaml # Global configuration
├── communication/ # Category
│ ├── _category.yaml # Category metadata
│ ├── slack/ # Service
│ │ ├── _service.yaml # Service metadata + MCP config
│ │ ├── send_message.yaml
│ │ └── list_channels.yaml
│ └── email/
│ ├── _service.yaml
│ └── send_email.yaml
├── database/
│ └── postgres/
└── files/
└── gdrive/
```
## File Types
### `_config.yaml` (Root)
Global configuration for LLM and MCP servers:
```yaml
llm:
provider: cerebras
model: llama-3.3-70b
api_key: "${AWB_LLM_API_KEY}"
mcp_servers:
slack-mcp:
command: npx
args: ["@anthropic/slack-mcp"]
env:
SLACK_TOKEN: "${SLACK_TOKEN}"
github-mcp:
command: npx
args: ["@anthropic/github-mcp"]
```
### `_category.yaml`
Category metadata:
```yaml
name: Communication
description: Tools for messaging, email, and notifications
icon: chat # Optional, for UI
```
### `_service.yaml`
Service metadata and MCP server reference:
```yaml
name: Slack
description: Slack messaging platform integration
mcp_server: slack-mcp # References _config.yaml
```
### Tool Files (e.g., `send_message.yaml`)
Individual tool definitions:
```yaml
name: send_message
description: Send a message to a Slack channel
mcp_tool: slack_send_message # Actual MCP tool name
parameters:
channel:
type: string
description: Channel name or ID
required: true
message:
type: string
description: Message content
required: true
thread_ts:
type: string
description: Thread timestamp for replies
required: false
examples:
- task: "Send hello to #general"
params:
channel: "#general"
message: "hello"
```
## Navigation Flow
1. **Categories**: `communication/`, `database/`, `files/`
2. **Services**: `slack/`, `email/`, `postgres/`
3. **Tools**: `send_message.yaml`, `list_channels.yaml`
The LLM navigates this hierarchy based on the task description.
## Environment Variables
Use `${VAR_NAME}` syntax for sensitive values:
```yaml
env:
API_KEY: "${MY_API_KEY}"
```
These are resolved at runtime from the environment.