Skip to content
LogiGreen
All case studies
Sustainability11 min read

Deploying an AI Agent for Sustainable Supply Chain Optimisation

AI agentsNetwork design

Could you imagine an AI agent replacing an army of consultants to help a company redesign its entire supply chain for more cost-efficient and sustainable operations?

Spoiler Alert: We are not yet here!

But for the first time since we discovered LLMs, we have been amazed (and worried at the same time) by the capacity of an AI agent that we deployed.

Supply Chain Network Optimisation determines where goods are produced to serve markets at the lowest cost in an environmentally friendly way.

Examples of network design with different objectives

For this difficult exercise, we must consider real-world constraints (capacity, demand) to find the optimal set of factories that will minimise the objective function.

Example of environmental constraints of maximum impact per unit produced

As a Supply Chain Solution Manager and founder of the startup Logigreen, we have led multiple network design studies that typically took 10, 12 weeks.

The final deliverable was usually a deck of slides presenting multiple scenarios, allowing supply chain directors to weigh the trade-offs.

Example of Network Designs with different constraints

But decision-makers were often frustrated during the presentations of the study results:

Supply Chain Director: “What if we increase the factory capacity by 25%?”

They wanted to challenge assumptions and re-run scenarios live, while all we had were the slides we had taken hours to prepare.

Our co-founder asked us: “What if we could improve this user experience using conversational agents?”

In this article, we will share with you an initial experiment we conducted a few days after the MCP servers were available for Claude Desktop.

We will demonstrate how to connect an MCP server to a FastAPI microservice utilising a Supply Chain Network Optimisation algorithm.

Example of a request to Claude Desktop connected to an MCP Server calling our FastAPI microservice

The result is a conversational agent that can run one or multiple scenarios and provide a detailed analysis with smart visuals.

We will even ask this agent to advise us on the best decision to take, considering our goals and the constraints.

Example of strategic recommendations provided by the agent

For this experiment, we used:

  • Claude Desktop as the conversational interface
  • MCP Server to expose typed tools to the agent
  • FastAPI microservice with the network optimisation endpoint

In the first section, we will introduce the problem of Supply Chain Network design with a concrete example.

You can skip it if you are not interested in the topic.

Then, we will show multiple deep analyses performed by the conversational agent to support strategic decision-making.

Example of advanced visuals generated by the agent to answer an open question

For the first time, we have been impressed by AI when the agent selected the correct visuals to answer an open question without any guidance!

Our objective is to inspire you to experiment with the connection between MCP servers and advanced analytics products.

We are genuinely excited by the capabilities of this technology.

Supply Chain Network Optimisation with Python

Problem Statement: Supply Chain Network Design

For the context, let us put ourselves in the shoes of a Supply Chain solution manager.

We are supporting the Supply Chain Director of an international manufacturing company that aims to redefine its network as part of a long-term transformation plan.

Supply Chain Network Design Problem

This multinational company has operations in 5 different markets: Brazil, the USA, Germany, India and Japan.

Example of demand per market

To meet this demand, we can open low or high-capacity factories in each of the markets.

Capacities per factory type and location

If you open a facility, you must consider the fixed costs (associated with electricity, Real Estate, and CAPEX) and the variable costs per unit produced.

Example of fixed and variable costs per production country

In this example, high-capacity plants in India have lower fixed costs than those in the USA with lower capacity.

Example of freight costs per container

Additionally, there are the costs associated with shipping a container from Country XXX to Country YYY.

Everything summed up will define the total cost of producing and delivering products from a manufacturing site to the different markets.

What about sustainability?

In addition to these parameters, we consider the amount of resources consumed per unit produced.

Example of energy and water usage per unit produced in each country

For instance, we consume 780 MJ/Unit of energy and 3,500 litres of water to produce a single unit in Indian factories.

You start to understand the complexity of the exercise.

For the environmental impacts, we also consider the pollution resulting from CO2 emissions and waste generation.

Environmental impact per unit produced for each country

In the example above, Japan is the cleanest production country.

Where should we produce to minimize water usage?

The idea is to select a metric to minimise, which could be costs, water usage, CO2 emissions or energy usage.

