Skip to main content
Glama
call518

MCP-OpenStack-Ops

by call518

MCP-OpenStack-Ops

MCP OpenStack Operations Server: A comprehensive MCP (Model Context Protocol) server providing OpenStack project management and monitoring capabilities with built-in safety controls and single-project scope.

License: MIT Python Docker Pulls BuyMeACoffee

Deploy to PyPI with tag PyPI PyPI - Downloads


Architecture & Internal (DeepWiki)

Ask DeepWiki


Related MCP server: mcpdeployment

Features

  • Project-Scoped Operations: Every tool enforces the configured OS_PROJECT_NAME, validating resource ownership so actions stay inside a single tenant.

  • Safety-Gated Writes: Modify (set_*) tooling only registers when ALLOW_MODIFY_OPERATIONS=true, keeping default deployments read-only and auditable.

  • 90+ Purpose-Built Tools: Broad coverage across compute, networking, storage, images, identity, Heat, and Octavia load balancing tasks—all constrained to the current project.

  • Bulk & Filtered Actions: Instance, volume, network, image, snapshot, and keypair managers accept comma-delimited targets or filter criteria to orchestrate bulk changes intentionally.

  • Post-Action Feedback & Async Guidance: Mutating tools reuse a shared result handler that adds emoji status checks, asynchronous timing notes, and follow-up verification commands.

  • Monitoring & Usage Insights: get_service_status, get_resource_monitoring, get_usage_statistics, and quota tools surface service availability, utilization, and capacity for the active project.

  • Unified Instance Queries: The get_instance tool consolidates name, ID, status, and free-form search paths with pagination plus summary/detailed modes.

  • Server Insight & Audit Trail: Dedicated tools expose server events, hypervisor details, availability zones, quotas, and resource ownership to speed diagnostics.

  • Load Balancer Management: Octavia tools cover listeners, pools, members, health monitors, flavors, quotas, and amphora operations with the same safety gates.

  • Connection & Deployment Flexibility: Connection caching, configurable service endpoints, Docker packaging, and both stdio/streamable-http transports support proxy/bastion and multi-project setups.

⚠️ Compatibility Notice: This MCP server is developed and optimized for OpenStack Epoxy (2025.1) as the primary target environment. However, it is compatible with most modern OpenStack releases (Dalmatian, Caracal, Bobcat, etc.) as the majority of APIs remain consistent across versions. Only a few specific API endpoints may require adaptation for full compatibility with older releases.

🚧 Coming Soon: Dynamic multi-version OpenStack API compatibility is actively under development and will be available in upcoming releases, providing seamless support for all major OpenStack deployments automatically.

🔧 OpenStackSDK Version Customization for Older Releases

Officially Supported Releases:

  • ✅ OpenStack Epoxy (2025.1) - Fully tested

  • ✅ OpenStack Dalmatian (2024.2) - Fully tested

For older OpenStack releases (Wallaby, Caracal, Bobcat, etc.), you may need to customize the OpenStackSDK version to match your environment. The SDK version must be changed in BOTH files:

Step 1: Modify Dockerfile.MCP-Server

RUN pip install \
        'uv>=0.8.5' \
        'mcpo>=0.0.17' \
        'fastmcp>=2.12.3' \
        'aiohttp>=3.12.0' \
        'openstacksdk==3.1.1' \  # ← Change to your required version (e.g., 3.1.1 for Wallaby)
        'python-dotenv>=1.0.0'

Step 2: Modify pyproject.toml

dependencies = [
    "fastmcp>=2.12.3",
    "openstacksdk==3.1.1",  # ← Must match Dockerfile version
    "python-dotenv>=1.1.1",
    # ... other dependencies
]

Step 3: Rebuild Docker Image

docker-compose build --no-cache mcp-server
docker-compose up -d

OpenStackSDK Version Reference:

OpenStack Release

Recommended SDK Version

Notes

Epoxy (2025.1)

>=3.3.0

Current default

Dalmatian (2024.2)

>=3.2.0

Fully compatible

Caracal (2024.1)

>=3.1.0

May require testing

Bobcat (2023.2)

>=3.0.0

May require testing

Wallaby (2021.1)

==3.1.1

Downgrade required

⚠️ Important: Both Dockerfile.MCP-Server and pyproject.toml must have the same version to avoid dependency conflicts during container runtime.


Screenshots

OpenStack Dashboard (Epoxy 2025.1)

OpenStack Dashboard (Epoxy 2025.1)

MCP Query Example - Cluster Status

Example Cluster Status


🆕 Latest Enhancements (v1.x)

Bulk Operations & Filter-based Targeting

Revolutionary approach to resource management enabling one-step operations:

# Traditional approach (multiple steps):
1. search_instances("test") → get list
2. set_instance("vm1", "stop") → stop individually  
3. set_instance("vm2", "stop") → stop individually

# NEW enhanced approach (single step):
set_instance(action="stop", name_contains="test")  # ✨ Stops ALL instances containing "test"

Supported Tools with Enhanced Capabilities:

  • set_instance: Bulk lifecycle management with filtering (name_contains, status, flavor_contains, image_contains)

  • set_volume: Bulk volume operations with filtering (name_contains, status, size filtering)

  • set_image: Bulk image management with filtering (name_contains, status)

  • set_networks: Bulk network operations with filtering (name_contains, status)

  • set_keypair: Bulk keypair management with filtering (name_contains)

  • set_snapshot: Bulk snapshot operations with filtering (name_contains, status)

Input Format Flexibility:

# Single resource
resource_names="vm1"

# Multiple resources (comma-separated)
resource_names="vm1,vm2,vm3"

# JSON array format
resource_names='["vm1", "vm2", "vm3"]'

# Filter-based (automatic target identification)
name_contains="test", status="ACTIVE"

Post-Action Status Verification

Every operation now provides immediate feedback with visual indicators:

✅ Bulk Instance Management - Action: stop
📊 Total instances: 3
✅ Successes: 2
❌ Failures: 1

Post-Action Status:
🟢 test-vm-1: SHUTOFF  
🟢 test-vm-2: SHUTOFF
🔴 test-vm-3: ERROR

Unified Resource Queries

New consolidated get_instance tool replaces multiple separate tools:

  • ❌ Old: get_instance_details, get_instance_info, get_instance_status, get_instance_network_info

  • ✅ New: get_instance(instance_names="vm1,vm2") - Single tool, comprehensive information


📊 OpenStack CLI vs MCP Tools Mapping

Detailed Mapping by Category

1. 🖥️ Compute (Nova)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack server list

get_instance

NEW UNIFIED - Pagination, filtering support

openstack server show

get_instance

ENHANCED - Replaces get_instance_by_name, get_instance_by_id

openstack server create

set_instance (action="create")

ENHANCED - Bulk creation support

openstack server start/stop/reboot

set_instance

ENHANCED - Bulk operations with filtering

openstack server delete

set_instance (action="delete")

ENHANCED - Bulk deletion with name_contains filtering

openstack server backup create

set_server_backup

Backup creation with rotation

openstack server image create

set_instance (action="snapshot")

Image/snapshot creation

openstack server shelve/unshelve

set_instance

Instance shelving

openstack server lock/unlock

set_instance

Instance locking

openstack server pause/unpause

set_instance

Instance pausing

openstack server suspend/resume

set_instance

Instance suspension

openstack server resize

set_instance (action="resize")

Instance resizing

openstack server resize confirm

set_instance (action="confirm_resize")

Resize confirmation

openstack server resize revert

set_instance (action="revert_resize")

Resize revert

openstack server rebuild

set_instance (action="rebuild")

Instance rebuilding

openstack server rescue/unrescue

set_instance

Recovery mode

openstack server migrate

set_server_migration (action="migrate")

Live migration

openstack server evacuate

set_server_migration (action="evacuate")

Server evacuation

openstack server migration list

set_server_migration (action="list")

Migration listing

openstack server migration show

set_server_migration (action="show")

Migration details

openstack server migration abort

set_server_migration (action="abort")

Migration abort

openstack server migration confirm

set_server_migration (action="confirm")

Migration confirmation

openstack server migration force complete

set_server_migration (action="force_complete")

Force migration completion

openstack server add network

set_server_network (action="add_network")

Network attachment

openstack server remove network

set_server_network (action="remove_network")

Network detachment

openstack server add port

set_server_network (action="add_port")

Port attachment

openstack server remove port

set_server_network (action="remove_port")

Port detachment

openstack server add floating ip

set_server_floating_ip (action="add")

Floating IP association

openstack server remove floating ip

set_server_floating_ip (action="remove")

Floating IP disassociation

openstack server add fixed ip

set_server_fixed_ip (action="add")

Fixed IP addition

openstack server remove fixed ip

set_server_fixed_ip (action="remove")

Fixed IP removal

openstack server add security group

set_server_security_group (action="add")

Security group addition

openstack server remove security group

set_server_security_group (action="remove")

Security group removal

openstack server add volume

set_server_volume (action="attach")

Volume attachment

openstack server remove volume

set_server_volume (action="detach")

Volume detachment

openstack server set

set_server_properties (action="set")

Server property setting

openstack server unset

set_server_properties (action="unset")

Server property unsetting

openstack server dump create

set_server_dump

Server dump creation

openstack server event list

get_server_events

Server event tracking

openstack server group list

get_server_groups

Server group listing

openstack server group create/delete

set_server_group

Server group management

openstack flavor list

get_flavor_list (via cluster_status)

Flavor listing

openstack flavor create/delete

set_flavor

Flavor management

openstack keypair list

get_keypair_list

Keypair listing

openstack keypair create/delete

set_keypair

Keypair management

openstack hypervisor list

get_hypervisor_details

Hypervisor querying

openstack availability zone list

get_availability_zones

Availability zone listing

2. 🌐 Network (Neutron)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack network list

get_network_details

Detailed network information

openstack network show

get_network_details (name param)

Specific network query

openstack network create

set_networks (action="create")

ENHANCED - Bulk network creation

openstack network delete

set_networks (action="delete")

ENHANCED - Bulk deletion with filtering

openstack network set

set_networks (action="update")

ENHANCED - Bulk updates

openstack subnet list

get_network_details (includes subnets)

Subnet information included

openstack subnet create/delete

set_subnets

Subnet management

openstack router list

get_routers

Router listing

openstack router create/delete

(Not yet implemented)

🚧

Router management

openstack floating ip list

get_floating_ips

Floating IP listing

openstack floating ip create

set_floating_ip (action="create")

Floating IP creation

openstack floating ip delete

set_floating_ip (action="delete")

Floating IP deletion

openstack floating ip set

set_floating_ip (action="set")

Floating IP property setting

openstack floating ip show

set_floating_ip (action="show")

Floating IP details

openstack floating ip unset

set_floating_ip (action="unset")

Floating IP property clearing

openstack floating ip pool list

get_floating_ip_pools

Floating IP pool listing

openstack floating ip port forwarding create

set_floating_ip_port_forwarding (action="create")

Port forwarding creation

openstack floating ip port forwarding delete

set_floating_ip_port_forwarding (action="delete")

Port forwarding deletion

openstack floating ip port forwarding list

set_floating_ip_port_forwarding (action="list")

Port forwarding listing

openstack floating ip port forwarding set

set_floating_ip_port_forwarding (action="set")

Port forwarding updates

openstack floating ip port forwarding show

set_floating_ip_port_forwarding (action="show")

Port forwarding details

openstack security group list

get_security_groups

Security group listing

openstack security group create/delete

(Not yet implemented)

🚧

Security group management

openstack port list

get_network_details (includes ports)

Port information included

openstack port create/delete

set_network_ports

Port management

openstack network qos policy list

(Not yet implemented)

🚧

QoS policy listing

openstack network qos policy create

set_network_qos_policies

QoS policy management

openstack network agent list

get_service_status (includes agents)

Network agents

openstack network agent set

set_network_agents

Network agent management

3. 💾 Storage (Cinder)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack volume list

get_volume_list

Volume listing

openstack volume show

get_volume_list (filtering)

Specific volume query

openstack volume create/delete

set_volume

Volume creation/deletion

openstack volume set

set_volume (action="modify")

Volume property modification

openstack volume type list

get_volume_types

Volume type listing

openstack volume type create/delete

(Not yet implemented)

🚧

Volume type management

openstack volume snapshot list

get_volume_snapshots

Snapshot listing

openstack volume snapshot create/delete

set_snapshot

Snapshot management

openstack backup list

(Not yet implemented)

🚧

Backup listing

openstack backup create/delete

set_volume_backups

Volume backup management

openstack volume transfer request list

(Not yet implemented)

🚧

Volume transfer

openstack server volume list

get_server_volumes

Server volume listing

openstack server add/remove volume

set_server_volume

Server volume attach/detach

openstack volume group list

(Not yet implemented)

🚧

Volume group listing

openstack volume group create

set_volume_groups

Volume group management

openstack volume qos list

(Not yet implemented)

🚧

QoS listing

openstack volume qos create

set_volume_qos

QoS management

4. 🖼️ Image (Glance)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack image list

