<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Matos</title>
    <description>The latest articles on DEV Community by Daniel Matos (@dmaxter).</description>
    <link>https://dev.to/dmaxter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2908456%2Facd45433-2c22-4575-a9b3-67959bb172bf.jpg</url>
      <title>DEV Community: Daniel Matos</title>
      <link>https://dev.to/dmaxter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmaxter"/>
    <language>en</language>
    <item>
      <title>Minikube custom image building</title>
      <dc:creator>Daniel Matos</dc:creator>
      <pubDate>Fri, 15 Aug 2025 15:24:04 +0000</pubDate>
      <link>https://dev.to/dmaxter/minikube-custom-image-building-3dh8</link>
      <guid>https://dev.to/dmaxter/minikube-custom-image-building-3dh8</guid>
      <description>&lt;p&gt;I have detailed all the steps to create a custom minikube image and enabling virtualization in minikube allowing for OpenShift Virtualization Operator to be emulated in a development environment.&lt;/p&gt;

&lt;p&gt;I had to compile the Linux kernel and deeply understand what minikube is in the process.&lt;/p&gt;

&lt;p&gt;Have a look over at: &lt;a href="https://dmaxter.pt/articles/25-08_minikube-virtualization/" rel="noopener noreferrer"&gt;https://dmaxter.pt/articles/25-08_minikube-virtualization/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>linux</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Empowering LLMs: MCP Manager, a Rust Middleware for API Interaction via Model Context Protocol</title>
      <dc:creator>Daniel Matos</dc:creator>
      <pubDate>Sat, 03 May 2025 18:37:09 +0000</pubDate>
      <link>https://dev.to/dmaxter/empowering-llms-mcp-manager-a-rust-middleware-for-api-interaction-via-model-context-protocol-3khl</link>
      <guid>https://dev.to/dmaxter/empowering-llms-mcp-manager-a-rust-middleware-for-api-interaction-via-model-context-protocol-3khl</guid>
      <description>&lt;p&gt;Hey Dev Community!&lt;/p&gt;

&lt;p&gt;I'm excited to share a new open-source project I've built: &lt;strong&gt;MCP Manager&lt;/strong&gt;. Developed in Rust, this tool acts as a crucial piece of middleware designed to enable Large Language Models (LLMs) to interact with and call external APIs using the Model Context Protocol (MCP).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;While LLMs are incredibly powerful at understanding and generating text, connecting them reliably and securely to external systems to perform actions is not standardized yet.&lt;/p&gt;

&lt;p&gt;The only solutions for integration I was able to found are proprietary or paid. The only real alternative is Claude for Desktop, however it is limited to the Antropic models. There are also multiple single solutions that work only for one model, but none to unify all of them, leading to redundant efforts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: MCP Manager + Model Context Protocol
&lt;/h2&gt;

&lt;p&gt;MCP Manager provides a standardized way for LLMs (initially supporting Google Gemini and Azure OpenAI) to trigger API calls. The flow works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The LLM determines that an external action is needed based on its prompt/context&lt;/li&gt;
&lt;li&gt;The LLM communicates this intent to MCP Manager using its tool/function calling capabilities&lt;/li&gt;
&lt;li&gt;MCP Manager receives this request and, using the Model Context Protocol (MCP), communicates with a backend "MCP Server"&lt;/li&gt;
&lt;li&gt;The MCP Server, which is responsible for knowing about and interacting with specific external APIs, executes the required API call&lt;/li&gt;
&lt;li&gt;The response from the API is sent back through the MCP Server and MCP Manager, and back to the LLM&lt;/li&gt;
&lt;li&gt;The LLM can decide to print an answer to the user or continuing calling functions to fulfill the user needs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach separates the LLM's intent from the specifics of API execution, providing a cleaner, more maintainable architecture for building LLM-powered applications that interact with the real world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;Building MCP Manager in Rust provides several key advantages for a middleware tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Efficient handling of requests and communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability &amp;amp; Safety:&lt;/strong&gt; Rust's strong type system and ownership model prevent common bugs, crucial for system-level tools. Only crashes the program when we tell it to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency:&lt;/strong&gt; Rust's excellent support for concurrent programming is ideal for handling multiple LLM interactions or API responses&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current Status &amp;amp; Future:
&lt;/h2&gt;