Example of the output in the LogiGreen App

The model will indicate where to locate factories and outline the flows from these factories to the various markets.

This solution has been packaged as a web application (FastAPI backend, Streamlit front-end) used as a demo to showcase the capabilities of our startup LogiGreen.

User interface of the LogiGreen App (Sustainability Module) 

The idea of today’s experiment is to connect the backend with Claude Desktop using a local MCP server built with Python.

FastAPI Microservice: 0, 1 Mixed-Integer Optimiser for Supply Chain Network Design

This tool is an optimisation model packaged in a FastAPI microservice.

What are the input data for this problem?

As inputs, we should provide the objective function (mandatory) and constraints of maximum environmental impact per unit produced (optional).

The default values for the thresholds are stored in a config file.

We send these parameters to a specific endpoint launch_network that will run the optimisation algorithm.

The API returns the JSON outputs in two parts.

In the section input_params, you can find

  • The objective function selected
  • All the maximum limits per environmental impact

We also added information to bring context to the agent:

  • plant_name is a list of all the potential manufacturing locations we can open by location and type
  • prod_name is the list of all the potential production flows we can have (production, market)
  • total_demand of all the markets

We don’t return the demand per market as it is loaded on the backend side.

And you have the results of the analysis.

They include:

  • plant_opening: a list of boolean values set to 1 if a site is open
    Three sites open for this scenario: 1 low-capacity plant in India and three high-capacity plants in India, Japan, and Brazil.
  • flow_volumes: mapping of the flow between countries
    Brazil will produce 12,500 units for the USA
  • Overall volumes with local_prod, export_prod and the total_prod
  • A cost breakdown with total_fixedcosts, total_varcosts and total_costs along with an analysis of the COGS
  • Environmental impacts per unit delivered with resource usage (Energy, Water) and pollution (CO2, waste).

This network design can be visually represented with this Sankey chart.

Sankey Chart generated by the LogiGreen App for the scenario ‘Production Cost’

Let us see what our conversational agent can do with that!

For a detailed demo, you can have a look at the YouTube version:

Building a local MCP Server to connect Claude Desktop to a FastAPI Microservice

This follows a series of articles in which we experimented with connecting FastAPI microservices to AI agents for a Production Planning tool and a Budget Optimiser.

For this time, we wanted to replicate the experiment with Anthropic’s Claude Desktop.

Set up a local MCP Server in WSL

We will run everything inside WSL (Ubuntu) and let the Claude Desktop (Windows) communicate with our MCP server via a small JSON configuration.

The first step was to install uv package manager:

uv (Python package manager) inside WSL

We can now use it to initiate a project with a local environment:

This will be used by our `network.py` file that will contain our server setup:

This will ensure that the agent sends the correct queries to the FastAPI microservice.

Before starting to build the functionalities of our MCP Server, we need to ensure that the Claude Desktop (Windows) can find network.py.

Add functions among others that we are going to build together

As we are using WSL, we could only do it manually using the Claude Desktop config JSON file:

  1. Open Claude Desktop → Settings → Developer → Edit Config (or open the config file directly).
  2. Add an entry that starts your MCP server in WSL

With this config file, we instruct Claude Desktop to run WSL in the folder mcp_tuto and use uv to run mpc[cli] launching budget.py.

If you are in this special case of building your MCP server in a Windows machine using WSL, you can follow this approach.

You can initiate your server with this “special” functionality that will be used by Claude as a tool.

We inform Claude (in the docstring) that this addition is intended for Supply Chain Professionals only.

If you restart Claude Desktop, you should be able to see this functionality under Network.

Tab with tools available

You can find our “special addition”, called Add, which is now waiting for us to be used!

Add functions among others that we are going to build together

Let’s test now with a simple question.

Example of request expecting an output using the special function

We can see that the conversational agent is calling the correct function based on the context provided in the question.

Comment of the output

It even provides a nice comment interrogating the validity of the results.

What if we complexify a bit the exercise?

We will create a hypothetical scenario to determine if the conversational agent can associate a context with the use of a tool.