get_image_detail_list

Image listing

openstack image show

get_image_detail_list (filtering)

Specific image query

openstack image create

set_image (action="create")

Enhanced image creation with min_disk, min_ram, properties

openstack image delete

set_image (action="delete")

Image deletion

openstack image set

set_image (action="update")

Image property modification

openstack image save

set_image (action="save")

Image download

openstack image add project

(Not yet implemented)

🚧

Project sharing

openstack image member list

(Not yet implemented)

🚧

Member listing

openstack image member create

set_image_members

Image member management

openstack image set --property

set_image_metadata

Image metadata

openstack image set --public/private

set_image_visibility

Image visibility setting

5. 👥 Identity (Keystone)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack user list

get_user_list

User listing

openstack user show

get_user_list (filtering)

Specific user query

openstack user create/delete

(Not yet implemented)

🚧

User management

openstack project list

get_project_details

Project listing

openstack project show

get_project_details (name param)

Specific project query

openstack project create/delete

set_project

Project management

openstack role list

get_role_assignments

Role listing

openstack role assignment list

get_role_assignments

Role assignment listing

openstack role create/delete

set_roles

Role management

openstack domain list

(Not yet implemented)

🚧

Domain listing

openstack domain create/delete

set_domains

Domain management

openstack group list

(Not yet implemented)

🚧

Group listing

openstack group create/delete

set_identity_groups

Group management

openstack service list

get_service_status

Service listing

openstack service create/delete

set_services

Service management

openstack endpoint list

get_service_status (includes endpoints)

Endpoint information

6. 🔥 Orchestration (Heat)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack stack list

get_heat_stacks

Stack listing

openstack stack show

get_heat_stacks (filtering)

Specific stack query

openstack stack create

set_heat_stack (action="create")

Stack creation

openstack stack delete

set_heat_stack (action="delete")

Stack deletion

openstack stack update

set_heat_stack (action="update")

Stack update

openstack stack suspend/resume

set_heat_stack

Stack suspend/resume

openstack stack resource list

(Not yet implemented)

🚧

Stack resource listing

openstack stack event list

(Not yet implemented)

🚧

Stack event listing

openstack stack template show

(Not yet implemented)

🚧

Template query

openstack stack output list

(Not yet implemented)

🚧

Stack output listing

7. ⚖️ Load Balancer (Octavia)

OpenStack CLI Command

MCP Tool

Status

Notes

openstack loadbalancer list

get_load_balancer_status

Load balancer listing with pagination

openstack loadbalancer show

get_load_balancer_status

Load balancer detailed information

openstack loadbalancer create

set_load_balancer (action="create")

Load balancer creation

openstack loadbalancer delete

set_load_balancer (action="delete")

Load balancer deletion

openstack loadbalancer set

set_load_balancer (action="update")

Load balancer property update

openstack loadbalancer stats show

get_load_balancer_status

Load balancer statistics

openstack loadbalancer status show

get_load_balancer_status

Load balancer status tree

openstack loadbalancer failover

set_load_balancer (action="failover")

Load balancer failover

openstack loadbalancer unset

set_load_balancer (action="unset")

Load balancer property unset

Listener Management

openstack loadbalancer listener list

get_load_balancer_listeners

Listener listing for load balancer

openstack loadbalancer listener create

set_load_balancer_listener (action="create")

Listener creation (HTTP/HTTPS/TCP/UDP)

openstack loadbalancer listener delete

set_load_balancer_listener (action="delete")

Listener deletion

openstack loadbalancer listener show

get_load_balancer_listeners

Listener detailed information

openstack loadbalancer listener set

set_load_balancer_listener (action="update")

Listener property update

openstack loadbalancer listener stats show

get_load_balancer_listeners

Listener statistics

openstack loadbalancer listener unset

set_load_balancer_listener (action="unset")

Listener property unset

Pool Management

openstack loadbalancer pool list

get_load_balancer_pools

Pool listing (all or by listener)

openstack loadbalancer pool create

set_load_balancer_pool (action="create")

Pool creation with algorithms

openstack loadbalancer pool delete

set_load_balancer_pool (action="delete")

Pool deletion

openstack loadbalancer pool set

set_load_balancer_pool (action="update")

Pool property update

openstack loadbalancer pool show

get_load_balancer_pools

Pool detailed information

openstack loadbalancer pool stats show

get_load_balancer_pools

Pool statistics

openstack loadbalancer pool unset

set_load_balancer_pool (action="unset")

Pool property unset

Member Management

openstack loadbalancer member list

get_load_balancer_members

Pool member listing

openstack loadbalancer member create

set_load_balancer_member (action="create")

Pool member creation

openstack loadbalancer member delete

set_load_balancer_member (action="delete")

Pool member deletion

openstack loadbalancer member set

set_load_balancer_member (action="update")

Pool member property update

openstack loadbalancer member show

get_load_balancer_members

Pool member detailed information

openstack loadbalancer member unset

set_load_balancer_member (action="unset")

Pool member property unset

Health Monitor Management

openstack loadbalancer healthmonitor list

get_load_balancer_health_monitors

Health monitor listing

openstack loadbalancer healthmonitor create

set_load_balancer_health_monitor (action="create")

Health monitor creation

openstack loadbalancer healthmonitor delete

set_load_balancer_health_monitor (action="delete")

Health monitor deletion

openstack loadbalancer healthmonitor set

set_load_balancer_health_monitor (action="update")

Health monitor update

openstack loadbalancer healthmonitor show

get_load_balancer_health_monitors

Health monitor detailed information

openstack loadbalancer healthmonitor unset

set_load_balancer_health_monitor (action="unset")

Health monitor property unset

L7 Policy Management

openstack loadbalancer l7policy list

get_load_balancer_l7_policies

L7 policy listing

openstack loadbalancer l7policy create

set_load_balancer_l7_policy (action="create")

L7 policy creation

openstack loadbalancer l7policy delete

set_load_balancer_l7_policy (action="delete")

L7 policy deletion

openstack loadbalancer l7policy set

set_load_balancer_l7_policy (action="update")

L7 policy update

openstack loadbalancer l7policy show

get_load_balancer_l7_policies

L7 policy details

openstack loadbalancer l7policy unset

set_load_balancer_l7_policy (action="unset")

L7 policy property unset

L7 Rule Management 🆕

openstack loadbalancer l7rule list

get_load_balancer_l7_rules

L7 rule listing

openstack loadbalancer l7rule create

set_load_balancer_l7_rule (action="create")

L7 rule creation

openstack loadbalancer l7rule delete

set_load_balancer_l7_rule (action="delete")

L7 rule deletion

openstack loadbalancer l7rule set

set_load_balancer_l7_rule (action="update")

L7 rule update

openstack loadbalancer l7rule show

get_load_balancer_l7_rules

L7 rule details

openstack loadbalancer l7rule unset

set_load_balancer_l7_rule (action="unset")

L7 rule property unset

Amphora Management 🆕

openstack loadbalancer amphora list

get_load_balancer_amphorae

Amphora listing

openstack loadbalancer amphora show

set_load_balancer_amphora (action="show")

Amphora details

openstack loadbalancer amphora configure

set_load_balancer_amphora (action="configure")

Amphora configuration

openstack loadbalancer amphora failover

set_load_balancer_amphora (action="failover")

Amphora failover

openstack loadbalancer amphora delete

N/A

Not supported by OpenStack SDK

openstack loadbalancer amphora stats show

N/A

Not supported by OpenStack SDK

Provider Management

openstack loadbalancer provider list

get_load_balancer_providers

Provider listing

openstack loadbalancer provider capability list

get_load_balancer_providers

Provider capability listing

Availability Zone Management 🆕

openstack loadbalancer availabilityzone list

get_load_balancer_availability_zones

Availability zone listing

openstack loadbalancer availabilityzone show

get_load_balancer_availability_zones

Availability zone details

openstack loadbalancer availabilityzone create

set_load_balancer_availability_zone (action="create")

Availability zone creation

openstack loadbalancer availabilityzone delete

set_load_balancer_availability_zone (action="delete")

Availability zone deletion

openstack loadbalancer availabilityzone set

set_load_balancer_availability_zone (action="update")

Availability zone update

openstack loadbalancer availabilityzone unset

set_load_balancer_availability_zone (action="unset")

Availability zone property unset

Flavor Management 🆕

openstack loadbalancer flavor list

get_load_balancer_flavors

Flavor listing

openstack loadbalancer flavor show

get_load_balancer_flavors

Flavor details

openstack loadbalancer flavor create

set_load_balancer_flavor (action="create")

Flavor creation

openstack loadbalancer flavor delete

set_load_balancer_flavor (action="delete")

Flavor deletion

openstack loadbalancer flavor set

set_load_balancer_flavor (action="update")

Flavor update

openstack loadbalancer flavor unset

set_load_balancer_flavor (action="unset")

Flavor property unset

Flavor Profile Management

openstack loadbalancer flavorprofile list

get_load_balancer_flavor_profiles

Flavor profile listing

openstack loadbalancer flavorprofile show

get_load_balancer_flavor_profiles

Flavor profile details

openstack loadbalancer flavorprofile create

set_load_balancer_flavor_profile (action="create")

Flavor profile creation

openstack loadbalancer flavorprofile set

set_load_balancer_flavor_profile (action="update")

Flavor profile update

openstack loadbalancer flavorprofile unset

set_load_balancer_flavor_profile (action="unset")

Flavor profile property unset

openstack loadbalancer flavorprofile delete

set_load_balancer_flavor_profile (action="delete")

🚧

Pending implementation

Quota Management 🆕

openstack loadbalancer quota list

get_load_balancer_quotas

Quota listing

openstack loadbalancer quota show

get_load_balancer_quotas

Quota details

openstack loadbalancer quota set

set_load_balancer_quota (action="set")

Quota setting

openstack loadbalancer quota reset

set_load_balancer_quota (action="reset")

Quota reset

8. 📊 Monitoring & Logging

OpenStack CLI Command

MCP Tool

Status

Notes

Resource monitoring

get_resource_monitoring

Resource monitoring

Service status

get_service_status

Service status query

Cluster overview

get_cluster_status

Cluster overview

Service logs

set_service_logs

Service log management

System metrics

set_metrics

Metrics management

Alarm management

set_alarms

Alarm management

Compute agents

set_compute_agents

Compute agent management

Usage statistics

get_usage_statistics

Usage statistics

9. 📏 Usage & Quota

OpenStack CLI Command

MCP Tool

Status

Notes

openstack quota show

get_quota

Quota query

openstack quota set

set_quota

Quota setting

openstack usage show

get_usage_statistics

Usage query

openstack limits show

get_quota (includes limits)

Limits query

Resource utilization

get_resource_monitoring

Resource utilization


Quick Start

💡 Need an OpenStack Cluster for Testing?
Check out this comprehensive guide: Tutorial: Install OpenStack Multinode Cluster /w Kolla-Ansible (Epoxy/Dalmatian)
Perfect for setting up a test environment to explore MCP-OpenStack-Ops capabilities.

Flow Diagram of Quickstart/Tutorial

1. Environment Setup

# Clone and navigate to project
cd MCP-OpenStack-Ops

# Install dependencies
uv sync

# Configure environment
cp .env.example .env
# Edit .env with your OpenStack credentials

Environment Configuration

Configure your .env file with OpenStack credentials:

# OpenStack Authentication (required)
OS_AUTH_HOST=your-openstack-host
OS_AUTH_PORT=5000
OS_AUTH_PROTOCOL=http  # Use 'https' for production with SSL/TLS
# OS_CACERT=/etc/ssl/certs/openstack-ca.pem  # Required for HTTPS (optional for HTTP)
OS_IDENTITY_API_VERSION=3
OS_USERNAME=your-username
OS_PASSWORD=your-password
OS_PROJECT_NAME=your-project
OS_PROJECT_DOMAIN_NAME=default
OS_USER_DOMAIN_NAME=default
OS_REGION_NAME=RegionOne

# OpenStack Service Ports (customizable)
OS_COMPUTE_PORT=8774
OS_NETWORK_PORT=9696
OS_VOLUME_PORT=8776
OS_IMAGE_PORT=9292
OS_PLACEMENT_PORT=8780
OS_HEAT_STACK_PORT=8004
OS_HEAT_STACK_CFN_PORT=8000

# MCP Server Configuration (optional)
MCP_LOG_LEVEL=INFO
ALLOW_MODIFY_OPERATIONS=false
FASTMCP_TYPE=stdio
FASTMCP_HOST=127.0.0.1
FASTMCP_PORT=8080

HTTPS Configuration for Production Environments

For secure OpenStack deployments with SSL/TLS:

# Enable HTTPS protocol
OS_AUTH_PROTOCOL=https
OS_AUTH_HOST=your-secure-openstack-host
OS_AUTH_PORT=13000  # Your HTTPS Keystone port

# SSL Certificate Configuration
# Option 1: Use custom CA certificate (recommended for production)
OS_CACERT=/etc/ssl/certs/openstack-ca.pem

