Skip to content

Rebrand to Scorable#27

Merged
juho-y merged 1 commit intomainfrom
rebrand-to-scorable
Nov 21, 2025
Merged

Rebrand to Scorable#27
juho-y merged 1 commit intomainfrom
rebrand-to-scorable

Conversation

@juho-y
Copy link
Contributor

@juho-y juho-y commented Nov 17, 2025

Summary by CodeRabbit

  • Documentation

    • Updated README with Scorable branding, including logos, links, and product references.
    • Updated example configurations and usage guides to reflect Scorable naming and API endpoints.
  • Refactor

    • Rebranded project from RootSignals to Scorable across all modules and services.
    • Renamed public client class and API services for consistency with new branding.
    • Updated API configuration to use Scorable endpoints and authentication.
  • Chores

    • Renamed environment variable from ROOT_SIGNALS_API_KEY to SCORABLE_API_KEY.
    • Updated Docker image and deployment configuration to reflect Scorable branding.
    • Updated package metadata and project configuration files.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 17, 2025

Walkthrough

This pull request performs a comprehensive rebranding of the MCP server from Root Signals to Scorable, including namespace migration from root_signals_mcp to scorable_mcp, API key renaming, class/type renames, environment variable updates, and documentation refreshes across configuration, examples, and all source code modules.

Changes

Cohort / File(s) Summary
Configuration & Environment
.env.example, .github/workflows/test.yml, pyproject.toml
Environment variable and configuration updated: ROOT_SIGNALS_API_KEYSCORABLE_API_KEY; project name, description, and author metadata updated from Root Signals to Scorable; test and coverage paths updated to reference scorable_mcp namespace.
Runtime & Infrastructure
Dockerfile, main.py
Docker maintainer email updated to [email protected]; entry point module imports updated from root_signals_mcp.sse_server to scorable_mcp.sse_server.
Documentation
README.md, demonstrations/example_pydantic-ai.py
Branding and references updated from Root Signals to Scorable; client class renamed to ScorableMCPClient; import paths and usage examples updated to reflect new namespace.
Root Package
src/__init__.py, src/root_signals_mcp/__init__.py, src/scorable_mcp/__init__.py
Old root_signals_mcp package removed; new scorable_mcp package created with ScorableFastMCP export and updated module docstring.
Core Server Layer
src/scorable_mcp/core.py, src/scorable_mcp/fastmcp_adapter.py
Logger names and server descriptors updated; imports redirected to scorable_mcp.*; adapter class renamed RootSignalsFastMCPScorableFastMCP.
Client API
src/scorable_mcp/client.py
Public client class renamed: RootSignalsMCPClientScorableMCPClient; docstrings updated to reference Scorable API.
Repository & HTTP Client
src/scorable_mcp/root_api_client.py
Public classes renamed: RootSignalsAPIErrorScorableAPIError, RootSignalsRepositoryBaseScorableRepositoryBase, RootSignalsEvaluatorRepositoryScorableEvaluatorRepository, RootSignalsJudgeRepositoryScorableJudgeRepository; User-Agent header and logger updated to reference scorable-mcp.
Service Implementations
src/scorable_mcp/evaluator.py, src/scorable_mcp/judge.py
Services updated to instantiate Scorable repository classes; exception handling switched to ScorableAPIError; imports and settings references updated to scorable_mcp.* and scorable_api_* fields.
Configuration & Schema
src/scorable_mcp/schema.py, src/scorable_mcp/settings.py
Settings fields renamed: root_signals_api_keyscorable_api_key, root_signals_api_urlscorable_api_url; API URL default updated to https://api.scorable.ai; schema models updated to inherit from new BaseScorableModel.
Server Implementations
src/scorable_mcp/sse_server.py, src/scorable_mcp/stdio_server.py, src/scorable_mcp/tools.py
Module imports, logger names, and startup messages updated to reflect Scorable naming; tool descriptions updated from RootSignals to Scorable references.
Test Infrastructure & Fixtures
src/scorable_mcp/test/__init__.py, src/scorable_mcp/test/conftest.py, src/scorable_mcp/test/test_*.py (all test files)
Test module imports updated to scorable_mcp; client class references updated to ScorableMCPClient; exception types and repository mocks updated to Scorable equivalents; environment variable checks updated to SCORABLE_API_KEY; logger names updated.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Large scope: Changes span configuration, infrastructure, core logic, public APIs, settings, and comprehensive test coverage.
  • Consistent pattern: Most changes follow a homogeneous renaming pattern (root_signals_mcp → scorable_mcp, RootSignals* → Scorable*), reducing cognitive load per file.
  • Key areas requiring attention:
    • src/scorable_mcp/root_api_client.py — Complex public API surface with multiple class renames and User-Agent/header updates; verify all exception handlers reference correct types
    • src/scorable_mcp/settings.py — Settings field renames must be consistent across all referencing modules (evaluator, judge, sse_server, stdio_server)
    • src/scorable_mcp/schema.py — Inheritance hierarchy changes (BaseRootSignalsModel → BaseScorableModel); ensure no type mismatches downstream
    • Test suite (all test_*.py files) — Verify mocks, fixtures, and environment variable usage are correctly updated across the board; check import paths for consistency

