{"id":62808,"date":"2025-07-30T15:40:48","date_gmt":"2025-07-30T13:40:48","guid":{"rendered":"https:\/\/www.inovex.de\/?p=62808"},"modified":"2026-03-04T09:52:08","modified_gmt":"2026-03-04T08:52:08","slug":"agentic-workflows-and-model-context-protocol-lessons-learned","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/","title":{"rendered":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned"},"content":{"rendered":"<p>LangGraph enables us to create and orchestrate workflows driven by Large Language Models (LLMs).<br \/>\nIn this article, we share our lessons learned from working with Agentic Workflows and Model Context Protocol (MCP) by using a respective GitLab server.<br \/>\n<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#What-Are-Agentic-Workflows\" >What Are Agentic Workflows?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Why-Dont-We-Use-Pure-Agents\" >Why Don&#8217;t We Use Pure Agents?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#How-Agentic-Workflows-Are-Created\" >How Agentic Workflows Are Created<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#The-Model-Context-Protocol\" >The Model Context Protocol<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#How-Does-It-Work\" >How Does It Work?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#The-GitLab-MCP-Server-We-Use\" >The GitLab MCP Server We Use<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#The-Assistant\" >The Assistant<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Tech-Stack\" >Tech Stack<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Architecture\" >Architecture<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#What-Can-Our-Assistant-Not-Do\" >What Can Our Assistant (Not) Do?<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Lessons-Learned-When-Working-With-Agentic-Workflows-and-MCP\" >Lessons Learned When Working With Agentic Workflows and MCP<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Key-Takeaways\" >Key Takeaways<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#How-Can-We-Improve-the-Assistant\" >How Can We Improve the Assistant?<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#The-Importance-of-Implementing-Security-Measures\" >The Importance of Implementing Security Measures<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#Summary\" >Summary<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"What-Are-Agentic-Workflows\"><\/span>What Are Agentic Workflows?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Agentic Workflows are a new paradigm in Artificial Intelligence (AI) automation. They promise more flexible, adaptive processes by leveraging the capabilities of autonomous agents while still maintaining structure and oversight. But what exactly makes them different from pure agents, and why are they gaining so much attention?<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Why-Dont-We-Use-Pure-Agents\"><\/span>Why Don&#8217;t We Use Pure Agents?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Agents represent autonomous systems where the AI doesn&#8217;t just execute predefined tasks, but independently pursues self-defined goals \u2013 often using various tools. By analyzing situations, making decisions, and dynamically adapting their actions, agents can refine their results.<\/p>\n<p>In theory, of course, this sounds wonderfully simple, but this autonomy brings challenges. How do we prevent agents from performing unwanted actions, especially when they have write access, meaning that they could potentially manipulate resources and code in production or delete important information or credentials? And how do we maintain oversight of their decisions? The more autonomy we allow, the less control and transparency we retain.<\/p>\n<p>The solution: We give agents a defined framework in which they can operate. Thus, we create <strong>Agentic Workflows<\/strong> that balance autonomy with control.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"How-Agentic-Workflows-Are-Created\"><\/span>How Agentic Workflows Are Created<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To create Agentic Workflows, we use the framework <a href=\"https:\/\/www.langchain.com\/langgraph\" target=\"_blank\" rel=\"noopener noreferrer\">LangGraph<\/a>. It defines models, functions, and tools as nodes in a graph, more precisely a Directed Acyclic Graph (DAG).<br \/>\nThe edges connecting the nodes describe the paths that the agent can take from one node to another. There are generally two types of edges: unconditional and conditional. Unconditional edges always lead from one node to a specific next node after processing. Conditional edges, on the other hand, mean that multiple edges stem from a single node. The system then decides which edge to follow based on a particular condition. This allows for different paths depending on the outcome. Additionally, the conditions enable us to control when the agent has access to a processing step.<\/p>\n<figure id=\"attachment_62919\" aria-describedby=\"caption-attachment-62919\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-62919\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-1024x502.png\" alt=\"Diagram of a minimal Directed Acyclic Graph containing a model with tool access as well as conditional (dashed) and unconditional (solid) edges.\" width=\"640\" height=\"314\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-1024x502.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-300x147.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-768x376.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-400x196.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1-360x176.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_simple_dag-1.png 1188w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-62919\" class=\"wp-caption-text\">Diagram of a minimal Directed Acyclic Graph containing a model with tool access as well as conditional (dashed) and unconditional (solid) edges.<\/figcaption><\/figure>\n<p>In essence, the agent remains autonomous but is only allowed to act within the permitted nodes and edges due to our deterministic control flow in the background. This controlled workflow combines the advantages of autonomous agents with the security and control of classic systems.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"The-Model-Context-Protocol\"><\/span>The Model Context Protocol<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Modern AI agents often need to interact with a wide range of external tools and services. But how can we ensure that these interactions are reliable, flexible, and easy to maintain? This is where the <a href=\"https:\/\/modelcontextprotocol.io\/introduction\" target=\"_blank\" rel=\"noopener noreferrer\">MCP<\/a> comes into play.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"How-Does-It-Work\"><\/span>How Does It Work?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The MCP can be seen as an abstraction layer for tools to be used by agents. MCP provides a standardized interface for exchanging information and making communication between AI and the endpoints smooth and clear. It defines how the context information (i. e. all relevant data and instructions) is structured, parameterized, and passed on. As a result, each tool knows exactly what is expected of the agent, and the agent can process the results reliably.<br \/>\nWhen using MCP, there are usually two roles: client and server. The client wants to perform a task or use a tool, or provide it to its workflows. In comparison, the server receives the request to use a tool, processes it, and returns a result.<\/p>\n<p>For us developers, this means that we can integrate new tools or functions into our AI system more easily. This is because we no longer have to worry about the exact data structure, regardless of the underlying technologies.<\/p>\n<figure id=\"attachment_62990\" aria-describedby=\"caption-attachment-62990\" style=\"width: 2346px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-62990\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1.png\" alt=\"Diagram of an assistant with Agentic Workflows using MCP Client-Server connections and tool calls for the communication with service endpoints.\" width=\"2346\" height=\"1443\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1.png 2346w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-300x185.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-1024x630.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-768x472.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-1536x945.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-2048x1260.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-1920x1181.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-400x246.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_tool_calling-1-360x221.png 360w\" sizes=\"auto, (max-width: 2346px) 100vw, 2346px\" \/><figcaption id=\"caption-attachment-62990\" class=\"wp-caption-text\">Diagram of an assistant with Agentic Workflows using MCP Client-Server connections and tool calls for the communication with service endpoints.<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"The-GitLab-MCP-Server-We-Use\"><\/span>The GitLab MCP Server We Use<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In our case, we want the assistant to process our requests relating to a private group with two projects in GitLab. Our assistant should not only be able to answer questions about the code and other information. It should also create GitLab resources such as issues and merge requests and make changes and extensions to code. This is exactly why we combine Agentic Workflows and MCP.<\/p>\n<p>So that our assistant can use the GitLab Application Programming Interface (API) via MCP, we also need a server that offers this. We decide to use the <a href=\"https:\/\/github.com\/zereight\/gitlab-mcp\" target=\"_blank\" rel=\"noopener noreferrer\">Better GitLab MCP Server<\/a>, which offers a large number of operations for interacting with GitLab.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"The-Assistant\"><\/span>The Assistant<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The idea behind the project is to develop a coding assistant for our repositories, in which we provide an LLM internally and make it available via a chat interface. However, the assistant should not simply take over all our work. Instead, it should help us to understand the code in the various repositories by answering questions about it. The assistant should also support us in further development and debugging. Ultimately, it should provide approaches on how to solve a problem and identify bugs and errors in the code.<\/p>\n<p>Apart from the technical expectations of the system, it is of course also important for us to gain experience in the development of Agentic Workflows and MCP in order to be able to share our knowledge.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Tech-Stack\"><\/span>Tech Stack<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Our assistant is built on a carefully selected set of technologies, which\u00a0enable everything from agent collaboration and workflow management to smooth user experiences and efficient integration.<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/www.langchain.com\/langgraph\" target=\"_blank\" rel=\"noopener noreferrer\">LangGraph<\/a><\/strong><br \/>\nA python\u00a0framework for building stateful, multi-agent applications with LLMs, enabling complex workflows and agent collaboration.<\/li>\n<li><strong><a href=\"https:\/\/docs.chainlit.io\/get-started\/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Chainlit<\/a><\/strong><br \/>\nAn open-source python package\u00a0for quick prototyping, testing, and deploying of conversational AI apps with a user-friendly chat-interface.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/zereight\/gitlab-mcp\" target=\"_blank\" rel=\"noopener noreferrer\">Better GitLab MCP<\/a><\/strong><br \/>\nA MCP server that provides many functionalities for retrieving and creating GitLab resources that have a unified interface for LLM communication.<\/li>\n<li><strong><a href=\"https:\/\/azure.microsoft.com\/en-us\/products\/ai-services\/openai-service\" target=\"_blank\" rel=\"noopener noreferrer\">Azure OpenAI<\/a> \u2014 <a href=\"https:\/\/openai.com\/index\/gpt-4-1\/\" target=\"_blank\" rel=\"noopener noreferrer\">GPT-4.1<\/a><\/strong><br \/>\nProvides access to OpenAI&#8217;s latest language models\u00a0via Azure, offering advanced AI capabilities for enterprise applications.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Architecture\"><\/span>Architecture<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To achieve a clearer structure and greater modularity, we organize our workflow using dedicated subgraphs. We do this by relocating nodes based on their task classification. This approach enhances control and enforces separation of concerns, as each subgraph is assigned only the tools and tasks relevant to its purpose. By following this architecture and dividing tasks into distinct nodes, we simplify development. Dedicated functionalities can be designed and tested independently before integration. Thus, we reduce debugging efforts later and ensure that new features do not affect core capabilities.<\/p>\n<ul>\n<li><strong>Orchestrator<\/strong><br \/>\nInitial and central instance for deciding which subgraph to start with, to which node to route to and when processing is completed.<\/li>\n<li><strong>Git Retrieval Workflow<\/strong><br \/>\nResponsible for retrieving information from the GitLab repository, for example in the form of code, folder structures, or text. Has a connection to the MCP server and has only access to the tools intended for it. Can get group projects, repository tree, file contents, and issues.<\/li>\n<li><strong>Docstring Workflow<\/strong><br \/>\nCreates or improves docstrings according to the <a href=\"https:\/\/google.github.io\/styleguide\/pyguide.html\" target=\"_blank\" rel=\"noopener noreferrer\">Google Python Style Guide<\/a> for increased readability, maintainability, and integration.<\/li>\n<li><strong>Code Fixing Workflow<\/strong><br \/>\nResponsible for automatically detecting, analyzing, and correcting errors or problems in the code. Consists of several individual nodes that work together.<\/p>\n<ul>\n<li><strong>Planner<\/strong><br \/>\nAnalyzes the given code and creates a plan of steps that must be implemented so that the code is executable and error-free.<\/li>\n<li><strong>Coding Agent<\/strong><br \/>\nImplements the instructions in the plan and outputs the updated code after each step.<\/li>\n<li><strong>Replanner<\/strong><br \/>\nChecks after each step whether all steps in the plan have been completed and whether the code is executable as well as error-free. If so, it terminates the execution in the subgraph; otherwise, it adds further steps to be executed to the plan.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Git Worker Workflow<\/strong><br \/>\nHas the task of creating resources in the specified project while avoiding duplicates. Has a connection to the MCP server and has only access to the tools intended for it. Can get group projects, repository tree, labels, issues, merge requests; can create issues, branches, and merge requests; and can create or update files. Follows the implemented security aspects and restrictions outlined in <a href=\"#the-importance-of-implementing-security-measures\">The Importance of Implementing Security Measures<\/a>.<\/li>\n<li><strong>Answerers<\/strong><br \/>\nSpecialized nodes that react and respond to different user requests depending on the context.<\/p>\n<ul>\n<li><strong>Coding Answerer<\/strong><br \/>\nSummarizes the code changes and presents them to the user. If required, makes the changed files available for download or provides their corresponding created GitLab resource links.<\/li>\n<li><strong>Answerer<\/strong><br \/>\nAnswers the user&#8217;s questions about the project and\/or its code, presents retrieved code, and provides links to created GitLab resources that are not associated with direct code changes.<\/li>\n<li><strong>Conversationalist<\/strong><br \/>\nHolds a conversation with the user if there are no specific tasks or questions about the projects or the code they contain.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Human in the Loop<\/strong><br \/>\nTo increase interactivity and maintain greater control over the process, the assistant can ask the user callback questions, for example \u201c<em>Which resource should be created for the change?\u201c<\/em><\/li>\n<\/ul>\n<figure id=\"attachment_62947\" aria-describedby=\"caption-attachment-62947\" style=\"width: 2322px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-62947 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5.png\" alt=\"Architectural diagram of the assistant consisting of Agentic Workflows and MCP connections displaying all contained subgraphs and individual nodes.\" width=\"2322\" height=\"1857\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5.png 2322w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-300x240.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-1024x819.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-768x614.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-1536x1228.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-2048x1638.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-1920x1536.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-400x320.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_architecture-5-360x288.png 360w\" sizes=\"auto, (max-width: 2322px) 100vw, 2322px\" \/><figcaption id=\"caption-attachment-62947\" class=\"wp-caption-text\">Architectural diagram of the assistant consisting of Agentic Workflows and MCP connections.<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"What-Can-Our-Assistant-Not-Do\"><\/span>What Can Our Assistant (Not) Do?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To gain an overview of what using Agentic Workflows and MCP enables us to do, here&#8217;s a quick look at the main functionalities together with an example prompt to solve this kind of task. Each is designed to enhance our onboarding and development processes:<\/p>\n<ul>\n<li><strong>Answer Questions About Project Code (Q&amp;A)<\/strong><br \/>\nRetrieve, understand, and summarize relevant code or documentation to answer user questions about the codebase.<br \/>\n\u2192 \u201c<em>How does the app work?\u201c<\/em><\/li>\n<li><strong>Fix Code Bugs<\/strong><br \/>\nIdentify bugs in code files or snippets and suggest or apply fixes automatically.<br \/>\n\u2192 \u201c<em>Fix this code: print(test).\u201c<\/em><\/li>\n<li><strong>Extend Existing Code<\/strong><br \/>\nGenerate new code, add features, or create comprehensive docstrings based on user input.<br \/>\n\u2192 \u201c<em>Add unit tests to the function calculate_area.\u201c<\/em><\/li>\n<li><strong>Create GitLab Resources<\/strong><br \/>\nAutomate the creation and management of GitLab resources, with or without making code changes.<br \/>\n\u2192 \u201c<em>Fix this code: print(test) and create a merge request for it.\u201c<\/em><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Lessons-Learned-When-Working-With-Agentic-Workflows-and-MCP\"><\/span>Lessons Learned When Working With Agentic Workflows and MCP<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>After putting Agentic Workflows and MCP to the test in combination, a few patterns and pain points became clear. Below, we&#8217;re sharing the most important takeaways from our journey, plus some concrete ideas for making the assistant even better and more reliable going forward.<\/p>\n<h3 id=\"key-takeaways\"><span class=\"ez-toc-section\" id=\"Key-Takeaways\"><\/span>Key Takeaways<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Developing our assistant brought plenty of surprises \u2013 some helpful, some challenging. Here are the key lessons learned along the way, from prompt design quirks to resource demands and everything in between.<\/p>\n<ul>\n<li><strong>LangGraph Helps With Development<\/strong><br \/>\nLangGraph is ideal for the development of Agentic Workflows and MCP. Managing the models, the MCP connections, and the tools in a DAG gives you the control you need to ensure the reliability of the results. Furthermore, the subdivision into subgraphs helps to increase modularity and facilitate the extension of the system.<\/li>\n<li><strong>Workflow Behavior Is Strongly Dependent on Prompt Design<\/strong><br \/>\nDuring development, we discovered that even the smallest changes in the system prompts of the LLMs can have a major impact. Especially with regard to the orchestrator, this can lead to incorrect decisions or even no decisions being made at all. It also helps a lot to divide the LLMs according to their tasks and to give them system prompts tailored to their area of responsibility \u2013 like we did with the subgraphs.<\/li>\n<li><strong>Non-Deterministic Behavior Complicates the Information Flow Control<\/strong><br \/>\nThe fact that we cannot always expect exactly the same results has an impact on various areas of development. For example, it makes testing a whole lot more difficult. This is because we have to weigh up whether we should design the tests for the system more generally so that we can intercept unpredictable results or whether we accept that tests could fail more often if one or more nodes in the DAG have a &#8222;hiccup&#8220;. Incidentally, the overall orchestration of the workflows is also made more difficult for the same reason.<\/li>\n<li><strong>Increased Resource Requirements<\/strong><br \/>\nThe nodes exchange all the information collected so far with each other (and call their available tools multiple times), thus sending a request each time. Therefore, we need considerably more resources per run. This is something we should keep in mind and which will need to be optimized in the future. As of now, we use the GPT-4.1 models for almost every node and send around 10-15 requests per task, which results in around <em>0.30\u2013$0.45<\/em>\u00a0for a single job.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"How-Can-We-Improve-the-Assistant\"><\/span>How Can We Improve the Assistant?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In order to further improve the assistant, there are a variety of approaches ranging from usability, reliability ,and control of the process to security-related aspects. Here are a few points where we see the greatest potential.<\/p>\n<h4 id=\"history-management\">History Management<\/h4>\n<p>One point we briefly touched on earlier in the <a href=\"#key-takeaways\">Key Takeaways<\/a> is that our message history is filled with all the retrieved content and the responses generated by the individual models. In the long run, however, this leads to inaccurate results. The models will take longer to process the input, and our costs will rise. To avoid these problems, there are several approaches that can be used in combination, depending on how they are used.<\/p>\n<ul>\n<li><strong>Message History Management<\/strong><br \/>\nMessage history management is crucial for efficiently handling the context of longer conversations while conserving resources. Different strategies offer different advantages and disadvantages. The following approaches show how context and storage requirements can be reconciled.<\/p>\n<ul>\n<li><strong>Cutoff\/Rolling Window<\/strong><br \/>\nOnly the last <code>n<\/code> messages or the last <code>m<\/code> tokens of a conversation are saved. This method is very easy to implement and reduces the amount of data. However, important information can be lost if it lies outside the window.<\/li>\n<li><strong>Message Summaries<\/strong><br \/>\nWhen older messages are summarized in the history, they are saved in compressed form. This preserves the essential context while saving memory. However, the quality of the summaries is crucial, as important information can be lost if it is compressed too much.<\/li>\n<li><strong>Indexing<\/strong><br \/>\nContent is stored in vector databases and retrieved as required instead of keeping the entire conversation in the history. This enables efficient context management for large amounts of data but requires a more complex implementation and additional infrastructure.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Separate Handling of File Contents<\/strong><br \/>\nSimilar to the <em>Indexing<\/em> strategy is the idea of managing the retrieved content of files separately. The idea here is to store the content of each file either locally or in a database and either add it to the context or withhold it from it as required. This procedure could be carried out both automatically and manually.<\/li>\n<li><strong>Pre-Fetching<\/strong><br \/>\nIn relation to the strategy of <em>Separate Handling of File Contents<\/em>, it can also make sense to load data that are frequently required when the application is started. This could include the available projects in the group, the repository tree, the files in each project, or individual high-importance files. This would prevent the nodes in the DAG from having to call certain tools themselves (possibly multiple times). In turn, this reduces costs and can also have a positive effect on the size of the history.<\/li>\n<\/ul>\n<h4>Context Engineering<\/h4>\n<p>The practice of context engineering is currently a hot topic. There are good reasons behind this, as we also encounter limitations concerning our agent context. We have already covered an integral part of this in the <a href=\"#history-management\">History Management<\/a>. However, there are other strategies and approaches to increase the performance of the system using clever context management. In the following, we will briefly discuss the most important additional points for our case.<\/p>\n<ul>\n<li><strong>Prompt Engineering and Prompt Chaining<\/strong><br \/>\nPrompt engineering involves refining prompts with clear instructions, roles, and examples to optimize AI model responses. It requires tailoring prompts to each model&#8217;s strengths and limitations. Prompt chaining expands on this by linking prompts in stages, where the AI can even generate new prompts to further improve results.<\/li>\n<li><strong>Global Rules and Agent Steering<\/strong><br \/>\nGlobal rules set consistent strategies and guidelines for every system execution, ensuring uniformity and reducing repetition by being defined once. In contrast, agent steering offers flexible, scenario-specific instructions. They can be activated as needed and tailored to particular contexts, such as applying special rules or providing extra files for specific tasks.<\/li>\n<\/ul>\n<figure id=\"attachment_62925\" aria-describedby=\"caption-attachment-62925\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-62925\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-1024x700.png\" alt=\"Diagram of the individual building blocks and disciplines for context engineering.\" width=\"640\" height=\"438\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-1024x700.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-300x205.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-768x525.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-1536x1050.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-400x273.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1-360x246.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/agentic_workflows_and_mcp_lessons_learned_context-1.png 1878w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-62925\" class=\"wp-caption-text\">Diagram of the individual building blocks and disciplines for context engineering.<\/figcaption><\/figure>\n<h4>Increase Human Feedback \/ Human in the Loop<\/h4>\n<p>Another point is to make the system more interactive and gain more control over the execution of Agentic Workflows. Therefore, a further improvement step is to incorporate more human feedback. This approach also has the advantage that security-relevant aspects can be incorporated. For example, before any writing tool call, the user could be asked whether this action may be executed. However, this can also lead to the automation \u2013 and therefore the core idea of the system \u2013 being lost from focus. One conceivable solution would therefore be to request the execution of write operations as a batch from the user in order to avoid too many interactions.<\/p>\n<h4>Comprehensive Testing<\/h4>\n<p>Comprehensive testing is particularly important in the context of Agentic Workflows and MCP. This is because many components and models interact with each other within the DAG. By increasing test coverage, errors and unexpected behavior can be detected at an early stage. For instance, more tests help us to detect agents making wrong decisions or interfaces not working as expected. They also help to identify unstable or error-prone areas in the overall system and to analyze whether the cause lies in the code, in the design of the prompts, or in the peculiarities of the model used. In this way, it is possible to find out specifically where there is a need for optimization. Thus, this ultimately leads to a more robust and reliable orchestration of the LLMs and workflows.<\/p>\n<h2 id=\"the-importance-of-implementing-security-measures\"><span class=\"ez-toc-section\" id=\"The-Importance-of-Implementing-Security-Measures\"><\/span>The Importance of Implementing Security Measures<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>To make our assistant as secure as possible, we include some restrictions and special adjustments to the environment in which it operates.<\/p>\n<p>A key principle is granting the system the least privilege possible. Since GitLab tokens can\u2019t restrict individual operations, we limit the assistant&#8217;s access by assigning it the <em>Developer<\/em> role. This prevents access to critical actions like managing permissions and settings (more on this in the <a href=\"https:\/\/docs.gitlab.com\/user\/permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">GitLab Permissions<\/a>).<br \/>\nWe also make several security-focused code changes. The assistant can&#8217;t access or modify its own code, as it works in a separate clone without its source. We also whitelist only approved tools, preventing the use of arbitrary MCP tools from the server. Additionally, direct commits to the main branch are blocked. All merge requests start as drafts.<\/p>\n<p>Of course, these points do not offer complete protection against possible attacks, such as prompt\/plan injections or memory poisoning. However, within the scope of our use, these points considerably reduce security risks. To learn more about AI risks in development, see our article <a href=\"https:\/\/www.inovex.de\/de\/blog\/threat-modeling-for-ai\/\" target=\"_blank\" rel=\"noopener noreferrer\">Threat Modeling for AI<\/a> and the Open Worldwide Application Security Project&#8217;s (OWASP) document, <a href=\"https:\/\/genai.owasp.org\/resource\/agentic-ai-threats-and-mitigations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Agentic AI \u2013 Threats and Mitigations<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Bringing together Agentic Workflows and MCP allowed us to develop a very helpful coding assistant. It can not only understand and answer questions about our codebase but also actively supports development and resource management in GitLab. Throughout the project, we encountered both the flexibility and complexity that come with orchestrating autonomous agents. This showed especially in terms of prompt design, context handling, and the need for reliable testing. We found that balancing autonomy with control is key. Therefore, thoughtful architecture and human feedback loops can greatly enhance both reliability and security. Our experiences highlight the importance of modular design, clear responsibility separation, and continuous improvement \u2013 insights that can help guide future projects working with similar AI-driven workflows.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LangGraph enables us to create and orchestrate workflows driven by Large Language Models (LLMs). In this article, we share our lessons learned from working with Agentic Workflows and Model Context Protocol (MCP) by using a respective GitLab server.<\/p>\n","protected":false},"author":326,"featured_media":63024,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[509,511,373,375,206,397,140,141],"service":[76,431,75],"coauthors":[{"id":326,"display_name":"Robin Pavkovic","user_nicename":"rpavkovic"},{"id":436,"display_name":"Denise Hartmann","user_nicename":"dhartmann"}],"class_list":["post-62808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-ai-2","tag-artificial-intelligence-2","tag-chatbot","tag-conversational-ai","tag-data-science","tag-gitlab","tag-machine-learning","tag-nlp","service-artificial-intelligence","service-data-science","service-nlp"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Agentic Workflows and Model Context Protocol \u2013 Lessons Learned<\/title>\n<meta name=\"description\" content=\"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned\" \/>\n<meta property=\"og:description\" content=\"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-30T13:40:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-04T08:52:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1506\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Robin Pavkovic, Denise Hartmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows-1024x598.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Robin Pavkovic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"16\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Robin Pavkovic, Denise Hartmann\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/\"},\"author\":{\"name\":\"Robin Pavkovic\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/374a80c857b486f8f16fbcdc384d3a41\"},\"headline\":\"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned\",\"datePublished\":\"2025-07-30T13:40:48+00:00\",\"dateModified\":\"2026-03-04T08:52:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/\"},\"wordCount\":3265,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Agentic-Workflows.png\",\"keywords\":[\"Ai\",\"Artificial Intelligence\",\"Chatbot\",\"Conversational Ai\",\"Data Science\",\"GitLab\",\"Machine Learning\",\"nlp\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/\",\"name\":\"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Agentic-Workflows.png\",\"datePublished\":\"2025-07-30T13:40:48+00:00\",\"dateModified\":\"2026-03-04T08:52:08+00:00\",\"description\":\"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Agentic-Workflows.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Agentic-Workflows.png\",\"width\":1506,\"height\":880,\"caption\":\"The MCP as Centre of die Agentic Workflwos\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/agentic-workflows-and-model-context-protocol-lessons-learned\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/374a80c857b486f8f16fbcdc384d3a41\",\"name\":\"Robin Pavkovic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/pb-96x96.png923061120235a455546ad57ffdd88ef4\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/pb-96x96.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/pb-96x96.png\",\"caption\":\"Robin Pavkovic\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/rpavkovic\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned","description":"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/","og_locale":"de_DE","og_type":"article","og_title":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned","og_description":"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.","og_url":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2025-07-30T13:40:48+00:00","article_modified_time":"2026-03-04T08:52:08+00:00","og_image":[{"width":1506,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png","type":"image\/png"}],"author":"Robin Pavkovic, Denise Hartmann","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows-1024x598.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Robin Pavkovic","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten","Written by":"Robin Pavkovic, Denise Hartmann"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/"},"author":{"name":"Robin Pavkovic","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/374a80c857b486f8f16fbcdc384d3a41"},"headline":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned","datePublished":"2025-07-30T13:40:48+00:00","dateModified":"2026-03-04T08:52:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/"},"wordCount":3265,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png","keywords":["Ai","Artificial Intelligence","Chatbot","Conversational Ai","Data Science","GitLab","Machine Learning","nlp"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/","url":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/","name":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png","datePublished":"2025-07-30T13:40:48+00:00","dateModified":"2026-03-04T08:52:08+00:00","description":"In this article, we combine Agentic Workflows and MCP by using LangGraph to orchestrate the interaction between LLMs and GitLab resources.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Agentic-Workflows.png","width":1506,"height":880,"caption":"The MCP as Centre of die Agentic Workflwos"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/agentic-workflows-and-model-context-protocol-lessons-learned\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Agentic Workflows and Model Context Protocol \u2013 Lessons Learned"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/374a80c857b486f8f16fbcdc384d3a41","name":"Robin Pavkovic","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/pb-96x96.png923061120235a455546ad57ffdd88ef4","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/pb-96x96.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/pb-96x96.png","caption":"Robin Pavkovic"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/rpavkovic\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/62808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=62808"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/62808\/revisions"}],"predecessor-version":[{"id":63092,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/62808\/revisions\/63092"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/63024"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=62808"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=62808"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=62808"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=62808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}