# Option 2: Skip CA certificate (SSL verification disabled - insecure)
# Just omit OS_CACERT - the server will warn you about insecure connection

# Docker: Mount CA certificate into container
# Add to docker-compose.yml volumes:
#   - /path/to/your/ca-cert.pem:/etc/ssl/certs/openstack-ca.pem:ro

Protocol Configuration Notes:

  • OS_AUTH_PROTOCOL=http: Use for local development or HTTP-only OpenStack deployments

  • OS_AUTH_PROTOCOL=https: Use for production environments with SSL/TLS enabled

  • When https is set without OS_CACERT, SSL verification is disabled (insecure but functional)

  • For secure production deployments, always provide OS_CACERT with your CA certificate path

2. Run Server

# Start all services
docker-compose up -d

# Check logs
docker-compose logs mcp-server
docker-compose logs mcpo-proxy

Container Architecture:

  • mcp-server: OpenStack MCP server with tools

  • mcpo-proxy: OpenAPI (REST-API)

  • open-webui: Web interface for testing and interaction

📌 Note: Web-UI configuration instructions are based on OpenWebUI v0.6.22. Menu locations and settings may differ in newer versions.

Service URLs - Docker Internal:

  • MCP Server: localhost:8080 (HTTP transport)

  • MCPO Proxy: localhost:8000 (OpenStack API proxy)

  • Open WebUI: localhost:3000 (Web interface)

Service URLs - Docker External:

  • MCP Server: host.docker.internal:18005 (HTTP transport)

  • MCPO Proxy: host.docker.internal:8005 (OpenStack API proxy)

  • Open WebUI: host.docker.internal:3005 (Web interface)

For Claude Desktop Integration

Add to your Claude Desktop configuration:

{
  "mcpServers": {
    "mcp-openstack-ops": {
      "command": "uvx",
      "args": ["--python", "3.12", "mcp-openstack-ops"],
      "env": {
        "OS_AUTH_HOST": "your-openstack-host",
        "OS_AUTH_PORT": "5000",
        "OS_PROJECT_NAME": "your-project",
        "OS_USERNAME": "your-username",
        "OS_PASSWORD": "your-password",
        "OS_USER_DOMAIN_NAME": "Default",
        "OS_PROJECT_DOMAIN_NAME": "Default",
        "OS_REGION_NAME": "RegionOne",
        "OS_IDENTITY_API_VERSION": "3",
        "OS_INTERFACE": "internal",
        "OS_COMPUTE_PORT": "8774",
        "OS_NETWORK_PORT": "9696",
        "OS_VOLUME_PORT": "8776",
        "OS_IMAGE_PORT": "9292",
        "OS_PLACEMENT_PORT": "8780",
        "OS_HEAT_STACK_PORT": "8004",
        "OS_HEAT_STACK_CFN_PORT": "18888",
        "ALLOW_MODIFY_OPERATIONS": "false",
        "MCP_LOG_LEVEL": "INFO"
      }
    }
  }
}

Server Configuration

Command Line Options

uv run python -m mcp_openstack_ops --help

Options:
  --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Logging level
  --type {stdio,streamable-http}
                        Transport type (default: stdio)
  --host HOST          Host address for HTTP transport (default: 127.0.0.1)
  --port PORT          Port number for HTTP transport (default: 8080)
  --auth-enable        Enable Bearer token authentication for streamable-http mode
  --secret-key SECRET  Secret key for Bearer token authentication

Environment Variables

Variable

Description

Default

Usage

OpenStack Authentication

OS_AUTH_HOST

OpenStack Identity service host

Required

Authentication host address

OS_AUTH_PORT

OpenStack Identity service port

Required

Authentication port

OS_AUTH_PROTOCOL

Connection protocol (http or https)

http

Use https for production with SSL/TLS

OS_CACERT

SSL CA certificate path for HTTPS

Optional

Required for secure HTTPS connections (e.g., /etc/ssl/certs/ca.pem). If not set with HTTPS, SSL verification is disabled (insecure)

OS_USERNAME

OpenStack username

Required

User credentials

OS_PASSWORD

OpenStack password

Required

User credentials

OS_PROJECT_NAME

OpenStack project name

Required

Project scope

OS_IDENTITY_API_VERSION

Identity API version

3

API version

OS_PROJECT_DOMAIN_NAME

Project domain name

default

Domain scope

OS_USER_DOMAIN_NAME

User domain name

default

Domain scope

OS_REGION_NAME

OpenStack region

RegionOne

Regional scope

OpenStack Service Ports

OS_COMPUTE_PORT

Compute service port

8774

Nova endpoint

OS_NETWORK_PORT

Network service port

9696

Neutron endpoint

OS_VOLUME_PORT

Volume service port

8776

Cinder endpoint

OS_IMAGE_PORT

Image service port

9292

Glance endpoint

OS_PLACEMENT_PORT

Placement service port

8780

Placement endpoint

OS_HEAT_STACK_PORT

Heat orchestration service port

8004

Heat API endpoint

OS_HEAT_STACK_CFN_PORT

Heat CloudFormation service port

18888

Heat CFN API endpoint (default: 8000, changed to avoid Docker port conflicts)

MCP Server Configuration

MCP_LOG_LEVEL

Logging level

INFO

Development debugging

ALLOW_MODIFY_OPERATIONS

Enable modify operations

false

Safety control for state modifications

FASTMCP_TYPE

Transport type

stdio

Rarely needed to change

FASTMCP_HOST

HTTP host address

127.0.0.1

For HTTP mode only

FASTMCP_PORT

HTTP port number

8080

For HTTP mode only

Authentication (Optional)

REMOTE_AUTH_ENABLE

Enable Bearer token authentication for streamable-http mode

false

Production security

REMOTE_SECRET_KEY

Secret key for Bearer token authentication

Required when auth enabled

Production security


🔒 Project Isolation & Security

Single Project Scope Operation

MCP-OpenStack-Ops operates within a strictly defined project scope determined by the OS_PROJECT_NAME environment variable. This provides complete tenant isolation and data privacy in multi-tenant OpenStack environments.

Key Security Features:

  • 100% Complete Resource Isolation: All operations are restricted to resources within the specified project with enhanced security validation

  • Zero Cross-tenant Data Leakage: Advanced project ownership validation prevents access to resources from other projects

  • Multi-layer Security Filtering: Each service implements intelligent resource filtering by current project ID with additional validation

  • Secure Resource Lookup: All resource searches use project-scoped lookup with ownership verification

  • Shared Resource Access: Intelligently includes shared/public resources (networks, images) while maintaining strict security boundaries

  • Cross-Project Access Prevention: Enhanced protection against accidental operations on similarly-named resources in other projects

Filtered Resources by Project:

Service

Project-Scoped Resources

Notes

Identity

Users (via role assignments), Role assignments

Only users with roles in current project

Compute

Instances, Flavors (embedded data), Keypairs

All instances within project scope

Image

Private images (owned), Public/Community/Shared images

Smart filtering prevents zero-image issues

Network

Networks, Subnets, Security Groups, Floating IPs, Routers

Includes shared/external networks for access

Storage

Volumes, Snapshots, Backups

All storage resources within project

Orchestration

Heat Stacks, Stack Resources

All orchestration within project

Load Balancer

Load Balancers, Listeners, Pools

All load balancing within project

Monitoring

Resource usage, Project quotas

Project-specific monitoring data

Security Validation & Testing

Project Isolation Security Test

To verify that project isolation is working correctly, run the included security test:

# Run project isolation security test
python test_project_isolation.py

Expected Test Results:

🔒 OpenStack Project Isolation Security Test
==================================================
📋 Testing project isolation for: your-project

1️⃣ Testing Connection and Project ID...
✅ Connection successful
✅ Current project ID: abc123-def456-ghi789
✅ Project name 'your-project' matches project ID

2️⃣ Testing Resource Ownership Validation...
✅ Found 5 compute instances
   Instance web-server-01: ✅ Owned
   Instance db-server-01: ✅ Owned
✅ Found 3/8 owned networks
✅ Found 10/10 owned volumes

3️⃣ Testing Service-Level Project Filtering...
✅ Compute service returned 5 instances
✅ Network service returned 3 networks  
✅ Storage service returned 10 volumes

4️⃣ Testing Secure Resource Lookup...
ℹ️  Network 'admin' not found or not accessible in current project
ℹ️  Instance 'demo' not found or not accessible in current project

🎯 Project Isolation Test Results
========================================
✅ All security tests passed!
✅ Project 'your-project' isolation verified
✅ Cross-project access prevention confirmed

🔒 Your OpenStack MCP Server is properly secured!

Security Features Validated:

  • ✅ Project ID verification and matching

  • ✅ Resource ownership validation for all services

  • ✅ Service-level project filtering

  • ✅ Secure resource lookup with cross-project protection

  • ✅ Prevention of accidental operations on other projects' resources

For managing multiple OpenStack projects, deploy multiple MCP server instances with different OS_PROJECT_NAME values:

Example: Managing 3 Projects

# Project 1: Production Environment
OS_PROJECT_NAME=production
# ... other config
python -m mcp_openstack_ops --type stdio

# Project 2: Development Environment  
OS_PROJECT_NAME=development
# ... other config  
python -m mcp_openstack_ops --type streamable-http --port 8001

# Project 3: Testing Environment
OS_PROJECT_NAME=testing  
# ... other config
python -m mcp_openstack_ops --type streamable-http --port 8002

Claude Desktop Multi-Project Configuration Example:

{
  "mcpServers": {
    "openstack-production": {
      "command": "python",
      "args": ["-m", "mcp_openstack_ops", "--type", "stdio"],
      "env": {
        "OS_PROJECT_NAME": "production",
        "OS_USERNAME": "admin",
        "OS_PASSWORD": "your-password",
        "OS_AUTH_HOST": "192.168.35.2"
      }
    },
    "openstack-development": {
      "command": "python", 
      "args": ["-m", "mcp_openstack_ops", "--type", "stdio"],
      "env": {
        "OS_PROJECT_NAME": "development",
        "OS_USERNAME": "admin",
        "OS_PASSWORD": "your-password", 
        "OS_AUTH_HOST": "192.168.35.2"
      }
    },
    "openstack-testing": {
      "command": "python",
      "args": ["-m", "mcp_openstack_ops", "--type", "stdio"], 
      "env": {
        "OS_PROJECT_NAME": "testing",
        "OS_USERNAME": "admin",
        "OS_PASSWORD": "your-password",
        "OS_AUTH_HOST": "192.168.35.2"
      }
    }
  }
}

This allows Claude to access each project independently with complete isolation between environments.

📁 Ready-to-use Configuration File:

A complete multi-project configuration example is available at mcp-config.json.multi-project:

  • Production: Read-only operations for safety (ALLOW_MODIFY_OPERATIONS=false)

  • Development: Full operations enabled (ALLOW_MODIFY_OPERATIONS=true)

  • Testing: Debug logging enabled (MCP_LOG_LEVEL=DEBUG)

# Copy and customize the multi-project configuration
cp mcp-config.json.multi-project ~/.config/claude-desktop/mcp_servers.json
# Edit with your OpenStack credentials

Safety Controls

Modification Operations Protection

By default, all operations that can modify or delete OpenStack resources are disabled for safety:

# Default setting - Only read-only operations allowed
ALLOW_MODIFY_OPERATIONS=false

Protected Operations (when ALLOW_MODIFY_OPERATIONS=false):

  • Instance management (start, stop, restart, pause, unpause)

  • Volume operations (create, delete, attach, detach)

  • Keypair management (create, delete, import)

  • Floating IP operations (create, delete, associate, disassociate)

  • Snapshot management (create, delete)

  • Image management (create, delete, update)

  • Heat stack operations (create, delete, update)

Always Available (Read-Only Operations):

  • Cluster status and monitoring

  • Resource listings (instances, volumes, networks, etc.)

  • Service status checks

  • Usage and quota information

  • Search and filtering operations

⚠️ To Enable Modify Operations:

# Enable all operations (USE WITH CAUTION)
ALLOW_MODIFY_OPERATIONS=true

Tool Registration Behavior:

  • When ALLOW_MODIFY_OPERATIONS=false: Only read-only tools are registered with the MCP server

  • When ALLOW_MODIFY_OPERATIONS=true: All tools (read-only + modify operations) are registered

  • Tool availability is determined at server startup - restart required after changing this setting

Best Practices:

  • Keep ALLOW_MODIFY_OPERATIONS=false in production environments

  • Enable modify operations only in development/testing environments

  • Use separate configurations for different environments

  • Review operations before enabling modify capabilities

  • Restart the MCP server after changing the ALLOW_MODIFY_OPERATIONS setting


💬 Example Queries & Usage Patterns

For comprehensive examples of how to interact with this MCP server, including natural language queries and their corresponding tool mappings, see:

📖 Example Queries & Usage Patterns

This section includes:

  • 🎯 Cluster overview and status queries

  • �️ Instance management operations

  • 🌐 Network configuration tasks

  • � Storage management workflows

  • 🔥 Heat orchestration examples

  • ⚖️ Load balancer operations

  • � Advanced search patterns

  • 📊 Monitoring and troubleshooting

  • 🧠 Complex multi-tool query combinations


