MewCP Chef Server MCP Server
Hosted, Stateless & Multitenant Chef Server MCP server enables AI assistants to manage infrastructure, nodes, cookbooks, and automation workflows through Chef Server.
Documentation
CL Chef Server MCP Server
A Model Context Protocol (MCP) server that exposes the Chef Infra Server API for generic, stateless, multi-tenant API operations.
Overview
This MCP is an integration server for Chef Infra Server and follows Curious Layer standards:
- Stateless and multi-tenant by design
- Per-request authentication (no shared in-memory auth/session state)
- Generic API coverage for all Chef Server endpoints via tool calls
Authentication
All tenant-facing tools require authentication input on every call.
Chef Signature Auth (default)
Use this auth payload format in auth_data:
{
"auth_type": "chef-signature",
"user_id": "pivotal",
"private_key": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----",
"auth_version": "1.3",
"chef_version": "18.0.0",
"server_api_version": "1"
}
Notes:
- private_key_base64 can be used instead of private_key.
- auth_version supports 1.3 (recommended) and 1.0.
Basic Auth (for endpoints like /_stats)
{
"auth_type": "basic",
"basic_username": "statsuser",
"basic_password": "your-password"
}
Tools
This server exposes dedicated tools per endpoint functionality (instead of a generic wrapper).
- health_check
Global endpoint tools:
- chef_authenticate_user
- chef_get_license
- chef_list_organizations_global
- chef_create_organization_global
- chef_get_organization_global
- chef_update_organization_global
- chef_delete_organization_global
- chef_get_stats
- chef_get_status
- chef_list_users_global
- chef_create_user_global
- chef_get_user_global
- chef_update_user_global
- chef_delete_user_global
- chef_list_user_keys_global
- chef_create_user_key_global
- chef_get_user_key_global
- chef_update_user_key_global
- chef_delete_user_key_global
- chef_get_universe_global
Organization endpoint tools:
- chef_list_association_requests
- chef_create_association_request
- chef_delete_association_request
- chef_list_clients
- chef_create_client
- chef_get_client
- chef_update_client
- chef_delete_client
- chef_list_client_keys
- chef_create_client_key
- chef_get_client_key
- chef_update_client_key
- chef_delete_client_key
- chef_list_containers
- chef_create_container
- chef_get_container
- chef_delete_container
- chef_list_cookbook_artifacts
- chef_get_cookbook_artifact
- chef_get_cookbook_artifact_version
- chef_upsert_cookbook_artifact_version
- chef_delete_cookbook_artifact_version
- chef_list_cookbooks
- chef_get_latest_cookbooks
- chef_get_latest_recipes
- chef_get_cookbook
- chef_get_cookbook_version
- chef_upsert_cookbook_version
- chef_delete_cookbook_version
- chef_list_data_bags
- chef_create_data_bag
- chef_get_data_bag
- chef_create_data_bag_item
- chef_delete_data_bag
- chef_get_data_bag_item
- chef_update_data_bag_item
- chef_delete_data_bag_item
- chef_list_environments
- chef_create_environment
- chef_get_default_environment
- chef_get_environment
- chef_update_environment
- chef_delete_environment
- chef_get_environment_cookbook
- chef_resolve_environment_cookbook_versions
- chef_list_environment_cookbooks
- chef_list_environment_nodes
- chef_list_environment_recipes
- chef_get_environment_role_run_list
- chef_list_groups
- chef_create_group
- chef_get_group
- chef_update_group
- chef_delete_group
- chef_list_nodes
- chef_create_node
- chef_get_node
- chef_update_node
- chef_delete_node
- chef_head_node
- chef_list_policies
- chef_list_policy_groups
- chef_get_principal
- chef_get_required_recipe
- chef_list_roles
- chef_create_role
- chef_get_role
- chef_update_role
- chef_delete_role
- chef_list_role_environments
- chef_get_role_environment
- chef_create_sandbox
- chef_commit_sandbox
- chef_list_search_indexes
- chef_search_index
- chef_partial_search_index
- chef_get_updated_since
- chef_list_org_users
- chef_associate_org_user
- chef_get_org_user
- chef_disassociate_org_user
Setup
pip install -r requirements.txt
Running the Server
# stdio
python server.py
# sse
python server.py --transport sse --host 127.0.0.1 --port 8001
# streamable-http
python server.py --transport streamable-http --host 127.0.0.1 --port 8001
Example Tool Calls
Global endpoint request
{
"tool": "chef_list_organizations_global",
"arguments": {
"auth_data": "{\"auth_type\":\"chef-signature\",\"user_id\":\"pivotal\",\"private_key\":\"-----BEGIN RSA PRIVATE KEY-----\\n...\\n-----END RSA PRIVATE KEY-----\"}",
"server_url": "https://chef.example.com",
"path_params": "{}",
"query_params": "{}"
}
}
Organization-scoped request
{
"tool": "chef_list_nodes",
"arguments": {
"auth_data": "{\"auth_type\":\"chef-signature\",\"user_id\":\"my-client\",\"private_key\":\"-----BEGIN RSA PRIVATE KEY-----\\n...\\n-----END RSA PRIVATE KEY-----\"}",
"server_url": "https://chef.example.com",
"path_params": "{\"organization\":\"my-org\"}",
"query_params": "{}"
}
}
Basic auth endpoint request
{
"tool": "chef_get_stats",
"arguments": {
"auth_data": "{\"auth_type\":\"basic\",\"basic_username\":\"statsuser\",\"basic_password\":\"secret\"}",
"server_url": "https://chef.example.com",
"path_params": "{}",
"query_params": "{\"format\":\"json\"}"
}
}
Project Structure
cl-mcp-chef-server/
|-- server.py
|-- requirements.txt
|-- README.md
`-- chef_server_mcp/
|-- __init__.py
|-- cli.py
|-- config.py
|-- tools.py
|-- schemas.py
`-- service.py
Resources
- Chef Infra Server API docs: https://docs.chef.io/server/api_chef_server/
- FastMCP docs: https://gofastmcp.com/v2/getting-started/welcome