Poem

🐰 From signals old to scorable new,
We hop through code with a branding debut!
Classes renamed, imports reflined,
A fresh identity for evaluators to find.
With API keys and URLs in place,
Scorable now owns this testing space!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Rebrand to Scorable' clearly and concisely summarizes the main objective of the changeset, which is a comprehensive rebranding from RootSignals to Scorable across the entire codebase.
Docstring Coverage ✅ Passed Docstring coverage is 93.26% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch rebrand-to-scorable

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/test.yml (1)

86-94: Update codecov upload name for consistency.

The codecov upload name still references "rootsignals-mcp-integration-codecov" on line 92, which is inconsistent with the rebranding.

Apply this diff to complete the rebranding:

           flags: integration
-          name: rootsignals-mcp-integration-codecov
+          name: scorable-mcp-integration-codecov
           fail_ci_if_error: false
🧹 Nitpick comments (6)
src/scorable_mcp/test/test_client.py (1)

23-324: Silence Ruff ARG001 for unused compose_up_mcp_server fixture arguments

Each async test takes compose_up_mcp_server only to trigger the fixture’s side effects, so the argument is intentionally unused but flagged by Ruff (ARG001). Consider annotating the parameter with a noqa comment in these tests to keep lint clean, for example:

-async def test_client_connection(compose_up_mcp_server: Any) -> None:
+async def test_client_connection(compose_up_mcp_server: Any) -> None:  # noqa: ARG001

You can apply the same pattern to the other tests that accept compose_up_mcp_server but don’t reference it.

src/scorable_mcp/stdio_server.py (1)

15-19: Drop unused # noqa: E501 on the ScorableFastMCP import

Ruff reports the # noqa: E501 as unused (E501 isn’t enabled), while # isort: skip is still useful. You can simplify the import line as:

-from scorable_mcp.fastmcp_adapter import ScorableFastMCP  # noqa: E501  # isort: skip
+from scorable_mcp.fastmcp_adapter import ScorableFastMCP  # isort: skip

This keeps imports ordered as intended without carrying an unnecessary noqa.

README.md (1)

2-2: LGTM! Documentation rebranding is comprehensive.

All documentation has been successfully updated including:

  • Logo and branding links
  • Product name references
  • API key environment variables
  • Docker image references
  • Code examples with ScorableMCPClient
  • Import paths to scorable_mcp.*
  • Configuration examples

Optional: Address markdown linting warnings.

Static analysis flagged a few minor markdown formatting issues:

  • Badge images (lines 11, 15, 19, 23) should have alt text for accessibility
  • Heading level jump at line 55 (h4 instead of h3)

These are not critical but could improve documentation quality.

Also applies to: 10-10, 14-14, 18-18, 22-22, 27-29, 33-33, 37-50, 55-56, 62-62, 69-77, 85-89, 100-108, 143-143, 146-146