Performance Optimization

Large-Scale Environment Support

The MCP server is optimized for large OpenStack environments with thousands of instances:

Pagination Features:

  • Default limits prevent memory overflow (50 instances per request)

  • Configurable safety limits (maximum 200 instances per request)

  • Offset-based pagination for browsing large datasets

  • Performance metrics tracking (processing time, instances per second)

Search Optimization:

  • 2-phase search process (basic info filtering → detailed info retrieval)

  • Intelligent caching with connection reuse

  • Selective API calls to minimize overhead

  • Case-sensitive search options for precise filtering

Connection Management:

  • Global connection caching with validity testing

  • Automatic retry mechanisms for transient failures

  • Connection pooling for high-throughput scenarios

Usage Examples:

# Safe large environment browsing
get_instance_details(limit=50, offset=0)     # First 50 instances
get_instance_details(limit=50, offset=50)    # Next 50 instances

# Emergency override for small environments
get_instance_details(include_all=True)       # All instances (use with caution)

# Optimized search for large datasets
search_instances("web", "name", limit=20)    # Search with reasonable limit

Development

Adding New Tools

Edit src/mcp_openstack_ops/mcp_main.py to add new MCP tools:

@mcp.tool()
async def my_openstack_tool(param: str) -> str:
    """
    Brief description of the tool's purpose.
    
    Functions:
    - List specific functions this tool performs
    - Describe the operations it enables
    - Mention when to use this tool
    
    Use when user requests [specific scenarios].
    
    Args:
        param: Description of the parameter
        
    Returns:
        Description of return value format.
    """
    try:
        logger.info(f"Tool called with param: {param}")
        # Implementation using functions.py helpers
        result = my_helper_function(param)
        
        response = {
            "timestamp": datetime.now().isoformat(),
            "result": result
        }
        
        return json.dumps(response, indent=2, ensure_ascii=False)
        
    except Exception as e:
        error_msg = f"Error: Failed to execute tool - {str(e)}"
        logger.error(error_msg)
        return error_msg

Helper Functions

Add utility functions to src/mcp_openstack_ops/functions.py:

def my_helper_function(param: str) -> dict:
    """Helper function for OpenStack operations"""
    try:
        conn = get_openstack_connection()
        
        # OpenStack SDK operations
        result = conn.some_service.some_operation(param)
        
        logger.info(f"Operation completed successfully")
        return {"success": True, "data": result}
        
    except Exception as e:
        logger.error(f"Helper function error: {e}")
        raise

Testing & Validation

Local Testing

# Test with MCP Inspector (recommended)
./scripts/run-mcp-inspector-local.sh

# Test with debug logging
MCP_LOG_LEVEL=DEBUG uv run python -m mcp_openstack_ops

# Validate OpenStack connection
uv run python -c "from src.mcp_openstack_ops.functions import get_openstack_connection; print(get_openstack_connection())"

🔐 Security & Authentication

Bearer Token Authentication

For streamable-http mode, this MCP server supports Bearer token authentication to secure remote access. This is especially important when running the server in production environments.

Configuration

Enable Authentication:

# In .env file
REMOTE_AUTH_ENABLE=true
REMOTE_SECRET_KEY=my-test-secret-key-12345

Or via CLI:

uv run python -m mcp_openstack_ops --type streamable-http --auth-enable --secret-key your-secure-secret-key-here

Security Levels

  1. stdio mode (Default): Local-only access, no authentication needed

  2. streamable-http + REMOTE_AUTH_ENABLE=false/undefined: Remote access without authentication ⚠️ NOT RECOMMENDED for production

  3. streamable-http + REMOTE_AUTH_ENABLE=true: Remote access with Bearer token authentication ✅ RECOMMENDED for production

🔒 Default Policy: REMOTE_AUTH_ENABLE defaults to false if undefined, empty, or null. This ensures the server starts even without explicit authentication configuration.

Client Configuration

When authentication is enabled, MCP clients must include the Bearer token in the Authorization header:

{
  "mcpServers": {
    "mcp-openstack-ops": {
      "type": "streamable-http",
      "url": "http://your-server:8000/mcp",
      "headers": {
        "Authorization": "Bearer your-secure-secret-key-here"
      }
    }
  }
}

Security Best Practices

  • Always enable authentication when using streamable-http mode in production

  • Use strong, randomly generated secret keys (32+ characters recommended)

  • Use HTTPS when possible (configure reverse proxy with SSL/TLS)

  • Restrict network access using firewalls or network policies

  • Rotate secret keys regularly for enhanced security

  • Monitor access logs for unauthorized access attempts

Error Handling

When authentication fails, the server returns:

  • 401 Unauthorized for missing or invalid tokens

  • Detailed error messages in JSON format for debugging


🎯 Recent Improvements & Enhancements

🔒 Complete Project Isolation Security Implementation

100% Project Isolation Guarantee:

  • Multi-layer Security Validation: Added comprehensive project ownership validation for all resource operations

  • Enhanced Delete Operation Security: All delete operations now use secure project-scoped lookup with ownership verification

  • Create Operation Security: Resource references during creation (networks, images, etc.) verified for project ownership

  • Query Security Enhancement: All list/get operations include explicit project validation with resource ownership checks

  • Cross-Project Access Prevention: Advanced protection against accidental operations on similarly-named resources in other projects

  • Security Test Suite: Added test_project_isolation.py for comprehensive security validation

Technical Implementation:

  • New Security Utilities: Added get_current_project_id(), validate_resource_ownership(), find_resource_by_name_or_id() functions

  • Service-Level Security: Enhanced all service modules (compute, network, storage, etc.) with project ownership validation

  • Secure Resource Lookup: Replaced unsafe name-based loops with secure project-scoped resource lookup

  • Error Message Enhancement: Improved error messages to clearly indicate project access restrictions

Complete Project Scoping Implementation

Enhanced Security & Tenant Isolation:

  • All Services Project-Scoped: Identity, Compute, Network, Storage, Image, Orchestration, Load Balancer, and Monitoring services now filter resources by current project ID

  • Zero Cross-Tenant Data Leakage: Automatic filtering at OpenStack SDK level using current_project_id

  • Smart Resource Access: Intelligent handling of shared/public resources (networks, images) while maintaining security boundaries

Fixed Image Service Issues 🖼️

Resolved Zero-Image Count Problems:

  • Enhanced Image Filtering: Now includes public, community, shared, and project-owned images

  • Intelligent Visibility Handling: Proper handling of different image visibility types

  • Prevented Empty Results: Fixed filtering logic that was too restrictive

Improved vCPU/RAM Calculation

Fixed Instance Resource Display:

  • Embedded Flavor Data Usage: Uses server.flavor attributes directly, avoiding 404 API errors

  • Accurate Resource Reporting: Proper vCPU and RAM values in cluster status reports

  • Eliminated API Failures: No more flavor lookup failures causing zero resource values

Enhanced Documentation 📚

Comprehensive Project Scoping Documentation:

  • Multi-Project Management Guide: Complete setup instructions for managing multiple OpenStack projects

  • Security & Isolation Details: Detailed explanation of tenant isolation features

  • Ready-to-Use Configuration: Pre-configured mcp-config.json.multi-project for quick setup

  • Updated Environment Variables: Enhanced .env.example with project scoping guidance


🚀 Adding Custom Tools

This MCP server is designed for easy extensibility. Follow these steps to add your own custom tools:

Step-by-Step Guide

1. Add Helper Functions (Optional)

Add reusable data functions to src/mcp_openstack_ops/functions.py:

async def get_your_custom_data(target_resource: str = None) -> List[Dict[str, Any]]:
    """Your custom data retrieval function."""
    # Example implementation - adapt to your OpenStack service
    conn = get_openstack_connection()
    results = []
    
    try:
        # Example: Custom query using OpenStack SDK
        resources = conn.your_service.list_resources(
            filters={'name': target_resource} if target_resource else {}
        )
        
        for resource in resources:
            results.append({
                'name': resource.name,
                'id': resource.id,
                'status': resource.status,
                'created_at': resource.created_at,
                # Add your custom fields
            })
            
    except Exception as e:
        logger.error(f"Failed to get custom data: {e}")
        return []
        
    return results

2. Create Your MCP Tool File

Create a new file src/mcp_openstack_ops/tools/get_your_custom_analysis.py:

"""Tool implementation for get_your_custom_analysis."""

import json
from datetime import datetime
from typing import Optional
from ..functions import get_your_custom_data  # Import your helper function
from ..mcp_main import (
    logger,
    mcp,
)

@mcp.tool()
async def get_your_custom_analysis(limit: int = 50, target_name: Optional[str] = None) -> str:
    """
    [Tool Purpose]: Brief description of what your tool does
    
    [Exact Functionality]:
    - Feature 1: Data aggregation and analysis
    - Feature 2: Resource monitoring and insights
    - Feature 3: Performance metrics and reporting
    
    [Required Use Cases]:
    - When user asks "your specific analysis request"
    - Your business-specific monitoring needs
    
    Args:
        limit: Maximum results (1-100)
        target_name: Target resource/service name
    
    Returns:
        Formatted analysis results
    """
    try:
        limit = max(1, min(limit, 100))  # Always validate input
        
        logger.info(f"Getting custom analysis, limit: {limit}, target: {target_name}")
        
        results = await get_your_custom_data(target_resource=target_name)
        
        if not results:
            return f"No custom analysis data found" + (f" for '{target_name}'" if target_name else "")
        
        # Apply limit
        results = results[:limit]
        
        # Format results as table
        table_data = []
        for item in results:
            table_data.append({
                'Name': item.get('name', 'N/A'),
                'ID': item.get('id', 'N/A'),
                'Status': item.get('status', 'N/A'),
                'Created': item.get('created_at', 'N/A'),
            })
        
        # Return formatted JSON
        return json.dumps({
            'title': f'Custom Analysis (Top {len(results)})',
            'data': table_data,
            'total_count': len(results),
            'timestamp': datetime.now().isoformat()
        }, indent=2)
        
    except Exception as e:
        logger.error(f"Failed to get custom analysis: {e}")
        return f"Error: {str(e)}"

3. For Modify Operations (Optional)

If your tool performs modify operations, use the @conditional_tool decorator instead:

"""Tool implementation for set_your_custom_resource."""

from ..mcp_main import (
    conditional_tool,  # Use this instead of @mcp.tool()
    handle_operation_result,
    logger,
)
from ..functions import set_your_custom_resource

@conditional_tool  # Only registers when ALLOW_MODIFY_OPERATIONS=true
async def set_your_custom_resource(resource_name: str, action: str) -> str:
    """
    Manage your custom OpenStack resources.
    
    Use when user requests custom resource management.
    """
    try:
        result = set_your_custom_resource(resource_name, action)
        
        return handle_operation_result(
            result=result,
            operation_name="Custom Resource Management",
            details={
                'Resource': resource_name,
                'Action': action
            }
        )
        
    except Exception as e:
        logger.error(f"Custom resource operation failed: {e}")
        return f"Error: {str(e)}"

4. Update Prompt Template (Recommended)

Add your tool description to src/mcp_openstack_ops/prompt_template.md for better natural language recognition:

### **Your Custom Analysis Tool**

### X. **get_your_custom_analysis**
**Purpose**: Brief description of what your tool does
**Usage**: "Show me your custom analysis" or "Get custom analysis for resource_name"
**Features**: Data aggregation, resource monitoring, performance metrics
**Optional**: `target_name` parameter for specific resource analysis

5. Test Your Tool

# Local testing
./scripts/run-mcp-inspector-local.sh

# Or with Docker
docker-compose up -d
docker-compose logs -f mcp-server

# Test with natural language:
# "Show me your custom analysis"
# "Get custom analysis for target_name"

Tool Registration System

The MCP server uses automatic tool discovery. When you create a new file in src/mcp_openstack_ops/tools/, it's automatically registered through the register_all_tools() function in tools/__init__.py. No manual import registration needed!

Safety System

  • Read-only tools: Use @mcp.tool() - always available

  • Modify tools: Use @conditional_tool - only available when ALLOW_MODIFY_OPERATIONS=true

  • Connection: Always use get_openstack_connection() for OpenStack API access

  • Project isolation: All operations are automatically scoped to OS_PROJECT_NAME

That's it! Your custom tool is ready to use with natural language queries.


License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add some amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

Available Tools

41 tools
get_availability_zonesB

List availability zones and their status

Returns: JSON string with availability zones information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states that it returns a JSON string with availability zones information. It does not disclose read-only behavior, authentication requirements, or any side effects. The description carries the full burden and is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short (two lines) and front-loaded with the purpose. However, it could be slightly more informative while still concise. It is not bloated, but it lacks detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no parameters and an output schema exists, the description is minimally adequate. However, it could mention that the output returns status information. Compared to the sibling complexity, it is incomplete in guiding the agent on when to use this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema already covers everything. The description adds no extra parameter information, but with no parameters, the baseline is 4. It does not detract but also does not add value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List availability zones and their status', which clearly indicates the action and resource. However, it does not explicitly differentiate from the sibling tool 'get_load_balancer_availability_zones', which could cause confusion despite being contextually different.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, such as the load balancer-specific availability zones tool. There is no mention of prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_floating_ip_poolsA

