Unified MCP Streamable HTTP 2025-11-25 transport, OAuth 2.1 AS, lifecycle, install
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 1 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
config__open_relay
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed v1.24.17 · analyzer v33 · 1h ago
danger signals1
- over-broad OAuth scope https://mail.google.com/ n24q02m_mcp_core-1.24.17/tests/schema/test_types.py :101
"scopes": ["https://mail.google.com/"],
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 156
filesystem 37
- fs n24q02m_mcp_core-1.24.17/src/mcp_core/cli.py :39
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/install/agents.py :29
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/lifecycle/lock.py :33
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/llm/catalog.py :13
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/oauth/jwt_issuer.py :28
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/oauth/user_store.py :7
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/relay/browser.py :41
with open("/proc/version", encoding="utf-8") as f: - fs (weak) n24q02m_mcp_core-1.24.17/src/mcp_core/scripts/clean_state.py :22
import shutil - fs n24q02m_mcp_core-1.24.17/src/mcp_core/storage/backends.py :12
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/storage/config_file.py :10
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/storage/machine_id.py :34
with open("/etc/machine-id") as f: - fs n24q02m_mcp_core-1.24.17/src/mcp_core/storage/per_plugin_store.py :25
from pathlib import Path
show 25 more
- fs n24q02m_mcp_core-1.24.17/src/mcp_core/storage/session_lock.py :15
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/transport/cache.py :20
from pathlib import Path - fs n24q02m_mcp_core-1.24.17/src/mcp_core/transport/local_server.py :16
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_credential_form_baseline.py :9
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_local_oauth_app.py :953
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/crypto/test_jwt_signing_seed.py :4
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/crypto/test_vectors.py :8
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/install/test_agents.py :6
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/lifecycle/test_lock.py :11
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/lifecycle/test_lock_error_paths.py :4
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/lifecycle/test_lock_permissions.py :3
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/lifecycle/test_lock_sweep.py :5
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/oauth/test_jwt_issuer.py :88
with open(keys_dir / f"{server_name}_private.pem", "wb") as f: - fs (weak) n24q02m_mcp_core-1.24.17/tests/oauth/test_user_store.py :3
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/oauth/test_user_store_errors.py :3
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/relay/test_browser.py :295
# webbrowser.open() -> subprocess.Popen(<list>) on Unix, os.startfile() - fs (weak) n24q02m_mcp_core-1.24.17/tests/scripts/test_clean_state.py :2
import shutil - fs (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_backends.py :39
monkeypatch.setattr("pathlib.Path.home", lambda: tmp_path) - fs (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_per_plugin_store.py :6
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_session_lock.py :5
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/test_cli.py :31
monkeypatch.setattr("pathlib.Path.home", lambda: tmp_path) - fs (weak) n24q02m_mcp_core-1.24.17/tests/transport/test_cache.py :11
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/transport/test_d17_wiring_integration.py :11
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/transport/test_local_server.py :11
from pathlib import Path - fs (weak) n24q02m_mcp_core-1.24.17/tests/transport/test_oauth_middleware.py :10
from pathlib import Path
shell / exec 5
- shell n24q02m_mcp_core-1.24.17/src/mcp_core/relay/browser.py :7
import subprocess - shell n24q02m_mcp_core-1.24.17/src/mcp_core/storage/machine_id.py :7
import subprocess - shell (weak) n24q02m_mcp_core-1.24.17/tests/lifecycle/test_lock.py :6
import subprocess - shell (weak) n24q02m_mcp_core-1.24.17/tests/relay/test_browser.py :4
import subprocess - shell (weak) n24q02m_mcp_core-1.24.17/tests/test_startup_warnings.py :3
import subprocess
network 24
- net n24q02m_mcp_core-1.24.17/src/mcp_core/auth/delegated_oauth_app.py :47
import httpx - net n24q02m_mcp_core-1.24.17/src/mcp_core/auth/local_oauth_app.py :390
from urllib.parse import quote - net n24q02m_mcp_core-1.24.17/src/mcp_core/auth/relay_login.py :23
from urllib.parse import quote - net n24q02m_mcp_core-1.24.17/src/mcp_core/http/ssrf.py :15
import socket - net n24q02m_mcp_core-1.24.17/src/mcp_core/relay/client.py :10
from urllib.parse import quote, urljoin - net n24q02m_mcp_core-1.24.17/src/mcp_core/relay/transient.py :22
import socket - net n24q02m_mcp_core-1.24.17/src/mcp_core/storage/backends.py :14
from urllib.parse import quote - net n24q02m_mcp_core-1.24.17/src/mcp_core/storage/d1.py :21
import httpx - net n24q02m_mcp_core-1.24.17/src/mcp_core/storage/machine_id.py :6
import socket - net n24q02m_mcp_core-1.24.17/src/mcp_core/storage/vectorize.py :20
import httpx - net n24q02m_mcp_core-1.24.17/src/mcp_core/transport/local_server.py :14
import socket - net (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_delegated_oauth_app.py :3
Stubs the upstream endpoints via ``httpx.MockTransport`` so the flow runs
show 12 more
- net (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_delegated_oauth_app_coverage.py :3
import httpx - net (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_delegated_oauth_relay_gate.py :16
from urllib.parse import urlparse - net (weak) n24q02m_mcp_core-1.24.17/tests/auth/test_local_oauth_app.py :6
from urllib.parse import parse_qs, urlparse - net (weak) n24q02m_mcp_core-1.24.17/tests/http/test_ssrf.py :3
import socket - net (weak) n24q02m_mcp_core-1.24.17/tests/llm/test_dispatch.py :10
import socket - net (weak) n24q02m_mcp_core-1.24.17/tests/llm/test_gateway_default_base.py :11
import socket - net (weak) n24q02m_mcp_core-1.24.17/tests/llm/test_vertex_express.py :9
import socket - net (weak) n24q02m_mcp_core-1.24.17/tests/relay/test_client.py :106
with patch("mcp_core.relay.client.httpx.AsyncClient") as mock_client_cls: - net (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_d1_backend.py :207
import httpx - net (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_string_session_store.py :3
from urllib.parse import unquote - net (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_vectorize.py :10
with patch("httpx.request") as mock_request: - net (weak) n24q02m_mcp_core-1.24.17/tests/transport/test_local_server.py :10
import socket
secrets 9
- secrets n24q02m_mcp_core-1.24.17/src/mcp_core/auth/delegated_oauth_app.py :230
signing_secret = os.environ.get("MCP_JWT_SIGNING_SECRET") or os.environ.get("CREDENTIAL_SECRET") - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/auth/local_oauth_app.py :154
signing_secret = os.environ.get("MCP_JWT_SIGNING_SECRET") or os.environ.get("CREDENTIAL_SECRET") - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/storage/backends.py :228
return CfKvBackend(base_url=base_url, token=os.environ.get("MCP_KV_TOKEN")) - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/storage/d1.py :176
return D1Backend(base_url=base, token=os.environ.get("MCP_D1_TOKEN")) - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/storage/machine_id.py :3
import getpass - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/storage/per_plugin_store.py :70
master = os.environ.get("CREDENTIAL_SECRET") - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/storage/vectorize.py :130
return VectorizeBackend(base_url=base, idx=idx, token=os.environ.get("MCP_VECTORIZE_TOKEN")) - secrets n24q02m_mcp_core-1.24.17/src/mcp_core/transport/local_server.py :262
jwt_signing_secret = os.environ.get("MCP_JWT_SIGNING_SECRET") or os.environ.get("CREDENTIAL_SECRET") - secrets (weak) n24q02m_mcp_core-1.24.17/tests/storage/test_resolver.py :25
os.environ["MCP_TELEGRAM_BOT_TOKEN"] = "env-token"
database 3
- db n24q02m_mcp_core-1.24.17/src/mcp_core/oauth/user_store.py :5
import sqlite3 - db (weak) n24q02m_mcp_core-1.24.17/tests/oauth/test_user_store.py :2
import sqlite3 - db (weak) n24q02m_mcp_core-1.24.17/tests/oauth/test_user_store_errors.py :2
import sqlite3
tool registrations 2
- config__open_relay n24q02m_mcp_core-1.24.17/src/mcp_core/relay/tool_helpers.py :144
- config__open_relay n24q02m_mcp_core-1.24.17/src/mcp_core/relay/transient.py :270
declared dependencies 14
- fastmcp@>=3.4.7,<4
- mcp@>=1.30.0,<2
- httpx@>=0.28.1
- httpcore@>=1.0.9
- cryptography@>=50.0.1
- authlib@>=1.8.0
- starlette@>=1.6.0
- s@resolve.
- pydantic-settings@>=2.14.2,<3
- loguru@>=0.7.3
- platformdirs@>=4.11.7
- tomli-w@>=1.2.0
show 2 more
- filelock@>=3.32.5
- litellm@>=1.100.0