github Python analyzed 6658923 deep scan · partial (148/1,794 files)

TNLegend/PortaMCP

github

Client-neutral MCP server and secure desktop Control Center for Windows/Linux computer automation, with OAuth/Bearer auth, scoped access, UI/browser control, audit logging, and remote HTTPS support.

maintainer
TNLegend
licence
MIT
first seen
2026-09-12
last seen
2026-09-12
releases · 30d
0
short id

Drift inferred · capture-to-capture

  1. HIGH code analysis flagged dynamic code execution ×5 in TNLegend/PortaMCP
capabilities 75 tools
transport stdio · streamable-http · http counts 75 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • browser_click
  • browser_close_page
  • browser_connect_cdp
  • browser_evaluate
  • browser_fill
  • browser_navigate
  • browser_new_page
  • browser_pages
  • browser_press
  • browser_screenshot
  • browser_snapshot
  • browser_start
  • browser_stop
  • chrome_live_activate
  • chrome_live_click
  • chrome_live_detach
  • chrome_live_evaluate
  • chrome_live_fill
  • chrome_live_navigate
  • chrome_live_screenshot
  • chrome_live_snapshot
  • chrome_live_status
  • chrome_live_tabs
  • fs_copy
  • fs_delete
  • fs_exists
  • fs_hash
  • fs_list
  • fs_mkdir
  • fs_move
  • fs_patch_text
  • fs_read_bytes
  • fs_read_text
  • fs_search
  • fs_stat
  • fs_write_text
  • git_add
  • git_commit
  • git_diff
  • git_log
  • git_status
  • input_hotkey
  • input_mouse_click
  • input_mouse_drag
  • input_mouse_move
  • input_mouse_position
  • input_press
  • input_scroll
  • input_type_text
  • linux_active
  • linux_click_control
  • linux_focus
  • linux_list
  • linux_set_text
  • linux_ui_tree
  • process_kill
  • process_list
  • process_start
  • screen_capture
  • screen_capture_region
  • screen_capture_to_file
  • screen_monitors
  • security_emergency_stop_status
  • server_capabilities
  • shell_run
  • shell_session_close
  • shell_session_create
  • shell_session_run
  • system_info
  • windows_active
  • windows_click_control
  • windows_focus
  • windows_list
  • windows_set_text
  • windows_ui_tree
skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 6658923 · analyzer v33 · 5d ago

danger signals40

code evidence vHEAD · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 751

filesystem 160

  • fs TNLegend-PortaMCP-6658923/launcher/build-public-archive.py :7 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/audit.py :6 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/chrome_bridge.py :10 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/config.py :7 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/control_center.py :93 self.icon_image = ctk.CTkImage(Image.open(icon_path), size=(34, 34))
  • fs TNLegend-PortaMCP-6658923/porta_mcp/control_center_backend.py :7 import shutil
  • fs TNLegend-PortaMCP-6658923/porta_mcp/http_server.py :6 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/installer.py :3 import shutil
  • fs TNLegend-PortaMCP-6658923/porta_mcp/local_http_server.py :6 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/oauth_server.py :6 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/platform_support.py :6 import shutil
  • fs TNLegend-PortaMCP-6658923/porta_mcp/policy.py :5 from pathlib import Path