Get list of floating IP pools (external networks).

Functions:

  • List all external networks that can provide floating IPs

  • Show available and used IP counts for each pool

  • Display network configuration for floating IP allocation

  • Provide pool capacity and utilization information

Use when user requests:

  • "Show floating IP pools"

  • "List available floating IP networks"

  • "Check floating IP capacity"

  • "What external networks are available?"

Returns: List of floating IP pools with capacity information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes read-only operations like listing and showing capacity, but does not explicitly state that the tool is non-destructive or has no side effects. It is clear enough but lacks explicit safety disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear header, bullet points for functions, example queries, and return type. It is front-loaded with the main purpose. Slightly verbose with 'Functions:' and 'Use when user requests:' but still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description provides sufficient context on what the tool does and what information it returns. It covers pool capacity and utilization, which is relevant for floating IP allocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has no parameters, so the baseline is 4. The description adds value by explaining what the output contains (capacity information) and the purpose of the returned data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it gets a list of floating IP pools, with specific verb 'Get' and resource 'floating IP pools'. It distinguishes from siblings like get_floating_ips by focusing on pools and capacity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides example user queries indicating when to use the tool, such as 'Show floating IP pools' and 'Check floating IP capacity'. However, it does not explicitly mention when not to use or alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_floating_ipsA

Get list of floating IPs with their associations.

Functions:

  • Query floating IPs and their current status

  • Display associated fixed IPs and ports

  • Show floating IP pool and router associations

  • Provide floating IP allocation and usage information

Use when user requests floating IP information, external connectivity queries, or IP management tasks.

Returns: List of floating IPs with detailed association information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral transparency burden. The description adequately implies a read-only operation via the 'get' verb and lists what information is returned, but does not explicitly state that it is safe or describe any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description includes some redundancy, with bullet points that essentially repeat the main function. It is structured but could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with no parameters and has an output schema (indicated). The description mentions the return format and covers the necessary context for a straightforward list retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so coverage is 100%. The description does not need to add parameter semantics. According to guidelines, zero-parameter tools have a baseline score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns a list of floating IPs with associations. However, it does not explicitly differentiate from sibling tools like get_floating_ip_pools, which is a closely related tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides usage context ('when user requests floating IP information, external connectivity queries, or IP management tasks'), but lacks exclusions or mention of alternative tools for specific scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_heat_stacksA

Get list of Heat orchestration stacks.

Functions:

  • Query Heat stacks and their current status

  • Display stack creation and update timestamps

  • Show stack templates and resource information

  • Provide orchestration deployment information

Use when user requests stack information, orchestration queries, or infrastructure-as-code status.

Returns: List of Heat stacks with detailed information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It indicates a read-only operation and mentions return format (JSON) and functions (query status, timestamps, etc.), but lacks details on permissions, rate limits, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with key purpose and includes a bullet list of functions, but has some redundancy (e.g., 'Get list' in title and description). Could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an output schema present, the description sufficiently explains what the tool does and returns. However, it does not mention if results are paginated or limited, which would enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. Description adds no param info, which is acceptable since there are none. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'list of Heat orchestration stacks', with specific functions listed. It distinguishes from sibling tools like get_instance or get_routers by focusing on orchestration stacks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use when user requests stack information, orchestration queries, or infrastructure-as-code status', providing clear context. However, it does not mention when not to use or suggest alternatives among the many siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hypervisor_detailsA

Get detailed information about hypervisors

Args: hypervisor_name: Name/ID of specific hypervisor or "all" for all hypervisors

Returns: JSON string with hypervisor details and statistics

ParametersJSON Schema
NameRequiredDescriptionDefault
hypervisor_nameNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description only implies a read operation via 'Get' and mentions a JSON return. It lacks explicit disclosure of behavioral traits like read-only nature, performance characteristics, or prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively concise and structured with separate sections for args and returns, though the 'Args' and 'Returns' labels are somewhat redundant when the parameter is already in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return type but lacks specifics about what 'details and statistics' are included. It is adequate for a simple tool but could provide more depth.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description compensates by explaining the parameter's meaning: it accepts a specific name/ID or 'all' for all hypervisors, adding value beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'detailed information about hypervisors', distinguishing it from sibling tools that target other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the parameter usage (specific name or 'all'), but provides no guidance on when to use this tool over alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_image_detail_listA

Get detailed list of all images with comprehensive metadata.

Functions:

  • List all images available in the project

  • Show image status, size, and format information

  • Display image properties and metadata

  • Provide ownership and visibility details

Use when user requests image listing, image information, or image metadata details.

Returns: Comprehensive image list in JSON format with detailed metadata, properties, and status information.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states the tool returns a comprehensive list with metadata but does not disclose potential volume, pagination, or performance implications. The read-only nature is implied by 'get' but not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose with bullet points and a separate 'Returns' section that largely duplicates the initial sentence. It could be more concise by merging the first sentence and summary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no annotations, the description adequately explains what the tool does and its output (metadata, properties, status). It does not mention pagination or rate limits, but for a simple list tool without filters, it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is 100% (trivially). The description adds value by confirming no input is needed and explaining the output scope ('all images'). This clarifies the tool's lack of filtering options, which is helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Get detailed list of all images with comprehensive metadata' and lists specific functions (status, size, format). It clearly distinguishes from sibling tools which target other resources like volumes, instances, or load balancers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Use when user requests image listing, image information, or image metadata details.' This clearly indicates when to invoke this tool, though it does not mention when not to use it or suggest alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instanceA

Unified instance query tool supporting all instance retrieval patterns. Consolidates functionality from get_instance_details, get_instance_by_name, get_instances_by_status, and search_instances.

Functions:

  • Get specific instances by names or IDs

  • Filter instances by status (ACTIVE, SHUTOFF, ERROR, etc.)

  • Search instances across multiple fields (name, flavor, image, host, etc.)

  • List all instances with pagination

  • Support both summary and detailed information modes

Use when user requests instance information, status checks, or instance searches.

Args: names: Specific instance name(s) to retrieve (comma-separated: "vm1,vm2,vm3") ids: Specific instance ID(s) to retrieve (comma-separated) status: Filter by instance status (e.g., "ACTIVE", "SHUTOFF", "ERROR") search_term: Search term for partial matching across fields search_in: Fields to search in ("name", "status", "host", "flavor", "image", "availability_zone", "all") all_instances: If True, retrieve all instances (ignores other filters) detailed: If True, return detailed information; if False, return summary only limit: Maximum instances to return (default: 50, max: 200) offset: Number of instances to skip for pagination case_sensitive: Case-sensitive search (default: False)

Returns: Instance information in JSON format with metadata and pagination info.

Examples: get_instance(names="vm1,vm2") # Get specific instances get_instance(status="SHUTOFF") # Get all stopped instances get_instance(search_term="web", search_in="name") # Search by name get_instance(all_instances=True, detailed=False) # List all (summary)

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNo
idsNo
statusNo
search_termNo
search_inNoname
all_instancesNo
detailedNo
limitNo
offsetNo
case_sensitiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: supports pagination (limit, offset), case-sensitive search, all_instances flag, detailed mode, and returns JSON with metadata. No contradictions; it's a read-only tool, and all filtering modes are explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections: summary, functions, usage, args, returns, examples. Front-loaded with purpose. Slightly verbose but justified by the number of parameters and complex behavior. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 0 required parameters, 10 params, no annotations, and an existing output schema, the description covers all necessary aspects: param usage, return format, pagination, and examples. No gaps observed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description provides detailed 'Args' section with explanations, defaults, and examples for all 10 parameters. Adds significant meaning beyond the schema's property types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it's a unified tool for all instance retrieval patterns, listing specific functions like get by names/IDs, filter by status, search, and list all. Distinguishes itself from sibling tools by consolidating get_instance_details, get_instance_by_name, get_instances_by_status, and search_instances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use when user requests instance information, status checks, or searches, but does not provide when-not-to-use or alternative tools beyond the consolidation statement. Sibling list is available externally, but the description itself lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instance_by_nameB

Get detailed information for a specific instance by name.

Args: instance_name: Name of the instance to retrieve

Returns: Instance detailed information or error message if not found

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must disclose behavioral traits. It states the tool returns 'detailed information or error message if not found,' which is minimal. It does not mention any side effects, idempotency, rate limits, or authentication requirements, leaving significant gaps for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one sentence for purpose plus standard Args/Returns structure. Every sentence is earned and no fluff exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is simple with one parameter and an implied output schema, the description covers the basics. However, in a context with 40+ sibling tools, it lacks guidance on how this tool relates to similar ones like 'get_instance,' reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% coverage (no description for the parameter), but the description's Args section explicitly documents 'instance_name: Name of the instance to retrieve,' adding meaning beyond the schema type. While helpful, it is still minimal and does not provide format or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get detailed information for a specific instance by name,' which clearly identifies the action and resource. It is specific enough to distinguish from sibling tools like 'get_instance' (likely by ID) and 'search_instances' (possibly broader search), though it does not explicitly contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'search_instances' or 'get_instance'. No prerequisites, use cases, or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instance_detailsA

Provides detailed information and status for OpenStack instances with pagination support.

Functions:

  • Query basic instance information (name, ID, status, image, flavor) with efficient pagination

  • Collect network connection status and IP address information

  • Check CPU, memory, storage resource usage and allocation

  • Provide instance metadata, keypair, and security group settings

  • Support large-scale environments with configurable limits

Use when user requests specific instance information, VM details, server analysis, or instance troubleshooting.

Args: instance_names: Comma-separated list of instance names to query (optional) instance_ids: Comma-separated list of instance IDs to query (optional) all_instances: If True, returns all instances (default: False) limit: Maximum number of instances to return (default: 50, max: 200) offset: Number of instances to skip for pagination (default: 0) include_all: If True, ignore pagination limits (use with caution in large environments)

Returns: Instance detailed information in JSON format with instance, network, resource data, and pagination info.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_namesNo
instance_idsNo
all_instancesNo
limitNo
offsetNo
include_allNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses pagination support, configurable limits, and warns about include_all in large environments. No annotations provided, so this is helpful. It does not explicitly state it is read-only, but that's implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured but includes a bullet list of functions that is somewhat redundant; the core information could be conveyed in fewer words. Still, it is not overly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (6 params, many siblings, output schema exists), the description covers purpose, usage, parameters, and return type. It is missing explicit guidance on when to choose this over similar sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 6 parameters are explained in the Args section with descriptions that add meaning beyond the schema. For example, explaining comma-separated lists and the behavior of all_instances and include_all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides detailed information for OpenStack instances with specific aspects listed (name, ID, status, etc.), making the purpose clear. However, it does not explicitly differentiate from siblings like get_instance or search_instances, which also provide instance details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a use case statement ('Use when user requests specific instance information...'), but does not provide guidance on when not to use it or mention alternatives among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instances_by_statusB

Get instances filtered by status.

Args: status: Instance status to filter by (ACTIVE, SHUTOFF, ERROR, BUILDING, etc.)

Returns: List of instances with the specified status

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It explains the return value (list of instances) but does not mention pagination, error handling, or performance characteristics. For a simple filter, this is acceptable but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with only three sentences, yet it includes clear 'Args' and 'Returns' sections. Every word is purposeful, and the structure is well-organized, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one required parameter, no nested objects) and the presence of an output schema, the description covers the basic purpose. However, it lacks contextual cues about when to prefer this tool over similar ones, limiting completeness for an agent unfamiliar with the domain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must add meaning. It lists example status values (ACTIVE, SHUTOFF, etc.) but does not specify if the list is exhaustive or provide format details. This adds some value but is insufficient for full parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves instances filtered by status, with a specific verb and resource. It distinguishes from siblings like get_instance (single instance) but does not explicitly differentiate from search_instances, which may offer more flexible filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There is no mention of when not to use it or comparison with similar tools like search_instances, leaving the agent to infer optimal usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keypair_listA

Get list of SSH keypairs for the current user.

Functions:

  • Query SSH keypairs and their fingerprints

  • Display keypair types and creation dates

  • Show public key information (truncated for security)

  • Provide keypair management information

Use when user requests SSH key management, keypair information, or security key queries.

Returns: List of SSH keypairs with detailed information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes the return content (fingerprints, types, dates, truncated public key) but does not explicitly state that the operation is read-only or any authentication requirements. The name implies a read operation, but transparency is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and sections (Functions, Use when, Returns). It is concise and front-loaded with the main purpose. Minor redundancy could be trimmed but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and an output schema (implied), the description covers the purpose, usage scenarios, and return content. Missing explicit read-only declaration or auth notes, but it is generally complete for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description adds context about the returned fields (fingerprints, types, dates), which adds value beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get list of SSH keypairs for the current user' which is a clear verb+resource combination. It further enumerates specific information returned (fingerprints, types, dates, public key). Among sibling tools, this is distinct from other get_* tools (e.g., get_security_groups, get_volume_list).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use when user requests SSH key management, keypair information, or security key queries.' This provides clear context, though it does not mention when not to use or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_amphoraeA

