envoy-mcp-openapi-processor
An Envoy external processor that transforms Model Context Protocol (MCP) requests into upstream HTTP API calls based on OpenAPI specifications.
Install / Use
claude mcp add ing-bank -- npx -y github:ing-bank/envoy-mcp-openapi-processorIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Development & EngineeringSupported Platforms
Our assessment of envoy-mcp-openapi-processor
envoy-mcp-openapi-processor scores 83/100 on our quality scale, 242nd of 1,340 Development & Engineering skills we index (top 19%).
Its MCP Server is 6.5 KB long, well organised into 17 sections with 8 code examples: a thorough specification that gives an agent plenty to work with.
It has 10 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so envoy-mcp-openapi-processor is actively maintained.
- Our last check on 2026-09-24 found the source still online.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 97/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-09-24. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
envoy-mcp-openapi-processor compared with similar skills
All 4 of these similar skills score higher than envoy-mcp-openapi-processor; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| envoy-mcp-openapi-processor (this skill)by ing-bank | 83 | 10 | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 85.2k | 8d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 73.7k | today | CLAUDE.md |
| rufloby ruvnet | 100 | 73.2k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.1k | today | CLAUDE.md |
Frequently asked questions
- How do I install envoy-mcp-openapi-processor?
- Run
claude mcp add ing-bank -- npx -y github:ing-bank/envoy-mcp-openapi-processor. The install tabs above show the steps for each supported agent. - Which AI agents does envoy-mcp-openapi-processor work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is envoy-mcp-openapi-processor safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 97/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is envoy-mcp-openapi-processor still maintained?
- The repository was last updated today, so envoy-mcp-openapi-processor is actively maintained.
Skill content
View source on GitHubenvoy-mcp-openapi-processor
An Envoy external processor that transforms Model Context Protocol (MCP) requests into upstream HTTP API calls based on OpenAPI specifications.
The external processor server communicates only with Envoy over gRPC via a Unix domain socket. Envoy owns all downstream client and upstream service connections, while the processor inspects and can mutate request and response data relayed by Envoy.
Installation
go get github.com/ing-bank/envoy-mcp-openapi-processor
Quick Start
See examples/mcp-server for a complete working example including Envoy proxy configured to use the
envoy-mcp-openapi-processor server.
Supported MCP Protocol Versions
The processor is a dual-era MCP server supporting 2025-06-18, 2025-11-25 and 2026-07-28. The two eras have
disjoint entry points, so every request selects one unambiguously:
- Legacy era (
2025-06-18,2025-11-25): the client starts with theinitializehandshake and declares no version on subsequent requests. Version negotiation never yields a modern version, so a client that asks for one over the handshake is answered with a version it can actually use statefully. - Modern era (
2026-07-28): there is no handshake. The mandatoryserver/discoverRPC replacesinitialize, and every request carries its protocol version inparams._meta(io.modelcontextprotocol/protocolVersion) and mirrors it in theMCP-Protocol-Versionheader, alongsideMcp-Method(andMcp-Namefortools/call). Those headers are validated against the JSON-RPC body and mismatches are refused with HTTP 400 and JSON-RPC error-32020. Results carryresultTypeand the serverInfo_metaentry, and an unknown method answers HTTP 404 rather than the legacy 200.
Result caching
Modern server/discover and tools/list results carry fixed cache hints: ttlMs: 300000 (five minutes) and
cacheScope: "private". The tool list changes only on redeploy, and an ext_proc filter cannot push
notifications/tools/list_changed, so the TTL is what brings a client back. Five minutes bounds how long a
client may keep using a retired list. Re-fetching is cheap, since both results are served from memory and never
reach the upstream API.
OpenTelemetry
To enable export of logs and traces to an OpenTelemetry collector, use one of the options below. If neither is used, the server runs with a no-op tracer provider and a no-op logger.
Option 1: Use provided initialization functions
package main
import (
"context"
mcp_proc "github.com/ing-bank/envoy-mcp-openapi-processor"
)
func main() {
telemetryConfig := mcp_proc.TelemetryConfig{
OtelEndpoint: "otel-collector:4317",
ServiceName: "mcp-sidecar",
ServiceVersion: "1.0.0",
}
ctx := context.Background()
err := mcp_proc.InitLogger(telemetryConfig)
// ...
tracerShutdown, err := mcp_proc.InitTracer(ctx, telemetryConfig)
// ...
var cfg mcp_proc.Config
// ...
mcp_proc.RunServer(ctx, &cfg)
}
Option 2: Bring your own provider
Set the global tracer provider by calling otel.SetTracerProvider(myTracerProvider) and the global zap logger by calling zap.ReplaceGlobals(myLogger) before starting the server.
Log verbosity
TelemetryConfig.LogLevel sets the minimum severity written to the console and exported to OpenTelemetry.
It accepts "debug", "info", "warn" or "error"; empty/unset means "info".
If you build the logger yourself instead, pass the level to CreateConsoleCore(level) as a zapcore.Level.
Development
Tests
To run all tests, execute the following command:
make test
To check the test coverage, execute the following command:
make coverage-check
E2E tests
To run the end-to-end suite (spins up Envoy, the processor, and a mock upstream via Docker Compose, then exercises MCP <=> REST translation), execute the following command:
make e2e
Requires Docker. On failure, container logs are captured in e2e/last-run.log.
Fuzz tests
Run server handler fuzz tests one at a time:
make fuzz-request
make fuzz-response
Each command runs until stopped with Ctrl+C and reports any issues found.
DNS Rebinding Protection
The processor validates the Host/:authority and Origin headers of every
request. By default only loopback hostnames are accepted: localhost, 127.0.0.1 and
::1 (any port); anything else is refused with HTTP 403. This protects unauthenticated
localhost deployments against DNS rebinding attacks where a malicious website's DNS resolves
to 127.0.0.1 so the victim's browser sends same-origin requests to the local server.
A missing Host header is rejected (fail closed). A missing Origin header
is accepted (non-browser clients do not send one), but a present Origin
must be a URL whose hostname is allowed.
Deployments serving other domains configure them via Config.AllowedHosts:
cfg := &mcp_proc.Config{
// ...
AllowedHosts: []string{"mcp.example.com"},
}
Matching is case-insensitive and ignores ports. A non-empty list replaces
the localhost default — include "localhost" explicitly if it should remain
allowed.
Each entry is one of:
"*"— match any host. This disables DNS rebinding protection, so use it only on trusted networks."*.example.com"— match any subdomain at any depth (foo.example.com,a.b.example.com) but not the apexexample.com."mcp.example.com"— exact match.
Security Checklist
Before deploying to production, we advise to verify if the following controls are in place
Container Security
- [ ] Container runs as non-root user
- [ ] Read-only root filesystem where possible
- [ ] No privileged mode
- [ ] Resource limits (CPU, memory) configured
- [ ] seccomp profile applied
- [ ] AppArmor/SELinux enabled
- [ ] Container image scanned for CVEs
- [ ] Image signed and verified
Envoy Configuration
- [ ] TLS configured for downstream connections
- [ ] TLS configured for upstream connections
- [ ] Buffer limits set (≤32KB for edge deployments)
- [ ] Connection limits configured
- [ ] Stream limits configured (≤100 concurrent for HTTP/2)
- [ ] Timeouts configured (connection, stream, request)
- [ ] Overload manager enabled
- [ ] Admin endpoint restricted to localhost
- [ ]
use_remote_address: truefor edge deployments - [ ] Path normalization enabled
- [ ]
headers_with_underscores_action: REJECT_REQUEST
Related Skills
Agent-Reach
85.2kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
73.7kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
ruflo
73.2k🌊 The original agent harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, federation, vector RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
CowAgent
47.1kOpen-source super AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
