MCP server · Org-owned · Audited from source
tunnel-client MCP server
by openai/tunnel-clientApache-2.0 licenceAudited 23 Oct 2026 · source ea9e397e0096
Is it safe? With care — CAUTION, grade F (57/100). It exposes 2 tools: 2 read, 0 write and 0 destructive. The audit recorded 32 findings (0 critical, 0 high, 10 medium, 20 low). Maintainer's description: Customer-run client for Secure MCP Tunnel: connect private or localhost MCP servers to ChatGPT, Codex, the Responses API, and AgentKit without exposing them to the public internet.
Cite
Cite this page
ModelsAtlas. “tunnel-client MCP server (openai/tunnel-client)”. Retrieved 23 Oct 2026. https://modelsatlas.com/mcp/openai/tunnel-client
Trust audit
Audit 0.4.1 · full source read 23 Oct 2026
32 findings, listed below with the file and line each was found on. Grade A needs a sandboxed behavioural run too; this audit read the source only.
What the source does
- FilesystemDeclared4 observations
- NetworkDeclared8 observations
- ShellDeclared3 observations
- DependenciesNot pinnedSome ranges float
- SecretsFoundSee the findings
“Declared” means the server says it does this and the source agrees. Browser, file and shell access are expected of some kinds of server.
Five audit layers
| Layer | What we check | Result |
|---|---|---|
L0 Provenance | Repo owner, licence, archive status, activity | PASS |
L1 Static source | Secrets, path traversal, supply chain | WARN 25 findings |
L2 Instructions | Prompt injection and authority framing in docs and tool descriptions | PASS |
L3 Inventory | Declared tools match the source | PASS |
L4 Sandbox | Run in isolation and watch behaviour | SKIPPED |
Provenance & runtime
Who published it, and what the audit could and could not run
Provenance
- Repository owner
openaiOrganizationAccount type recorded when we read the repository. - PackagePublished on npm
@openai/tunnel-client-mcp-tunnel-proxy, no version recorded - LicenceApache-2.0From the repository, as read at the audited commit.
- Last pushTodayActivity of the repository when we read it.
- Source commit readea9e397e0096The audit covers exactly this commit, read on 23 Oct 2026.
Runtime
- Sandbox runNot run yetThis audit read the source only; it did not execute the server.
- Tool inventory2 declaredRead from the source and classed read, write or destructive.
Every value here is read from the record's own repository and audit.Suggest a correction
Findings (32)
Sorted by severity · the 25 most severe of 32 are listed
MEDIUMNetwork egressnet.raw_ip · adminui/vite.config.ts:4
const adminProxyTarget = process.env.ADMIN_UI_PROXY_TARGET ?? "http://127.0.0.1:8080";
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · pkg/controlplane/internal/testdata/routing_sequences.json:440
"response": {"status": 409, "headers": {"X-Tunnel-Shard-Token": ["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · cmd/client/main_test.go:363
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · pkg/adminui/log_export_test.go:563
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · pkg/adminui/log_export_test.go:576
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · pkg/cloudflared/runtime/supervisor_test.go:140
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · pkg/controlplane/internal/routing_test.go:506
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.private_key · e2e/testdata/test_server_key.pem:2
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.private_key · plugins/tunnel-mcp/mcp/server.test.cjs:600
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.private_key · plugins/tunnel-mcp/mcp/server.test.cjs:931
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · scripts/augment_sbom_files.sh:88
sha1 = hashlib.sha1()
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.credential_store · plugins/tunnel-mcp/mcp/server.test.cjs:211
mcp_command: "AWS_SHARED_CREDENTIALS_FILE=/home/me/.aws/credentials node server.js",
- Why
- touches a credential store
- Fix
- —
LOWFilesystem / pathfs.credential_store · plugins/tunnel-mcp/mcp/server.test.cjs:1467
credentials_path: "/home/me/.aws/credentials",
- Why
- touches a credential store
- Fix
- —
LOWFilesystem / pathfs.traversal · adminui/src/components/__tests__/App.test.ts:4
import App from "../../App.svelte";
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · adminui/src/components/__tests__/App.test.ts:5
import { jsonResponse, mockFetchRequest, textResponse, type MockFetchRequest } from "../../test/mockFetch";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · adminui/src/components/__tests__/CodexPanel.test.ts:4
import { jsonResponse, mockFetchRequest } from "../../test/mockFetch";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · adminui/src/components/__tests__/HarpoonPanel.test.ts:4
import { jsonResponse, mockFetch } from "../../test/mockFetch";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · adminui/src/components/__tests__/LogsPanel.test.ts:5
import { jsonResponse, mockFetchRequest } from "../../test/mockFetch";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.metadata_ip · pkg/mcpclient/channel_transport_factory_test.go:619
w.Header().Set("Location", "http://169.254.169.254/latest/meta-data")- Why
- cloud metadata endpoint: the classic SSRF credential grab
- Fix
- —
LOWNetwork egressnet.metadata_ip · pkg/mcpclient/channel_transport_factory_test.go:668
{name: "link local metadata destination", left: "https://mcp.example.test/mcp", right: "http://169.254.169.254/latest/meta-data", want: false},- Why
- cloud metadata endpoint: the classic SSRF credential grab
- Fix
- —
LOWNetwork egressnet.metadata_ip · pkg/oauth/discovery_origin_test.go:95
{"https://mcp.example", "http://169.254.169.254/latest/meta-data"},- Why
- cloud metadata endpoint: the classic SSRF credential grab
- Fix
- —
LOWNetwork egressnet.metadata_ip · pkg/oauth/discovery_origin_test.go:154
req.URL.Host = "169.254.169.254"
- Why
- cloud metadata endpoint: the classic SSRF credential grab
- Fix
- —
LOWNetwork egressnet.metadata_ip · pkg/runtimeharpoon/host_registration_compat_test.go:434
host: "169.254.169.254",
- Why
- cloud metadata endpoint: the classic SSRF credential grab
- Fix
- —
LOWNetwork egressnet.raw_ip · adminui/README.md:15
Open the URL printed by Vite (usually `http://127.0.0.1:5173`).
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · adminui/README.md:19
- default: `http://127.0.0.1:8080`
- Why
- No further detail recorded for this rule.
- Fix
- —
Tools it exposes
2 declared in source · 0 destructive
| Tool | Risk | What it does |
|---|---|---|
description | read | Inventory resource identifier |
echo | read | calls.append(name) |
Install
audited commit ea9e397
Read the findings first. The most severe is Network egress (medium) at adminui/vite.config.ts.
One-click links open your editor with the config below filled in, exactly as the snippets show it. The audit covers commit ea9e397 only.
claude mcp add tunnel-client-mcp-tunnel-proxy -- npx -y @openai/tunnel-client-mcp-tunnel-proxy
{
"mcpServers": {
"tunnel-client-mcp-tunnel-proxy": {
"command": "npx",
"args": [
"-y",
"@openai/tunnel-client-mcp-tunnel-proxy"
]
}
}
}The command does not pin a version; the audit covers commit ea9e397e0096. Transport: stdio · streamable-http. No environment variables required.
Audit history
- !CAUTION F 57 / 100
First audit ·
ea9e397e0096
README badge
For maintainers · updates on every re-audit
[](https://modelsatlas.com/mcp/openai/tunnel-client/)
The badge always shows the latest audit; a maintainer cannot pin an old verdict.
Other ratings
Cited, never blended into our score
No third-party security ratings are recorded for this server yet. When they exist they appear here with their source and date, beside, not inside, our grade.
Questions about tunnel-client MCP server
What is the tunnel-client MCP server?
What tools does tunnel-client expose?
Is tunnel-client safe to connect to an agent?
What credentials does tunnel-client need?
How does tunnel-client run?
How current is this page?
Sources
- openai/tunnel-client on GitHub — the source we read, its licence, stars and activityObserved · 23 Oct 2026
- ModelsAtlas trust audit — CAUTION verdict for commit ea9e397e0096Observed · 23 Oct 2026
Spotted something wrong? Report a correction · Methodology
Keep going in your AI
Opens with this page as the source. We add nothing else to the prompt.
- What is the tunnel-client MCP server?
- What tools does tunnel-client expose?
- Is tunnel-client safe to connect to an agent?