Tools
When to Use Which Tool Pattern?
Scenario
Recommended Pattern
Remote deploy?
Create and Attach Tools
Single-File Tool Integration
# tool/calculator.py
import ast
import operator
from typing import Any
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field
ALLOWED_OPERATORS = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.Mod: operator.mod,
ast.USub: operator.neg,
}
def safe_arithmetic(expression: str) -> float:
def _visit(node: ast.AST) -> float:
if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)):
return float(node.value)
if isinstance(node, ast.BinOp) and type(node.op) in ALLOWED_OPERATORS:
return ALLOWED_OPERATORS[type(node.op)](_visit(node.left), _visit(node.right))
if isinstance(node, ast.UnaryOp) and type(node.op) in ALLOWED_OPERATORS:
return ALLOWED_OPERATORS[type(node.op)](_visit(node.operand))
raise ValueError("Unsupported expression")
parsed = ast.parse(expression, mode="eval")
return _visit(parsed.body)
class CalculatorArgs(BaseModel):
expression: str = Field(..., description="Arithmetic expression to evaluate")
class CalculatorTool(BaseTool):
name = "calculator"
description = "Evaluates simple arithmetic expressions."
args_schema = CalculatorArgs
def _run(self, expression: str, **_: Any) -> str:
try:
return str(safe_arithmetic(expression))
except ValueError:
return "Only basic arithmetic expressions are supported."Complex Tool Logic
Modular Tools (Multiple Files)
Tool Implementation Expectations
Manage Tools
Registry Operations
Symptom
Likely cause
Fix
GL Connectors and Managed Connectors
Tool Resilience
Situation
Recommended layer
Error kind
Description
State
Behavior
Key
Default
Description
MCP Tool Discovery
Observability and Auditing
Best Practices
Production Readiness Checklist
Related Documentation
Last updated
Was this helpful?