Universal Test Framework

io.github.phoenice-labs由 GitHub 帳號 phoenice-labs 發布v1.0.2更新於 Nov 3, 2026

Polyglot MCP test generation with 8-section contract enforcement across Python, TS, Java, Go, C++.

已驗證STDIO僅桌面開發者工具資料與分析

概覽

AI 產生的概覽

本機 MCP 伺服器,可跨六種語言產生、驗證、登錄、執行測試並產出報告,強制符合 8 段式測試契約。

可以做什麼
  • 為 Python、TypeScript、JavaScript、Java、Go 與 C++ 原始碼產生測試套件,並自動辨識語言與測試框架、建議測試類型。
  • 依 8 段式契約驗證任何測試並評分,低於最低分數的測試會被阻擋。
  • 登錄契約、匯入 JUnit XML 結果、執行測試與變異測試,並查詢依專案隔離的 SQLite 登錄庫。
  • 分析覆蓋率缺口、建立需求到測試的追溯矩陣,並輸出 HTML、JUnit 或 JSON 合規報告及狀態與趨勢摘要。
適用情境
適合讓 AI 助理撰寫測試、同時希望每個測試都對應需求、依固定契約評分並跨工作階段留痕的情境。也適用於需要追溯性與覆蓋率缺口報告,或在 CI 中對產生的測試設品質門檻的團隊。
執行需求
以本機 stdio 程序執行,來自 PyPI 套件 universal-test-framework;建議以 uvx 啟動,pip 或本機複製安裝需 Python 3.11+。也可用 Docker 提供共用的 HTTP/SSE 端點。需透過工具參數 project_dir 或環境變數 UTF_PROJECT_DIR 指定專案目錄,以確保登錄庫依專案隔離。
安裝前請注意
會在專案的 .utf 目錄寫入 SQLite 登錄庫與報告檔案,run_tests 與 run_mutation_tests 會在本機執行測試程式碼。產生測試的品質取決於所讀原始碼,契約分數是模型的自評。README 稱不記錄密鑰或個人資料,登錄庫不會外傳。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Universal Test Framework,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Universal Test Framework (UTF)

Contract-driven test enforcement and reporting for LLM-generated code — via MCP, VS Code, Copilot CLI, Claude, Cursor, or Python SDK.

UTF is an MCP server and contract enforcement engine. It does not replace your AI coding assistant — it gives every test your AI writes a mandatory quality gate, a structured audit trail, and a comprehensive compliance report.

[PyPI version] [Python] [License: MIT]


Why UTF? (Not Another Test Generator)

AI tools — GitHub Copilot, Claude, Cursor, Gemini — generate tests fast. The problem: fast ≠ trustworthy.

Without UTFWith UTF
Tests exist but nobody knows whyEvery test is linked to a requirement
"Covers everything" — nobody can prove itTraceability matrix maps REQ → test
CI passes; real behavior untestedGap analysis flags what is NOT covered
LLM wrote a test that asserts TrueMeaningfulness check rejects trivial assertions
No history of what was testedPersistent registry survives session restarts
Report shows pass/fail counts only8-section per-test detail cards in HTML report

UTF vs Markdown Instructions / Prompt Files

You may already use markdown files (AGENTS.md, copilot-instructions.md, .cursorrules) to guide your AI. UTF is complementary — not competing:

Markdown instructionsUTF
Describe how to write testsEnforce a contract on every test produced
Rely on LLM to follow instructionsBlock tests that fail the contract at generation time
No verification after generationScore each test 0–1 against 8 measurable criteria
No persistent state between sessionsSQLite registry persists all tests and results
No compliance reportHTML report with per-test 8-section detail cards

Use markdown instructions to shape how your AI thinks. Use UTF to verify and report on what it produced.


Key Features

  • 13 MCP tools — generate, validate, register, analyze, trace, execute, mutate, report, and query tests
  • 6 languages — Python, TypeScript, JavaScript, Java, Go, C++
  • 7 test types — unit, integration, API, E2E, contract, performance, security
  • 8-section contract — every test must pass all 8 sections or it is blocked (minimum score: 0.85)
  • 3-segment test IDs — TC-{PRJ}-{MODULE}-{NNN} and classic TC-{MODULE}-{NNN} both accepted
  • Five install modes — uvx (zero-clone), local clone, Docker, GitHub MCP Registry, pip SDK
  • VS Code @utf — chat participant with slash commands
  • CI/CD ready — GitHub Actions, GitLab CI, pre-commit hooks
  • Per-project overrides — YAML rules in .utf/rules/ override global defaults

