Tool Templates¶
There are 3 tool templates included. A Fill-in-the-Blank template for intermediate to advanced users. A Minimal template for simple tools. And a template for Non-Coders.
Tool Definition Template: Fill-in-the-Blank Edition¶
Instructions: Replace all [BLANK] sections with your specific information. Delete optional sections if not needed. Copy this entire template for each tool you create.
BASIC INFORMATION¶
{
"name": "[TOOL_NAME]",
// Example: "send_email", "get_user_profile", "calculate_mortgage"
"description": "[ONE SENTENCE: What does this tool do?]",
// Example: "Sends an email to a specified recipient with subject and body"
// Example: "Retrieves a single user's complete profile from the database"
// Example: "Calculates monthly mortgage payment including principal and interest"
"class": "[A, B, or C]",
// A = Read-Only (no side effects, safe to use freely)
// B = State-Change (modifies data, requires confirmation)
// C = Computational (task exceeds Claude's reasoning capability)
}
TRIGGER LOGIC (When a Model Should Use This)
"trigger_logic": {
"use_when": [
"[Scenario 1: When should Claude use this tool?]",
"[Scenario 2: Another situation where this tool is appropriate]",
"[Scenario 3: Add more as needed]"
],
// Examples:
// - "User asks to send an email or message"
// - "User requests information about a specific person"
// - "User needs complex financial calculation"
"dont_use_when": [
"[Scenario 1: When should Claude NOT use this? Use reasoning instead?]",
"[Scenario 2: When should a different tool be used instead?]",
"[Scenario 3: What edge cases fail?]"
]
// Examples:
// - "User is asking ABOUT email (explain, don't send)"
// - "General questions about users (use search_users for multiple)"
// - "Simple calculations Claude can do (e.g., 15% of 200)"
},
PARAMETERS (What Inputs Does This Tool Accept?)
"parameters": {
"[parameter_name]": {
"type": "[string/number/boolean/array/object]",
"description": "[What is this parameter for?]",
"required": [true/false],
"example": "[Example value]",
"constraints": "[Any validation rules? e.g., 'must be valid email format']"
},
// Repeat for each parameter
// Example:
// "email_address": {
// "type": "string",
// "description": "Recipient's email address",
// "required": true,
// "example": "<user@example.com>",
// "constraints": "Must be valid email format (<name@domain.com>)"
}
},
NEGATIVE CONSTRAINTS (What a Model Should NEVER Do)
"negative_constraints": {
"do_not": [
"[Common mistake 1: What should Claude avoid?]",
"[Common mistake 2: What input patterns cause failure?]",
"[Common mistake 3: What behaviors cause loops?]"
],
// Examples:
// - "Do not execute with empty or null input (validate first)"
// - "Do not assume field names that aren't in the schema"
// - "Do not retry the same failed input without modification"
"safety": [
"[Safety rule 1: What data should never be exposed?]",
"[Safety rule 2: What are the rate limits?]",
"[Safety rule 3: What are the timeout thresholds?]"
]
// Examples:
// - "Never return password or API key fields in responses"
// - "Limit to 100 results maximum"
// - "Timeout after 5 seconds"
},
RETURN CONTRACT (What to Expect When the Tool Runs)
**Success Case:**
"return_contract": {
"success": {
"type": "[object/array/string/number/boolean]",
"description": "[What does successful output look like?]",
"schema": {
"[field_name]": "[field_type and description]"
// Example: "message_id": "string - unique identifier for sent message"
},
"example": {
// Paste a real example of successful output here
// Example: {"sent": true, "message_id": "msg_abc123"}
}
},
Failure Cases:
"failure_modes": {
"[error_type_1]": {
// Example: "invalid_email", "rate_limit", "timeout"
"error": "[Human-readable error message]",
// Example: "Recipient email format is invalid"
"recovery_action": "[What should Claude DO when this happens?]",
// Example: "Ask user to verify email address format"
"retry": [true/false],
// true = Claude should retry automatically
// false = Claude should NOT retry (ask user for help)
"user_action": "[What should Claude tell the user?]"
// Example: "Please provide email in format: name@domain.com"
},
// Copy this block for each error type
"[error_type_2]": {
"error": "[What went wrong?]",
"recovery_action": "[What should Claude do?]",
"retry": [true/false],
"user_action": "[What to tell user?]"
}
}
}
COMPOSITION (Optional: How This Tool Relates to Others)
"composition": {
"typically_followed_by": [
"[tool_name_1]",
"[tool_name_2]"
],
// Examples of tools that usually run AFTER this one
// Example: After "create_user", you typically run "send_welcome_email"
"prerequisites": [
"[tool_name_that_must_run_first]"
],
// Tools that MUST run successfully before this one
// Example: "build_app" must run before "deploy_app"
"conflicts_with": [
"[tool_name_that_cant_run_simultaneously]"
]
// Tools that should NOT run at the same time as this one
// Example: "delete_user" conflicts with "create_user"
}
}
CLASS-SPECIFIC ADDITIONS¶
If Class B (State-Change), Add This¶
"confirmation_required": true,
"confirmation_template": "[This will [ACTION]. Proceed? (yes/no)]",
// Example: "This will permanently delete user_profile.json. Proceed? (yes/no)"
"reversible": [true/false],
// Can this action be undone?
"backup_strategy": "[How is data backed up before this operation?]"
// Example: "File is copied to .backup/ directory before deletion"
If Class C (Computational), Add This¶
"complexity_justification": "[Why can't a model do this with reasoning alone?],
// Example: "Requires 360 separate calculations (30 years × 12 months)"
// Example: "Statistical analysis on dataset with 10,000+ rows"
"estimated_duration": "[How long does this typically take?]",
// Example: "2-5 seconds for typical inputs"
"timeout_threshold": "[When should this operation time out?]"
// Example: "30 seconds maximum"
QUICK REFERENCE CHECKLIST¶
Before finalizing your tool definition, verify:
[ ] Name is clear and descriptive (not generic like "do_thing")
[ ] Description is ONE sentence explaining what it does
[ ] Class is assigned (A, B, or C)
[ ] Trigger Logic has at least 2 "use_when" scenarios
[ ] Trigger Logic has at least 2 "dont_use_when" scenarios
[ ] Parameters all have types, descriptions, and examples
[ ] Negative Constraints list common mistakes to avoid
[ ] Return Contract includes success schema AND example
[ ] Failure Modes include at least 2 error types with recovery actions
[ ] Class B tools have confirmation templates
[ ] Class C tools have complexity justification
COMPLETE EXAMPLE (Filled Template)¶
Here's what a fully-completed template looks like:
{
"name": "send_email",
"description": "Sends an email to a specified recipient with subject and body content",
"class": "B",
"trigger_logic": {
"use_when": [
"User explicitly asks to send an email or message",
"Workflow requires notification via email",
"User provides recipient, subject, and message content"
],
"dont_use_when": [
"User is asking ABOUT email (explain, don't send)",
"Recipient email is missing or unclear (ask for clarification first)",
"User wants to draft email (write content, don't send)"
]
},
"parameters": {
"to": {
"type": "string",
"description": "Recipient's email address",
"required": true,
"example": "<user@example.com>",
"constraints": "Must be valid email format (<name@domain.com>)"
},
"subject": {
"type": "string",
"description": "Email subject line",
"required": true,
"example": "Meeting Reminder",
"constraints": "Maximum 200 characters"
},
"body": {
"type": "string",
"description": "Email message content",
"required": true,
"example": "Hi, this is a reminder about our 3pm meeting.",
"constraints": "Maximum 10,000 characters"
}
},
"negative_constraints": {
"do_not": [
"Send email with empty subject or body",
"Send to invalid email addresses (validate format first)",
"Retry sending the same email multiple times on rate limit errors"
],
"safety": [
"Never include API keys or passwords in email content",
"Rate limit: maximum 10 emails per minute",
"Never send to more than 50 recipients in a single call"
]
},
"return_contract": {
"success": {
"type": "object",
"description": "Confirmation that email was sent successfully",
"schema": {
"sent": "boolean - true if email sent successfully",
"message_id": "string - unique identifier for tracking"
},
"example": {
"sent": true,
"message_id": "msg_abc123xyz"
}
},
"failure_modes": {
"invalid_email": {
"error": "Recipient email format is invalid",
"recovery_action": "Ask user to verify email address format",
"retry": false,
"user_action": "Please provide email in format: <name@domain.com>"
},
"rate_limit": {
"error": "Rate limit exceeded (max 10 emails/minute)",
"recovery_action": "Wait 60 seconds, then retry automatically",
"retry": true,
"user_action": "Email will be sent in 60 seconds due to rate limiting"
},
"smtp_failure": {
"error": "Email server temporarily unavailable",
"recovery_action": "Inform user, do not retry",
"retry": false,
"user_action": "Email system is temporarily unavailable. Please try again in a few minutes."
}
}
},
"composition": {
"typically_followed_by": ["log_email_sent", "update_notification_status"],
"prerequisites": ["validate_email_address"],
"conflicts_with": []
},
"confirmation_required": true,
"confirmation_template": "This will send an email to {to} with subject 'subject}'. Proceed? (yes/no)",
"reversible": false,
"backup_strategy": "Email is logged in sent_emails table before sending"
}
MINIMAL TEMPLATE (For Simple Tools)¶
If your tool is simple (like a Class A read-only tool), here's a shorter version:
{
"name": "[TOOL_NAME]",
"description": "[ONE SENTENCE: What does this do?]",
"class": "A",
"trigger_logic": {
"use_when": [
"[When to use this]"
],
"dont_use_when": [
"[When NOT to use this]"
]
},
"parameters": {
"[param_name]": {
"type": "[type]",
"description": "[what is this?]",
"required": [true/false],
"example": "[example]"
}
},
"return_contract": {
"success": {
"type": "[type]",
"example": {...}
},
"failure_modes": {
"not_found": {
"error": "[What went wrong]",
"recovery_action": "[What to do]",
"retry": false
}
}
}
}
WORKSHEET FORMAT (For Non-Coders)¶
Prefer a questionnaire style? Answer these questions:
BASIC INFO:
1. Tool name: ____________________
2. What does it do (one sentence)? ____________________
3. Risk level?
[ ] Class A - Just reads data (safe)
[ ] Class B - Changes data (needs confirmation)
[ ] Class C - Complex calculation
WHEN TO USE:
4. Model should use this when:
____________________
____________________
WHEN NOT TO USE
5. Model should NOT use this when:
____________________
____________________
INPUTS:
6. What information does this tool need?
Parameter 1: ____________________
Parameter 2: ____________________
SAFETY:
7. What should Model never do with this tool?
____________________
____________________
OUTPUTS:
8. What does success look like? (Give an example)
____________________
9.What errors can happen?
Error 1: ____________________
What to do: ____________________
Error 2: ____________________
What to do: ____________________
CONFIRMATION (If Class B):
10. What should Model ask before using this tool?
"This will ____________________. Proceed?"
END OF SKILLS C: TOOL TEMPLATES version:1.0 2026-02-24