&lt;p&gt;Currently, MCP Manager v0.1.0 supports integration with Google Gemini and Azure OpenAI and is designed to work only with local MCP server implementations.&lt;/p&gt;

&lt;p&gt;Support for remote MCP servers is planned to enable more distributed architectures, but this feature is not yet implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;p&gt;MCP Manager is fully open source, and I strongly believe in collaborative development. Whether you're a Rust developer, an AI/LLM enthusiast, or someone interested in AI or APIs, your contributions are highly welcome!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explore the Code:&lt;/strong&gt; See how the MCP is integrated and how the LLM integrations work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribute:&lt;/strong&gt; Help add support for more LLMs, enhance the MCP integration, improve documentation, or suggest new features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide Feedback:&lt;/strong&gt; Share your thoughts on the project's direction and potential use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the repositories: &lt;a href="https://gitlab.com/DMaxter/mcp-manager" rel="noopener noreferrer"&gt;https://gitlab.com/DMaxter/mcp-manager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's discuss how we can build robust bridges between LLMs and the external world! Looking forward to your thoughts and contributions.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>rust</category>
      <category>api</category>
    </item>
    <item>
      <title>Unlocking the Full Potential of Kong Plugins</title>
      <dc:creator>Daniel Matos</dc:creator>
      <pubDate>Sat, 05 Apr 2025 18:11:56 +0000</pubDate>
      <link>https://dev.to/dmaxter/unlocking-the-full-potential-of-kong-plugins-5313</link>
      <guid>https://dev.to/dmaxter/unlocking-the-full-potential-of-kong-plugins-5313</guid>
      <description>&lt;p&gt;The explosive growth of APIs, driven by the rise of AI and microservices, demands robust and adaptable API management solutions.&lt;/p&gt;

&lt;p&gt;Because there is "No AI without APIs", we should prioritize their security and performance. Therefore, we can rely on Kong, an API Gateway with a large set of plugins to simplify development and deployment of APIs. &lt;/p&gt;

&lt;p&gt;Their catalog of &lt;strong&gt;official&lt;/strong&gt; plugins is available at their &lt;a href="https://docs.konghq.com/hub" rel="noopener noreferrer"&gt;Plugin Hub&lt;/a&gt; and provides solutions for common API management needs. Beyond these, Kong supports community plugins available on platforms like GitLab and GitHub. For very specific requirements, they also enable custom plugin development via the &lt;a href="https://docs.konghq.com/gateway/latest/plugin-development/pdk" rel="noopener noreferrer"&gt;Lua PDK&lt;/a&gt; or other languages they support.&lt;/p&gt;

&lt;p&gt;In this post, we will dive deep into the Kong plugin ecosystem, exploring its architecture and configuration. By the end, we should be equipped with the knowledge to optimize our gateway and build effective custom solutions.&lt;/p&gt;

&lt;p&gt;There are 4 main factors that influence when plugins are triggered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Protocols&lt;/li&gt;
&lt;li&gt;Lifecycle phases&lt;/li&gt;
&lt;li&gt;Plugin priority&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Scope
&lt;/h2&gt;

&lt;p&gt;Kong plugins can be applied at various scopes, allowing for granular control. There are 5 scopes a plugin can be applied (sorted by specificity):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global&lt;/strong&gt; - applies to all routes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service&lt;/strong&gt; - applies to all routes that are assigned to the service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt; - applies to a single route&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ConsumerGroup&lt;/strong&gt; - applies to a consumer group&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer&lt;/strong&gt; - applies to a single consumer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's important to note that when a plugin is configured at multiple scopes simultaneously, &lt;strong&gt;the most specific one will take precedence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To illustrate this, I have prepared an example &lt;a href="https://gitlab.com/DMaxter/kong-plugins-deepdive/-/tree/main/scope" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The deployment instructions are provided within the repository.&lt;/p&gt;

&lt;p&gt;The detailed configuration is available in the README of the repository. But basically we have 4 routes: 2 have a plugin configured at the route level, 1 has a plugin configured at the service level and the other one relies on the global configuration. Additionally, we have 2 consumers, one with the plugin set at Consumer level and another without it. Consumers authenticate by providing their name as the value for the &lt;code&gt;apikey&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;Here is a table with some responses given by a set of the routes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Plugin Scope&lt;/th&gt;
&lt;th&gt;Consumer&lt;/th&gt;
&lt;th&gt;Response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/free-service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Global&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Hello from Global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/free-service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;Hello from Consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/free-service-override&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Route&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Hello from Route&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/free-service-override&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;Hello from Consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;user2&lt;/td&gt;
&lt;td&gt;Hello from Service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As we can see, the most specific scope takes precedence over the others, depending on the request. Feel free to play around with all the consumers and routes to see all the possible outcomes!&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Protocols
&lt;/h2&gt;

