Foreman MCP Server
# Foreman MCP Server
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://github.com/InfraMCP/foreman-mcp-server/actions/workflows/pylint.yml)
[](https://github.com/InfraMCP/foreman-mcp-server/actions/workflows/safety-scan.yml)
[](https://github.com/InfraMCP/foreman-mcp-server/actions/workflows/dependency-security.yml)
MCP server for Foreman host management and infrastructure automation.
## Features
- List and search hosts from Foreman
- Get detailed host information
- Search by location, OS, and environment
- Generic configuration via environment variables
## Installation
### From PyPI (Recommended)
```bash
pip install foreman-mcp-server
```
### From Source
```bash
git clone https://github.com/rorymcmahon/foreman-mcp-server.git
cd foreman-mcp-server
pip install -e .
## Configuration
Set the following environment variables:
- `FOREMAN_URL`: Base URL of your Foreman instance (e.g., `https://foreman.example.com`)
- `FOREMAN_USERNAME`: Foreman username
- `FOREMAN_PASSWORD`: **Personal Access Token** (not your web login password - create this in User Administration → Personal Access Tokens)
- `FOREMAN_VERIFY_SSL`: Whether to verify SSL certificates (default: `true`)
### Required Permissions
The user account needs the following minimum permissions to use all MCP server tools:
| Resource Type | Permission | Purpose |
|---------------|------------|---------|
| Host | `view_hosts` | List and search hosts, get host details and status |
| Organization | `view_organizations` | List organizations |
| Location | `view_locations` | List locations |
| Hostgroup | `view_hostgroups` | List and search by hostgroups |
| Subnet | `view_subnets` | List subnets and get subnet details |
| Domain | `view_domains` | List domains and get domain details |
| SmartProxy | `view_smart_proxies` | List smart proxies and get proxy details |
### Recommended Roles
Instead of assigning individual permissions, you can use these built-in roles:
| Role | Description | Recommended For |
|------|-------------|-----------------|
| **Viewer** | Read-only access to most Foreman resources | General monitoring and inventory queries |
| **Ansible Tower Inventory Reader** | Specific permissions for inventory access | Automated systems integration |
| **Organization admin** | Full access within assigned organizations | Organization-specific administration |
**Note**: The "Viewer" role provides the most appropriate permissions for this MCP server's read-only operations.
## MCP Configuration
Add to your MCP client configuration:
```json
{
"foreman-mcp-server": {
"command": "foreman-mcp-server",
"env": {
"FOREMAN_URL": "https://foreman.example.com",
"FOREMAN_USERNAME": "your-username",
"FOREMAN_PASSWORD": "your-password",
"FOREMAN_VERIFY_SSL": "true"
}
}
}
```
## Available Tools
### Host Management
- `list_hosts(search, per_page, page)` - List hosts with optional search
- `get_host(host_id)` - Get detailed host information
- `get_host_status(host_id)` - Get status information for a specific host
### Host Search Functions
- `search_hosts_by_location(location, per_page)` - Search by location
- `search_hosts_by_os(os_name, per_page)` - Search by operating system
- `search_hosts_by_environment(environment, per_page)` - Search by environment
- `search_hosts_by_hostgroup(hostgroup, per_page)` - Search by hostgroup
- `search_hosts_by_fact(fact_name, fact_value, per_page)` - Search by custom facts
### Infrastructure Information
- `list_organizations(per_page)` - List all organizations
- `list_locations(per_page)` - List all locations
- `list_hostgroups(per_page)` - List all hostgroups
- `list_subnets(per_page)` - List all subnets
- `get_subnet(subnet_id)` - Get detailed subnet information
- `list_domains(per_page)` - List all domains
- `get_domain(domain_id)` - Get detailed domain information
- `list_smart_proxies(per_page)` - List all smart proxies
- `get_smart_proxy(proxy_id)` - Get detailed smart proxy information
### OS Management
- `list_operatingsystems(per_page)` - List all operating systems
- `get_operatingsystem(os_id)` - Get detailed operating system information
- `list_architectures(per_page)` - List all architectures
- `get_architecture(arch_id)` - Get detailed architecture information
- `list_media(per_page)` - List all installation media
- `get_media(media_id)` - Get detailed installation media information
### Content Management
- `list_content_views(per_page)` - List all content views
- `get_content_view(cv_id)` - Get detailed content view information
- `list_repositories(per_page)` - List all repositories
- `get_repository(repo_id)` - Get detailed repository information
- `list_lifecycle_environments(per_page)` - List all lifecycle environments
- `get_lifecycle_environment(env_id)` - Get detailed lifecycle environment information
## Development
```bash
pip install -e ".[dev]"
pytest
```
## Support
- [GitHub Issues](https://github.com/rorymcmahon/foreman-mcp-server/issues)
- [Changelog](CHANGELOG.md)
TDQS
Scored across 29 tools
Each tool targets a distinct resource and action (get vs list vs search with specific filters), with no overlapping purposes. For example, get_host vs get_host_status provide different aspects of the same entity, and list_hosts vs search_hosts_by_* use different filtering mechanisms.
All tools follow a consistent verb_noun pattern: get_* for singular resources, list_* for plural collections, and search_hosts_by_* for filtered host queries. No mixing of conventions such as camelCase or inconsistent verb choices.
With 29 tools, the count is slightly higher than the typical 3-15 range, but it is well-justified for a domain (Foreman infrastructure management) that involves many distinct resource types (architectures, content views, hosts, etc.). Each tool addresses a specific entity, making the set reasonably scoped.
The tool set is strictly read-only (only get and list operations) with no create, update, or delete capabilities. This leaves obvious gaps in lifecycle management for all entities (e.g., no ability to create or modify hosts, repositories, or content views), which will hinder agents needing full CRUD coverage.