What Are Tool Annotations?
Tool annotations are metadata fields attached to each tool definition that describe operational characteristics:src/mcp/tools/toolFactory.ts:19-25 and applied to every tool during creation.
Core Annotations Explained
readOnlyHint
Tools with
readOnlyHint: true are guaranteed to never modify system state. They’re safe for exploratory queries and can be called without confirmation.- Only retrieves and returns data
- No side effects on Dokploy infrastructure
- Safe to call repeatedly
- Cannot cause data loss or service disruption
src/mcp/tools/project/projectAll.ts:14):
project-all,project-oneapplication-one,application-readAppMonitoring,application-readTraefikConfigdomain-byApplicationId,domain-byComposeId,domain-one,domain-validateDomain,domain-generateDomain,domain-canGenerateTraefikMeDomainspostgres-one,mysql-one
destructiveHint
Characteristics:- Modifies existing resources
- Deletes data or services
- Stops running services
- Changes system state in ways that may be hard to reverse
src/mcp/tools/project/projectRemove.ts:14):
- Deletion:
project-remove,application-delete,domain-delete,postgres-remove,mysql-remove - Stopping services:
application-stop,postgres-stop,mysql-stop - Configuration changes:
application-update,postgres-update,mysql-update, allsave*tools - State changes:
application-cancelDeployment,application-cleanQueues,postgres-changeStatus
idempotentHint
Characteristics:- Calling the tool multiple times with identical input produces identical results
- No accumulating side effects
- Safe to retry on network failures or timeouts
- Predictable behavior
- All read-only tools (reading data doesn’t change with repeated calls)
- Some update operations that are designed to be idempotent (e.g.,
domain-update)
application-deploy- each deployment creates a new deployment recordproject-create- creates a new project each timeapplication-start,application-stop- state changes over time
domain-update is idempotent because updating a domain to the same configuration multiple times results in the same final state.
openWorldHint
All tools in Dokploy MCP Server have
openWorldHint: true because they interact with an external Dokploy API over the network.- Makes network requests to external systems
- Subject to network failures, timeouts, rate limits
- Depends on external service availability
- May have latency variability
- Expect potential network errors
- Handle timeouts gracefully
- Consider rate limiting when making multiple calls
- Validate authentication before bulk operations
Annotation Patterns by Category
Project Management Tools
| Tool | readOnly | destructive | idempotent | Notes |
|---|---|---|---|---|
project-all | ✅ | ❌ | ✅ | Safe listing operation |
project-one | ✅ | ❌ | ✅ | Safe retrieval |
project-create | ❌ | ❌ | ❌ | Creates new resources |
project-update | ❌ | ✅ | ❌ | Modifies existing project |
project-duplicate | ❌ | ❌ | ❌ | Creates new project |
project-remove | ❌ | ✅ | ❌ | Irreversible deletion |
Application Lifecycle Tools
| Tool | readOnly | destructive | idempotent | Notes |
|---|---|---|---|---|
application-one | ✅ | ❌ | ✅ | Read operation |
application-create | ❌ | ❌ | ❌ | Creates new app |
application-deploy | ❌ | ❌ | ❌ | Each deploy is unique |
application-start | ❌ | ❌ | ❌ | State change |
application-stop | ❌ | ✅ | ❌ | Stops service |
application-delete | ❌ | ✅ | ❌ | Permanent removal |
application-update | ❌ | ✅ | ❌ | Modifies configuration |
Domain Management Tools
| Tool | readOnly | destructive | idempotent | Notes |
|---|---|---|---|---|
domain-one | ✅ | ❌ | ✅ | Read operation |
domain-create | ❌ | ❌ | ❌ | Creates new domain |
domain-update | ❌ | ❌ | ✅ | Idempotent update |
domain-delete | ❌ | ✅ | ❌ | Removes domain |
domain-validateDomain | ✅ | ❌ | ✅ | Validation check |
Database Tools (PostgreSQL & MySQL)
| Tool | readOnly | destructive | idempotent | Notes |
|---|---|---|---|---|
*-one | ✅ | ❌ | ✅ | Read operation |
*-create | ❌ | ❌ | ❌ | Creates new database |
*-deploy | ❌ | ✅ | ❌ | Deploys container |
*-start | ❌ | ✅ | ❌ | Starts database |
*-stop | ❌ | ✅ | ❌ | Stops database |
*-remove | ❌ | ✅ | ❌ | Deletes database |
*-update | ❌ | ✅ | ❌ | Modifies configuration |
Why Annotations Matter for AI Safety
Semantic annotations enable AI systems to make informed decisions about tool usage:1. Risk Assessment
AI systems can categorize tools by risk level:- Low risk:
readOnlyHint: true- Safe for autonomous use - Medium risk:
destructiveHint: false, readOnlyHint: false- Creates resources - High risk:
destructiveHint: true- Requires confirmation
2. Retry Logic
idempotentHint informs retry strategies:
3. User Confirmation
AI can prompt for confirmation on destructive operations:4. Exploratory Queries
Read-only tools can be used freely for exploration:Best Practices for Tool Usage
Read Before Write
Always use read-only tools to gather context before calling destructive operations. Example:
project-one before project-update.Confirm Destructive Actions
Request explicit user confirmation for any tool with
destructiveHint: true, especially deletions.Handle Idempotency
Retry idempotent operations on transient failures, but avoid retrying non-idempotent operations automatically.
Expect Network Issues
All tools have
openWorldHint: true. Implement timeouts, error handling, and graceful degradation.Safe Workflow Example
Implementation Details
Annotations are defined in the tool factory (src/mcp/tools/toolFactory.ts:42-124):
Real-World Examples
Example 1: Safe Database Exploration
Example 2: Careful Application Deletion
Summary
Tool annotations provide essential metadata for safe AI interaction:- readOnlyHint: Safe for exploration, no modifications
- destructiveHint: Requires caution, may be irreversible
- idempotentHint: Safe to retry, consistent results
- openWorldHint: External dependencies, handle failures
Related Documentation
API Overview
Complete guide to all 67 tools
Troubleshooting
Common issues and solutions