<?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: optml</title>
    <description>The latest articles on DEV Community by optml (@optml).</description>
    <link>https://dev.to/optml</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%2F1238424%2Fe6674686-2967-4e6b-b4ac-6c5b0188cddc.jpeg</url>
      <title>DEV Community: optml</title>
      <link>https://dev.to/optml</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/optml"/>
    <language>en</language>
    <item>
      <title>Securing AI Agents with 42 Built-in Plugins</title>
      <dc:creator>optml</dc:creator>
      <pubDate>Wed, 04 Mar 2026 08:37:26 +0000</pubDate>
      <link>https://dev.to/optml/securing-ai-agents-with-42-built-in-plugins-1ifk</link>
      <guid>https://dev.to/optml/securing-ai-agents-with-42-built-in-plugins-1ifk</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/optml/why-you-need-an-mcp-gateway-for-enterprise-ai-agents-3537"&gt;Part 1&lt;/a&gt;, we covered why MCP gateways matter. In &lt;a href="https://dev.to/optml/getting-started-with-contextforge-from-zero-to-tool-calls-in-15-minutes-1lgi"&gt;Part 2&lt;/a&gt;, we set up ContextForge and executed tool calls. Now let's talk about what makes ContextForge genuinely different from other MCP proxies: &lt;strong&gt;the plugin pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ContextForge ships with &lt;strong&gt;42 built-in plugins&lt;/strong&gt; covering security, performance, content processing, input validation, and policy enforcement. In this post, we'll enable them, see them in action, and understand how they protect AI agents in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Plugin Pipeline Works
&lt;/h2&gt;

&lt;p&gt;Every tool call and resource fetch passes through a chain of plugins, organized by &lt;strong&gt;hooks&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Request
     ↓
[tool_pre_invoke]     ← Validate, filter, rate-limit BEFORE the tool runs
     ↓
  Tool Execution
     ↓
[tool_post_invoke]    ← Filter, compress, audit AFTER the tool returns
     ↓