src/scorable_mcp/schema.py (1)

1-4: Minor: consider updating remaining docstring references to Root-generated types

A few docstrings still mention root.generated.openapi_aclient... even though this module is now Scorable‑branded. If those types are still the true upstream sources, this is fine; otherwise you may want to reword them to reference “Scorable OpenAPI models” (or similar) for consistency with the rest of the rebrand.

Purely a documentation/clarity point, no behavioral impact.

Also applies to: 155-179

src/scorable_mcp/evaluator.py (1)

101-112: Minor: docstrings still reference evaluator_id in run_evaluation_by_name

The docstring in run_evaluation_by_name still says “The evaluator_id field will be treated as the evaluator name”, but the request model now uses evaluator_name explicitly. Same for the run_evaluation docstring mentioning an evaluator_id arg rather than the request model.

Consider tightening these docstrings to match the actual EvaluationRequest / EvaluationRequestByName signatures to avoid confusion for readers.

Also applies to: 135-144

src/scorable_mcp/root_api_client.py (1)

113-149: Both suggestions are reasonable but optional given current usage patterns

Verification confirms:

  1. Client reuse: The _make_request method is called only 4 times in the codebase (from _fetch_paginated_results, list_evaluators, and related judgment methods). The current async with httpx.AsyncClient(...) as client: pattern is idiomatic and handles resource cleanup automatically. Pooling would require non-trivial lifecycle management and offers minimal practical benefit at this call frequency.

  2. Logger style: Switching logger.error(f"Request error: {str(e)}") to logger.error("Request error: %s", e) would improve consistency with Ruff and placeholder-based logging patterns—this is valid polish.

The code is functionally correct; both suggestions are valid refinements rather than necessary changes.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bef7d36 and 3ac77f0.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (32)
  • .env.example (1 hunks)
  • .github/workflows/test.yml (3 hunks)
  • Dockerfile (2 hunks)
  • README.md (7 hunks)
  • demonstrations/example_pydantic-ai.py (4 hunks)
  • main.py (1 hunks)
  • pyproject.toml (4 hunks)
  • src/__init__.py (1 hunks)
  • src/root_signals_mcp/__init__.py (0 hunks)
  • src/root_signals_mcp/test/__init__.py (0 hunks)
  • src/scorable_mcp/__init__.py (1 hunks)
  • src/scorable_mcp/client.py (8 hunks)
  • src/scorable_mcp/core.py (4 hunks)
  • src/scorable_mcp/evaluator.py (4 hunks)
  • src/scorable_mcp/fastmcp_adapter.py (3 hunks)
  • src/scorable_mcp/judge.py (3 hunks)
  • src/scorable_mcp/root_api_client.py (12 hunks)
  • src/scorable_mcp/schema.py (11 hunks)
  • src/scorable_mcp/settings.py (4 hunks)
  • src/scorable_mcp/sse_server.py (3 hunks)
  • src/scorable_mcp/stdio_server.py (4 hunks)
  • src/scorable_mcp/test/__init__.py (1 hunks)
  • src/scorable_mcp/test/conftest.py (1 hunks)
  • src/scorable_mcp/test/test_client.py (9 hunks)
  • src/scorable_mcp/test/test_evaluator.py (5 hunks)
  • src/scorable_mcp/test/test_judge.py (3 hunks)
  • src/scorable_mcp/test/test_root_client.py (22 hunks)
  • src/scorable_mcp/test/test_settings.py (1 hunks)
  • src/scorable_mcp/test/test_sse_integration.py (7 hunks)
  • src/scorable_mcp/test/test_sse_server.py (5 hunks)
  • src/scorable_mcp/test/test_stdio_integration.py (9 hunks)
  • src/scorable_mcp/tools.py (2 hunks)
💤 Files with no reviewable changes (2)
  • src/root_signals_mcp/init.py
  • src/root_signals_mcp/test/init.py
🧰 Additional context used
🧬 Code graph analysis (19)
src/scorable_mcp/__init__.py (1)
src/scorable_mcp/fastmcp_adapter.py (1)
  • ScorableFastMCP (25-58)