Quick Start

Setup Method Comparison

#MethodHow StartedRegistry Location@utf Slash CmdsBest For
1uvx (zero-install)mcp.json + uvx<workspace>/.utf/utf.db❌ use natural languageAny developer with uv
2Local Cloneinstall-vscode-mcp.ps1<workspace>/.utf/utf.db✅ with extensionContributing / customizing UTF
3Docker / HTTPdocker compose upNamed volume or bind mount❌ use natural languageTeam / remote / CI
4GitHub MCP RegistryAuto via client<workspace>/.utf/utf.db❌ use natural languageDiscoverable via MCP marketplace
5pip + SDKPython importCaller controls cwdN/ACI scripts / programmatic

All methods (1, 2, 4) using stdio transport write the registry to ${workspaceFolder}/.utf/utf.db — isolated per project and persistent across sessions.


Method 1 — uvx (Zero-Install, Recommended)

Requires uv. No cloning, no venv.

Add to %APPDATA%\Code\User\mcp.json (Windows) or ~/.config/Code/User/mcp.json (macOS/Linux):

json
{  "servers": {    "utf": {      "type": "stdio",      "command": "uvx",      "args": ["--from", "universal-test-framework", "utf-server", "--transport", "stdio"],      "cwd": "${workspaceFolder}",      "env": {        "UTF_PROJECT_DIR": "${workspaceFolder}"      }    }  }}

Registry: .utf/utf.db inside ${workspaceFolder} — isolated per project, persistent across sessions.
Reload VS Code after editing mcp.json.


Method 2 — Local Clone (VS Code + Copilot)

powershell
git clone https://github.com/phoenice-labs/Universal-Test-Frameworkcd Universal-Test-Framework
# Register MCP server, install @utf extension, copy global prompts.\scripts\install-vscode-mcp.ps1
# Optionally scaffold a specific project.\scripts\install-vscode-mcp.ps1 -InitProject -ProjectDir C:\my-project

Reload VS Code → open Copilot Chat → ask naturally: generate e2e tests for my backend.

The install script writes this entry to mcp.json:

json
{  "utf": {    "type": "stdio",    "command": "<python>",    "args": ["-m", "mcp_server.server", "--transport", "stdio"],    "cwd": "${workspaceFolder}",    "env": { "PYTHONPATH": "<UTF_install_dir>" }  }}

Registry: ${workspaceFolder}/.utf/utf.db — isolated per project.
@utf slash commands are available after the VSIX extension is installed.


Method 3 — Docker (Team / Remote)

bash
# Start the UTF servercd Universal-Test-Frameworkdocker compose -f docker/docker-compose.yml up -d
# MCP server available at http://localhost:8765/sse

Connect from VS Code by adding to mcp.json:

json
{  "servers": {    "utf-remote": {      "type": "sse",      "url": "http://localhost:8765/sse"    }  }}

Registry: persisted in a named Docker volume (utf_registry → /app/.utf/utf.db).
For per-project isolation with Docker, use a bind-mount in docker-compose.yml:

yaml
volumes:  - /path/to/your/project/.utf:/app/.utf

Because Docker uses HTTP/SSE transport (no ${workspaceFolder} templating), pass project_dir explicitly in tool calls, or set UTF_PROJECT_DIR in the container environment.

Per-project Docker workflow:

yaml
# docker-compose.override.ymlservices:  utf-server:    volumes:      - ./my-project/.utf:/app/.utf    environment:      UTF_PROJECT_DIR: /app

Method 4 — GitHub MCP Registry

Once published, UTF is discoverable via the MCP marketplace. Clients that support server.json install it automatically. The generated mcp.json entry is equivalent to Method 1 (uvx).

