Agents & orchestration
Agents that carry out real tasks in your tools, connected via MCP, the standard that saves you from rewiring everything each time you switch models.
A chatbot answers, an agent acts. To act, an agent has to be plugged into your tools, and that's what MCP is for: think of it as the USB-C of your software. You write the connection once, and it works with Claude, GPT, Gemini or a private model installed in-house. In eighteen months it has become the standard followed by Anthropic, OpenAI, Google and Microsoft, and above all MCP spares you one trap: depending on a single vendor. And since the connector can run inside your infrastructure, your access stays with you, ready to feed a private model when confidentiality demands it. On this foundation, I build agents that take a request, decide and act, and when the task calls for it, several specialized agents coordinate, with an orchestrator and guardrails everywhere.
Key facts
24/7
the agent acts in your tools, day and night, no queue
once
one MCP connection written once, reused with Claude, GPT or a private model
on-site
the MCP connector can run in your own infra, right next to your systems
Agents & orchestration
What I build
Your tools connected via MCP
MCP is the USB-C of your software: you connect your CRM, emails, databases and APIs once, and it then works with Claude, GPT or a private model. You switch models without redoing everything, and the connector can stay in-house.
MCP · No vendor lock-in · Sovereignty · Sovereign MCP server
Tool-using business agents
An agent that answers, decides and executes real actions in your tools through these connections, and escalates to a human when needed.
Tool actions · Human escalation · Support
Multi-agent orchestration
Several specialized agents that coordinate on complex tasks, with an orchestrator and guardrails.
Multi-agent · Coordination · Guardrails
The promise
An agent that acts, not a chatbot that talks.
Demonstration
A late delivery claim settled on the record
A road haulier receives a claim over a late delivery. Answering it means cross-checking shipment tracking, the transport contract and the penalty schedule, across three tools that do not talk to each other. This case is invented.
Invented caseThis case is not an engagement. It is invented end to end, and the code below is the real code that would run it.
HumanThe claim arrives
The claims desk writes: the customer on shipment EXP-48231 is complaining. They say the delivery landed at the end of the day, when the contract promises noon. Is the late penalty owed, and what goes back to them?
The agentChoosing the tool
Three MCP servers are connected: shipment tracking, contract management, invoicing. I start from tracking, because the penalty is computed on field timestamps, not on an invoice. I rule out invoicing: it carries the amount billed, nothing about the promised slot or what happened at the dock.
I rule the third tool out for a stated reason, not because it was never found.
Tool callCalling tracking
{ "jsonrpc": "2.0", "id": 7, "method": "tools/call", "params": { "name": "read_shipment_tracking", "arguments": { "reference": "EXP-48231" } } }Tool responseServer response
{ "jsonrpc": "2.0", "id": 7, "result": { "content": [ { "type": "text", "text": "{\"reference\": \"EXP-48231\", \"customer\": \"CL-7742\", \"contractual_slot\": \"2026-08-25T12:00:00+02:00\", \"events\": [{\"timestamp\": \"2026-08-24T06:12:00+02:00\", \"code\": \"PICKUP\", \"site\": \"north-dock\", \"reason\": null}, {\"timestamp\": \"2026-08-25T11:48:00+02:00\", \"code\": \"DELIVERY_ATTEMPT\", \"site\": \"customer-site\", \"reason\": \"dock unavailable\"}, {\"timestamp\": \"2026-08-25T19:41:00+02:00\", \"code\": \"DELIVERY\", \"site\": \"customer-site\", \"reason\": null}]}" } ], "structuredContent": { "reference": "EXP-48231", "customer": "CL-7742", "contractual_slot": "2026-08-25T12:00:00+02:00", "events": [ { "timestamp": "2026-08-24T06:12:00+02:00", "code": "PICKUP", "site": "north-dock", "reason": null }, { "timestamp": "2026-08-25T11:48:00+02:00", "code": "DELIVERY_ATTEMPT", "site": "customer-site", "reason": "dock unavailable" }, { "timestamp": "2026-08-25T19:41:00+02:00", "code": "DELIVERY", "site": "customer-site", "reason": null } ] }, "isError": false } }The caller's token must carry the read scope on shipments. Without it, the same call returns an error, not a record.
The agentThe cross-check, then the stop
Two reads follow on the same channel: the transport contract, then the penalty schedule. The contract sets the slot at noon. Tracking shows a first delivery attempt at 11:48, turned away because the customer's dock was unavailable. So the article 8 penalty does not trigger: the delay is not on the carrier. A goodwill gesture is still on the table, and that is where I stop. No write tool is exposed to me: I draft the offer, I do not grant it.
The agent cannot issue a credit note, even by mistake: the server exposes reads only.
AnswerWhat comes back
The answer goes back to the claims desk. The penalty is not owed: the first delivery attempt falls inside the contractual slot, and the refusal comes from the receiving dock. Sources cited, in order: tracking EXP-48231, transport contract, article 8 of the schedule. Proposal held for human approval: a goodwill gesture on the next shipment, for the desk to grant or refuse. Nothing is written to invoicing until someone decides.
The MCP server that exposes shipment tracking, read only
from dataclasses import asdict, dataclass
from fastmcp import FastMCP
from fastmcp.exceptions import ToolError
from fastmcp.server.dependencies import get_access_token
mcp = FastMCP("transport-claims")
SCOPE_BY_DOMAIN = {"shipments": "claims:shipments:read"}
@dataclass(frozen=True)
class Event:
timestamp: str
code: str
site: str
reason: str | None = None
RECORDS = {
"EXP-48231": {
"customer": "CL-7742",
"domain": "shipments",
"contractual_slot": "2026-08-25T12:00:00+02:00",
"events": [
Event("2026-08-24T06:12:00+02:00", "PICKUP", "north-dock"),
Event("2026-08-25T11:48:00+02:00", "DELIVERY_ATTEMPT", "customer-site", "dock unavailable"),
Event("2026-08-25T19:41:00+02:00", "DELIVERY", "customer-site"),
],
}
}
@mcp.tool()
def read_shipment_tracking(reference: str) -> dict:
"""Return the tracking events of a shipment, read only."""
record = RECORDS.get(reference)
if record is None:
raise ToolError(f"unknown reference: {reference}")
token = get_access_token()
# A missing token counts as a refusal: otherwise the guard falls and the record leaves its department.
if token is None or SCOPE_BY_DOMAIN[record["domain"]] not in set(token.scopes):
raise ToolError(f"read denied on record {reference}")
return {
"reference": reference,
"customer": record["customer"],
"contractual_slot": record["contractual_slot"],
"events": [asdict(e) for e in record["events"]],
}
# No write tool is exposed: a goodwill gesture stays a human decision.
if __name__ == "__main__":
mcp.run(transport="http")
I do not give an agent write access to a business system: here it reads three of them, proposes a goodwill gesture, and stops there, because no tool lets it grant one.
Agents & orchestration
Before / after
An integration to redo each time you switch models
One MCP connection written once, reusable with any model
Tools that don't talk to each other
An agent that acts across every tool
Agents & orchestration
The stack
MCP
LangGraph
Claude
Tool use
n8n
Python
TypeScript
Webhooks
Agents & orchestration
Straight answers
What is MCP, in plain terms?
MCP is the standard that plugs an AI into your software, a bit like USB-C plugs in any device. In practice, I connect your tools once, and the same connection works with Claude, GPT, Gemini or a private model. Adopted in under two years by the major players and handed to the Linux Foundation in late 2025, it has become the standard way to connect AI, which protects you the day you want to switch vendors.
What's the difference between a chatbot and an AI agent?
A chatbot answers questions. An agent acts: it reads your tools, decides, executes an action (creating a ticket, sending a follow-up, updating the CRM) and escalates to a human when the situation calls for it.
Can the agent do anything it wants in my tools?
No. Every agent has a defined scope of actions, hard limits, and human approval on sensitive or irreversible actions. Guardrails are designed before the agent, not after.
How much does an AI agent in production cost?
It depends on scope, and I put a number on it from the first exchange, free of charge. On the running side, I architect so the token bill stays under control: the right model in the right place, caching, spending limits.
Do I need several agents?
Rarely at the start. One well-equipped agent covers most cases, and a study published in June 2026 shows that automatically assembled multi-agent systems do worse than a simpler approach, at a far higher cost. We move there when the task genuinely calls for it: it is a means, not a marketing pitch.
Read on this topic
Contact
Ready to go from demo to production?
Reply within 24 hours · first conversation free, no strings attached.