src/scorable_mcp/test/test_judge.py (5)
src/scorable_mcp/judge.py (3)
  • JudgeService (24-113)
  • list_judges (68-81)
  • run_judge (83-113)
src/scorable_mcp/root_api_client.py (4)
  • ResponseValidationError (40-51)
  • ScorableAPIError (25-37)
  • list_judges (395-454)
  • run_judge (456-492)
src/scorable_mcp/schema.py (3)
  • JudgeEvaluatorResult (265-270)
  • RunJudgeRequest (239-262)
  • RunJudgeResponse (273-278)
src/scorable_mcp/test/test_evaluator.py (1)
  • mock_api_client (27-35)
src/scorable_mcp/client.py (2)
  • list_judges (223-230)
  • run_judge (232-253)
src/scorable_mcp/core.py (2)
src/scorable_mcp/evaluator.py (1)
  • EvaluatorService (25-165)
src/scorable_mcp/judge.py (1)
  • JudgeService (24-113)
src/scorable_mcp/test/test_client.py (2)
src/scorable_mcp/client.py (1)
  • ScorableMCPClient (22-253)
src/scorable_mcp/test/conftest.py (1)
  • compose_up_mcp_server (129-175)
src/scorable_mcp/test/conftest.py (1)
src/scorable_mcp/sse_server.py (1)
  • SSEMCPServer (31-47)
main.py (1)
src/scorable_mcp/sse_server.py (1)
  • run_server (91-98)
src/scorable_mcp/sse_server.py (1)
src/scorable_mcp/core.py (1)
  • RootMCPServerCore (42-158)
src/scorable_mcp/tools.py (1)
src/scorable_mcp/schema.py (5)
  • ListEvaluatorsRequest (23-29)
  • EvaluationRequest (126-133)
  • EvaluationRequestByName (91-123)
  • CodingPolicyAdherenceEvaluationRequest (136-143)
  • ListJudgesRequest (205-211)
src/scorable_mcp/fastmcp_adapter.py (1)
src/scorable_mcp/core.py (1)
  • RootMCPServerCore (42-158)
src/scorable_mcp/test/test_sse_integration.py (4)
src/scorable_mcp/client.py (1)
  • ScorableMCPClient (22-253)
src/scorable_mcp/evaluator.py (1)
  • EvaluatorService (25-165)
src/scorable_mcp/schema.py (5)
  • EvaluationRequest (126-133)
  • EvaluationRequestByName (91-123)
  • EvaluationResponse (150-162)
  • EvaluatorInfo (174-196)
  • EvaluatorsListResponse (199-202)
src/scorable_mcp/test/test_sse_server.py (1)
  • test_list_tools (37-54)
src/scorable_mcp/root_api_client.py (1)
src/scorable_mcp/schema.py (5)
  • EvaluationResponse (150-162)
  • EvaluatorInfo (174-196)
  • JudgeInfo (214-230)
  • RunJudgeRequest (239-262)
  • RunJudgeResponse (273-278)
src/scorable_mcp/stdio_server.py (2)
src/scorable_mcp/core.py (1)
  • RootMCPServerCore (42-158)
src/scorable_mcp/fastmcp_adapter.py (1)
  • ScorableFastMCP (25-58)
src/scorable_mcp/test/test_settings.py (1)
src/scorable_mcp/settings.py (1)
  • get_package_version (15-34)
src/scorable_mcp/test/test_sse_server.py (2)
src/scorable_mcp/root_api_client.py (2)
  • ResponseValidationError (40-51)
  • ScorableEvaluatorRepository (215-389)
src/scorable_mcp/schema.py (2)
  • EvaluationRequest (126-133)
  • UnknownToolRequest (37-45)
src/scorable_mcp/test/test_stdio_integration.py (1)
src/scorable_mcp/core.py (1)
  • RootMCPServerCore (42-158)
src/scorable_mcp/test/test_root_client.py (2)
src/scorable_mcp/root_api_client.py (4)
  • ResponseValidationError (40-51)
  • ScorableAPIError (25-37)
  • ScorableEvaluatorRepository (215-389)
  • ScorableJudgeRepository (392-492)