&lt;p&gt;Each plugin can be set to be used only for some protocols or to use all possible. There are plugins that only support some protocols, like the &lt;a href="https://docs.konghq.com/hub/kong-inc/grpc-web" rel="noopener noreferrer"&gt;gRPC Web&lt;/a&gt; plugin which only supports gRPC (both secure and insecure).&lt;/p&gt;

&lt;p&gt;The plugin protocols allows us to have a route being served for multiple protocols at the same time but having different configurations depending on them. Attention that there is no difference between &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt;, and &lt;code&gt;grpc&lt;/code&gt; and &lt;code&gt;grpcs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, I can have in the same route &lt;a href="https://docs.konghq.com/hub/kong-inc/key-auth" rel="noopener noreferrer"&gt;🔑 Key Authentication&lt;/a&gt; for gRPC and &lt;a href="https://docs.konghq.com/hub/kong-inc/mtls-auth" rel="noopener noreferrer"&gt;↔️🔒 Mutual TLS Authentication&lt;/a&gt; for HTTPS, allowing different authentication mechanisms for the same route.&lt;/p&gt;

&lt;h2&gt;
  
  
  ♻️ Lifecycle
&lt;/h2&gt;

&lt;p&gt;The Kong gateway has defined a set of phases that a request/response goes through when reaching it. These phases are based on nginx directives and are documented &lt;a href="https://docs.konghq.com/gateway/latest/plugin-development/custom-logic/#available-contexts" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Even though there are more phases, we will only cover the ones accessible to plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🌐 &lt;strong&gt;HTTP connections&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;init_worker&lt;/code&gt; - executed on every nginx worker process startup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;configure&lt;/code&gt; - executed every time there is a configuration change in the gateway&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;certificate&lt;/code&gt; - executed during serving of SSL certificate (only available for &lt;strong&gt;secure protocols&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rewrite&lt;/code&gt; - executed for every request, before determining the consumer and service (only executed at &lt;strong&gt;Global scope&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;access&lt;/code&gt; - executed for every request before sending request upstream&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;header_filter&lt;/code&gt; - executed after receiving all response header bytes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;body_filter&lt;/code&gt; - executed for each chunk of the response body received&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response&lt;/code&gt; - executed after the whole response has been received but not forwarded to the client (cannot be used with &lt;code&gt;header_filter&lt;/code&gt; or &lt;code&gt;body_filter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ws_handshake&lt;/code&gt; - executed for every WebSocket request before the handshake&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ws_client_frame&lt;/code&gt; - executed for every WebSocket message sent by the client&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ws_upstream_frame&lt;/code&gt; - executed for every WebSocket message sent by the upstream service&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;log&lt;/code&gt; - executed after sending the response to the client&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ws_close&lt;/code&gt; - executed after WebSocket connection is closed&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;📡 &lt;strong&gt;Streaming connections&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init_worker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;certificate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;preread&lt;/code&gt; - executed once for every connection after service and consumer have been identified (similar to &lt;code&gt;access&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;For the details on which protocols each phase supports, check the &lt;a href="https://docs.konghq.com/gateway/latest/plugin-development/custom-logic/#available-contexts" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All plugins, including the official ones, have to define 2 things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema - provides the configuration parameters' types to be used by the plugin&lt;/li&gt;
&lt;li&gt;Handler - priority (next section) and actual code of the plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the handler, each plugin defines at least a function with the name of the phase they want their code to run. &lt;/p&gt;

&lt;p&gt;For example, for the &lt;a href="https://docs.konghq.com/hub/kong-inc/key-auth" rel="noopener noreferrer"&gt;🔑 Key Authentication&lt;/a&gt; plugin will run its code in the &lt;code&gt;access&lt;/code&gt; phase (for curiosity, it's source is in &lt;a href="https://github.com/Kong/kong/blob/master/kong/plugins/key-auth/handler.lua" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) while the &lt;a href="https://docs.konghq.com/hub/kong-inc/pre-function" rel="noopener noreferrer"&gt;⏪ Pre-Function&lt;/a&gt; and &lt;a href="https://docs.konghq.com/hub/kong-inc/post-function" rel="noopener noreferrer"&gt;⏩ Post-Function&lt;/a&gt; plugins override multiple phases and execute the code provided by the user.&lt;/p&gt;

&lt;p&gt;Most plugins have the main code running in the &lt;code&gt;access&lt;/code&gt; phase as it is the latest before the request is sent to the upstream service, so it contains the most information.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⬆️ Plugin priority
&lt;/h2&gt;

&lt;p&gt;Priority is probably the simplest concept of the 4 to understand. &lt;/p&gt;

&lt;p&gt;In their definition, each plugin needs to set a static value, defining their priority, which is just a number. Plugins with a bigger number have higher priority, thus are executed first.&lt;/p&gt;

&lt;p&gt;Kong provides a list of each their plugin's priority in the &lt;a href="https://docs.konghq.com/konnect/reference/plugins" rel="noopener noreferrer"&gt;Kong Plugin Ordering&lt;/a&gt; page. For custom plugins or others not provided by Kong, we have to check their priority in the source code (or documentation) usually in the plugin's main code file (e.g., &lt;code&gt;handler.lua&lt;/code&gt; for Lua-based plugins).&lt;/p&gt;

&lt;p&gt;However, since this isn't a very flexible approach, Kong also provides &lt;a href="https://docs.konghq.com/gateway/latest/kong-enterprise/plugin-ordering" rel="noopener noreferrer"&gt;Dynamic Plugin Ordering&lt;/a&gt;. This means that we can have plugins with lower priority running before others which have higher priority.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://docs.konghq.com/hub/kong-inc/rate-limiting" rel="noopener noreferrer"&gt;🚦 Rate Limiting&lt;/a&gt; plugin executes after the &lt;a href="https://docs.konghq.com/hub/kong-inc/ldap-auth" rel="noopener noreferrer"&gt;🌳 LDAP Authentication&lt;/a&gt; one, meaning it only rate limits the authenticated requests. But let's say we want to rate limit any request by IP and do this before checking the authentication as this plugin needs to contact an external server.&lt;/p&gt;

&lt;p&gt;To do that, we have 2 options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add in the &lt;code&gt;ordering.after&lt;/code&gt; field of LDAP plugin the value &lt;code&gt;rate-limiting&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add in the &lt;code&gt;ordering.before&lt;/code&gt; field of Rate Limiting plugin the value &lt;code&gt;ldap-auth&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dynamic ordering can be very useful when we have some very specific cases, however it comes with some limitations like only being available for the &lt;code&gt;access&lt;/code&gt; phase and some performance. These limitations are described in the &lt;a href="https://docs.konghq.com/gateway/latest/kong-enterprise/plugin-ordering/#known-limitations" rel="noopener noreferrer"&gt;Kong documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;We’ve covered a significant amount of ground in exploring the intricacies of Kong plugins, from understanding their scope and protocol limitations to the critical aspects of their lifecycle phases and execution priority. These four factors are the foundations of the Kong plugins and something we should have in mind both when using plugins and also when writing them.&lt;/p&gt;

&lt;p&gt;The Kong Plugin Hub and the wider community offer a vast array of pre-built solutions for the most common API management challenges. However, the true potential lies in our ability to combine the existing plugins effectively and craft custom solutions tailored to unique use cases. That's why we should be aware of all these factors when dealing with Kong plugins.&lt;/p&gt;

&lt;p&gt;The API landscape is constantly evolving, new plugins are being released and requirements may change over time. Therefore, continuous learning and experimentation are the keys to staying ahead. And Kong seems to be a good option as they are constantly evolving their gateway to support new usecases.&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.konghq.com/gateway/latest/key-concepts/plugins" rel="noopener noreferrer"&gt;Kong Plugin Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.konghq.com/hub/plugins/compatibility" rel="noopener noreferrer"&gt;Compatibility for each Kong Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.konghq.com/konnect/reference/plugins" rel="noopener noreferrer"&gt;Kong Plugin Ordering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/DMaxter/kong-plugins-deepdive" rel="noopener noreferrer"&gt;Showcase Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>kong</category>
      <category>apigateway</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
