Tools are how AI agents interact with the world. A well-designed tool is the difference between an agent that works and one that hallucinates, fails silently, or wastes tokens. This skill covers tool design from schema to error handling.
57%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/agent-tool-builder/SKILL.mdTools are how AI agents interact with the world. A well-designed tool is the difference between an agent that works and one that hallucinates, fails silently, or wastes tokens.
This skill covers tool design from schema to error handling. JSON Schema best practices, description writing that actually helps the LLM, validation, and the emerging MCP standard that's becoming the lingua franca for AI tools.
Descriptions guide selection, but implementations enforce correctness, authorization and safety. Both require testing; the model may also inspect exposed code/results.
Read the detailed guide before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.
Mock only: fixed weather is synthetic, not a current forecast. Pin/verify SDK beta API and an account-accessible model before any billed call. Tools need bounded execution/approval policies; the runner does not authorize external effects.
import json
import anthropic
from anthropic import beta_tool
client = anthropic.Anthropic()
@beta_tool
def get_weather(location: str, unit: str = "fahrenheit") -> str:
'''Get the current weather in a given location.
Args:
location: The city and state, e.g. San Francisco, CA
unit: Temperature unit, either 'celsius' or 'fahrenheit'
'''
# Implementation
return json.dumps({"temperature": "72°F", "conditions": "Sunny"})
@beta_tool
def search_web(query: str) -> str:
'''Search the web for information.
Args:
query: The search query
'''
# Implementation
return json.dumps({"results": [], "mock": True})
# Tool runner handles the loop
runner = client.beta.messages.tool_runner(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=[get_weather, search_web],
messages=[
{"role": "user", "content": "What's the weather in Paris?"}
]
)
# Process each message
for message in runner:
for block in message.content:
if getattr(block, "type", None) == "text":
print(block.text)
# Or just get final result
final = runner.until_done()sickn33/agentic-awesome-skills
55d9399
Also appears in
last in sync Apr 16, 2026
last in sync Apr 16, 2026
last in sync Apr 16, 2026
last in sync Jan 28, 2026
last in sync Jan 28, 2026
last in sync Mar 3, 2026
last in sync Mar 3, 2026
last in sync Mar 3, 2026
last in sync Jan 28, 2026
since Feb 24, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.