src/scorable_mcp/schema.py (2)
  • EvaluatorInfo (174-196)
  • RunJudgeRequest (239-262)
src/scorable_mcp/evaluator.py (3)
src/scorable_mcp/root_api_client.py (4)
  • ResponseValidationError (40-51)
  • ScorableAPIError (25-37)
  • ScorableEvaluatorRepository (215-389)
  • list_evaluators (218-276)
src/scorable_mcp/schema.py (5)
  • EvaluationRequest (126-133)
  • EvaluationRequestByName (91-123)
  • EvaluationResponse (150-162)
  • EvaluatorInfo (174-196)
  • EvaluatorsListResponse (199-202)
src/scorable_mcp/client.py (1)
  • list_evaluators (113-120)
src/scorable_mcp/judge.py (3)
src/scorable_mcp/root_api_client.py (4)
  • ResponseValidationError (40-51)
  • ScorableAPIError (25-37)
  • ScorableJudgeRepository (392-492)
  • list_judges (395-454)
src/scorable_mcp/schema.py (4)
  • JudgeInfo (214-230)
  • JudgesListResponse (233-236)
  • RunJudgeRequest (239-262)
  • RunJudgeResponse (273-278)
src/scorable_mcp/client.py (1)
  • list_judges (223-230)
src/scorable_mcp/test/test_evaluator.py (2)
src/scorable_mcp/evaluator.py (2)
  • EvaluatorService (25-165)
  • list_evaluators (71-82)
src/scorable_mcp/root_api_client.py (4)
  • ResponseValidationError (40-51)
  • ScorableAPIError (25-37)
  • list_evaluators (218-276)
  • run_evaluator (278-330)
🪛 markdownlint-cli2 (0.18.1)
README.md

11-11: Images should have alternate text (alt text)

(MD045, no-alt-text)


15-15: Images should have alternate text (alt text)

(MD045, no-alt-text)


19-19: Images should have alternate text (alt text)

(MD045, no-alt-text)


23-23: Images should have alternate text (alt text)

(MD045, no-alt-text)


55-55: Heading levels should only increment by one level at a time
Expected: h3; Actual: h4

(MD001, heading-increment)

🪛 Ruff (0.14.4)
src/scorable_mcp/__init__.py

6-6: Unused noqa directive (non-enabled: F401)

Remove unused noqa directive

(RUF100)

src/scorable_mcp/test/test_client.py

24-24: Unused function argument: compose_up_mcp_server

(ARG001)

src/scorable_mcp/test/test_sse_integration.py

32-32: Unused function argument: compose_up_mcp_server

(ARG001)

src/scorable_mcp/root_api_client.py

148-148: Use explicit conversion flag

Replace with conversion flag

(RUF010)

src/scorable_mcp/stdio_server.py

18-18: Unused noqa directive (non-enabled: E501)

Remove unused noqa directive

(RUF100)

src/scorable_mcp/evaluator.py

57-57: Consider moving this statement to an else block

(TRY300)

src/scorable_mcp/judge.py

54-54: Consider moving this statement to an else block

(TRY300)

🔇 Additional comments (37)
src/scorable_mcp/test/__init__.py (1)

1-1: LGTM!

The package initializer is minimal and appropriate. The docstring is clear, uses the updated "Scorable" branding, and follows Python conventions for test package initialization.

src/__init__.py (1)

1-1: Docstring update looks good

Docstring accurately reflects the Scorable rebrand and keeps the module description clear and minimal. No further changes needed.

.env.example (1)

1-5: LGTM! Configuration properly rebranded.

The header and environment variable have been consistently updated to reflect the Scorable branding.

Dockerfile (2)

2-2: LGTM! Maintainer email updated.

The maintainer label has been properly updated to the Scorable domain.


26-26: LGTM! Module path updated.

The CMD instruction has been properly updated to use the new scorable_mcp namespace.

main.py (1)

1-3: LGTM! Entry point properly rebranded.

