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

01

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

02

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

03

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.

  1. 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?

  2. 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.

  3. Tool callCalling tracking

    {
      "jsonrpc": "2.0",
      "id": 7,
      "method": "tools/call",
      "params": {
        "name": "read_shipment_tracking",
        "arguments": {
          "reference": "EXP-48231"
        }
      }
    }
  4. 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.

  5. 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.

  6. 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 codeclaims_server.pypython

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

Agents & orchestration

The stack

MCP

LangGraph

Claude

Tool use

n8n

Python

TypeScript

Webhooks

Agents & orchestration

Straight answers

01

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.

02

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.

03

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.

04

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.

05

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.