Get amphora instances for a load balancer or all amphorae.

Args: lb_name_or_id: Optional load balancer name or ID. If empty, shows all amphorae.

Returns: JSON string containing amphora information including compute instances and network details

ParametersJSON Schema
NameRequiredDescriptionDefault
lb_name_or_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; the description indicates it is a read operation returning JSON, but lacks details on error conditions, authentication, or performance impacts, leaving gaps in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but includes structured sections (Args, Returns) which slightly lengthen it; however, every part is informative and not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no annotations, the description adequately covers purpose and return format. It could mention potential pagination or limits, but overall sufficient for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'lb_name_or_id' is well-described: optional, can be name or ID, and default behavior when empty. This adds significant value beyond the bare schema type 'string'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves amphora instances for a specific load balancer or all amphorae if no ID provided, distinguishing it from sibling tools like get_load_balancer_details or get_load_balancer_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the optional parameter and its default behavior, but does not provide guidance on when to use this tool over alternatives among the many sibling load balancer tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_availability_zonesB

Get load balancer availability zones.

Returns: JSON string containing availability zones information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description should disclose behavioral traits. It only states it returns a JSON string, but does not indicate if the operation is read-only, requires authentication, or has any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two sentences and no wasted words. It is front-loaded with the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an existing output schema, the description is minimal but could be more helpful by clarifying the scope relative to the sibling tools and the meaning of availability zones in this context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the schema coverage is 100%. The description adds no additional meaning beyond what the schema already provides, but given the lack of parameters, it is minimally sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'load balancer availability zones', making the purpose apparent. However, it does not differentiate from the sibling tool 'get_availability_zones', which may cause confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, such as get_availability_zones. There is no mention of prerequisites or context for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_detailsA

Get detailed information about a specific OpenStack load balancer.

Functions:

  • Shows comprehensive load balancer details including VIP configuration

  • Lists all listeners with their protocols and ports

  • Shows pools and members for each listener

  • Displays health monitor information if configured

  • Provides provisioning and operating status

Use when user requests:

  • "Show details for load balancer [name/id]"

  • "Get load balancer configuration"

  • "Show load balancer listeners and pools"

  • "What's the status of load balancer [name]?"

Args: lb_name_or_id: Load balancer name or ID to query

Returns: JSON string containing detailed load balancer information

ParametersJSON Schema
NameRequiredDescriptionDefault
lb_name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Describes what information is returned but does not explicitly state that it is a read-only operation or disclose any side effects, authentication needs, or rate limits. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a main sentence followed by bullet lists for functions and use cases, plus explicit Args and Returns sections. Front-loaded with purpose, but bullet lists could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 1 parameter with good semantic coverage and a promised output schema, the description adequately explains what the tool does and how to call it. It is complete for the complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description adds meaning: 'lb_name_or_id: Load balancer name or ID to query'. This clarifies that the parameter accepts both name and ID, beyond the schema's minimal type definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves detailed information about a specific OpenStack load balancer, listing specific components like VIP, listeners, pools, members, and health monitors. Distinguishes from sibling tools that focus on individual components.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use case examples like 'Show details for load balancer [name/id]' and 'What's the status of load balancer [name]?'. Does not explicitly state when not to use, but the specificity implies alternatives exist for narrower queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_flavorsB

Get load balancer flavors.

Returns: JSON string containing flavors information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided and the description only states it returns a JSON string. It lacks disclosure of behavioral traits such as read-only nature, authentication needs, or performance characteristics. The word 'Get' implies read-only, but no explicit details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, front-loading the purpose. It could be slightly more structured but is not verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of an output schema, the description is mostly adequate. However, it does not explain what 'flavors' are or how the result relates to other load balancer operations, which could help overall context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the description adds minimal value but does not need to. Baseline for 0 parameters is 4; the description confirms there are no inputs, which is consistent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Get load balancer flavors', clearly identifying the verb and resource. It distinguishes from sibling tools like get_load_balancer_amphorae or get_load_balancer_availability_zones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description does not specify context, prerequisites, or exclude cases, leaving the agent to infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_health_monitorsA

Get health monitors, optionally filtered by pool.

Functions:

  • Lists all health monitors or monitors for a specific pool

  • Shows monitor types (HTTP, HTTPS, TCP, PING, UDP-CONNECT)

  • Displays health check intervals, timeouts, and retry settings

  • Provides HTTP-specific settings (method, URL path, expected codes)

Use when user requests:

  • "Show all health monitors"

  • "List health monitors for pool [name/id]"

  • "What health checks are configured?"

  • "Show health monitor configuration"

Args: pool_name_or_id: Optional pool name or ID to filter monitors (empty for all)

Returns: JSON string containing health monitor details

ParametersJSON Schema
NameRequiredDescriptionDefault
pool_name_or_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description covers behavioral aspects well: it mentions the tool lists monitors, shows types and settings, returns a JSON string, and can be filtered by pool. This is sufficient for a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, bullet points, usage examples, and argument/return details. It is slightly verbose but each sentence adds value, making it effective without being overly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's core functionality, parameter, and return format. Given the simple input schema and presence of an output schema, it is adequately complete. It could mention error cases or pagination, but these are not critical for a basic list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the tool description adds meaning: 'Optional pool name or ID to filter monitors (empty for all)'. This clarifies the parameter's purpose beyond the schema's type-only definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get health monitors, optionally filtered by pool' and lists specific functions. It distinguishes from sibling 'get_load_balancer_*' tools by focusing on health monitors, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage examples like 'Show all health monitors' and 'List health monitors for pool [name/id]', giving clear context. However, it does not mention when not to use this tool or point to alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_l7_policiesA

Get L7 policies for a listener or all L7 policies.

Args: listener_name_or_id: Optional listener name or ID to filter policies. If empty, shows all policies.

Returns: JSON string containing L7 policies information including policy details, actions, and rules

ParametersJSON Schema
NameRequiredDescriptionDefault
listener_name_or_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the return format (JSON string with policy details, actions, rules), but with no annotations provided, it fails to mention permissions, read-only nature, or error handling. The description adds some value but leaves gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with the main purpose stated first, followed by a structured Args and Returns section. No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple structure (one optional parameter, no nested objects) and presence of an output schema, the description covers purpose, parameter, and return value adequately. It could mention error cases or permissions but is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully explains the parameter's purpose, optionality, and default behavior (shows all policies if empty). This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves L7 policies, optionally filtered by listener, using a specific verb 'Get' and resource 'L7 policies'. It distinguishes from siblings like get_load_balancer_l7_rules and get_load_balancer_listeners.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the optional listener filter and the effect of omitting it, providing clear context. However, it does not explicitly state when not to use this tool or mention alternatives, so it is not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_l7_rulesA

Get L7 rules for a specific L7 policy.

Args: policy_name_or_id: L7 policy name or ID (required)

Returns: JSON string containing L7 rules information including rule types, values, and conditions

ParametersJSON Schema
NameRequiredDescriptionDefault
policy_name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It describes the return format (JSON string with rule types, values, conditions) but does not disclose whether the operation is read-only, requires special permissions, or has any side effects. It adds moderate context but lacks full behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two short paragraphs (overview and Args/Returns). Every sentence serves a purpose, and the structure is clear. However, it could be slightly more compact by integrating the Args/Returns into prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single required param, no nested objects, existing output schema), the description covers the essential points: what it does, what the parameter means, and what it returns. Minor gaps include no discussion of error cases or empty results, but overall it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only restates that 'policy_name_or_id' is required without providing format hints, examples, or constraints beyond the schema's bare string type. This adds minimal value over the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get L7 rules for a specific L7 policy,' specifying the verb (Get), resource (L7 rules), and constraint (specific policy). This distinguishes it from sibling tools like get_load_balancer_l7_policies which retrieves policies, not rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you need L7 rules for a known policy, but provides no explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. While it mentions 'specific L7 policy', it doesn't clarify that the policy must be obtained via another tool (e.g., get_load_balancer_l7_policies) first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_listA

Retrieve comprehensive list of OpenStack load balancers with detailed information.

Functions:

  • Lists all load balancers in the OpenStack cluster

  • Provides detailed load balancer information including VIP, status, listeners

  • Supports pagination for large environments (limit/offset)

  • Shows listener count and basic listener information for each load balancer

  • Displays provisioning and operating status for troubleshooting

Use when user requests:

  • "Show me all load balancers"

  • "List load balancers with details"

  • "What load balancers are available?"

  • "Show load balancer status"

Args: limit: Maximum load balancers to return (1-200, default: 50) offset: Number of load balancers to skip for pagination (default: 0)
include_all: Return all load balancers ignoring limit/offset (default: False)

Returns: JSON string containing load balancer details with summary statistics

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
include_allNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Describes pagination (limit/offset), include_all option, and what information is displayed (VIP, status, listeners, provisioning status). Does not mention authentication or side effects, but as a read-only list, this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-organized with clear sections: functions, use cases, args, returns. Every sentence adds value; no fluff. Front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Has output schema, so detailed return structure is covered elsewhere. Description notes returns 'JSON string containing load balancer details with summary statistics', which suffices. Complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (only defaults and types). Description's 'Args' section explains each parameter: limit (1-200, default 50), offset (default 0), include_all (default False). Adds context missing from schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description specifies 'Retrieve comprehensive list of OpenStack load balancers with detailed information' and lists functions like listing all LBs, showing VIP/status/listeners. This clearly distinguishes it from sibling tools like get_load_balancer_details (single LB) or get_load_balancer_listeners (listeners only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases with example user requests ('Show me all load balancers'). Lacks explicit when-not-to-use or alternatives, but the context is clear enough for an AI to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_listenersA

Get listeners for a specific OpenStack load balancer.

Functions:

  • Lists all listeners attached to a load balancer

  • Shows listener protocols, ports, and configurations

  • Displays admin state and default pool associations

  • Provides creation and update timestamps

Use when user requests:

  • "Show listeners for load balancer [name/id]"

  • "List load balancer listeners"

  • "What ports are configured on load balancer [name]?"

  • "Show listener configuration for [lb_name]"

Args: lb_name_or_id: Load balancer name or ID

Returns: JSON string containing listener details for the load balancer

ParametersJSON Schema
NameRequiredDescriptionDefault
lb_name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It details the output fields (protocols, ports, configurations, timestamps) and states the return type (JSON string). While it does not mention rate limits or error handling, the behavioral traits are adequately disclosed for a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a main sentence, bullet lists for functions and example uses, then Args and Returns sections. It is well-organized and front-loaded. Minor redundancy exists between the initial sentence and the first bullet point, but overall it is concise enough.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter and an output schema exists, the description is sufficiently complete. It covers the tool's purpose, input, and output details. It does not mention behavior for nonexistent load balancers or permission issues, but for a simple get operation this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must add meaning. It states that lb_name_or_id accepts 'Load balancer name or ID', which clarifies the parameter's purpose. However, it does not specify how the tool distinguishes between names and IDs or any format requirements, leaving some ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get listeners for a specific OpenStack load balancer' and lists specific functions like listing all listeners and showing protocols. The tool's purpose is distinct from sibling load balancer tools such as get_load_balancer_health_monitors or get_load_balancer_pools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides example user requests (e.g., 'Show listeners for load balancer [name/id]') that clarify when to use the tool. However, it does not explicitly state when not to use it or suggest alternative tools for related tasks like retrieving health monitors or pools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_pool_membersA

Get members for a specific OpenStack load balancer pool.

Functions:

  • Lists all members in a specific pool

  • Shows member addresses, ports, weights, and health status

  • Displays member admin state and operational status

  • Provides monitor configuration for each member

Use when user requests:

  • "Show members for pool [name/id]"

  • "List pool members"

  • "What members are in pool [name]?"

  • "Show pool member status"

Args: pool_name_or_id: Pool name or ID to query members for

Returns: JSON string containing member details for the pool

ParametersJSON Schema
NameRequiredDescriptionDefault
pool_name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description details what data is returned: member addresses, ports, weights, health status, admin state, operational status, and monitor configuration, and states it returns a JSON string. Without annotations, this provides adequate behavioral context, though it does not mention read-only nature or potential errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headings (Functions, Use when user requests, Args, Returns) and uses bullet points for readability. It is concise, containing only relevant information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema (not shown), so the description's high-level summary of return values is sufficient. It mentions key fields like addresses, ports, and health status, covering expected outputs. A minor gap is the lack of explicit mention of pagination or limits, but not critical given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only names 'pool_name_or_id' without description. The description compensates by explaining it as 'Pool name or ID to query members for' and listing example queries that illustrate usage. This adds essential meaning, especially given 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get members for a specific OpenStack load balancer pool' and lists specific functions like listing members and showing addresses, ports, weights, and health status. It also provides example user requests, making the purpose unambiguous and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit use cases with four example queries (e.g., 'Show members for pool [name/id]'), providing clear context for when to invoke the tool. However, it does not explicitly exclude usage or suggest alternatives, such as when to use a different load balancer tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_poolsA