The docstring and import path have been consistently updated to reflect the Scorable namespace.

.github/workflows/test.yml (3)

36-42: LGTM! Environment variable creation updated.

The workflow properly uses the new SCORABLE_API_KEY secret for both the .env file and the GitHub environment.


56-63: LGTM! API key check updated.

The conditional check and error message properly reference the new SCORABLE_API_KEY environment variable.


65-71: LGTM! Coverage path updated.

The pytest coverage configuration properly uses the new scorable_mcp namespace.

pyproject.toml (4)

5-12: LGTM! Project metadata updated.

The project name, description, and authors have been comprehensively updated to reflect the Scorable branding.


47-54: LGTM! Test paths updated.

The pytest test paths have been properly updated to use the new scorable_mcp namespace.


56-62: LGTM! Coverage configuration updated.

The coverage source and omit paths have been properly updated to use the new scorable_mcp namespace.


74-104: LGTM! Entry points and tool configurations updated.

The project scripts and tool configurations have been properly updated to use the new scorable_mcp namespace.

src/scorable_mcp/test/test_settings.py (1)

5-5: LGTM! Import path updated.

The import statement has been properly updated to use the new scorable_mcp namespace.

src/scorable_mcp/__init__.py (1)

1-6: LGTM! Package initialization properly set up.

The package docstring and re-export of ScorableFastMCP are correctly implemented. The noqa: F401 comment is appropriate for re-exports in __init__.py files to document the intentional re-export pattern, even if the specific rule isn't currently enabled in your linter configuration.

demonstrations/example_pydantic-ai.py (3)

1-31: LGTM! Documentation updated.

The file header and acceptance criteria have been properly updated to reference Scorable branding.


55-56: LGTM! Variable renamed.

The server variable has been properly renamed from root_signals_server to scorable_server.


72-78: LGTM! Agent configuration updated.

The Agent initialization properly uses the renamed scorable_server variable.

src/scorable_mcp/test/conftest.py (1)

15-18: SSE server import and logger rename look consistent with the rebrand

Importing SSEMCPServer from scorable_mcp.sse_server and using the "scorable_mcp_tests" logger aligns with the new namespace and other tests; no issues spotted here.

src/scorable_mcp/test/test_evaluator.py (1)

9-35: Evaluator tests correctly updated to Scorable imports and error types

The move to scorable_mcp.* imports, the patched ScorableEvaluatorRepository target, and the use of ScorableAPIError in side effects all match the updated EvaluatorService wiring and preserve the previous behavior and assertions.

Also applies to: 56-61, 222-243

src/scorable_mcp/test/test_judge.py (1)

9-24: Judge tests correctly migrated to Scorable types and repository

Imports, the ScorableJudgeRepository patch, and the use of ScorableAPIError are all aligned with the updated JudgeService and root API client; test intent and coverage remain the same.

Also applies to: 35-40, 82-83

src/scorable_mcp/test/test_client.py (1)

1-21: Integration test setup correctly rebranded to Scorable

Docstring, ScorableMCPClient import, settings.scorable_api_key, skip reason, and logger name all match the new Scorable naming and configuration.

src/scorable_mcp/sse_server.py (1)

1-5: SSE server rebrand and config wiring look consistent

Renaming the docstring, logger, imports to scorable_mcp.*, and startup logs (including settings.scorable_api_url) cleanly aligns this transport with the Scorable branding without altering the server’s public behavior.

Also applies to: 21-23, 28-28, 106-108

src/scorable_mcp/client.py (1)

1-7: Client rename and Scorable-focused docstrings look good

The class rename to ScorableMCPClient, logger namespace, and updated evaluator/judge docstrings are coherent with the rest of the Scorable stack, and they don’t alter the client’s behavior or API surface.

Also applies to: 17-23, 113-115, 130-131, 160-161, 185-186, 208-209, 224-225

src/scorable_mcp/test/test_sse_server.py (1)

10-16: LGTM! Rebranding updates are consistent.

All import paths, class names, environment variable references, and logger names have been correctly updated from Root Signals to Scorable. The test logic remains unchanged.