show 28 more
  • fs TNLegend-PortaMCP-6658923/porta_mcp/self_hosted_oauth.py :15 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/server.py :7 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :7 import shutil
  • fs TNLegend-PortaMCP-6658923/porta_mcp/tools/linux_ui.py :7 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/tools/screen.py :5 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/tools/shell.py :6 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/porta_mcp/transport_logging.py :9 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_aix_support.py :15 fp = open("/tmp/_aix_support.%s"%(
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_osx_support.py :66 fp = open("/tmp/_osx_support.%s"%(
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyio.py :26 # open() uses st_blksize whenever we can
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyrepl/main.py :45 with tokenize.open(startup_path) as f:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyrepl/pager.py :53 os.unlink(filename)
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyrepl/readline.py :430 with open(os.path.expanduser(filename), 'rb') as f:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyrepl/trace.py :12 trace_file = open(trace_filename, "a")
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_sitebuiltins.py :50 with open(filename, encoding='utf-8') as fp:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/antigravity.py :5 webbrowser.open("https://xkcd.com/353/")
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/argparse.py :170 import shutil
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/ast.py :1859 with open(args.infile, 'rb') as infile:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/__main__.py :101 with tokenize.open(startup_path) as f:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/base_events.py :1413 os.remove(local_addr)
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/unix_events.py :313 os.remove(path)
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/base64.py :614 with open(args[0], 'rb') as f:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/bz2.py :279 def open(filename, mode="rb", compresslevel=9,
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/cProfile.py :50 with open(file, 'wb') as f:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/codecs.py :886 def open(filename, mode='r', encoding=None, errors='strict', buffering=-1):
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/compileall.py :21 from pathlib import Path
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/configparser.py :743 with open(filename, encoding=encoding) as fp:
  • fs TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/contextlib.py :347 with closing(<module>.open(<arguments>)) as f:

120 more not shown — this panel samples each group; the count above is the real total.

shell / exec 36

  • shell TNLegend-PortaMCP-6658923/porta_mcp/control_center.py :4 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/control_center_backend.py :9 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/installer.py :4 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/platform_support.py :7 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/tools/git.py :3 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/tools/input.py :6 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/tools/process.py :4 import subprocess
  • shell TNLegend-PortaMCP-6658923/porta_mcp/tools/shell.py :5 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_aix_support.py :10 # Similar to os.popen(commandstring, "r").read(),
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_osx_support.py :57 # Similar to os.popen(commandstring, "r").read(),
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_pyrepl/pager.py :39 if hasattr(os, 'system') and os.system('(pager) 2>/dev/null') == 0:
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/base_events.py :25 import subprocess
show 24 more
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/base_subprocess.py :2 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/events.py :22 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/subprocess.py :3 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/unix_events.py :11 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/windows_utils.py :12 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/ctypes/_aix.py :53 from subprocess import Popen, PIPE, DEVNULL
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/ctypes/util.py :3 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/ensurepip/__init__.py :2 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/http/server.py :14 If the os.fork() function is not present (Windows), subprocess.Popen() is used,
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/idlelib/editor.py :744 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/idlelib/iomenu.py :361 pipe = os.popen(command, "r")
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/idlelib/pyshell.py :27 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/imaplib.py :1468 "command" - a string that can be passed to subprocess.Popen()
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/popen_spawn_win32.py :6 from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/util.py :17 from subprocess import _args_from_interpreter_flags
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/os.py :1015 # Supply os.popen()
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/platform.py :284 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/pydoc_data/topics.py :12185 also "os.popen()", "os.fdopen()", and the "makefile()" method of
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/subprocess.py :666 >>> import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/turtledemo/__main__.py :136 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/uuid.py :382 proc = subprocess.Popen(command,
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/venv/__init__.py :10 import subprocess
  • shell TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/webbrowser.py :9 import subprocess
  • shell (weak) TNLegend-PortaMCP-6658923/tests/test_release.py :9 import subprocess

network 51

  • net TNLegend-PortaMCP-6658923/porta_mcp/control_center_backend.py :8 import socket
  • net TNLegend-PortaMCP-6658923/porta_mcp/log_privacy.py :5 from urllib.parse import urlsplit, urlunsplit
  • net TNLegend-PortaMCP-6658923/porta_mcp/oauth_server.py :7 from urllib.parse import urlparse
  • net TNLegend-PortaMCP-6658923/porta_mcp/self_hosted_oauth.py :17 from urllib.parse import parse_qs, urlencode, urlparse
  • net TNLegend-PortaMCP-6658923/porta_mcp/tools/system.py :5 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/_compat_pickle.py :47 'urllib2': 'urllib.request',
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/base_events.py :23 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/events.py :21 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/proactor_events.py :11 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/selector_events.py :15 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/streams.py :6 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/trsock.py :1 import socket
show 28 more
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/unix_events.py :9 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/asyncio/windows_events.py :14 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/email/_header_value_parser.py :72 import urllib # For urllib.parse.unquote
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/email/utils.py :29 import urllib.parse
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/ftplib.py :40 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/http/client.py :77 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/http/cookiejar.py :36 import urllib.parse, urllib.request
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/http/cookies.py :392 import urllib.parse
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/http/server.py :102 import socket # For gethostbyaddr()
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/idlelib/pyshell.py :26 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/idlelib/rpc.py :37 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/logging/config.py :35 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/logging/handlers.py :33 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/mailbox.py :12 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/mimetypes.py :29 import urllib.parse
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/connection.py :16 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/forkserver.py :6 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/reduction.py :16 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/multiprocessing/resource_sharer.py :13 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/nturl2path.py :4 for urllib.requests, thus do not use directly.
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/pathlib/_local.py :446 from urllib.parse import quote_from_bytes
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/platform.py :693 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/poplib.py :18 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/pydoc.py :74 import urllib.parse
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/pydoc_data/module_docs.py :273 'urllib.request': 'urllib.request#module-urllib.request',
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/smtplib.py :44 import socket
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/socket.py :17 fromshare() -- create a socket object from data received from socket.share() [*]
  • net TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/socketserver.py :126 import socket

11 more not shown — this panel samples each group; the count above is the real total.

secrets 2

  • secrets TNLegend-PortaMCP-6658923/porta_mcp/control_center_backend.py :3 import getpass
  • secrets TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/urllib/request.py :2353 import getpass

database 3

  • db TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/dbm/sqlite3.py :2 import sqlite3
  • db TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/sqlite3/__init__.py :29 import sqlite3
  • db TNLegend-PortaMCP-6658923/runtime/python-bootstrap.zip!/Lib/sqlite3/__main__.py :7 import sqlite3

tool registrations 75

  • browser_start TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :34
  • browser_connect_cdp TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :102
  • browser_pages TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :146
  • browser_new_page TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :161
  • browser_navigate TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :178
  • browser_snapshot TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :190
  • browser_click TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :211
  • browser_fill TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :231
  • browser_press TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :252
  • browser_evaluate TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :264
  • browser_screenshot TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :279
  • browser_close_page TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :293
show 28 more
  • browser_stop TNLegend-PortaMCP-6658923/porta_mcp/tools/browser.py :306
  • chrome_live_status TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :26
  • chrome_live_tabs TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :38
  • chrome_live_snapshot TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :48
  • chrome_live_activate TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :65
  • chrome_live_navigate TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :76
  • chrome_live_click TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :87
  • chrome_live_fill TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :103
  • chrome_live_evaluate TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :133
  • chrome_live_screenshot TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :146
  • chrome_live_detach TNLegend-PortaMCP-6658923/porta_mcp/tools/current_chrome.py :161
  • fs_list TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :88
  • fs_stat TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :131
  • fs_read_text TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :141
  • fs_read_bytes TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :158
  • fs_write_text TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :172
  • fs_patch_text TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :193
  • fs_search TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :214
  • fs_hash TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :295
  • fs_copy TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :310
  • fs_exists TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :345
  • fs_mkdir TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :354
  • fs_move TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :365
  • fs_delete TNLegend-PortaMCP-6658923/porta_mcp/tools/filesystem.py :393
  • git_status TNLegend-PortaMCP-6658923/porta_mcp/tools/git.py :26
  • git_diff TNLegend-PortaMCP-6658923/porta_mcp/tools/git.py :34
  • git_log TNLegend-PortaMCP-6658923/porta_mcp/tools/git.py :45
  • git_add TNLegend-PortaMCP-6658923/porta_mcp/tools/git.py :53

35 more not shown — this panel samples each group; the count above is the real total.

declared dependencies 15

  • mcp@>=2.1.1,<2.2
  • uvicorn@>=0.30
  • websockets@>=13
  • customtkinter@>=5.2.2
  • starlette@>=0.37
  • httpx@>=0.27
  • psutil@>=6.0
  • mss@>=10.0
  • pyautogui@>=0.9.54
  • pillow@>=10.0
  • playwright@>=1.50
  • python3-xlib@>=0.15; sys_platform ==
show 3 more
  • win32@*
  • pytest@>=8
  • ruff@>=0.6

transport_posture 1

  • binds all interfaces (0.0.0.0) TNLegend-PortaMCP-6658923/tests/test_release.py :203 settings = _runtime_settings(tmp_path, host="0.0.0.0")