Get load balancer pools, optionally filtered by listener.

Functions:

  • Lists all pools or pools for a specific listener

  • Shows pool protocols, load balancing algorithms

  • Displays members in each pool with their status

  • Provides health monitor associations

Use when user requests:

  • "Show all load balancer pools"

  • "List pools for listener [name/id]"

  • "What pools are configured on [listener_name]?"

  • "Show pool members and their status"

Args: listener_name_or_id: Optional listener name or ID to filter pools

Returns: JSON string containing pool details with member information

ParametersJSON Schema
NameRequiredDescriptionDefault
listener_name_or_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It details that the tool lists pools, shows protocols, algorithms, members with status, and health monitor associations, and returns JSON. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with a summary line, bullet list of functions, usage examples, args, and returns. It is concise without unnecessary repetition, though slightly verbose in listing functions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool with 1 optional parameter and an output schema existing, the description covers purpose, behavior, parameter meaning, and return format comprehensively. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but description adds meaning: 'Optional listener name or ID to filter pools'. However, it lacks format details or examples that would further clarify usage, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it gets load balancer pools, optionally filtered by listener. It explicitly lists functions like listing pools, showing protocols, members, and health monitors, distinguishing it from sibling tools such as get_load_balancer_list or get_load_balancer_pool_members.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description provides explicit usage examples like 'Show all load balancer pools' and 'List pools for listener [name/id]', guiding when to use. However, it does not mention alternatives or when not to use this tool despite ample sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_providersB

Get load balancer providers.

Returns: JSON string containing providers information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully convey behavioral traits. It only states that the tool returns a JSON string, omitting any side effects, authentication needs, or rate limits. As a read operation, it lacks necessary behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using a single sentence and a line about the return type. It is front-loaded and contains no unnecessary words, earning its place efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description is nearly complete for its simplicity. However, it could briefly explain what load balancer providers are to improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to add parameter meaning, but it correctly implies no input is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets load balancer providers, with a specific verb and resource. It distinguishes it from sibling tools which target other resources. However, it does not clarify what 'providers' means in this context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description does not mention any prerequisites or context where this tool is appropriate, leaving the agent without decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_balancer_quotasA

Get load balancer quotas for a project or all projects.

Args: project_id: Optional project ID. If empty, shows quotas for all projects.

Returns: JSON string containing quota information

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states it returns a JSON string without mentioning safety (e.g., read-only), authentication needs, or error handling. The description does not go beyond basic purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two sentences plus structured Args/Returns sections. Every word is functional with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one optional parameter and an output schema. The description adequately covers the behavior and return format. It is nearly complete, though missing potential edge cases (e.g., invalid project ID).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'project_id' parameter's behavior (optional, defaults to all projects if empty), adding meaning beyond the schema's type and default. With 0% schema description coverage, this compensates well, though only one parameter is present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves load balancer quotas with a specific verb 'Get' and resource 'load balancer quotas', including scoping to a project or all projects. This distinguishes it from siblings like 'get_quota' which may cover different quota types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is provided on when to use this tool versus alternatives. Given the presence of a sibling 'get_quota', the description lacks differentiation or context for when each is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_network_detailsA

Provides detailed information for OpenStack networks, subnets, routers, and security groups.

Functions:

  • Query configuration information for specified network or all networks

  • Check subnet configuration and IP allocation status per network

  • Collect router connection status and gateway configuration

  • Analyze security group rules and port information

Use when user requests network information, subnet details, router configuration, or network troubleshooting.

Args: network_name: Name of network to query or "all" for all networks (default: "all")

Returns: Network detailed information in JSON format with networks, subnets, routers, and security groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
network_nameNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must cover behavioral traits. It lacks any mention of read-only nature, permissions, side effects, or rate limits. Only states it returns JSON format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with functions, usage, args, and returns sections. Slightly verbose but clear and front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers multiple resource types comprehensively. Output schema exists (though not shown), and description explains return format. Adequate for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description adds meaning to the sole parameter 'network_name' by explaining it can be a specific name or 'all' for all networks, with default 'all'. Schema had 0% coverage, so this compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it provides detailed information for OpenStack networks, subnets, routers, and security groups. Lists specific functions, distinguishing it from sibling tools like get_routers or get_security_groups which focus on individual resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (network information, subnet details, etc.) but does not mention when not to use or alternatives like get_routers for router-only queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_detailsA

Get OpenStack project details (similar to 'openstack project list/show').

Args: project_name: Name of specific project to show details for (optional, lists all if empty)

Returns: JSON string containing project information including details, roles, and quotas

ParametersJSON Schema
NameRequiredDescriptionDefault
project_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description must convey behavioral traits. It specifies that it is a read operation, returns a JSON string with details/roles/quotas, and notes the 'list all' behavior for empty parameter. This sufficiently covers the expected behavior for a simple read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with clear sections for purpose, parameters, and return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter, no nested objects, output schema present), the description adequately covers input, output, and behavior. Minor gap: no mention of error handling for nonexistent project, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It fully explains the only parameter 'project_name', including its purpose, optionality, and effect (lists all if empty). This adds all necessary meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves OpenStack project details, with a CLI equivalent ('openstack project list/show') for reference. It distinguishes from sibling tools (none other target projects) and notes the optional filtering behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use (to get project details) and explains the optional parameter behavior (empty lists all). However, it lacks explicit guidance on when not to use or alternatives, but the sibling tool list does not contain a direct substitute.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quotaA

Get quota information for projects (similar to 'openstack quota show').

Args: project_name: Name of the project (optional, defaults to current project if empty)

Returns: JSON string containing quota information for the specified project or current project

ParametersJSON Schema
NameRequiredDescriptionDefault
project_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It explains that the parameter is optional and defaults to the current project, and that the return is a JSON string. However, it does not mention potential errors (e.g., if the project does not exist), required permissions, or whether the operation is read-only (implied but not stated). The transparency is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear structure including an Args section and a Returns section. The purpose is stated in the first sentence, making it easy to scan. There is no redundant information, and every sentence contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (one optional parameter, no nested objects), the description is fairly complete. It covers the parameter, return type, and provides an analogy. However, it could mention error handling or the specific quota categories (compute, storage, etc.), but the output schema presumably covers return details. Overall, it is nearly complete for a simple information retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter (project_name) with 0% schema description coverage. The description compensates by stating the parameter is optional, defaults to the current project, and is the name of the project. This adds semantic value beyond the schema definition, clarifying the default behavior and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves quota information for projects, using the verb 'get' with the specific resource 'quota information for projects'. It also provides an analogy to 'openstack quota show', which helps understanding. Although there is a sibling 'get_load_balancer_quotas', the description uniquely identifies this tool for project-level quotas, effectively distinguishing it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives like get_load_balancer_quotas or get_usage_statistics. It mentions similarity to openstack quota show but does not explain scenarios where this tool is preferred or when to avoid it. No 'when-not-to-use' or alternative tool mentions are included.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_resource_monitoringA

Monitors real-time resource usage across the OpenStack cluster.

Functions:

  • Monitor cluster-wide CPU, memory, and storage usage rates

  • Collect hypervisor statistics and resource allocation

  • Track resource utilization trends and capacity planning data

  • Provide resource usage summaries and utilization percentages

Use when user requests resource monitoring, capacity planning, usage analysis, or performance monitoring.

Returns: Resource monitoring data in JSON format with cluster summary, hypervisor details, and usage statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It states returns JSON with cluster summary and hypervisor details, implying a read operation. However, lacks details on performance, caching, or authorization requirements, which would be helpful for a monitoring tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear headline, bulleted functions, usage guidance, and return description. No redundant information; every section serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and a described output schema, the description provides complete context: what it monitors, when to use, and what the response contains. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters, so schema coverage is 100%. Description adds value by explaining the output format and included functions, beyond what the empty schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool monitors real-time resource usage across the OpenStack cluster, listing specific functions like CPU, memory, and storage monitoring. This distinguishes it from sibling tools that focus on other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when user requests resource monitoring, capacity planning, usage analysis, or performance monitoring.' While it doesn't mention when not to use, the guidance is clear and covers common scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_role_assignmentsA

Get role assignments for the current project.

Functions:

  • Query role assignments for users and groups

  • Display project-level and domain-level permissions

  • Show scope of role assignments

  • Provide comprehensive access control information

Use when user requests permission information, access control queries, or security auditing.

Returns: List of role assignments with detailed scope information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it returns a JSON list of role assignments with scope information and implies read-only behavior. No annotations exist, so the description carries full burden; it covers the main behavior but doesn't detail authentication or implicit project context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points for functions and a separate returns section, but slightly verbose. Could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers the return format and use cases. It lacks details on error handling or permissions, but for a straightforward get operation, it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the schema already covers all inputs. The description adds context by specifying the project is 'current' (implied from authentication), which clarifies the implicit parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets role assignments for the current project, covering specific aspects like project-level and domain-level permissions and scope. It distinguishes itself from sibling tools by focusing on access control, not general resource listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: for permission information, access control queries, or security auditing. However, it does not mention when not to use or alternative tools, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_routersA

Get list of routers with their configuration.

Functions:

  • Query routers and their external gateway configurations

  • Display router interfaces and connected networks

  • Show routing table entries and static routes

  • Provide comprehensive network routing information

Use when user requests router information, network connectivity queries, or routing configuration.

Returns: List of routers with detailed configuration in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It accurately describes the operation as a read-only list operation returning configuration details. Since there are no side effects or destructive actions, the description sufficiently conveys the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat redundant. The first sentence already conveys the purpose, but the 'Functions' bullet list essentially repeats it with more words. A more concise version could combine the core idea without the bullet list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and the presence of an output schema, the description adequately explains that the return is a JSON list of routers with detailed configuration. It is complete enough for an agent to understand the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the baseline score is 4. The description adds no parameter-level detail, but none is needed. The schema covers 100% of parameters (none), so the description does not need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a list of routers with their configuration. It uses specific verb+resource ('Get routers'), and the 'Functions' bullet list reinforces the scope. This distinguishes it from sibling tools that target other resources like instances or networks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use when user requests router information, network connectivity queries, or routing configuration.' This provides clear context for when to employ the tool, though it does not explicitly state when not to use it or contrast with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_security_groupsA

Get list of security groups with their rules.

Functions:

  • Query security groups and their rule configurations

  • Display ingress and egress rules with protocols and ports

  • Show remote IP prefixes and security group references

  • Provide comprehensive network security information

Use when user requests security group information, firewall rules, or network security queries.

Returns: List of security groups with detailed rules in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully covers behavior. It explains it's read-only (list), details what is returned (ingress/egress rules, protocols, ports), but does not mention any potential permissions or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a clear purpose, bullet points for functions, and usage guidance. Slightly verbose but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and presence of output schema, the description is complete: it explains what the tool does, when to use it, and the content of the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist (schema coverage 100%). Baseline for 0 params is 4; description adds no further meaning but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves a list of security groups with their rules, distinguishing it from sibling tools like get_instance or get_volume_list which deal with different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'when user requests security group information, firewall rules, or network security queries.' No conflicting alternatives exist among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_server_eventsA

Get recent events for a specific server

Args: instance_name: Name or ID of the server instance limit: Maximum number of events to return (default: 50)

Returns: JSON string with server events information

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_nameYes
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description indicates a read operation ('Get') but does not disclose any behavioral details such as data recency, pagination, or side effects. With no annotations, more transparency would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args and Returns sections, concise sentences, and no extraneous information. It is slightly verbose for a tool definition but clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While an output schema exists, the description only states 'JSON string with server events information', lacking detail on event structure. Given the tool's simplicity, this is acceptable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds meaning to both parameters: instance_name as 'Name or ID', limit as 'Maximum number of events' with default noted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves recent events for a specific server, distinguishing it from sibling tools that focus on other resources like instances, volumes, or load balancers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like get_instance or get_instance_details. It does not specify usage context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_server_groupsA

List all server groups with their details

Returns: JSON string with server groups information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

As no annotations are provided, the description carries the burden for behavioral disclosure. It implies a read-only operation ('list') but does not mention pagination, error handling, or side effects. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first concisely states purpose, the second notes the return format. Every sentence is necessary; no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and the presence of an output schema, the description is complete. It provides essential information (list all groups, with details) and does not need to explain return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the description adds no parameter details beyond the schema. Baseline is 4 for no parameters, and no additional information is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'server groups', specifying scope 'all server groups' with details. This distinguishes it from sibling tools, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Among many sibling 'get_*' tools, the description does not provide any usage context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_server_volumesA

Get all volumes attached to a specific server

Args: instance_name: Name or ID of the server instance

