Skip to content

feat(clp-package): Add CLP Model Context Protocol (MCP) Server:#1368

Merged
LinZhihao-723 merged 40 commits into
y-scope:mainfrom
20001020ycx:clp-mcp-server-component
Oct 4, 2025
Merged

feat(clp-package): Add CLP Model Context Protocol (MCP) Server:#1368
LinZhihao-723 merged 40 commits into
y-scope:mainfrom
20001020ycx:clp-mcp-server-component

Conversation

@20001020ycx

@20001020ycx 20001020ycx commented Oct 2, 2025

Copy link
Copy Markdown
Contributor
  • Add clp-mcp-server Python project.
  • Add tasks to build and package clp-mcp-server as a part of the CLP package.

Description

1. MCP Server Source Code Setup
Introduces the MCP server as a new component under the CLP project, with the following directory structure:
clp/components/clp-mcp-server/
├── pyproject.toml & uv.lock
├── README.md
└── clp_mcp_server/
  ├── server
    └── server.py (implementation of MCP API tool calls)
  └── clp_mcp_server.py (main)

  • pyproject.tom/uv.lock: Configured Poetry with uv.lock for managing dependencies required for the MCP server.
  • Package name: clp-mcp-server. This is the Python package executed when Docker Compose starts the MCP server container: python3 -m clp_mcp_server

2. Taskfile Integration
Adds infrastructure for building and packaging the MCP server.

  • Create task clp-mcp-server: Generate a Python wheel at clp-mcp-server/dist/clp-mcp-server.whl.
  • Update task package: Install the MCP server wheel into the CLP package’s Python environment. After installation, we should have:
    • MCP server’s source files in build/clp-package/lib/python3/site-packages/clp_mcp_server/
    • MCP server’s metadata and dependencies in build/clp-package/lib/python3/site-packages/clp-mcp-server-0.5.2.dev0.dist-info/
  • Documentation and linter updates of the new component for developer usability

Checklist

  • The PR satisfies the contribution guidelines.
  • This is a breaking change and that has been indicated in the PR title, OR this isn't a
    breaking change.
  • Necessary docs have been updated, OR no docs need to be updated.

Validation performed

  1. Ran task package to build the package.
  2. Ran cd build/clp-package/lib/python3/site-packages && python3 -m clp_mcp_server.clp_mcp_server --host 127.0.0.1 --port 8000
  3. Confirmed the MCP server started successfully.
  4. Connected Claude Desktop agent and issued a “hello world” query, receiving the expected greeting and server status response.
Screenshot 2025-10-04 at 12 37 07 PM

Summary by CodeRabbit

  • New Features

    • Added a CLP MCP Server and CLI to run an HTTP-accessible MCP service exposing basic info and a hello endpoint.
  • Documentation

    • Added README and docs covering build/packaging, prerequisites, configuration example, server URL guidance, connecting via Claude Desktop, and an "Available Tools" placeholder.
  • Chores

    • Integrated the component into build, packaging, clean and lint workflows; added tasks to build, lint and install its wheel.

@coderabbitai

coderabbitai Bot commented Oct 2, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Adds a new clp-mcp-server component: server implementation and factory, a Click CLI entrypoint with host/port validation to run a FastMCP server exposing two tools, package metadata and build config, README and docs, and task/lint CI integration for building and packaging the component.

Changes

Cohort / File(s) Summary
Server core
components/clp-mcp-server/clp_mcp_server/server/__init__.py, components/clp-mcp-server/clp_mcp_server/server/server.py
Add ProtocolConstant and create_mcp_server() factory; register MCP tools get_server_info and hello_world; re-export create_mcp_server.
CLI & package module
components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py, components/clp-mcp-server/clp_mcp_server/__init__.py
Add Click-based main(host, port) CLI with host/port validation, logging, MCP instantiation and mcp.run(transport="streamable-http", host, port); add package-level docstring.
Packaging & build metadata
components/clp-mcp-server/pyproject.toml
New pyproject.toml with project metadata, runtime deps (click, fastmcp), dev deps, hatchling backend, console script entry point, and tooling configs (mypy, ruff, isort).
Tasks & CI integration
taskfile.yaml, taskfiles/lint.yaml
Add clp-mcp-server public task wired to a reusable uv-component wheel build flow; include component wheel in packaging/install steps; add component to lint targets and clean sequence.
Docs & README
components/clp-mcp-server/README.md, docs/src/dev-docs/design-project-structure.md
Add README documenting build/packaging, MCP connection/configuration and placeholder "Available Tools" section; update project-structure docs to list clp-mcp-server.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant CLI as clp_mcp_server.main
  participant Factory as create_mcp_server()
  participant Transport as Streamable_HTTP

  User->>CLI: clp-mcp-server --host H --port P
  CLI->>CLI: validate host and port
  CLI->>Factory: create_mcp_server()
  CLI->>Transport: mcp.run(transport="streamable-http", host=H, port=P)
  Note over Transport,Factory: Server listens on H:P and exposes MCP tools
  alt invalid host/port
    CLI-->>User: exit(1)
  else startup error
    CLI-->>User: log error, exit(1)
  end