Response to Agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The same pattern applies to resources (&lt;code&gt;resource_pre_fetch&lt;/code&gt; / &lt;code&gt;resource_post_fetch&lt;/code&gt;) and prompts (&lt;code&gt;prompt_pre_fetch&lt;/code&gt; / &lt;code&gt;prompt_post_fetch&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Plugins execute in &lt;strong&gt;priority order&lt;/strong&gt; within each hook band. Same-priority plugins run &lt;strong&gt;in parallel&lt;/strong&gt; for performance.&lt;/p&gt;
&lt;h3&gt;
  
  
  Plugin Modes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enforce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block requests that violate the plugin's rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;permissive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Log violations but allow the request through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plugin is not loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  The 42 Plugins at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Key Plugins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security &amp;amp; Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;PII Filter, Secrets Detection, SQL Sanitizer, VirusTotal, Content Moderation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance &amp;amp; Optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Rate Limiter, Circuit Breaker, Cache, Watchdog, TOON Encoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Processing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;HTML→Markdown, JSON Repair, Code Formatter, Summarizer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Input Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Schema Guard, Argument Normalizer, SPARC Validator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Header Injector, Vault, Webhook Notification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Unified PDP (Cedar + OPA + RBAC + MAC combined)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus &lt;strong&gt;3 Rust-powered plugins&lt;/strong&gt; (PyO3) for performance-critical paths: PII Filter, Secrets Detection, Encoded Exfil Detection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnljn8iar6ywz4xlw0sm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnljn8iar6ywz4xlw0sm.png" alt="Plugin Management UI (42 total)"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Deep Dive: Key Plugins in Action
&lt;/h2&gt;
&lt;h3&gt;
  
  
  PII Filter — Mask Sensitive Data
&lt;/h3&gt;

&lt;p&gt;The PII Filter scans tool responses for personally identifiable information and masks it before it reaches the LLM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it catches:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social Security Numbers: &lt;code&gt;123-45-6789&lt;/code&gt; → &lt;code&gt;***-**-****&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Email addresses: &lt;code&gt;john@company.com&lt;/code&gt; → &lt;code&gt;****@****&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Credit card numbers, phone numbers, IP addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rust-powered variant&lt;/strong&gt;: The &lt;code&gt;PIIDetectorRust&lt;/code&gt; plugin uses PyO3 bindings for 10x faster detection on high-throughput paths.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Verified: Rust PII detector in action
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pii_filter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PIIDetectorRust&lt;/span&gt;

&lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PIIDetectorRust&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My email is john@test.com and SSN is 123-45-6789&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Returns: [PIIFinding(type="email", ...), PIIFinding(type="ssn", ...)]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  DenyList — Block Prohibited Content
&lt;/h3&gt;

&lt;p&gt;Define words or patterns that must never appear in tool responses:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# plugins/config.yaml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DenyList"&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enforce"&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;denied_words&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;innovative"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;revolutionary"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;groundbreaking"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In &lt;code&gt;enforce&lt;/code&gt; mode, any tool response containing these words is immediately blocked. Useful for preventing AI hallucination buzzwords, competitor names, or regulated terms.&lt;/p&gt;
&lt;h3&gt;
  
  
  TOON Encoder — Save 30-70% on LLM Tokens
&lt;/h3&gt;

&lt;p&gt;TOON (Tool Output Optimized Notation) is a custom encoding that compresses JSON tool results before they're sent to the LLM:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Standard JSON:  {"name": "John", "role": "admin", "active": true}
TOON encoded:   n:John|r:admin|a:1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Real-world measurement&lt;/strong&gt;: 15% reduction on small JSON, 30-70% on larger payloads. This directly reduces LLM API costs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Rate Limiter — Per-Team, Per-User Throttling
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RateLimiter"&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enforce"&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests_per_minute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
    &lt;span class="na"&gt;burst&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Prevent runaway agents from overwhelming backend systems or burning through API quotas.&lt;/p&gt;
&lt;h3&gt;
  
  
  URL Reputation — Block Malicious Endpoints
&lt;/h3&gt;

&lt;p&gt;Checks URLs in tool arguments against threat intelligence feeds:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent tries to call: fetch_url("http://malicious.example.com/payload")
     ↓
URL Reputation Plugin: ⛔ BLOCKED (known malicious domain)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Cached Tool Results — Avoid Redundant Calls
&lt;/h3&gt;

&lt;p&gt;If an agent calls the same tool with the same arguments within the cache TTL, the cached result is returned instantly:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First call:  get_current_time(timezone="UTC")  → 150ms (real call)
Second call: get_current_time(timezone="UTC")  → 2ms (cached)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Summarizer — LLM-Powered Response Compression
&lt;/h3&gt;

&lt;p&gt;For large tool responses (documentation, logs, data dumps), the Summarizer plugin calls a secondary LLM to compress the content:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarizer"&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enforce"&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic"&lt;/span&gt;
    &lt;span class="na"&gt;anthropic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-haiku-4-5-20251001"&lt;/span&gt;
      &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt;
    &lt;span class="na"&gt;threshold_chars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Responses exceeding the threshold are automatically summarized before reaching the primary agent.&lt;/p&gt;
&lt;h3&gt;
  
  
  Unified PDP — Multi-Engine Policy Decisions
&lt;/h3&gt;

&lt;p&gt;The Unified PDP plugin integrates &lt;strong&gt;four policy engines&lt;/strong&gt; into one interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cedar&lt;/strong&gt; — AWS's policy language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPA&lt;/strong&gt; — Open Policy Agent (Rego)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RBAC&lt;/strong&gt; — Native role-based access control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MAC&lt;/strong&gt; — Mandatory Access Control (Bell-LaPadula model)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UnifiedPDPPlugin"&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enforce"&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;engines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;native_rbac"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Start simple, add Cedar/OPA as needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running 28 Plugins Simultaneously
&lt;/h2&gt;

&lt;p&gt;We tested 28 plugins running at the same time. Here's the verified configuration:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total plugins: 42
Enabled: 28  |  Disabled: 14

Hooks distribution:
├─ tool_pre_invoke:     17 plugins
├─ tool_post_invoke:    26 plugins
├─ resource_pre_fetch:   7 plugins
├─ resource_post_fetch: 14 plugins
├─ prompt_pre_fetch:    10 plugins
└─ prompt_post_fetch:    7 plugins

Modes: enforce=18, permissive=10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Performance impact&lt;/strong&gt;: With 28 plugins active, health endpoint response stayed at &lt;strong&gt;4ms&lt;/strong&gt;, gateway queries at &lt;strong&gt;7ms&lt;/strong&gt;. The parallel execution model keeps latency low.&lt;/p&gt;


&lt;h2&gt;
  
  
  Observability: See Everything
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Prometheus Metrics
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/metrics/prometheus
&lt;span class="c"&gt;# 801 lines, 44 metric definitions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Key metrics include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mcp_tool_calls_total&lt;/code&gt; — per-tool call counts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mcp_plugin_executions_total&lt;/code&gt; — per-plugin execution counts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mcp_tool_call_duration_seconds&lt;/code&gt; — latency histograms&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mcp_active_sessions&lt;/code&gt; — concurrent session gauge&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Aggregated JSON Metrics
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/metrics
&lt;span class="c"&gt;# Structured summary: tools, resources, servers, prompts, a2a_agents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Tool Annotations
&lt;/h3&gt;

&lt;p&gt;Each tool exposes metadata about its behavior:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_current_time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"readOnlyHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openWorldHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agents can use these hints to make smarter decisions about tool usage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falkqraiepjq1jgyinl6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falkqraiepjq1jgyinl6h.png" alt="System Metrics Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Enabling Plugins
&lt;/h2&gt;

&lt;p&gt;All plugin configuration lives in &lt;code&gt;plugins/config.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PIIFilterPlugin"&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enforce"&lt;/span&gt;        &lt;span class="c1"&gt;# enforce | permissive | disabled&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;           &lt;span class="c1"&gt;# Lower = runs first&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_post_invoke"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resource_post_fetch"&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ssn"&lt;/span&gt;
          &lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;d{3}-&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;d{2}-&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;d{4}"&lt;/span&gt;
          &lt;span class="na"&gt;mask&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***-**-****"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Enable the plugin system in &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PLUGINS_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="nv"&gt;PLUGINS_CONFIG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;plugins/config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check the status via Admin API:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/admin/plugins/stats &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Load Testing Results
&lt;/h2&gt;

&lt;p&gt;We ran Locust with 10 concurrent users for 30 seconds against a gateway with 28 active plugins:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Avg Response&lt;/th&gt;
&lt;th&gt;p99&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4ms&lt;/td&gt;
&lt;td&gt;12ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gateways&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7ms&lt;/td&gt;
&lt;td&gt;22ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/servers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13ms&lt;/td&gt;
&lt;td&gt;38ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/admin/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43ms&lt;/td&gt;
&lt;td&gt;95ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;~290 requests total, zero failures. The plugin pipeline adds minimal overhead.&lt;/p&gt;


&lt;h2&gt;
  
  
  Infrastructure We Verified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTPS/TLS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TLS 1.3, AEAD-AES256-GCM-SHA384, RSA-4096 self-signed certs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alembic migrations, 60 tables created, full CRUD verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v8.6.1, PING/PONG connectivity, caching layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rust Plugins&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PIIDetectorRust built via maturin, detect/mask verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Locust 10 users / 30s, 4-43ms avg response&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  The Full Picture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flauu1lq24rfqxe0asnux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flauu1lq24rfqxe0asnux.png" alt="Admin Dashboard with System Overview"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent
   ↓
[ContextForge Gateway]
   ├─ JWT Authentication
   ├─ Token Scoping (what can you see?)
   ├─ RBAC (what can you do?)
   ├─ Plugin Pipeline:
   │   ├─ PII Filter (mask sensitive data)
   │   ├─ Rate Limiter (throttle per team)
   │   ├─ DenyList (block prohibited content)
   │   ├─ SQL Sanitizer (prevent injection)
   │   ├─ TOON Encoder (compress for LLM)
   │   ├─ URL Reputation (block malicious URLs)
   │   ├─ Watchdog (track response times)
   │   └─ ... 35 more plugins
   ├─ Prometheus Metrics
   └─ Audit Logging
   ↓
Backend Tools (MCP, REST, gRPC, A2A)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;ContextForge isn't just an MCP proxy — it's a &lt;strong&gt;governance layer for AI agents&lt;/strong&gt;. The 42 built-in plugins give you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data protection&lt;/strong&gt; without modifying agent code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost optimization&lt;/strong&gt; through TOON compression and caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt; with PII filtering, audit logs, and policy engines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt; with rate limiting, circuit breakers, and watchdogs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility&lt;/strong&gt; with Prometheus metrics and structured logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All open source, all configurable, all running with minimal latency overhead.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ContextForge is open source under Apache 2.0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/IBM" rel="noopener noreferrer"&gt;
        IBM
      &lt;/a&gt; / &lt;a href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;
        mcp-context-forge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An AI Gateway, registry, and proxy that sits in front of any MCP, A2A, or REST/gRPC APIs, exposing a unified endpoint with centralized discovery, guardrails and management. Optimizes Agent &amp;amp; Tool calling, and supports plugins.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ContextForge&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;An open source registry and proxy that federates MCP, A2A, and REST/gRPC APIs with centralized governance, discovery, and observability. Optimizes Agent &amp;amp; Tool calling, and supports plugins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/IBM/mcp-context-forge/docs/docs/images/contextforge-logo_horizontal_black.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIBM%2Fmcp-context-forge%2Fdocs%2Fdocs%2Fimages%2Fcontextforge-logo_horizontal_black.png" alt="ContextForge Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml/badge.svg" alt="Build Python Package"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml/badge.svg" alt="Bandit Security"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml/badge.svg" alt="Dependency Review"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml/badge.svg" alt="Tests &amp;amp; Coverage"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml/badge.svg" alt="Lint &amp;amp; Static Analysis"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.python.org/3/library/asyncio.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/da9b739d383d8fb6012f47c5c923a7342d91ae03a8cff1e6925b04b19d9b036a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6173796e632d61776169742d677265656e2e737667" alt="Async"&gt;&lt;/a&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c1ac750baabf259ffde317eb6320024dee716fa2e2d9ee3978a507a047784056/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f69626d2f6d63702d636f6e746578742d666f726765" alt="License"&gt;&lt;/a&gt; 
&lt;a href="https://pypi.org/project/mcp-contextforge-gateway/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/06aa0fceee22c6fb23eb2821d5c09c9052d7b06a2a3f02bc5c3cd318b647f54a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6d63702d636f6e74657874666f7267652d67617465776179" alt="PyPI"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/ibm/mcp-context-forge/pkgs/container/mcp-context-forge" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/708cf966fd95ff3f2797cfcaced350b21923fc2e2681d86bcd72bfd1770861f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f636b65722d676863722e696f25324669626d2532466d63702d2d636f6e746578742d2d666f7267652d626c7565" alt="Docker Image"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ContextForge&lt;/strong&gt; is an open source registry and proxy that federates tools, agents, and APIs into one clean endpoint for your AI clients. It provides centralized governance, discovery, and observability across your AI infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools Gateway&lt;/strong&gt; — MCP, REST, gRPC-to-MCP translation, and TOON compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Gateway&lt;/strong&gt; — A2A protocol, OpenAI-compatible and Anthropic agent routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt; — Rate limiting, auth, retries, and reverse proxy for REST services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Extensibility&lt;/strong&gt; — 40+ plugins for additional transports, protocols, and integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; — OpenTelemetry tracing with Phoenix, Jaeger, Zipkin, and other OTLP backends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs as a fully compliant MCP server, deployable via PyPI or Docker, and scales to multi-cluster environments on Kubernetes with Redis-backed federation and caching.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966"&gt;&lt;img src="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966" alt="ContextForge"&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/IBM/mcp-context-forge#overview--goals" rel="noopener noreferrer"&gt;Overview &amp;amp; Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge#quick-start---pypi" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>mcp</category>
      <category>security</category>
      <category>plugins</category>
      <category>ai</category>
    </item>
    <item>
      <title>Getting Started with ContextForge: From Zero to Tool Calls in 15 Minutes</title>
      <dc:creator>optml</dc:creator>
      <pubDate>Wed, 04 Mar 2026 08:36:32 +0000</pubDate>
      <link>https://dev.to/optml/getting-started-with-contextforge-from-zero-to-tool-calls-in-15-minutes-1lgi</link>
      <guid>https://dev.to/optml/getting-started-with-contextforge-from-zero-to-tool-calls-in-15-minutes-1lgi</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/optml/why-you-need-an-mcp-gateway-for-enterprise-ai-agents-3537"&gt;Part 1&lt;/a&gt;, we covered &lt;em&gt;why&lt;/em&gt; you need an MCP gateway. Now let's get hands-on.&lt;/p&gt;

&lt;p&gt;By the end of this post, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A running ContextForge gateway&lt;/li&gt;
&lt;li&gt;An MCP server registered and discoverable&lt;/li&gt;
&lt;li&gt;Tool calls executing through the gateway&lt;/li&gt;
&lt;li&gt;Admin UI up and running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All on your local machine, in about 15 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3.12+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;uv&lt;/strong&gt; (package manager) — &lt;code&gt;pip install uv&lt;/code&gt; if you don't have it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Clone and Configure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/IBM/mcp-context-forge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-context-forge
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Edit &lt;code&gt;.env&lt;/code&gt; — change these default values for local development:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Admin UI login&lt;/span&gt;
&lt;span class="nv"&gt;BASIC_AUTH_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Dev@Local2026!

&lt;span class="c"&gt;# JWT signing key (32+ characters)&lt;/span&gt;
&lt;span class="nv"&gt;JWT_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;contextforge-dev-secret-key-2026-not-for-prod

&lt;span class="c"&gt;# Stored secrets encryption key&lt;/span&gt;
&lt;span class="nv"&gt;AUTH_ENCRYPTION_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;contextforge-dev-encryption-salt-2026

&lt;span class="c"&gt;# Platform admin account&lt;/span&gt;
&lt;span class="nv"&gt;PLATFORM_ADMIN_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin@example.com
&lt;span class="nv"&gt;PLATFORM_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Dev@Admin2026!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Install Dependencies
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make install-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a virtual environment at &lt;code&gt;~/.venv/mcpgateway&lt;/code&gt; and installs ~289 packages including dev dependencies.&lt;/p&gt;

&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make check-env-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Use &lt;code&gt;check-env-dev&lt;/code&gt;, not &lt;code&gt;check-env&lt;/code&gt;. The latter reads &lt;code&gt;.env.example&lt;/code&gt; defaults and will flag security warnings.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 3: Run the Tests (Optional but Recommended)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;13,755+ tests, 99% coverage, ~67 seconds. Some tests skip based on your environment (no Rust, no PostgreSQL, etc.) — that's normal. Zero failures = success.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Start the Dev Server
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: &lt;code&gt;http://localhost:8000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger Docs&lt;/strong&gt;: &lt;code&gt;http://localhost:8000/docs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin UI&lt;/strong&gt;: &lt;code&gt;http://localhost:8000/admin/login&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 5: Log Into the Admin UI
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:8000/admin/login&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4njvdf2x4aca2v11xct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4njvdf2x4aca2v11xct.png" alt="Login Page — drag &amp;amp; drop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin@example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Dev@Admin2026!&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On first login, you'll be asked to change your password. Set it to something like &lt;code&gt;Dev@Admin2026!New#1&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The database is file-based SQLite (&lt;code&gt;mcp.db&lt;/code&gt;), so your changed password persists across server restarts.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 6: Generate a JWT Token
&lt;/h2&gt;

&lt;p&gt;API calls require a Bearer token. Open a new terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.venv/mcpgateway/bin/activate

python &lt;span class="nt"&gt;-m&lt;/span&gt; mcpgateway.utils.create_jwt_token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--username&lt;/span&gt; admin@example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--exp&lt;/span&gt; 10080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--secret&lt;/span&gt; contextforge-dev-secret-key-2026-not-for-prod &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--admin&lt;/span&gt;

&lt;span class="c"&gt;# Save the output&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;paste-the-generated-token&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: The &lt;code&gt;--admin&lt;/code&gt; flag is required. Without it, admin API calls return &lt;code&gt;"Authorization token required"&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 7: Register an MCP Server
&lt;/h2&gt;

&lt;p&gt;We'll use &lt;code&gt;mcp-server-time&lt;/code&gt; as an example. ContextForge's &lt;code&gt;translate&lt;/code&gt; command converts stdio MCP servers to SSE:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal 1&lt;/strong&gt; — Start the MCP server:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.venv/mcpgateway/bin/activate

python &lt;span class="nt"&gt;-m&lt;/span&gt; mcpgateway.translate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stdio&lt;/span&gt; &lt;span class="s2"&gt;"uvx mcp-server-time --local-timezone UTC"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 9000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Multi-protocol server ready → SSE: http://127.0.0.1:9000/sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Terminal 2&lt;/strong&gt; — Register it with the gateway:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8000/gateways &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "time-server", "url": "http://localhost:9000/sse"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4ba5541fd0bc486ea68830e39b1febdb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"time-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:9000/sse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SSE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reachable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The URL must include &lt;code&gt;/sse&lt;/code&gt; — that's where the translate server exposes its SSE endpoint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpqdgzjl6gxvv4wja2jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpqdgzjl6gxvv4wja2jj.png" alt="MCP Servers &amp;amp; Federated Gateways page"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 8: Discover Tools
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:8000/tools &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You should see tools like &lt;code&gt;get_current_time&lt;/code&gt; automatically discovered from the registered server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuatqt74ahetad8uhvtz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuatqt74ahetad8uhvtz.png" alt="Tools list with annotation badges"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 9: Execute a Tool Call
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8000/tools/get_current_time/call &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"arguments": {"timezone": "America/New_York"}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You get back the current time — routed through ContextForge, logged, and ready for plugin processing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmujpy2in51nsozihjoj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmujpy2in51nsozihjoj.png" alt="Tool Test execution result"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 10: Explore the Admin Dashboard
&lt;/h2&gt;

&lt;p&gt;Go back to &lt;code&gt;http://localhost:8000/admin/&lt;/code&gt; and explore:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;What You'll See&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server/tool/resource counts, system health&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gateways&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your registered &lt;code&gt;time-server&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_current_time&lt;/code&gt; discovered from the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugins&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42 available plugins (enable/disable from config)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Virtual server management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Request/response audit trail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcv3uqnzq4dnqk4obauv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcv3uqnzq4dnqk4obauv.png" alt="Admin Dashboard with System Overview"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 11: Check the API Docs
&lt;/h2&gt;

&lt;p&gt;Visit &lt;code&gt;http://localhost:8000/docs&lt;/code&gt; for the full Swagger UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;344 API endpoints&lt;/strong&gt; documented with OpenAPI 3.1.0&lt;/li&gt;
&lt;li&gt;Try-it-out functionality for every endpoint&lt;/li&gt;
&lt;li&gt;Schema definitions for all request/response models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fuz78j1nuozl0iq27s3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fuz78j1nuozl0iq27s3.png" alt="Swagger UI"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What We Just Did
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌────────────────────┐
mcp-server-time ──→ │                    │
  (stdio→SSE)       │   ContextForge     │ ← Admin UI
                    │   Gateway :8000    │ ← Swagger Docs
                    │                    │ ← JWT Auth
                    └────────────────────┘
                              ↑
                    curl / AI Agent / SDK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In 15 minutes, we set up a fully functional MCP gateway with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication (JWT)&lt;/li&gt;
&lt;li&gt;Server discovery&lt;/li&gt;
&lt;li&gt;Tool execution&lt;/li&gt;
&lt;li&gt;Admin dashboard&lt;/li&gt;
&lt;li&gt;API documentation&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Bonus: HTTPS in 30 Seconds
&lt;/h2&gt;

&lt;p&gt;ContextForge ships with self-signed certificate generation:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If certs don't exist yet, they'll be created automatically&lt;/span&gt;
&lt;span class="nv"&gt;SSL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true &lt;/span&gt;&lt;span class="nv"&gt;CERT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;certs/cert.pem &lt;span class="nv"&gt;KEY_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;certs/key.pem make serve-ssl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Result: TLS 1.3, AEAD-AES256-GCM-SHA384, RSA-4096 — production-grade encryption.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bonus: PostgreSQL Backend
&lt;/h2&gt;

&lt;p&gt;Swap SQLite for PostgreSQL with one environment variable:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgresql+psycopg://user:pass@localhost:5432/mcp"&lt;/span&gt; make dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Alembic migrations run automatically, creating 60 tables. Same API, same features, production-ready persistence.&lt;/p&gt;


&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, we'll enable plugins and see the real power of ContextForge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PII filtering that masks sensitive data before it reaches the LLM&lt;/li&gt;
&lt;li&gt;Rate limiting per team and per user&lt;/li&gt;
&lt;li&gt;TOON compression that saves 30-70% on LLM tokens&lt;/li&gt;
&lt;li&gt;28 plugins running simultaneously in a pipeline&lt;/li&gt;
&lt;li&gt;Prometheus metrics and observability&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;ContextForge is open source under Apache 2.0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/IBM" rel="noopener noreferrer"&gt;
        IBM
      &lt;/a&gt; / &lt;a href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;
        mcp-context-forge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An AI Gateway, registry, and proxy that sits in front of any MCP, A2A, or REST/gRPC APIs, exposing a unified endpoint with centralized discovery, guardrails and management. Optimizes Agent &amp;amp; Tool calling, and supports plugins.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ContextForge&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;An open source registry and proxy that federates MCP, A2A, and REST/gRPC APIs with centralized governance, discovery, and observability. Optimizes Agent &amp;amp; Tool calling, and supports plugins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/IBM/mcp-context-forge/docs/docs/images/contextforge-logo_horizontal_black.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIBM%2Fmcp-context-forge%2Fdocs%2Fdocs%2Fimages%2Fcontextforge-logo_horizontal_black.png" alt="ContextForge Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml/badge.svg" alt="Build Python Package"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml/badge.svg" alt="Bandit Security"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml/badge.svg" alt="Dependency Review"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml/badge.svg" alt="Tests &amp;amp; Coverage"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml/badge.svg" alt="Lint &amp;amp; Static Analysis"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.python.org/3/library/asyncio.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/da9b739d383d8fb6012f47c5c923a7342d91ae03a8cff1e6925b04b19d9b036a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6173796e632d61776169742d677265656e2e737667" alt="Async"&gt;&lt;/a&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c1ac750baabf259ffde317eb6320024dee716fa2e2d9ee3978a507a047784056/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f69626d2f6d63702d636f6e746578742d666f726765" alt="License"&gt;&lt;/a&gt; 
&lt;a href="https://pypi.org/project/mcp-contextforge-gateway/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/06aa0fceee22c6fb23eb2821d5c09c9052d7b06a2a3f02bc5c3cd318b647f54a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6d63702d636f6e74657874666f7267652d67617465776179" alt="PyPI"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/ibm/mcp-context-forge/pkgs/container/mcp-context-forge" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/708cf966fd95ff3f2797cfcaced350b21923fc2e2681d86bcd72bfd1770861f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f636b65722d676863722e696f25324669626d2532466d63702d2d636f6e746578742d2d666f7267652d626c7565" alt="Docker Image"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ContextForge&lt;/strong&gt; is an open source registry and proxy that federates tools, agents, and APIs into one clean endpoint for your AI clients. It provides centralized governance, discovery, and observability across your AI infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools Gateway&lt;/strong&gt; — MCP, REST, gRPC-to-MCP translation, and TOON compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Gateway&lt;/strong&gt; — A2A protocol, OpenAI-compatible and Anthropic agent routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt; — Rate limiting, auth, retries, and reverse proxy for REST services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Extensibility&lt;/strong&gt; — 40+ plugins for additional transports, protocols, and integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; — OpenTelemetry tracing with Phoenix, Jaeger, Zipkin, and other OTLP backends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs as a fully compliant MCP server, deployable via PyPI or Docker, and scales to multi-cluster environments on Kubernetes with Redis-backed federation and caching.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966"&gt;&lt;img src="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966" alt="ContextForge"&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/IBM/mcp-context-forge#overview--goals" rel="noopener noreferrer"&gt;Overview &amp;amp; Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge#quick-start---pypi" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;In Part 3, we enable the plugin pipeline and see what makes ContextForge genuinely different.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>tutorial</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why You Need an MCP Gateway for Enterprise AI Agents</title>
      <dc:creator>optml</dc:creator>
      <pubDate>Wed, 04 Mar 2026 08:35:43 +0000</pubDate>
      <link>https://dev.to/optml/why-you-need-an-mcp-gateway-for-enterprise-ai-agents-3537</link>
      <guid>https://dev.to/optml/why-you-need-an-mcp-gateway-for-enterprise-ai-agents-3537</guid>
      <description>&lt;p&gt;MCP adoption is accelerating — but so are the risks. Every AI agent with direct API access is a potential data leak, permission escalation, or compliance violation waiting to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if you could govern every AI agent tool call through a single layer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is Part 1 of a 3-part series on &lt;a href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;ContextForge&lt;/a&gt;, an open-source MCP gateway that brings enterprise-grade security, observability, and 42 built-in plugins to AI agent infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: AI Agents Without Guard Rails
&lt;/h2&gt;

&lt;p&gt;Imagine your company adopts an AI agent platform. Different teams spin up agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                          ┌→ SAP ERP (REST)
HR Agent ─────────────────┼→ Employee DB (SQL)
                          └→ Slack API

                          ┌→ Salesforce (REST)
Sales Agent ──────────────┼→ Internal CRM (gRPC)
                          └→ Email Service

                          ┌→ Jenkins (REST)
DevOps Agent ─────────────┼→ GitHub API
                          └→ Cloud Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each agent connects directly to each API. What could go wrong?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Real-World Scenario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Leaks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HR agent accidentally sends employee SSNs to the LLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission Chaos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An intern's agent runs &lt;code&gt;DROP TABLE&lt;/code&gt; on production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No Audit Trail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Who called what API when?" — nobody knows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Connection Sprawl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 APIs x 50 agents = 5,000 individual connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Blindness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No idea which team is burning through LLM tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't hypothetical risks. They're the inevitable result of letting AI agents access enterprise systems without centralized governance.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Solution: Put a Gateway in the Middle
&lt;/h2&gt;

&lt;p&gt;ContextForge sits between your AI agents and your backend systems:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                                ┌→ SAP ERP
HR Agent ─────────┐                             ├→ Employee DB
                  │    ┌────────────────────┐   ├→ Salesforce
Sales Agent ──────┼───→│   ContextForge     │──→├→ CRM (gRPC→MCP auto-convert)
                  │    │                    │   ├→ Jenkins
DevOps Agent ─────┘    │  Security · Audit  │   ├→ GitHub
                       │  Plugin Pipeline   │   └→ Cloud APIs
AI Platform ──────────→│                    │
(Claude Code, etc.)    └────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every request flows through the gateway. Every response gets filtered. Everything gets logged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08zfuzbu9o5hljhxljnc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08zfuzbu9o5hljhxljnc.png" alt="Admin Dashboard — drag &amp;amp; drop"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What ContextForge Actually Does
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Turns Your Existing APIs into AI Tools — Automatically
&lt;/h3&gt;

&lt;p&gt;Enterprises already have hundreds of REST and gRPC APIs. ContextForge converts them into MCP tools without modifying the original services:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Existing SAP REST API  → Register in ContextForge → Agents use it as a "tool"
Existing gRPC service  → Auto-discovery via Reflection → MCP tool, no schema needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No code changes to existing systems. Your investment is protected.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Prevents Data Leaks at the Gateway Level
&lt;/h3&gt;

&lt;p&gt;Every tool call and response passes through a &lt;strong&gt;plugin pipeline&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Request: "Look up John's employee record"
     ↓
[ContextForge Plugin Pipeline]
     ├─ PII Filter        → SSN 123-45-6789 → ***-**-****
     ├─ Secrets Detection  → DB password detected → masked
     ├─ SQL Sanitizer      → SQL injection attempt → blocked
     └─ DenyList           → Prohibited keywords → blocked
     ↓
Only safe results reach the agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;GDPR, HIPAA, SOC 2 — compliance is enforced at the infrastructure layer, not in application code.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Isolates Teams with Multi-Tenancy
&lt;/h3&gt;

&lt;p&gt;Different teams see different tools, enforced by a &lt;strong&gt;two-layer security model&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layer 1 — Token Scoping&lt;/strong&gt;: Controls what you &lt;em&gt;can see&lt;/em&gt; (data filtering)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer 2 — RBAC&lt;/strong&gt;: Controls what you &lt;em&gt;can do&lt;/em&gt; (permission checks)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HR Team Agent     → Can only access HR servers (payroll, employee DB)
Sales Team Agent  → Can only access CRM, Salesforce
Intern's Agent    → Read-only (viewer role), write/delete returns 403
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Can See (Token Scoping)&lt;/th&gt;
&lt;th&gt;Can Do (RBAC)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;platform_admin&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;team_admin&lt;/td&gt;
&lt;td&gt;Team tools&lt;/td&gt;
&lt;td&gt;Team management + tool execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;developer&lt;/td&gt;
&lt;td&gt;Team tools&lt;/td&gt;
&lt;td&gt;Tool execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viewer&lt;/td&gt;
&lt;td&gt;Team tools&lt;/td&gt;
&lt;td&gt;Read only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  4. Tracks Costs and Usage
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ContextForge Observability:
├─ Prometheus Metrics   → Per-team, per-agent API call counts
├─ TOON Compression     → 30-70% LLM token reduction (= cost savings)
├─ Rate Limiter         → Per-team, per-user call limits
├─ Token Catalog        → Per-token quotas, expiry, usage tracking
└─ Audit Logs           → Full record of who did what, when
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Finally, you can answer: &lt;em&gt;"How much did AI agent operations cost this month?"&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Deploys Like Enterprise Software
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Platform (Cloud)
       ↓
ContextForge (OCP / K8s / Docker)
├─ Helm Charts       → Auto-scaling (HPA)
├─ PostgreSQL        → Persistent storage
├─ Redis             → Caching / sessions
├─ TLS 1.3           → End-to-end encryption
├─ NetworkPolicy     → Network isolation
└─ OAuth / SSO       → Enterprise identity (Entra, Okta, Keycloak)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  By the Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built-in plugins&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit tests&lt;/td&gt;
&lt;td&gt;13,755+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code coverage&lt;/td&gt;
&lt;td&gt;99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported protocols&lt;/td&gt;
&lt;td&gt;MCP, A2A, REST→MCP, gRPC→MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API endpoints&lt;/td&gt;
&lt;td&gt;344 (OpenAPI 3.1.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported databases&lt;/td&gt;
&lt;td&gt;SQLite, PostgreSQL, MySQL, MariaDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment options&lt;/td&gt;
&lt;td&gt;Docker, K8s Helm, OpenShift, AWS/Azure/GCP/IBM Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  A Real-World Scenario
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Employee asks AI platform:
   "Analyze last week's production incident logs"

2. AI agent calls tools through ContextForge:
   ├─ Splunk API (REST→MCP auto-convert) → Fetch logs
   ├─ Jira API → Search related issues
   └─ PagerDuty API → Retrieve incident history

3. ContextForge plugin pipeline:
   ├─ PII Filter → Mask customer PII in logs
   ├─ TOON Compression → Reduce token usage on large log data
   └─ Audit Log → Record "who accessed production logs"

4. Agent delivers safe, filtered analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Without vs. With
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Without ContextForge&lt;/th&gt;
&lt;th&gt;With ContextForge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API connections&lt;/td&gt;
&lt;td&gt;Each agent implements its own&lt;/td&gt;
&lt;td&gt;Register once, share everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Handled in each agent's code&lt;/td&gt;
&lt;td&gt;Applied uniformly at the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditing&lt;/td&gt;
&lt;td&gt;Build it yourself&lt;/td&gt;
&lt;td&gt;Built-in (Prometheus + logging)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Configure per API&lt;/td&gt;
&lt;td&gt;Unified RBAC + token scoping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost tracking&lt;/td&gt;
&lt;td&gt;Not possible&lt;/td&gt;
&lt;td&gt;Per-team, per-token usage tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding new APIs&lt;/td&gt;
&lt;td&gt;Modify agent code&lt;/td&gt;
&lt;td&gt;Just register the REST/gRPC endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, we'll get hands-on: clone the repo, start a dev server, register an MCP server, and execute tool calls — all in under 15 minutes.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, we'll deep-dive into the 42-plugin pipeline: PII filtering, rate limiting, circuit breakers, LLM summarization, and the unique TOON compression that saves 30-70% on LLM tokens.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ContextForge is open source under Apache 2.0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/IBM" rel="noopener noreferrer"&gt;
        IBM
      &lt;/a&gt; / &lt;a href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;
        mcp-context-forge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An AI Gateway, registry, and proxy that sits in front of any MCP, A2A, or REST/gRPC APIs, exposing a unified endpoint with centralized discovery, guardrails and management. Optimizes Agent &amp;amp; Tool calling, and supports plugins.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ContextForge&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;An open source registry and proxy that federates MCP, A2A, and REST/gRPC APIs with centralized governance, discovery, and observability. Optimizes Agent &amp;amp; Tool calling, and supports plugins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/IBM/mcp-context-forge/docs/docs/images/contextforge-logo_horizontal_black.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIBM%2Fmcp-context-forge%2Fdocs%2Fdocs%2Fimages%2Fcontextforge-logo_horizontal_black.png" alt="ContextForge Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/python-package.yml/badge.svg" alt="Build Python Package"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/bandit.yml/badge.svg" alt="Bandit Security"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/dependency-review.yml/badge.svg" alt="Dependency Review"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/pytest.yml/badge.svg" alt="Tests &amp;amp; Coverage"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/IBM/mcp-context-forge/actions/workflows/lint.yml/badge.svg" alt="Lint &amp;amp; Static Analysis"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.python.org/3/library/asyncio.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/da9b739d383d8fb6012f47c5c923a7342d91ae03a8cff1e6925b04b19d9b036a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6173796e632d61776169742d677265656e2e737667" alt="Async"&gt;&lt;/a&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c1ac750baabf259ffde317eb6320024dee716fa2e2d9ee3978a507a047784056/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f69626d2f6d63702d636f6e746578742d666f726765" alt="License"&gt;&lt;/a&gt; 
&lt;a href="https://pypi.org/project/mcp-contextforge-gateway/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/06aa0fceee22c6fb23eb2821d5c09c9052d7b06a2a3f02bc5c3cd318b647f54a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6d63702d636f6e74657874666f7267652d67617465776179" alt="PyPI"&gt;&lt;/a&gt; 
&lt;a href="https://github.com/ibm/mcp-context-forge/pkgs/container/mcp-context-forge" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/708cf966fd95ff3f2797cfcaced350b21923fc2e2681d86bcd72bfd1770861f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f636b65722d676863722e696f25324669626d2532466d63702d2d636f6e746578742d2d666f7267652d626c7565" alt="Docker Image"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ContextForge&lt;/strong&gt; is an open source registry and proxy that federates tools, agents, and APIs into one clean endpoint for your AI clients. It provides centralized governance, discovery, and observability across your AI infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools Gateway&lt;/strong&gt; — MCP, REST, gRPC-to-MCP translation, and TOON compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Gateway&lt;/strong&gt; — A2A protocol, OpenAI-compatible and Anthropic agent routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt; — Rate limiting, auth, retries, and reverse proxy for REST services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Extensibility&lt;/strong&gt; — 40+ plugins for additional transports, protocols, and integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; — OpenTelemetry tracing with Phoenix, Jaeger, Zipkin, and other OTLP backends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs as a fully compliant MCP server, deployable via PyPI or Docker, and scales to multi-cluster environments on Kubernetes with Redis-backed federation and caching.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966"&gt;&lt;img src="https://camo.githubusercontent.com/4ad799b9c5731013cfa2898bece94355a8702eec7d31c210b8a7e4c9e88b8b89/68747470733a2f2f69626d2e6769746875622e696f2f6d63702d636f6e746578742d666f7267652f696d616765732f6d6370676174657761792e676966" alt="ContextForge"&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/IBM/mcp-context-forge#overview--goals" rel="noopener noreferrer"&gt;Overview &amp;amp; Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/IBM/mcp-context-forge#quick-start---pypi" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/IBM/mcp-context-forge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If this resonated with you, follow this series — in Part 2, we go from zero to tool calls in 15 minutes. &lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