Returns: JSON string with server volumes information

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It does not disclose read-only behavior, authentication needs, error conditions (e.g., server not found), or response structure beyond 'JSON string'. Minimal behavioral context beyond the basic operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: two lines of descriptive text plus standardized Args/Returns sections. Every sentence adds value, no redundancy. The structure is clear and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists (not shown but indicated), the description does not need to detail return values. The single required parameter is well-explained. However, lacks behavioral details like error handling or rate limits, but for a simple query tool it is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no description for instance_name (0% coverage). The description clarifies that the parameter accepts 'Name or ID of the server instance', adding crucial semantic information. This compensates well for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Get all volumes attached to a specific server', which is a specific verb-resource pair. Distinguishes from sibling tools like get_volume_list (which lists all volumes) and get_instance (which retrieves server details).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. The context is implied (e.g., needing volumes for a specific server), but no when-not-to-use or prerequisite information is provided. Sibling tools are not mentioned as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_service_statusA

Provides status and health check information for each OpenStack service.

Functions:

  • Check active status of all OpenStack services

  • Verify API endpoint responsiveness for each service

  • Collect detailed status and version information per service

  • Detect and report service failures or error conditions

Use when user requests service status, API status, health checks, or service troubleshooting.

Returns: Service status information in JSON format with service details and health summary.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It mentions detecting and reporting failures, but lacks details on side effects (e.g., read-only nature), authentication needs, or rate limits. It does state the output format, but could be more transparent about behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and a clear use-case statement. It is front-loaded with the primary purpose. Slightly verbose with the 'Functions:' list, but every sentence adds value. Appropriate length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description adequately summarizes the return format ('JSON format with service details and health summary'). However, it does not detail the specific fields, which might be needed for call chaining. Still, it is sufficiently complete for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so baseline is 4. The description does not need to add parameter details, but it confirms the tool takes no arguments, matching the schema. No additional semantic value needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool provides status and health check information for each OpenStack service, listing specific functions like checking active status and API responsiveness. It clearly distinguishes from sibling tools (e.g., get_instances_by_status, get_availability_zones) by targeting OpenStack services specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases: 'Use when user requests service status, API status, health checks, or service troubleshooting.' This helps the agent decide when to invoke, though it does not explicitly mention when not to use or name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usage_statisticsA

Get usage statistics for projects (similar to 'openstack usage list' command).

Functions:

  • Show project usage statistics over a specified time period

  • Display servers, RAM MB-Hours, CPU Hours, and Disk GB-Hours

  • Provide detailed server usage breakdown when available

  • Calculate usage summary across all projects

Use when user requests usage statistics, billing information, resource consumption analysis, or project usage reports.

Args: start_date: Start date in YYYY-MM-DD format (optional, defaults to 30 days ago) end_date: End date in YYYY-MM-DD format (optional, defaults to today)

Returns: Usage statistics in JSON format with project usage data, server details, and summary information.

ParametersJSON Schema
NameRequiredDescriptionDefault
start_dateNo
end_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It transparently describes the output includes servers, RAM, CPU, and disk hours, as well as a summary. It also notes the optional date range parameters. No contradictions or hidden behaviors are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and clear sections, but slightly lengthy at about 10 sentences. Every sentence adds value, so it earns its place, though it could be slightly more concise without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (context signal: 'Has output schema: true'), the description does not need to detail return values extensively, but it does mention JSON format and summary. It sufficiently covers input parameters and use cases, though a brief note on pagination or limits would enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions, so the description adds essential meaning by explaining that start_date defaults to 30 days ago and end_date defaults to today, both in YYYY-MM-DD format. This adds value beyond the schema's type-only definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves usage statistics for projects, analogous to the OpenStack command. It lists specific functions and use cases, distinguishing it from sibling tools that focus on other resources like availability zones or floating IPs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies when to use the tool, such as for billing, resource consumption analysis, or project usage reports. While it does not explicitly state when not to use it or name alternatives, the context of sibling tools makes the usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_listA

Get list of OpenStack users in the current domain.

Functions:

  • Query user accounts and their basic information

  • Display user status (enabled/disabled)

  • Show user email and domain information

  • Provide user creation and modification timestamps

Use when user requests user management information, identity queries, or user administration tasks.

Returns: List of users with detailed information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors: it queries user accounts, shows enabled/disabled status, email, domain, and creation/modification timestamps. It states the return format as JSON. Without annotations, it adequately covers behavior, though it omits potential error conditions or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear main sentence, a bullet list summarizing functions, a usage note, and a return statement. Every sentence adds value, and the structure front-loads the essential purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with an output schema, the description covers the purpose, scope ('current domain'), returned fields, and usage context. It is complete without extraneous information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are 0 parameters, so baseline is 4. The description does not need to explain parameters and does not add misleading information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves a list of OpenStack users in the current domain, specifying included details like status, email, and timestamps. This distinguishes it from sibling tools which focus on other resources (e.g., floating IPs, instances).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Use when user requests user management information, identity queries, or user administration tasks.' It lacks explicit when-not-to-use or alternatives, but given no direct sibling for user listing, this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_volume_listA

Get list of all volumes with detailed information.

Functions:

  • List all volumes in the project

  • Show volume status, size, and type information

  • Display attachment information for volumes

  • Provide detailed metadata for each volume

Use when user requests volume listing, volume information, or storage overview.

Returns: Detailed volume list in JSON format with volume information, attachments, and metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It explains that the tool returns a detailed list in JSON with volume information, attachments, and metadata. This is transparent for a read operation, though it does not disclose potential limitations like pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and a 'Returns' section, making it easy to parse. However, it is slightly verbose; part of it lists functions that are already implied by the main statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no annotations, and an existing output schema, the description adequately covers the tool's purpose and output. It could be more explicit about scope (e.g., project-level listing) but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the description adds value by explaining what information the listing includes. Baseline for 0 params is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get list of all volumes with detailed information' and explicitly lists the types of information returned (status, size, type, attachments, metadata). It differentiates from siblings like get_volume_snapshots and get_volume_types by focusing solely on volumes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'Use when user requests volume listing, volume information, or storage overview.' This provides clear use cases, though it does not explicitly mention when not to use or name alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_volume_snapshotsA

Get list of volume snapshots.

Functions:

  • Query volume snapshots and their status

  • Display source volume information

  • Show snapshot creation and modification dates

  • Provide snapshot size and usage information

Use when user requests snapshot information, backup queries, or volume restoration planning.

Returns: List of volume snapshots with detailed information in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the returned information (source volume, dates, size) and implies a read-only operation by listing functions. It does not disclose potential limits or performance, but it is transparent enough for a get operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is clear and front-loaded with the main purpose, followed by bullet points and use cases. It could be slightly more concise, but it effectively communicates the tool's capabilities without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no parameters and an output schema exists. The description explains the return value (JSON with detailed info) and covers key aspects. For a simple list tool, this is complete and provides sufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and the schema coverage is 100%. The description does not add parameter semantics because none are needed. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get list of volume snapshots' and lists specific functions (query, display source volume info, show dates, provide size/usage). This distinguishes it from siblings like get_volume_list (volumes) and get_image_detail_list (images).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases: 'when user requests snapshot information, backup queries, or volume restoration planning.' It does not mention when not to use or alternatives, but the context is sufficient for a simple list tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_volume_typesA

Get list of volume types with their specifications.

Functions:

  • Query volume types and their capabilities

  • Display extra specifications and backend configurations

  • Show public/private volume type settings

  • Provide storage backend information

Use when user requests volume type information, storage backend queries, or volume creation planning.

Returns: List of volume types with detailed specifications in JSON format.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the transparency burden. It clearly indicates a read-only retrieval of volume types with specifications, including extra specs, backend config, and public/private settings. No side effects or contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with a purpose statement, bullet-point functions, usage guidance, and return info. Every sentence is relevant and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter list tool, the description covers all needed context: what it returns (volume types with detailed specs), and hints at fields like extra specifications and backend configurations. The existence of an output schema further fills details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so baseline is 4. The description adds value by detailing the output content (specifications, backend info, settings) beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Get list of volume types with their specifications' and lists specific functions, clearly distinguishing it from siblings like get_volume_list and get_volume_snapshots.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage contexts: 'Use when user requests volume type information, storage backend queries, or volume creation planning.' It doesn't mention when not to use, but given no direct sibling for volume types, this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_instancesA

Search for OpenStack instances based on various criteria with efficient pagination.

Functions:

  • Search instances by name, status, host, flavor, image, or availability zone

  • Support partial matching with configurable case sensitivity

  • Return detailed information for matching instances with pagination

  • Optimized for large-scale environments with intelligent filtering

Args: search_term: Term to search for (supports partial matching) search_in: Field to search in ('name', 'status', 'host', 'flavor', 'image', 'availability_zone', 'all') limit: Maximum number of matching instances to return (default: 50, max: 200) offset: Number of matching instances to skip for pagination (default: 0) case_sensitive: If True, performs case-sensitive search (default: False)

Returns: List of matching instances with detailed information and pagination metadata

ParametersJSON Schema
NameRequiredDescriptionDefault
search_termYes
search_inNoname
limitNo
offsetNo
case_sensitiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool performs searching, supports partial matching and case sensitivity, and returns detailed information with pagination. It does not mention any destructive behavior, rate limits, or ordering, but overall provides good transparency for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a clear header, bulleted functions, args, and returns, but it is somewhat verbose. It could be more concise by removing the bullet list of functions and integrating them into a single sentence. The structure is readable but not maximally efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core functionality, explains all 5 parameters, and mentions output (list with pagination metadata). There is an output schema (not shown), so the description need not detail return fields. However, it lacks information on error conditions, authentication requirements, or behavior when no results are found. Overall, it is largely complete for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, meaning the properties have no descriptions. The tool's description provides an 'Args' section that explains each parameter, including defaults and allowed values (e.g., search_in defaults to 'name', case_sensitive defaults to false). This fully compensates for the lack of schema descriptions, adding significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches for OpenStack instances based on various criteria, listing specific fields (name, status, host, flavor, image, availability zone). It clearly distinguishes from sibling tools, which are mostly get_* tools for specific resources, by offering a search with partial matching and pagination.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching instances by criteria, mentions 'efficient pagination' and 'optimized for large-scale environments', but does not explicitly state when to use this tool vs alternatives like get_instances_by_status or get_instance_by_name. It lacks explicit 'when not to use' or comparative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 41 tool updatesv0.1.0
    • First observedget_availability_zones
    • First observedget_floating_ip_pools
    • First observedget_floating_ips
    • First observedget_heat_stacks
    • First observedget_hypervisor_details
    • First observedget_image_detail_list
    • First observedget_instance
    • First observedget_instance_by_name
    • First observedget_instance_details
    • First observedget_instances_by_status
    • First observedget_keypair_list
    • First observedget_load_balancer_amphorae
    • First observedget_load_balancer_availability_zones
    • First observedget_load_balancer_details
    • First observedget_load_balancer_flavors
    • First observedget_load_balancer_health_monitors
    • First observedget_load_balancer_l7_policies
    • First observedget_load_balancer_l7_rules
    • First observedget_load_balancer_list
    • First observedget_load_balancer_listeners
    • First observedget_load_balancer_pool_members
    • First observedget_load_balancer_pools
    • First observedget_load_balancer_providers
    • First observedget_load_balancer_quotas
    • First observedget_network_details
    • First observedget_project_details
    • First observedget_quota
    • First observedget_resource_monitoring
    • First observedget_role_assignments
    • First observedget_routers
    • First observedget_security_groups
    • First observedget_server_events
    • First observedget_server_groups
    • First observedget_server_volumes
    • First observedget_service_status
    • First observedget_usage_statistics
    • First observedget_user_list
    • First observedget_volume_list
    • First observedget_volume_snapshots
    • First observedget_volume_types
    • First observedsearch_instances

TDQS

A3.5/5.0
Disambiguation2/5

Multiple tools for instance queries (get_instance, get_instance_details, search_instances, etc.) overlap significantly, causing confusion about which to use. While most other tools are distinct, this redundancy harms overall disambiguation.

Naming Consistency5/5

All tools follow a consistent 'get_<resource>' pattern (e.g., get_availability_zones, get_floating_ip_pools). No mixing of verbs or styles, making the naming highly predictable.

Tool Count4/5

41 tools is on the high side but appropriate given OpenStack's broad service landscape. Redundant instance tools could be consolidated, but the count is not excessive.

Completeness2/5

The tool surface is entirely read-only (all get operations). For an 'Ops' server, this lacks essential create, update, and delete capabilities, leaving significant gaps for management tasks.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables interaction with multiple Kubernetes clusters simultaneously, providing comprehensive tools for cluster management, resource operations, and diagnostics across different environments.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for Proxmox VE that enables read-only cluster inspection, VM/container lifecycle operations, snapshots, migration, and provisioning with safe confirmation gates.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/call518/MCP-OpenStack-Ops'

If you have feedback or need assistance with the MCP directory API, please join our Discord server