A unified REPL-based MCP server for Sherlog-Canvas that integrates multiple MCP services (GitHub, Filesystem, Jira) into a single persistent Python session.
This server provides a powerful environment for working with Claude and other LLMs by enabling a persistent REPL session with access to multiple MCP tools.
- Persistent Python Session: Maintain variables and state between calls
- Unified Tool Access: Access GitHub, Filesystem, and Jira tools from a single REPL
- Dynamic Tool Discovery: Automatically discover and register tools from MCP services
- Session Management: Support for multiple concurrent sessions with isolation
- Tool Proxies: Call MCP tools as native Python functions
pip install sherlog-replsherlog-replYou can run the REPL server using Docker:
docker pull ghcr.io/evalstate/sherlog-repl
docker run -it \
-e GITHUB_TOKEN=<your-token> \
-e JIRA_URL=<your-jira-url> \
-e JIRA_API_TOKEN=<your-jira-token> \
-e JIRA_EMAIL=<your-jira-email> \
-v $(pwd):/mnt/data \
ghcr.io/evalstate/sherlog-replThe container includes:
- Python 3.12
- UV package manager for fast dependency installation
- Pre-configured MCP environment
- GitHub, Filesystem, and Jira MCP connectors
The server provides the following tools:
-
execute_python: Execute Python code with access to MCP toolscode: The Python code to executereset: Optional boolean to reset the sessionregister_tools: Optional list of tool domains to register
-
list_available_tools: List all available tools from MCP connectorsdomain: Optional domain to filter tools by (e.g., "github", "filesystem", "jira")
-
register_tools: Register tools from specified domains in the current sessiondomains: List of domains to register tools from (e.g., ["github", "filesystem"])
-
list_session_variables: Show all variables in the current session -
reset_session: Reset the current session, clearing all variables
# Register GitHub tools
await register_tools(domains=["github"])
# List GitHub repositories
repos = await github_list_repositories(owner="yourusername")
for repo in repos:
print(repo['name'])# Register Filesystem tools
await register_tools(domains=["filesystem"])
# List files in a directory
files = await filesystem_list_files(path="/mnt/data")
for file in files:
print(file['name'])# First call
data = await github_list_issues(owner="yourusername", repo="yourrepo")
issue_count = len(data)
# Second call (issue_count persists)
print(f"Found {issue_count} issues")The Sherlog-Canvas Unified REPL MCP Server integrates:
- MCP Connectors: Interfaces to GitHub, Filesystem, and Jira MCP services
- Dynamic Tool Proxy Generator: Creates Python function proxies for MCP tools
- Session Manager: Maintains isolated sessions for different users/notebooks
- Concurrency Manager: Handles parallel execution of MCP operations
Contributions are welcome! Please feel free to submit a Pull Request.
Before submitting a PR, please ensure:
- Your code follows the existing style
- You've updated documentation as needed
- You've added tests for new functionality
For major changes, please open an issue first to discuss what you would like to change.