Also applies to: 19-20, 26-26, 335-335, 346-346, 362-362, 370-370, 442-442

src/scorable_mcp/core.py (1)

1-1: LGTM! Core module rebranding is complete.

All import paths, docstrings, logger names, and server descriptors have been correctly updated to reflect the Scorable branding.

Also applies to: 18-21, 34-34, 36-36, 46-46

src/scorable_mcp/test/test_root_client.py (1)

1-1: LGTM! Test file rebranding is thorough and consistent.

All references to Root Signals have been successfully updated to Scorable, including:

  • Import paths (scorable_mcp.*)
  • Class names (ScorableAPIError, ScorableEvaluatorRepository, ScorableJudgeRepository)
  • Environment variables (SCORABLE_API_KEY)
  • Logger names and User-Agent strings

Test logic remains functionally unchanged.

Also applies to: 9-16, 20-21, 27-27, 32-32, 37-37, 51-51, 73-73, 96-96, 108-108, 134-134, 166-166, 182-182, 205-205, 213-213, 241-241, 273-274, 286-287, 322-323, 370-370, 379-379, 427-427, 438-438, 452-452, 471-471, 492-492, 506-506, 521-521

src/scorable_mcp/test/test_sse_integration.py (1)

1-1: LGTM! Integration test rebranding is complete.

All references have been correctly updated:

  • Import paths to scorable_mcp.*
  • Client class to ScorableMCPClient
  • Environment variables to SCORABLE_API_KEY
  • Logger names to scorable_mcp_tests

Test functionality is preserved.

Also applies to: 8-10, 17-17, 21-22, 28-28, 35-35, 61-61, 78-78, 95-95, 128-128, 330-330, 370-370

src/scorable_mcp/tools.py (1)

1-1: LGTM! Tool catalog rebranding is complete.

All tool descriptions have been updated to reference Scorable instead of Root Signals. Import paths are correctly updated to scorable_mcp.schema.

Also applies to: 7-14, 18-18, 23-23, 28-28, 33-33, 38-38, 43-43, 48-48

src/scorable_mcp/fastmcp_adapter.py (1)

1-1: LGTM! FastMCP adapter rebranding is complete.

The adapter class has been renamed from RootSignalsFastMCP to ScorableFastMCP, with all supporting changes (imports, docstrings, logger names) updated consistently.

Also applies to: 7-7, 20-20, 22-22, 25-25, 51-51

src/scorable_mcp/settings.py (1)

1-1: Environment variable names have changed (breaking change).