Loading
sequenceDiagram
  autonumber
  actor Client as MCP Client (e.g., Claude Desktop via mcp-remote)
  participant HTTP as HTTP Endpoint /mcp
  participant Server as FastMCP Tools

  Client->>HTTP: Request get_server_info
  HTTP->>Server: get_server_info()
  Server-->>HTTP: {name, capabilities, status}
  HTTP-->>Client: Response

  Client->>HTTP: Request hello_world(username)
  HTTP->>Server: hello_world(username)
  Server-->>HTTP: {message, server_name, status}
  HTTP-->>Client: Response
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

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.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
Title Check ✅ Passed The title clearly describes the primary change—adding the CLP Model Context Protocol server—and uses a conventional commit style with a concise scope and verb that match the pull request’s main content.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@20001020ycx 20001020ycx changed the title Clp mcp server component feat(clp-mcp-server): Introducing a hello world MCP server to CLP project Oct 2, 2025
@20001020ycx 20001020ycx changed the title feat(clp-mcp-server): Introducing a hello world MCP server to CLP project feat(clp-mcp-server): Introducing a hello world MCP server into CLP project Oct 2, 2025
@20001020ycx

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 2, 2025

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 10

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f193e2 and 7334e08.

⛔ Files ignored due to path filters (1)
  • components/clp-mcp-server/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (8)
  • components/clp-mcp-server/README.md (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/__init__.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/__main__.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/server.py (1 hunks)
  • components/clp-mcp-server/pyproject.toml (1 hunks)
  • docs/src/dev-docs/design-project-structure.md (2 hunks)
  • taskfile.yaml (6 hunks)
  • taskfiles/lint.yaml (1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
components/clp-mcp-server/README.md

12-12: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


20-20: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


21-21: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


23-23: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


26-26: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


27-27: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: ubuntu-jammy-lint
  • GitHub Check: musllinux_1_2-x86_64-static-linked-bins
  • GitHub Check: musllinux_1_2-x86_64-dynamic-linked-bins
  • GitHub Check: manylinux_2_28-x86_64-static-linked-bins
  • GitHub Check: manylinux_2_28-x86_64-dynamic-linked-bins
  • GitHub Check: build-macos (macos-15, true)
  • GitHub Check: build-macos (macos-15, false)
  • GitHub Check: build-macos (macos-14, true)
  • GitHub Check: build-macos (macos-14, false)
🔇 Additional comments (11)
taskfiles/lint.yaml (1)

767-767: LGTM!

The addition of the clp-mcp-server component to the lint workflow is correct and maintains alphabetical ordering.

components/clp-mcp-server/clp_mcp_server/server.py (1)

10-21: LGTM!

The factory function is well-structured and properly documented.

components/clp-mcp-server/clp_mcp_server/__main__.py (1)

1-4: LGTM!

This is the standard Python pattern for making a package executable. The implementation is correct.

components/clp-mcp-server/pyproject.toml (2)

1-7: LGTM!

Project metadata is well-defined with appropriate Python version requirement.


16-17: LGTM!

The console script entry point correctly maps to the main function defined in clp_mcp_server/__init__.py.

components/clp-mcp-server/clp_mcp_server/__init__.py (2)

19-22: LGTM!

Logging configuration is appropriate for a server application.


29-31: LGTM!

Port validation correctly checks the valid TCP port range.

taskfile.yaml (4)

69-71: LGTM!

The addition of clp-mcp-server to the clean task is correct and maintains consistency with other Python components.


122-122: LGTM!

The integration of clp-mcp-server into the packaging workflow is complete and consistent, including sources, dependencies, and installation steps.

Also applies to: 132-132, 149-149


237-240: LGTM!

The new clp-mcp-server task correctly delegates to the uv-component template with the appropriate component name.


554-582: LGTM!

The new uv-component task template is well-structured and mirrors the existing python-component pattern. The use of uv build --wheel instead of poetry build --format wheel is appropriate for components using uv for dependency management.

Comment thread components/clp-mcp-server/clp_mcp_server/__init__.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/__init__.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/__init__.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated
Comment thread components/clp-mcp-server/README.md Outdated
Comment thread docs/src/dev-docs/design-project-structure.md
Comment thread docs/src/dev-docs/design-project-structure.md
@20001020ycx 20001020ycx marked this pull request as ready for review October 2, 2025 16:22
@20001020ycx 20001020ycx requested a review from a team as a code owner October 2, 2025 16:22
@kirkrodrigues

Copy link
Copy Markdown
Member

Can you provide some brief links/instructions for how you connected Claude Desktop to the MCP?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can you add the linting setup described here? See integration-tests/pyproject.toml for an example of how to use it. Similar to integration-tests, we should be using uv to do the linting.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done, I have followed integration-tests/pyproject.toml's linting style, and have run both uv run ruff check . and task lint:fix-py with all errors being resolved.

Question: I know task lint:check-py is in our gh workflow, but what about uv? should I add it to workflow as well?

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
components/clp-mcp-server/pyproject.toml (1)

1-77: Address maintainer feedback: Add linting setup integration.

As noted by @kirkrodrigues, this component should integrate the linting setup from yscope-dev-utils. See integration-tests/pyproject.toml for reference implementation patterns.

The current configuration should be augmented to use the shared linting configuration for consistency across the CLP project. This will ensure uniform code quality standards.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ca29274 and 4f8e92e.

⛔ Files ignored due to path filters (1)
  • components/clp-mcp-server/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • components/clp-mcp-server/README.md (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/__init__.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/__main__.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/server.py (1 hunks)
  • components/clp-mcp-server/pyproject.toml (1 hunks)
  • taskfile.yaml (5 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-02T15:48:58.935Z
Learnt from: 20001020ycx
PR: y-scope/clp#1368
File: components/clp-mcp-server/clp_mcp_server/__init__.py:11-15
Timestamp: 2025-10-02T15:48:58.935Z
Learning: In the clp-mcp-server component (components/clp-mcp-server/clp_mcp_server/__init__.py), the default host binding of 0.0.0.0 is intentional because the server is designed to be deployed in Docker containers where this binding is necessary to accept external connections.

Applied to files:

  • components/clp-mcp-server/clp_mcp_server/__init__.py
🧬 Code graph analysis (2)
components/clp-mcp-server/clp_mcp_server/__init__.py (1)
components/clp-mcp-server/clp_mcp_server/server.py (1)
  • clp_mcp_server (28-77)
components/clp-mcp-server/clp_mcp_server/__main__.py (1)
components/clp-mcp-server/clp_mcp_server/__init__.py (1)
  • main (18-61)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: ubuntu-jammy-static-linked-bins
  • GitHub Check: musllinux_1_2-x86_64-static-linked-bins
  • GitHub Check: manylinux_2_28-x86_64-dynamic-linked-bins
  • GitHub Check: manylinux_2_28-x86_64-static-linked-bins
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: lint-check (ubuntu-24.04)
  • GitHub Check: rust-checks (ubuntu-24.04)
  • GitHub Check: rust-checks (ubuntu-22.04)
🔇 Additional comments (11)
taskfile.yaml (3)

554-582: LGTM: Clean implementation of uv-based build task.

The uv-component task properly mirrors the python-component structure while using uv build --wheel instead of Poetry. The UV_CACHE_DIR environment variable is set to a build-specific directory, which is appropriate for isolated builds.


221-225: LGTM: Proper integration of clp-mcp-server into build system.

The task correctly delegates to uv-component and follows the established pattern for component tasks.


60-62: LGTM: Complete integration of clp-mcp-server into packaging workflow.

The component is properly integrated at all touchpoints:

  • Clean task includes component cleanup
  • Package task tracks wheel artifacts as sources
  • Package dependencies include the build task
  • Installation step includes the wheel

Also applies to: 119-119, 127-127, 146-146

components/clp-mcp-server/README.md (1)

1-46: LGTM: Clear and accurate documentation.

The README provides comprehensive coverage of:

  • Server overview and transport configuration
  • Installation via taskfile
  • Usage examples with default and custom configurations
  • Tool descriptions with parameters and return values

The documentation accurately reflects the implementation in the codebase.

components/clp-mcp-server/clp_mcp_server/server.py (2)

8-25: LGTM: Well-structured configuration class.

The CLPMCPServerConfig class effectively centralizes server constants and provides a clean API via get_capabilities() for retrieving available tools. This addresses previous feedback about extracting repeated values.


28-77: LGTM: Clean factory pattern with proper tool registration.

The clp_mcp_server factory function:

  • Properly instantiates configuration
  • Creates FastMCP with server name and additional settings
  • Registers tools using decorators within the factory scope
  • Returns a configured MCP instance

The async function signatures are appropriate for FastMCP's async-first design, even though the implementations don't perform I/O.

components/clp-mcp-server/clp_mcp_server/__main__.py (1)

1-6: LGTM: Standard package entry point.

This minimal entry point correctly imports and executes main(), enabling the package to be run as python -m clp_mcp_server. The implementation follows Python best practices for package execution.

components/clp-mcp-server/clp_mcp_server/__init__.py (3)

13-17: Verify default host binding aligns with Docker deployment.

The default host is now 127.0.0.1, which differs from the Docker deployment context mentioned in previous discussions where 0.0.0.0 binding is necessary. For containerized deployments, users will need to explicitly pass --host 0.0.0.0.

Based on learnings, consider documenting this in the README or adding a note about Docker deployments requiring the --host 0.0.0.0 flag.


26-48: LGTM: Comprehensive host and port validation.

The validation logic properly handles:

  • Empty host strings
  • IP address format (IPv4/IPv6 via ipaddress module)
  • Hostname resolution via socket.gethostbyname
  • Port range constraints (1-65535)

The error messages are clear and actionable.


50-61: LGTM: Robust server startup with appropriate error handling.

The startup sequence:

  • Creates the MCP server instance
  • Logs startup information
  • Runs with HTTP transport
  • Catches OS-level and runtime errors with proper logging

The error handling is appropriate for a CLI application.

components/clp-mcp-server/pyproject.toml (1)

40-76: LGTM: Comprehensive tooling configuration.

The configuration includes:

  • Mypy strict mode with enhanced output options
  • Extensive Ruff rule selection with thoughtful ignores
  • Per-file ignores for test files
  • Docstring formatting preferences

The ignore list is well-documented and reasonable for a new component.

Comment thread components/clp-mcp-server/pyproject.toml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f8e92e and 530d4aa.

📒 Files selected for processing (1)
  • taskfile.yaml (5 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (12)
  • GitHub Check: manylinux_2_28-x86_64-dynamic-linked-bins
  • GitHub Check: manylinux_2_28-x86_64-static-linked-bins
  • GitHub Check: musllinux_1_2-x86_64-static-linked-bins
  • GitHub Check: ubuntu-jammy-dynamic-linked-bins
  • GitHub Check: musllinux_1_2-x86_64-dynamic-linked-bins
  • GitHub Check: package-image
  • GitHub Check: ubuntu-jammy-static-linked-bins
  • GitHub Check: ubuntu-jammy-lint
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: rust-checks (ubuntu-22.04)
  • GitHub Check: rust-checks (ubuntu-24.04)
  • GitHub Check: lint-check (ubuntu-24.04)

Comment thread taskfile.yaml Outdated
Comment on lines +581 to +583
. "{{.VENV_DIR}}/bin/activate"
UV_CACHE_DIR="{{.G_BUILD_DIR}}/uv-cache" uv build --wheel

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

❓ Verification inconclusive

Confirm uv availability in the component venv.

uv build --wheel will fail in a fresh environment unless the uv CLI is installed inside the component virtualenv. component-venv only provisions what's listed in requirements.txt, and I don't see a corresponding update ensuring uv gets installed. Please add uv to that requirements set (or otherwise guarantee it’s present) so this task remains portable.

Run the following to double-check whether uv is declared in the shared requirements file:


🏁 Script executed:

#!/bin/bash
# Verify that uv is listed in requirements.txt
rg -n "^uv" requirements.txt

Length of output: 0


Searching for uv in all requirements files to ensure the CLI is installed in the component venv:


🏁 Script executed:

#!/bin/bash
# Search for 'uv' in any requirements*.txt file
rg -n -H "^uv" -g "requirements*.txt"

Length of output: 0


Install uv in the component virtualenv
No uv entry exists in any requirements*.txt; add it (or otherwise ensure the uv CLI is installed) so uv build --wheel in taskfile.yaml lines 581–583 won’t fail.

🤖 Prompt for AI Agents
In taskfile.yaml around lines 581–583, the task activates the component
virtualenv then runs "uv build --wheel", but the uv CLI isn't installed in the
venv; add "uv" to the appropriate requirements*.txt for that component (or the
component's setup/install script) so pip installing requirements into
{{.VENV_DIR}} produces the uv executable, or modify the task to pip install uv
into the activated venv before running "uv build --wheel", and update any
CI/build steps that install dependencies to include uv as well.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 530d4aa and c2540c0.

📒 Files selected for processing (1)
  • components/clp-mcp-server/README.md (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-02T15:48:58.935Z
Learnt from: 20001020ycx
PR: y-scope/clp#1368
File: components/clp-mcp-server/clp_mcp_server/__init__.py:11-15
Timestamp: 2025-10-02T15:48:58.935Z
Learning: In the clp-mcp-server component (components/clp-mcp-server/clp_mcp_server/__init__.py), the default host binding of 0.0.0.0 is intentional because the server is designed to be deployed in Docker containers where this binding is necessary to accept external connections.

Applied to files:

  • components/clp-mcp-server/README.md
🪛 markdownlint-cli2 (0.18.1)
components/clp-mcp-server/README.md

54-54: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


56-56: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


60-60: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

Comment thread components/clp-mcp-server/README.md Outdated
@LinZhihao-723 LinZhihao-723 self-requested a review October 2, 2025 18:03

@LinZhihao-723 LinZhihao-723 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Comments on the README style.

Comment thread components/clp-mcp-server/README.md
Comment thread components/clp-mcp-server/README.md Outdated
Comment thread components/clp-mcp-server/README.md

@LinZhihao-723 LinZhihao-723 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add comments in the actual Python implementation.

Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/__init__.py
Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 12

♻️ Duplicate comments (2)
components/clp-mcp-server/pyproject.toml (2)

8-14: Apply the previously requested dependency version updates.

The past review requested version bumps:

  • click >= 8.3.0
  • fastmcp < 2.13.0
  • uvicorn >= 0.37.0

These updates have not been applied yet.


8-14: Dependency version constraints could be loosened per previous feedback.

A previous review suggested updating:

  • click>=8.3.0 (currently >=8.2.1)
  • fastmcp>=2.10.0,<2.13.0 (currently <2.11.0)
  • uvicorn>=0.37.0 (currently >=0.27.0)

While the developer marked the linting feedback as done, these dependency constraint adjustments were not applied. Consider adopting these suggestions to include recent patches while maintaining compatibility.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c2540c0 and 808273c.

📒 Files selected for processing (5)
  • components/clp-mcp-server/README.md (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/server/__init__.py (1 hunks)
  • components/clp-mcp-server/clp_mcp_server/server/server.py (1 hunks)
  • components/clp-mcp-server/pyproject.toml (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-08T17:20:02.560Z
Learnt from: junhaoliao
PR: y-scope/clp#1078
File: components/webui/server/src/plugins/MongoSocketIoServer/index.ts:105-108
Timestamp: 2025-07-08T17:20:02.560Z
Learning: The y-scope/clp codebase has a 100-character line length limit that takes precedence over other style preferences like template literals when they conflict.

Applied to files:

  • components/clp-mcp-server/README.md
🧬 Code graph analysis (2)
components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py (1)
components/clp-mcp-server/clp_mcp_server/server/server.py (1)
  • create_mcp_server (29-69)
components/clp-mcp-server/clp_mcp_server/server/__init__.py (1)
components/clp-mcp-server/clp_mcp_server/server/server.py (1)
  • create_mcp_server (29-69)
🪛 markdownlint-cli2 (0.18.1)
components/clp-mcp-server/README.md

45-45: Trailing spaces
Expected: 0 or 2; Actual: 1

(MD009, no-trailing-spaces)


84-84: Trailing spaces
Expected: 0 or 2; Actual: 1

(MD009, no-trailing-spaces)


91-91: Trailing spaces
Expected: 0 or 2; Actual: 1

(MD009, no-trailing-spaces)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: manylinux_2_28-x86_64-static-linked-bins
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: lint-check (ubuntu-24.04)
  • GitHub Check: rust-checks (ubuntu-24.04)
  • GitHub Check: rust-checks (ubuntu-22.04)
  • GitHub Check: build (macos-15)
🔇 Additional comments (24)
components/clp-mcp-server/pyproject.toml (9)

16-17: LGTM!

The console script entry point correctly maps to the main() function in clp_mcp_server/clp_mcp_server.py.


19-21: LGTM!

Hatchling is a modern, well-maintained build backend suitable for this use case.


23-29: LGTM!

Development dependencies are appropriate for linting, type checking, and testing.


31-76: LGTM!

The linting and type-checking configuration is comprehensive and follows project conventions, as confirmed in the past review discussion.


16-17: LGTM!

The console script entry point correctly maps to the Click-decorated main() function in clp_mcp_server.clp_mcp_server module.


19-21: LGTM!

Hatchling is a modern, standards-compliant build backend appropriate for this Python package.


23-29: LGTM!

Development dependencies appropriately cover type checking (mypy), linting/formatting (ruff), and testing (pytest with pytest-env).


31-38: LGTM!

Mypy strict mode with enhanced error output is an excellent configuration for maintaining high type safety standards in new code.


40-76: LGTM!

Ruff configuration is comprehensive and aligns with the project's established linting patterns from integration-tests/pyproject.toml. The ignore rules are well-justified and the per-file test ignores are appropriate.

components/clp-mcp-server/clp_mcp_server/server/server.py (3)

1-7: LGTM!

Imports are clean and appropriately scoped.


42-68: LGTM!

Both tool implementations are correct and follow the expected pattern for MCP tools. The hello_world tool appropriately sanitizes input with .strip(), and both return well-structured dictionaries.


42-53: LGTM!

The get_server_info() tool correctly returns server metadata including name, capabilities, and running status.

components/clp-mcp-server/clp_mcp_server/server/__init__.py (2)

1-5: LGTM!

The module correctly re-exports create_mcp_server for public API access, following standard Python packaging conventions.


1-5: LGTM!

Clean package initialization following Python conventions with proper module docstring and explicit __all__ export.

components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py (10)

1-11: LGTM!

All imports are necessary and appropriately scoped for the CLI functionality.


13-31: LGTM!

Click integration is correctly configured with sensible defaults and appropriate logging setup.


33-36: LGTM!

Empty host validation is correct and provides clear error messaging.


52-55: LGTM!

Port range validation is correct (1-65535) with clear error messaging.


71-72: LGTM!

Standard Python entry point pattern is correctly implemented.


57-68: No changes needed: transport mode verified
The streamable-http transport is a valid FastMCP mode for HTTP streaming (alias "http" also supported).


1-17: LGTM!

Imports are appropriate and Click command configuration uses sensible defaults (127.0.0.1:8000) with proper type hints.


27-36: LGTM!

Logging configuration is appropriate and empty host validation is correctly implemented.


52-55: LGTM!

Port validation correctly enforces the valid range (1-65535) with clear error messaging.


71-72: LGTM!

Standard __main__ block correctly enables direct script execution with Click handling the CLI arguments.

Comment thread components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py
Comment thread components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py
Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py Outdated
Comment thread components/clp-mcp-server/pyproject.toml
Comment thread components/clp-mcp-server/README.md Outdated
Comment thread components/clp-mcp-server/README.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (1)
components/clp-mcp-server/clp_mcp_server/server/server.py (1)

49-61: Handle the empty-string edge case.

If name contains only whitespace, name.strip() becomes an empty string, resulting in the message "Hello World, !" which is awkward. Consider falling back to a default value when the cleaned name is empty.

Apply this diff to handle the edge case:

     @mcp.tool()
     def hello_world(name: str = "clp-mcp-server user") -> dict[str, Any]:
         """
         Provides a simple hello world greeting.
 
-        :param name:
+        :param name: The name to greet (defaults to "clp-mcp-server user").
         :return: A greeting message to the given `name`.
         """
+        clean_name = name.strip() or "clp-mcp-server user"
         return {
-            "message": f"Hello World, {name.strip()}!",
+            "message": f"Hello World, {clean_name}!",
             "server": ProtocolConstant.SERVER_NAME,
             "status": "running",
         }

Alternatively, as suggested in past reviews, consider using a simpler default like "there" for a more natural greeting.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1f731b2 and f5a1764.

📒 Files selected for processing (1)
  • components/clp-mcp-server/clp_mcp_server/server/server.py (1 hunks)
🔇 Additional comments (2)
components/clp-mcp-server/clp_mcp_server/server/server.py (2)

26-34: LGTM!

The factory function signature is clean, and the implementation correctly initializes the FastMCP instance using the constants from ProtocolConstant.


36-47: LGTM!

The get_server_info tool correctly returns the server's metadata, including the name, capabilities list, and status.

Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py
Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f5a1764 and 7019295.

📒 Files selected for processing (1)
  • components/clp-mcp-server/README.md (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-08T17:20:02.560Z
Learnt from: junhaoliao
PR: y-scope/clp#1078
File: components/webui/server/src/plugins/MongoSocketIoServer/index.ts:105-108
Timestamp: 2025-07-08T17:20:02.560Z
Learning: The y-scope/clp codebase has a 100-character line length limit that takes precedence over other style preferences like template literals when they conflict.

Applied to files:

  • components/clp-mcp-server/README.md
🪛 markdownlint-cli2 (0.18.1)
components/clp-mcp-server/README.md

42-42: Bare URL used

(MD034, no-bare-urls)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: rust-checks (ubuntu-22.04)
  • GitHub Check: rust-checks (ubuntu-24.04)
  • GitHub Check: lint-check (ubuntu-24.04)

Comment thread components/clp-mcp-server/README.md Outdated
Comment on lines +49 to +50

> **Warning:** 🚧 This section is still under construction.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I gave up polishing the previous writing. I don't think it makes too much sense to document the APIs in this markdown. Let's defer it until we properly set up a doc site for available APIs.
@kirkrodrigues Are you ok with that?
@20001020ycx Also, that said, please communicate with the team to write docstrings that comply with Sphinx-based documentation. As Jack said, the quality of docstirng matters and we should set them up in a maintainable way with automation enabled. Let's take it seriously.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Works for me.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Sure, in fact, current API are served as the placeholder, we already have a version that writes the docstring in great detail for AI to understand. The team will iterate on those docstring as they are crucial for AI to be effective!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Sure, I think the goal is:

  • Make it clear so AI can use it in a super clear way.
  • Follow Sphinx rule to make sure it can be auto-generated.
  • Ensure we have a workflow that auto-generates and updates the doc whenever a new commit is made.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I will create issue tracker for the AI team to follow up on addressing the goal, I think they do make sense.

Comment thread components/clp-mcp-server/README.md

@LinZhihao-723 LinZhihao-723 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The last comment about the task file. We're almost there to merge.

Comment thread taskfile.yaml Outdated
Comment on lines +554 to +582
uv-component:
internal: true
label: "{{.COMPONENT}}"
vars:
VENV_DIR: "{{.G_BUILD_DIR}}/{{.COMPONENT}}/venv"
requires:
vars: ["COMPONENT"]
sources:
- "{{.G_BUILD_DIR}}/{{.COMPONENT}}-venv.md5"
- "{{.ROOT_DIR}}/requirements.txt"
- "{{.TASKFILE}}"
- "/etc/os-release"
- "**/*"
- exclude: "dist/**/*"
dir: "components/{{.COMPONENT}}"
generates:
- "dist/*.whl"
deps:
- task: "component-venv"
vars:
COMPONENT: "{{.COMPONENT}}"
OUTPUT_DIR: "{{.VENV_DIR}}"
cmds:
- task: "clean-python-component"
vars:
COMPONENT: "{{.COMPONENT}}"
- |-
. "{{.VENV_DIR}}/bin/activate"
UV_CACHE_DIR="{{.G_BUILD_DIR}}/uv-cache" uv build --wheel

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
uv-component:
internal: true
label: "{{.COMPONENT}}"
vars:
VENV_DIR: "{{.G_BUILD_DIR}}/{{.COMPONENT}}/venv"
requires:
vars: ["COMPONENT"]
sources:
- "{{.G_BUILD_DIR}}/{{.COMPONENT}}-venv.md5"
- "{{.ROOT_DIR}}/requirements.txt"
- "{{.TASKFILE}}"
- "/etc/os-release"
- "**/*"
- exclude: "dist/**/*"
dir: "components/{{.COMPONENT}}"
generates:
- "dist/*.whl"
deps:
- task: "component-venv"
vars:
COMPONENT: "{{.COMPONENT}}"
OUTPUT_DIR: "{{.VENV_DIR}}"
cmds:
- task: "clean-python-component"
vars:
COMPONENT: "{{.COMPONENT}}"
- |-
. "{{.VENV_DIR}}/bin/activate"
UV_CACHE_DIR="{{.G_BUILD_DIR}}/uv-cache" uv build --wheel
uv-component:
internal: true
label: "{{.COMPONENT}}"
requires:
vars: ["COMPONENT"]
sources:
- "{{.TASKFILE}}"
- "/etc/os-release"
- "**/*"
- exclude: "dist/**/*"
dir: "components/{{.COMPONENT}}"
generates:
- "dist/*.whl"
cmds:
- task: "clean-python-component"
vars:
COMPONENT: "{{.COMPONENT}}"
- "uv build --wheel -o dist"

I don't think u need to enter a virtual environment to build the project when using uv (which is good since it provides a better isolation).
I updated this task to remove any virtual environment related setup.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is a good catch, I copied the implementation of uv-component task from python-component task. Here is the code for python-component task:

  python-component:
    internal: true
    label: "{{.COMPONENT}}"
    vars:
      VENV_DIR: "{{.G_BUILD_DIR}}/{{.COMPONENT}}/venv"
    requires:
      vars: ["COMPONENT"]
    sources:
      - "{{.G_BUILD_DIR}}/{{.COMPONENT}}-venv.md5"
      - "{{.ROOT_DIR}}/requirements.txt"
      - "{{.TASKFILE}}"
      - "/etc/os-release"
      - "**/*"
      - exclude: "dist/**/*"
    dir: "components/{{.COMPONENT}}"
    generates:
      - "dist/*.whl"
    deps:
      - task: "component-venv"
        vars:
          COMPONENT: "{{.COMPONENT}}"
          OUTPUT_DIR: "{{.VENV_DIR}}"
    cmds:
      - task: "clean-python-component"
        vars:
          COMPONENT: "{{.COMPONENT}}"
      - |-
        . "{{.VENV_DIR}}/bin/activate"
        poetry build --format wheel

Following your logic, then we don't need to enter a virtual environment to build with poetry build as well. Therefore, my question is should we also update python-component as well? and should we do it at this pr?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Without UV_CACHE_DIR, you would haveerror: failed to create directory/.cache/uv: Permission denied (os error 13) during the package build in gh workflow.

The new commits adds UV_CACHE_DIR as an environmental variable.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

  • Let me check about the uv cache thing.
  • If we want to update python-component, we should do it in a separate PR. It's always a good practice to keep the PR clean.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I suspect we might have the same issue in the integration test (as it's also using uv).
According to the official doc: https://docs.astral.sh/uv/concepts/cache/#cache-directory, we should probably specify the cache using --cache-dir, which is more explicit and thus more readable.
However, I think we should defer this to another PR. I need to investigate more about this cache management and side effect, as it might be reused by all uv components. For now, how about using --no-cache to disable caching?
@coderabbitai can u create a feature request for configuring uv cache properly in our taskfile?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Create a GitHub issue for configuring uv cache properly in taskfile

gh issue create \
  --repo y-scope/clp \
  --title "Configure uv cache properly in taskfile" \
  --body "## Context

Currently, the \`uv-component\` task in \`taskfile.yaml\` uses the \`UV_CACHE_DIR\` environment variable to specify the cache directory. However, according to the [uv documentation on cache directory](https://docs.astral.sh/uv/concepts/cache/#cache-directory), using the \`--cache-dir\` flag would be more explicit and readable.

## Current Implementation

The current implementation sets \`UV_CACHE_DIR\` as an environment variable:
\`\`\`yaml
env:
  UV_CACHE_DIR: \"{{.G_BUILD_DIR}}/uv-cache\"
\`\`\`

## Proposed Enhancement

- Use \`--cache-dir\` flag instead of environment variable for better explicitness
- Investigate whether the cache should be shared across all uv components or isolated
- Check if integration tests have similar cache configuration issues
- Ensure proper cache management to avoid permission errors in CI/CD workflows

## Related

- PR: #1368
- Discussion: https://github.com/y-scope/clp/pull/1368#discussion_r2403668580
- Requested by: @LinZhihao-723" \
  --assignee LinZhihao-723

Length of output: 42


@LinZhihao-723, I've created a feature request issue for configuring uv cache properly in the taskfile: #1382

The issue includes:

  • Context about the current UV_CACHE_DIR environment variable approach
  • Reference to the uv documentation on cache directory
  • Proposed enhancements including using --cache-dir flag for better explicitness
  • Notes about investigating cache sharing across components and integration test impacts
  • Backlinks to this PR and discussion

The issue has been assigned to you as requested. Using --no-cache for now sounds like a reasonable temporary workaround to avoid the permission issues until the proper cache configuration can be investigated and implemented.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In the latest two commits I did:

  • Upgrade back to Python 3.10 since our dependencies need Python version >= 3.10.
  • Upgrade fastmcp to the latest release.
    @20001020ycx notice that u need to run uv lock every time u change the pyproject file.

@coderabbitai Can u create two issues to:

  • The first one to ask upgrading package's min Python version upgrading to Python 3.10, to align with mcp's requirement.
  • The second one is to add a task for checking/upgrading UV.lock files for all UV components.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Create first issue: Upgrade package's minimum Python version to 3.10
gh issue create \
  --repo y-scope/clp \
  --title "Upgrade package's minimum Python version to Python 3.10" \
  --body "## Description

The CLP MCP server component requires Python >= 3.10 to satisfy its dependencies (particularly fastmcp). The package's minimum Python version should be upgraded to align with this requirement.

## Context

This issue was identified during the review of PR #1368, where the MCP server component was introduced.

## References

- PR: https://github.com/y-scope/clp/pull/1368
- Comment: https://github.com/y-scope/clp/pull/1368#discussion_r2403677337
- Requested by: @LinZhihao-723" \
  --assignee LinZhihao-723

# Create second issue: Add task for checking/upgrading UV.lock files
gh issue create \
  --repo y-scope/clp \
  --title "Add task for checking/upgrading uv.lock files for all UV components" \
  --body "## Description

A task should be added to the build system to check and upgrade uv.lock files for all UV-based components in the repository. This will help ensure that lock files are kept up to date when pyproject.toml files are modified.

## Context

This issue was identified during the review of PR #1368, where the CLP MCP server component (which uses UV for dependency management) was introduced. Currently, developers need to manually remember to run \`uv lock\` after modifying pyproject.toml files.

## References

- PR: https://github.com/y-scope/clp/pull/1368
- Comment: https://github.com/y-scope/clp/pull/1368#discussion_r2403677337
- Requested by: @LinZhihao-723" \
  --assignee LinZhihao-723

echo "Issues created successfully"

Length of output: 113


@LinZhihao-723, I've created both issues as requested:

  1. Issue Upgrade package's minimum Python version to Python 3.10 #1380: Upgrade package's minimum Python version to Python 3.10 - To align the package's minimum Python version with the MCP server component's requirements.

  2. Issue Add task for checking/upgrading uv.lock files for all UV components #1381: Add task for checking/upgrading uv.lock files for all UV components - To add a build task that helps ensure uv.lock files are kept up to date when pyproject.toml files are modified.

Both issues have been assigned to you and include references back to this PR and comment.

20001020ycx and others added 2 commits October 4, 2025 12:19
Co-authored-by: Lin Zhihao <59785146+LinZhihao-723@users.noreply.github.com>

@LinZhihao-723 LinZhihao-723 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit

Comment thread components/clp-mcp-server/clp_mcp_server/server/server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/__init__.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/clp_mcp_server.py Outdated
Comment thread components/clp-mcp-server/clp_mcp_server/server/__init__.py Outdated
@LinZhihao-723 LinZhihao-723 changed the title feat(clp-mcp-server): Introducing a hello world MCP server into CLP project feat(clp-mcp-server): Add CLP model context protocol server: Oct 4, 2025
@LinZhihao-723 LinZhihao-723 changed the title feat(clp-mcp-server): Add CLP model context protocol server: feat(clp-package): Add CLP model context protocol server: Oct 4, 2025
20001020ycx and others added 5 commits October 4, 2025 15:48
Co-authored-by: Lin Zhihao <59785146+LinZhihao-723@users.noreply.github.com>
Co-authored-by: Lin Zhihao <59785146+LinZhihao-723@users.noreply.github.com>
Co-authored-by: Lin Zhihao <59785146+LinZhihao-723@users.noreply.github.com>
Co-authored-by: Lin Zhihao <59785146+LinZhihao-723@users.noreply.github.com>
@20001020ycx 20001020ycx changed the title feat(clp-package): Add CLP model context protocol server: feat(clp-package): Add CLP Model Context Protocol (MCP) Server: Oct 4, 2025

@LinZhihao-723 LinZhihao-723 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Directly modified the PR title.

@LinZhihao-723 LinZhihao-723 merged commit 212200a into y-scope:main Oct 4, 2025
32 checks passed
junhaoliao pushed a commit to junhaoliao/clp that referenced this pull request May 17, 2026
…ope#1368)

* Add clp-mcp-server Python project.
* Add tasks to build and package clp-mcp-server as a part of the CLP package.
Co-authored-by: LinZhihao-723 <zh.lin@mail.utoronto.ca>
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.

3 participants