An agent is an LLM given a loop, memory, and a set of tools it can call, so it can plan multi-step work and take actions rather than just returning a single answer. "Agentic" describes a pattern along a spectrum — from a single tool call to a fully autonomous multi-step loop — not a strict on/off feature. The engineering that matters is less the model and more the guardrails, observability, and evals around the loop, since an agent that can act is also an agent that can act wrongly.
Also known as function calling
Tool calling — also called function calling — is the mechanism that lets a model request a structured action, like calling an API or running a query, instead of only generating text, with the calling application executing the action and returning the result. It's the primitive underneath every agent: an agent is essentially a model given a set of callable tools and a loop to call them in. Reliability here comes down to tight tool schemas and validating what the model actually asks for before executing it.
Also known as MCP
The Model Context Protocol (MCP) is an open standard for connecting LLM applications to external tools, data sources, and other agents through a common interface, rather than every integration being a bespoke one-off. It's the plumbing that lets a single tool or data connector be written once and reused across different agents and applications. Adopting it early is part of building model-agnostic, vendor-neutral agent systems instead of tools wired to one specific assistant — though MCP standardizes the wire format for that connection, not the catalog, contract, or permission decisions behind it.
Context engineering is deciding what occupies a model's context window at every step — tool definitions, retrieved content, conversation history, and the task itself — and in what order, not just what to write in a system prompt. It treats the window as a fixed, competed-for resource: every token spent on one slice is a token unavailable to another, so the allocation has to be a deliberate decision rather than whatever's left over once everything else is assembled. Prompt engineering is one input to it, not the whole discipline.
A tool contract is the schema a tool exposes to a model — its parameter names, types, required fields, and whatever enums or patterns constrain them. A loose contract lets a model fill an ambiguous field with a plausible-looking guess instead of a real value; a tight one, validated server-side, is what actually stops a hallucinated argument from reaching execution. It's the one piece of documentation a model reads before every call, so it has to carry everything a new hire would otherwise ask about in person.
An idempotent operation produces the same result no matter how many times it runs with the same input — calling it twice does nothing a single call didn't already do. For a tool that writes, sends, or deletes, idempotency (usually enforced with a unique key passed on every retry of the same logical call) is what makes a retry safe: without it, a timeout followed by an automatic retry can execute the same mutation twice.
Structured output constrains a model's response to a defined schema — JSON, an enum, a typed object — instead of free-form prose, so the calling code can parse it reliably without brittle regex or string matching. It's foundational to tool calling and agent loops, where a wrongly-shaped response breaks the next step in the chain. Enforcing and validating the schema, not just asking nicely for JSON, is what makes it dependable in production.
Guardrails are the checks placed around a model's input and output — content filters, schema validation, permission scoping, human-approval gates — that keep an LLM or agent inside acceptable bounds in production. They matter most for agents with real tool access, where an ungrounded or manipulated response can translate directly into an unwanted action, not just a bad chat reply. Guardrails are a design layer added deliberately, not a property models come with by default.