The settings field names have been updated as part of the rebranding:

  • ROOT_SIGNALS_API_KEYSCORABLE_API_KEY
  • ROOT_SIGNALS_API_URLSCORABLE_API_URL (default now https://api.scorable.ai)
  • ROOT_SIGNALS_API_TIMEOUTSCORABLE_API_TIMEOUT

Users upgrading from the previous version will need to update their environment variables. Ensure that:

  1. Migration documentation exists
  2. Release notes highlight this breaking change
  3. The README and examples have been updated (confirmed in this PR)

Also applies to: 38-38, 43-50, 51-54, 74-74, 113-113

src/scorable_mcp/schema.py (1)

48-60: BaseScorableModel config looks consistent with usage across Scorable API response models

extra="ignore" plus strict=True and validate_assignment=True is a reasonable combo here: it gives you forward‑compatible schema evolution while still failing fast if core fields are missing or of the wrong type. The downstream repositories (ScorableEvaluatorRepository / ScorableJudgeRepository) are correctly constructing EvaluationResponse, EvaluatorInfo, JudgeInfo, JudgesListResponse, JudgeEvaluatorResult, and RunJudgeResponse from raw API data, so adopting BaseScorableModel for all these keeps behavior consistent and centralized.

No changes needed from my side in these model definitions.

Also applies to: 149-203, 214-237, 265-278

src/scorable_mcp/test/test_stdio_integration.py (1)

16-28: Env var and module rebrand in stdio tests is consistent

  • Importing settings from scorable_mcp.settings and checking settings.scorable_api_key.get_secret_value() in the skipif condition matches the rebranded configuration.
  • Using server_env["SCORABLE_API_KEY"] = settings.scorable_api_key.get_secret_value() ensures the spawned stdio server sees the same key as the in‑process client.
  • Updating stdio entrypoints to "scorable_mcp.stdio_server" and the logger name to "scorable_mcp_tests" keeps the tests aligned with the new package namespace.

The continued use of RootMCPServerCore as the core class name looks intentional and consistent with scorable_mcp.core.

Also applies to: 109-116, 141-148, 206-213, 278-285, 302-309

src/scorable_mcp/evaluator.py (1)

8-23: EvaluatorService wiring to ScorableEvaluatorRepository and error mapping looks correct

  • ScorableEvaluatorRepository is initialized with settings.scorable_api_key and settings.scorable_api_url, matching the new base client defaults and keeping configuration explicit.
  • fetch_evaluators/run_evaluation/run_evaluation_by_name consistently catch ScorableAPIError and ResponseValidationError, log with exc_info=settings.debug, and surface RuntimeError with user‑oriented messages, which preserves a clean boundary between HTTP concerns and the rest of the MCP server.
  • The log messages have been rebranded to “Scorable API” everywhere, which should help when correlating logs across components.

From a behavior standpoint this looks solid.

Also applies to: 28-33, 47-69, 113-134, 145-165

src/scorable_mcp/root_api_client.py (2)

13-23: ScorableRepositoryBase rebrand and error handling are coherent

  • The base client now pulls api_key/base_url from settings.scorable_api_key / settings.scorable_api_url, and sets a Scorable‑specific User‑Agent, which matches the rest of the rename.
  • _make_request correctly:
    • logs request/response details (guarded by settings.debug),
    • raises ScorableAPIError for HTTP ≥ 400 and for httpx.RequestError,
    • returns JSON bodies or {} for 204 responses.
  • This aligns with how EvaluatorService/JudgeService catch ScorableAPIError and ResponseValidationError, so the abstraction boundary is consistent.

No behavioral concerns here.

Also applies to: 54-80, 82-103, 113-149


215-276: Evaluator and judge repositories correctly adapted to Scorable models

  • ScorableEvaluatorRepository and ScorableJudgeRepository both:
    • use _fetch_paginated_results with appropriate resource_type and limits derived from Scorable settings,
    • map raw API data into EvaluatorInfo, JudgeInfo, and nested JudgeInfo.NestedEvaluatorInfo Pydantic models,
    • propagate structural issues via ResponseValidationError with the offending payload attached.
  • Evaluation/judge execution methods (run_evaluator, run_evaluator_by_name, run_judge) all:
    • build payloads from the appropriate schema types (RunJudgeRequest, etc.),
    • rely on _make_request for HTTP concerns,
    • validate responses via EvaluationResponse / RunJudgeResponse, surfacing validation problems via ResponseValidationError.

This lines up cleanly with the service layers and preserves previous behavior under the new Scorable naming.

Also applies to: 332-389, 392-492

src/scorable_mcp/judge.py (1)

8-22: JudgeService Scorable wiring and error handling look consistent

  • ScorableJudgeRepository is instantiated with settings.scorable_api_key and settings.scorable_api_url, mirroring the evaluator service.
  • fetch_judges and run_judge both:
    • log high‑level actions against the “Scorable API”,
    • catch ScorableAPIError and ResponseValidationError and wrap them in RuntimeError with clear messages,
    • optionally log full response_data when present, gated by settings.debug.
  • list_judges correctly wraps the underlying list in a JudgesListResponse, matching the schema used by the core and client code.

Implementation is consistent and appropriate; no changes needed.

Also applies to: 27-32, 46-66, 83-113

@juho-y juho-y requested a review from TensorTemplar November 17, 2025 10:57
@juho-y juho-y merged commit 420aabb into main Nov 21, 2025
2 of 3 checks passed
@juho-y juho-y deleted the rebrand-to-scorable branch November 21, 2025 10:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant