{"slug": "show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers", "title": "Show HN: Fentaris, an open-source proxy for managing multiple MCP servers", "summary": "Fentaris launched as an open-source proxy and control plane for managing multiple Model Context Protocol (MCP) servers behind a single stable endpoint, unifying stdio, Streamable HTTP, SSE, and HTTP upstream MCP servers. The project ships three packages — @fentaris/core, @fentaris/cli, and @fentaris/approval-telegram — and supports API keys, bearer tokens, custom headers, and OAuth 2.1 for authenticating clients and upstream servers, with the CLI generating a proxy that listens on http://localhost:4000/mcp by default. Fentaris targets teams that want MCP servers to behave like production infrastructure, with namespaced tool names, policy-based access control, manual approval for risky actions, and structured logging of every proxied operation.", "body_md": "## Table of contents\n\n**Fentaris** is a control plane for your MCP servers — one place to run, route, and manage every MCP server behind a single, stable endpoint.\n\n- **Unify** stdio, Streamable HTTP, SSE, and HTTP upstream MCP servers behind one proxy.\n- **Manage** which servers and tools are exposed, to whom, and how they behave — without touching client configs.\n- **Observe** every proxied operation with structured logging, lifecycle events, and per-request context.\n- **Protect** tool calls, resources, prompts, and completions with policy, identity, middleware, hooks, and rate limits.\n- **Authenticate** clients and upstream MCP servers with API keys, bearer tokens, custom headers, and OAuth 2.1.\n\nFentaris is designed for teams that want MCP servers to behave like production infrastructure: stable names, centralized management, auditable calls, and predictable client-facing endpoints.\n\nVisit our [docs](https://fentaris.mintlify.app) or jump to a [quickstart](https://fentaris.mintlify.app/getting-started/quickstart)\n\nUsing Claude Code, Codex, Cursor or other AI coding agents?\n\nFor a complete runnable project with API-key users, groups, allow-list policy,\na remote MCP upstream, and app-owned local tools, see\n[`examples/team-governed-proxy`](https://github.com/Fentaris/fentaris/blob/main/examples/team-governed-proxy).\n\nUse the CLI to start a new Fentaris proxy project:\n\n```\nnpm install -g @fentaris/cli\nfentaris init my-proxy\ncd my-proxy\nfentaris dev\n```\n\nThe generated proxy listens on `http://localhost:4000/mcp` by default. Point your MCP client to that endpoint.\n\nUnder the hood, a Fentaris proxy is just a few lines of code:\n\n``` js\nimport {\n  approval,\n  fentaris,\n  oauth,\n  policy,\n  stdio,\n  streamableHttp,\n  user,\n} from \"@fentaris/core\";\n\nconst app = fentaris();\n\napp.mcp(\"filesystem\", {\n  transport: stdio({\n    command: \"npx\",\n    args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/tmp\"],\n  }),\n});\n\nawait app.start();\n```\n\nUpstream tool names stay stable and namespaced by server, no matter how many servers you add. A filesystem tool is exposed to clients with a proxy name such as:\n\n```\nfilesystem__list_directory\n```\n\nAdd another server behind the same endpoint:\n\n```\napp.mcp(\"github\", {\n  transport: stdio({ command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-github\"] }),\n});\n```\n\nRestrict who can call what:\n\n```\napp.policy(\"read-only\")\n  .mcp(\"filesystem\")\n  .allow(\"list_directory\");\n\napp.group(\"operators\")\n  .users(user(\"alice\", { email: \"alice@example.com\" }))\n  .policy(\"read-only\");\n```\n\nRequire approval before a risky action runs:\n\n``` js\nconst deploy = policy(\"deploy\")\n  .mcp(\"github\")\n  .allow(\"deploy_production\", approval.manual({\n    reason: \"Production deploy requires approval\",\n  }));\n```\n\nObserve every tool call:\n\n``` js\napp.on(\"tool:success\", ({ ctx, durationMs }) => {\n  ctx.log.info(\"tool.success\", { tool: ctx.tool?.name, durationMs });\n});\n```\n\nRuntime routes can deny, approve, hide, log, or transform calls to any tool, resource, prompt, or completion.\n\nAuthenticate clients with an API key, and let Fentaris handle OAuth 2.1 for upstream servers automatically:\n\n```\nfentaris auth api-key add alice --generate\napp.mcp(\"linear\", {\n  transport: streamableHttp({ url: \"https://mcp.linear.app/mcp\" }),\n  auth: oauth(),\n});\n```\n\nCredential values are never exposed to middleware, hooks, logs, or policy callbacks.\n\n| Package | Description | \n|---|---|\n| [`@fentaris/core`](https://github.com/Fentaris/fentaris/blob/main/packages/core) | Proxy runtime, MCP server wrapper, transports, policy, auth, logging, and middleware APIs. | \n| [`@fentaris/cli`](https://github.com/Fentaris/fentaris/blob/main/packages/cli) | Project generator and local development commands. | \n| [`@fentaris/approval-telegram`](https://github.com/Fentaris/fentaris/blob/main/packages/approval-telegram) | Telegram approval adapter for Fentaris policies. | \n\nRun the project for development:\n\n```\nfentaris dev\n```\n\nFrom a clean clone, install the locked dependency graph and run the same validation used by CI:\n\n```\npnpm install --frozen-lockfile\npnpm verify\n```\n\n`pnpm verify` runs lint, typecheck, build, and every package test in that order.\n\nBefore promoting a release, verify the exact npm tarballs in clean projects:\n\n```\npnpm verify:release\n```\n\nThis packs Core, CLI, Edge, and Telegram approval, validates their manifests and entrypoints, installs them in an empty project, generates and builds a real CLI project, and exercises upgrade, downgrade, reinstall, and re-upgrade from the previous published package set. It requires access to the npm registry.\n\nGenerate docs reference:\n\n```\npnpm docs:generate\n```\n\n[MIT](https://github.com/Fentaris/fentaris/blob/main/LICENSE.txt), as declared by the published Fentaris packages.", "url": "https://wpnews.pro/news/show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers", "canonical_source": "https://github.com/Fentaris/fentaris", "published_at": "2026-09-19 13:10:04+00:00", "updated_at": "2026-09-19 13:24:54.716884+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-infrastructure", "developer-tools", "ai-tools"], "entities": ["Fentaris", "@fentaris/core", "@fentaris/cli", "@fentaris/approval-telegram", "Model Context Protocol", "Claude Code", "Cursor", "Codex"], "alternates": {"html": "https://wpnews.pro/news/show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers", "markdown": "https://wpnews.pro/news/show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers.md", "text": "https://wpnews.pro/news/show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers.txt", "jsonld": "https://wpnews.pro/news/show-hn-fentaris-an-open-source-proxy-for-managing-multiple-mcp-servers.jsonld"}}