Registry isolation: The MCP registry schema does not support a cwd field at the registry level.
UTF resolves project isolation via (in priority order):

  1. project_dir argument passed to each tool call
  2. UTF_PROJECT_DIR environment variable
  3. Path.cwd() fallback (server's working directory)

For correct isolation, ensure the MCP client writes "cwd": "${workspaceFolder}" and "UTF_PROJECT_DIR": "${workspaceFolder}" in the generated entry (UTF's mcp-gallery.json does this).


Method 5 — pip + Python SDK

bash
pip install universal-test-framework
python
from mcp_server.tools.generate_tests import generate_testsfrom pathlib import Path
result = generate_tests(    test_type="unit",    source_code=open("src/auth.py").read(),    project_dir=str(Path.cwd()),   # ← pass explicitly for correct registry isolation)print(result["suite_code"])

Registry: <project_dir>/.utf/utf.db when project_dir is passed; falls back to Path.cwd().


MCP Tools Reference

ToolDescription
generate_testsGenerate a complete test suite satisfying the 8-section contract
validate_test_contractValidate any test (generated or hand-written) against the contract
analyze_coverageIdentify coverage gaps in an existing test suite
build_traceability_matrixBuild a requirements → tests traceability matrix
suggest_test_typesRecommend test types with rationale from source code
detect_language_frameworkAuto-detect programming language and test framework
import_test_resultsImport JUnit XML from any test run into the UTF registry
query_registryQuery the persistent per-project test registry
run_testsExecute test files and return structured CI results
run_mutation_testsRun mutation testing and return mutation score
feedback_statusGet gap analysis, coverage health, and trend report
generate_reportGenerate HTML / JUnit / JSON contract compliance report
healthServer health check: version, uptime, tool count

The 8-Section Test Contract

Every test generated by UTF must satisfy all 8 sections. Tests that fail any hard section are blocked — returned in blocked_tests, never silently included.

#SectionWhat It Must ContainWeight
1test_idUnique ID: TC-{TYPE}-{NNN} (e.g. TC-US-042)10%
2why_generatedRationale tied to a requirement (≥50 chars)10%
3requirement_mappingAt least one US-, AC-, REQ-, JIRA-, BUG-, or NFR- reference15%
4how_it_exercisesGIVEN / WHEN / THEN with inputs, mocks, assertions (≥100 chars)20%
5coverage_contributionCoverage type + module + estimated %15%
6expected_outcomePrecise return values, status codes, state changes (≥50 chars)15%
7gaps_missingHonest list of what this test does NOT cover (≥40 chars)10%
8meaningfulness_checkSelf-assessment: meaningful / redundant / hallucinated (≥50 chars)5%

Minimum passing score: 0.85. Tests below this threshold are blocked regardless of individual section presence. "none" in gaps or vague rationale like "to test the function" are rejected.


Supported Matrix

LanguageFrameworksTest Types
Pythonpytestunit, integration, api, e2e, security, performance
TypeScriptJest, Vitest, Playwrightunit, integration, e2e, api
JavaScriptJest, Vitestunit, integration
JavaJUnit 5 + AssertJ, Mavenunit, integration, api
Gogo-test + testifyunit, integration, api
C++Google Testunit

The UTF 3-Phase E2E Workflow

This is the canonical flow for using UTF with any AI CLI (Copilot, Claude, Cursor) or VS Code. Follow the phases in order — skipping Phase 1 registration means the report has no Per-Test Contract Detail cards.

┌─────────────────────────────────────────────────────────────────────────┐│  PHASE 1 — CONTRACT GENERATION (LLM writes, UTF validates + registers) ││                                                                         ││  ① generate_tests (scaffold)                                           ││  ② LLM writes real test methods — each with its own TC-ID and         ││     8-section comment block (WHY / REQ / HOW / COV / OUT / GAP / MEAN)││  ③ validate_test_contract — score must be ≥ 0.85 per test             ││  ④ register_contracts — parse test file, upsert status=generated rows  ││  ⑤ generate_report — verify Per-Test Contract Detail cards appear      ││                                                                         ││  PHASE 2 — EXECUTION (pytest/jest/maven runs, results captured)        ││                                                                         ││  ⑥ pytest --junit-xml=utf-tests/reports/results.xml                   ││  ⑦ import_test_results — upsert executed/failed rows                   ││  ⑧ generate_report — now shows contract cards AND pass/fail status     ││                                                                         ││  PHASE 3 — HEALTH (ongoing coverage quality)                           ││                                                                         ││  ⑨ feedback_status — gap analysis, drift alerts, trend over 30 days   ││  ⑩ Address gaps → add tests → back to Phase 1                         │└─────────────────────────────────────────────────────────────────────────┘

Why register before running? The UTF registry has two record types. status=generated records (created by register_contracts) drive the Per-Test Contract Detail cards in the HTML report. status=executed/failed records (created by import_test_results) drive the Execution Results table. Both must exist for a test to appear in both sections. Running pytest before registering means you get execution rows but no 8-section detail cards.

Per-Method 8-Section Comment Block (mandatory)

Every test METHOD must have its own inline comment block — not a class docstring:

python
def test_health_returns_200(self, live_backend):    # ─── TC-FIQ-HLT-001 ──────────────────────────────────────────────────────    # WHY_GENERATED: The /health endpoint is the primary liveness signal for    #   load balancers and K8s probes. Non-200 = platform unavailable.    # REQUIREMENT_MAPPING: REQ-E2E-001    # HOW_IT_EXERCISES: GIVEN backend is running at http://localhost:8001    #   WHEN GET /health is called THEN HTTP 200 is returned.    # COVERAGE_CONTRIBUTION: Line coverage of health route; ~15% of health module    # EXPECTED_OUTCOME: HTTP 200; elapsed < 500ms    # GAPS_MISSING: Does not test health under load; no auth header tested    # MEANINGFULNESS_CHECK: Meaningful — gateway test for all other tests    # ─────────────────────────────────────────────────────────────────────────    r = requests.get(f"{live_backend}/health", timeout=5)    assert r.status_code == 200

Test ID formats accepted: TC-HLT-001 (2-segment) or TC-FIQ-HLT-001 (3-segment project-prefixed).


Invoking UTF from AI CLIs

GitHub Copilot CLI

UTF tools are called via natural language — no special syntax required:

# Phase 1 — Generate and registergenerate e2e tests for backend/app/api/routes/register contracts for utf-tests/test_myapp_e2e.pyutf report
# Phase 2 — After running pytestimport junit xml utf-tests/reports/results.xmlutf report
# Phase 3 — Health checkutf statuswhat are my coverage gaps?build a traceability matrix

Claude (claude.ai / Claude CLI / MCP client)

Claude supports MCP servers natively. With UTF added to your MCP config:

# Natural language triggers UTF MCP tools automatically"Generate e2e tests for my FastAPI backend at backend/app/""Register contracts for utf-tests/test_myapp_e2e.py""Generate the UTF report""Show UTF status and gaps""Validate this test against the 8-section contract: [paste test]"

To add UTF to Claude's MCP config (~/.config/claude/mcp.json or equivalent):

json
{  "mcpServers": {    "utf": {      "command": "uvx",      "args": ["--from", "universal-test-framework", "utf-server", "--transport", "stdio"],      "env": { "UTF_PROJECT_DIR": "/path/to/your/project" }    }  }}

Cursor

In Cursor, add UTF as an MCP server in .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):

json
{  "mcpServers": {    "utf": {      "command": "uvx",      "args": ["--from", "universal-test-framework", "utf-server", "--transport", "stdio"],      "cwd": "${workspaceFolder}",      "env": { "UTF_PROJECT_DIR": "${workspaceFolder}" }    }  }}

Then ask Cursor naturally:

Generate unit tests for src/auth.py using UTFUTF reportRegister contracts for tests/test_api.py

Any MCP-Compatible Client (Windsurf, Continue, etc.)

The MCP entry is identical regardless of client:

json
{  "utf": {    "type": "stdio",    "command": "uvx",    "args": ["--from", "universal-test-framework", "utf-server", "--transport", "stdio"],    "cwd": "${workspaceFolder}",    "env": { "UTF_PROJECT_DIR": "${workspaceFolder}" }  }}

UTF uses natural language detection — the same prompts work across all MCP-compatible AI clients.


GitHub Copilot CLI Usage

UTF is invoked via natural language in the GitHub Copilot CLI — there are no special slash commands or @utf syntax at the CLI prompt. Simply describe what you want and the MCP tools are called automatically.

How to Invoke UTF from the CLI

# In the GitHub Copilot CLI terminal (gh copilot / copilot-cli)generate unit tests for backend/app/routes/auth.pygenerate e2e tests covering REQ-001 through REQ-024register contracts for utf-tests/test_myapp_e2e.pyutf reportshow utf statusvalidate this test against the 8-section contractwhat are the coverage gaps?suggest test types for my projectbuild a traceability matrix

Full Command Reference (Natural Language → MCP Tool)

What you sayUTF MCP tool invokedWhat happens
generate unit tests for <file>generate_testsScans source, infers requirements, produces 8-section test suite
generate e2e testsgenerate_testsE2E suite with happy path + negatives + edge cases
generate api testsgenerate_testsAPI contract tests with HTTP assertions
generate security testsgenerate_testsAuth, injection, and boundary security tests
register contracts for <test_file.py>register_contractsParses test file, extracts per-method 8-section blocks, upserts generated rows
validate this testvalidate_test_contractScores test 0–1 against all 8 contract sections
utf status / show utf statusfeedback_statusGap analysis, coverage health, trend report
utf report / generate reportgenerate_reportHTML + JUnit + JSON contract compliance report
import junit xml <path>import_test_resultsRegister results from an existing pytest/Maven run
coverage gapsanalyze_coverageIdentifies uncovered symbols and missing test paths
traceability matrixbuild_traceability_matrixRequirements → tests coverage mapping
suggest test typessuggest_test_typesRecommends test types from source or requirements
query registryquery_registryLists registered tests for the current project
run testsrun_testsExecutes test files and records results in registry
run mutation testsrun_mutation_testsMutation score with killed/survived breakdown
utf healthhealthServer uptime, version, tool count

Registry Persistence

The UTF SQLite registry persists per-project across all sessions:

your-project/└── .utf/    ├── utf.db          ← SQLite registry (persists between sessions)    ├── utf-config.yaml ← Optional project overrides    ├── rules/          ← Optional YAML rule overrides    └── reports/        ├── contract_YYYYMMDD_HHMMSS.html        ├── contract_YYYYMMDD_HHMMSS.xml        └── contract_YYYYMMDD_HHMMSS.json

Once tests are generated (generate_tests), they are registered in .utf/utf.db. Subsequent calls to utf report, utf status, and query registry read from this persistent store — no re-generation required between sessions.

Providing Project Context

When the MCP server cannot infer your project root automatically, pass project_dir explicitly:

generate unit tests for src/auth.py in project C:/my-project

Or configure "cwd": "${workspaceFolder}" in your mcp.json (already set in the quickstart above) so the server always starts in the correct workspace.


VS Code Copilot Chat Integration

After running .\scripts\install-vscode-mcp.ps1 (Option 2) or adding the uvx MCP entry (Option 1):

Note: The @utf prefix and /slash-command syntax only work if you have the UTF VS Code Chat Participant extension installed (included via Option 2). In GitHub Copilot CLI and standard VS Code Copilot Chat without the extension, use natural language — the MCP tools are invoked automatically. See GitHub Copilot CLI Usage above.

VS Code Chat Participant Slash Commands (extension required)

CommandEffect
@utf /generate-tests unitUnit tests for selected/active code
@utf /generate-tests apiAPI tests
@utf /generate-tests integrationIntegration tests
@utf /generate-tests e2eEnd-to-end tests
@utf /generate-tests securitySecurity / auth tests
@utf /generate-tests performancePerformance / load tests
@utf /validate-contractValidate a test against the 8-section contract
@utf /coverage-gapsIdentify coverage gaps in the current suite
@utf /traceabilityBuild requirements → tests traceability matrix
@utf /reportGenerate HTML contract compliance report
@utf /statusServer health and installation status

Natural Language (no extension required)

In standard VS Code Copilot Chat or GitHub Copilot CLI, just ask:

generate unit tests for this fileshow utf statusutf reportwhat are my coverage gaps?validate this test against the contract

UTF reads the open file, detects language and framework, infers requirements from function signatures, generates happy-path + negative + edge-case tests — all validated against the 8-section contract.


Python SDK

Use UTF directly in scripts or CI pipelines without the MCP server:

python
from mcp_server.tools.generate_tests import generate_testsfrom mcp_server.tools.validate_contract import validate_test_contract
# Generate tests — UTF infers language, framework, and requirementsresult = generate_tests(    test_type="unit",    source_code=open("src/auth.py").read(),    requirements_text="US-101: Users must be authenticated before accessing dashboard",)
print(result["suite_code"])          # Executable test fileprint(result["traceability_matrix"]) # Requirements → tests mappingprint(result["gaps"])                # Identified coverage gaps
# Validate any existing testvalidation = validate_test_contract(test_content=my_test_markdown)print(f"Score: {validation['score']:.0%}  Valid: {validation['is_valid']}")

CI/CD Integration

GitHub Actions

yaml
# .github/workflows/test-quality-gate.ymlname: UTF Contract Gateon: [push, pull_request]jobs:  contract-gate:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions/setup-python@v5        with: { python-version: "3.11" }      - run: pip install universal-test-framework      - name: Validate test contract        run: |          python - <<'EOF'          from mcp_server.tools.validate_contract import validate_test_contract          import glob, sys, pathlib
          failures = []          for f in glob.glob("tests/**/*.py", recursive=True):              content = pathlib.Path(f).read_text()              result = validate_test_contract(test_content=content)              if not result["is_valid"]:                  failures.append(f"{f}: score {result['score']:.0%}")          if failures:              print("Contract failures:\n" + "\n".join(failures))              sys.exit(1)          print("All tests passed contract validation")          EOF

Per-Project Configuration

Create .utf/rules/project-overrides.yaml in your project root:

yaml
# Raise minimum score for safety-critical codecontract:  min_score: 0.90          # default: 0.85  hard_block_below: 0.75
# Match your Jira project keytraceability:  requirement_id_pattern: "^(PROJ-\\d+|AC-\\d+(\\.\\d+)?|NFR-\\d+)$"
# Tests generated per requirement per typescenario_counts:  happy_path: 1  negative: 2  boundary: 1  edge_case: 1
# Coverage advisory thresholds (appear in report, do not block)coverage:  line_target: 85  branch_target: 75  mutation_score_target: 70

Rules are deep-merged: project overrides layer on top of UTF's global defaults. The 8-section contract structure itself cannot be overridden.


Architecture

UTF MCP Server (stdio or HTTP/SSE)│├── mcp_server/server.py         — FastMCP entrypoint, 13 registered tools│├── mcp_server/engine/           — Core processing│   ├── language_detector.py     — Detects language + framework from code/path│   ├── rule_engine.py           — Loads and merges YAML rules│   ├── contract_validator.py    — Enforces 8-section contract, scores tests│   ├── template_renderer.py     — Jinja2 test file generation│   ├── context_resolver.py      — Resolves project context for generation│   └── framework_mapper.py      — Maps language → framework → test runner│├── mcp_server/tools/            — One module per MCP tool├── mcp_server/registry/         — SQLite per-project test registry├── mcp_server/execution/        — pytest, Vitest, Maven, go-test adapters├── mcp_server/mutation/         — mutmut, Stryker, PIT, Gremlins adapters├── mcp_server/reporting/        — HTML, JUnit XML, JSON report generation├── mcp_server/feedback/         — CI listener, trend analysis, gap reopener│├── rules/                       — Global YAML rules (language, framework, type)├── templates/                   — Jinja2 test templates per language/framework├── agent-customization/         — VS Code copilot-instructions + prompt palette└── vscode-extension/            — @utf VS Code Chat Participant (VSIX)

Transport modes:

  • stdio — default, used by VS Code MCP client and uvx
  • HTTP/SSE — for remote/team deployment (--transport http --port 8765)

SQLite registry resolves to .utf/utf.db relative to the caller's project root (the cwd in mcp.json, or the project_dir parameter passed to any tool). Each project has its own isolated registry — no shared state. The registry persists across all sessions until explicitly cleared.


Installation Options Summary

MethodCommandcwd / Registry IsolationRequirements
uvx (zero-clone)uvx --from universal-test-framework utf-server${workspaceFolder} in mcp.jsonuv
Local clone.\scripts\install-vscode-mcp.ps1${workspaceFolder} auto-writtenGit, Python 3.11+
Dockerdocker compose up -dNamed volume; bind-mount for per-projectDocker
GitHub MCP RegistryAuto via MCP clientUTF_PROJECT_DIR env varuv (auto-installed)
pip + SDKpip install universal-test-frameworkPass project_dir to each callPython 3.11+

Registry Isolation Rules

All setups resolve the SQLite registry path using the same priority chain:

1. project_dir argument (explicit per-tool call)2. UTF_PROJECT_DIR environment variable3. Path.cwd() at server start (fallback — avoid for multi-project use)

The recommended approach for all setups: set both "cwd": "${workspaceFolder}" and "env": { "UTF_PROJECT_DIR": "${workspaceFolder}" } in your mcp.json entry. This ensures registry isolation works even if a tool call omits project_dir.

Security

  • All MCP tool inputs are validated via Pydantic before processing
  • No secrets, credentials, or PII are logged or stored
  • The registry (utf.db) is local to each project and never transmitted
  • Docker image runs as non-root user
  • Rate limiting is enforced on the HTTP/SSE transport

License

MIT — see LICENSE

來源:README.md,提交 767601f

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.0.2最新Sep 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。