Context with two characters / the user is a supply chain professional

Let us see what happens when we ask a question requiring the use of addition.

Example of a tool calling based on a “complex” context

Even if it was reluctantly, the agent had the reflex of using the special add tool for the user, as they are a supply chain professional.

Now that we are familiar with our new MCP server, we can start adding tools for Supply Chain Network Optimisation.

Build a Supply Chain Optimisation MCP Server connected to a FastAPI Microservice

We can get rid of the special add tool and start introducing key parameters to connect to the FastAPI microservice.

The variable last_run will be used to store the results of the last run.

We need to create a tool that can connect to the FastAPI microservice.

For that, we introduced the function below.

This function takes parameters following the Pydantic model LaunchParamsNetwork, sending a clean JSON payload with None fields dropped.

It calls the FastAPI endpoint asynchronously and collects the results that are cached in last_run.

The key part of this function is the docstring, which we removed from the code snippet for concision, as this is the only way to describe what the function does to the agent.

Section 1: Context

The first section is only to introduce the context in which the tool is used.

Section 2: Describe Input Data

This brief description is crucial if we want to be sure that the agent adheres to the Pydantic schema of input parameters imposed by our FastAPI microservice.

Section 3: Description of output results

This part describes to the agent the outputs it will receive.

We did not want to only count on “self-explicit” naming of variables in the JSON.

We want to ensure that it understands the data it has on hand and can provide summaries in accordance with the guidelines listed below.

We share a list of potential scenarios and explanations of the type of analysis we expect using an actual example.

This is far from being concise, but our objective here is to ensure that the agent is equipped to use the tool at its highest potential.

Experiment with the tool: from simple to complex instructions

To test the workflow, we ask the agent to run the simulation with default parameters.

Sample of analysis provided by the conversation agent

As expected, the agent calls the FastAPI microservice, collects the results, and concisely summarises them.

This is cool, but we already had that with our Production Planning Optimisation Agent built with LangGraph and FastAPI.

Example of output analysis of the Production Planning Optimisation Agent

We wanted to explore MCP Servers with Claude Desktop for a more advanced usage.

Supply Chain Director: “I want to have a comparative study of multiple scenario.”

If we come back to the original plan, the idea was to equip our decision-makers (customers who pay us) with a conversational agent that would assist them in their decision-making process.

Let us try a more advanced question:

Here we provide more open questions that reflect the needs of our customers

We explicitly request a comparative study while allowing Claude Sonnet 4 to be creative in terms of visual rendering.

Claude Agent sharing its plan

To be honest, we were impressed by the dashboard that was generated by Claude, which you can access via this link.

At the top, you can find an executive summary listing what can be considered the most important indicators of this problem.

Executive Summary generated by Claude

The model understood, without being explicitly asked in the prompt, that these four indicators were key to the decision-making process resulting from this study.

At this stage, in our opinion, we already get the added value of incorporating an LLM into the loop.

The following outputs are more conventional and could have been generated with deterministic code.

Financial and Environmental Metrics Summary Table

However, we admit that the creativity of Claude outperformed our own web application with this smart visual showing the plant openings per scenario.

Plant open per scenario

While we were starting to worry about getting replaced by AI, we had a look at the strategic analysis generated by the agent.

Example of trade-off analysis

The approach of comparing each scenario vs a baseline of cost optimisation has never been explicitly requested.

The agent took the initiative to bring up this angle when presenting results.

This demonstrated the ability to select the appropriate indicators to convey a message effectively using data.

Can we ask open questions?

let us explore that in the next section.

A Conversation Agent capable of decision-making?

To further explore the capabilities of our new tool and test its potential, we will pose open-ended questions.

Question 1: Trade-off between cost and sustainability

Question 1

This is the type of question we got when we were in charge of network studies.

Executive Summary

This appeared to be a recommendation to adopt the Water-optimised strategy to find the perfect balance.

Visuals

It used compelling visuals to support its idea.

We really like the cost vs. environmental impact scatter plot!

Implementation Plan

Unlike some strategy consulting firms, it did not forget the implementation part.

Have a problem shaped like this one?

Contact Us