Thank you for your interest in contributing! This document provides guidelines for participating in the project.
Found a bug? Want to suggest a feature? Open an issue on GitHub:
- Check if the issue already exists
- Provide a clear description of the problem
- Include steps to reproduce (for bugs)
- Include your environment (OS, Python version, Node version)
Skills are reusable patterns that solve common problems. To contribute a skill:
- Develop and test your solution
- Document the pattern with clear examples
- Register the skill using
/create-skill - Submit a pull request with the new skill
"""
Skill Name
Brief description of what this skill does.
"""
from typing import Any, Dict, List
def my_skill(param1: str, param2: int = 10) -> Dict[str, Any]:
"""
Description of the skill.
Args:
param1: Description of param1
param2: Description of param2 (default: 10)
Returns:
Dictionary with results
Example:
>>> result = my_skill("input", 5)
>>> print(result)
"""
# Implementation here
return {"result": "value"}/**
* Skill Name
*
* Brief description of what this skill does.
*/
export interface SkillResult {
result: string;
[key: string]: any;
}
export async function mySkill(
param1: string,
param2: number = 10
): Promise<SkillResult> {
/**
* Description of the skill.
*
* @param param1 - Description of param1
* @param param2 - Description of param2 (default: 10)
* @returns Skill result
*
* @example
* const result = await mySkill("input", 5);
* console.log(result);
*/
// Implementation here
return { result: "value" };
}New MCP server integrations are welcome:
- Add server to mcp_config.json
- Generate wrappers using
/generate-wrappers - Create example tasks showing how to use the server
- Document usage in the README
- Submit a pull request
Documentation improvements help everyone:
- Fix typos and clarity issues
- Add missing examples
- Improve error messages
- Create tutorials
- Python 3.10+
- Node.js 18+
- uv (Python package manager)
- bun (JavaScript runtime)
# Clone the repository
git clone https://github.com/anthropics/mcp-code-execution.git
cd mcp-code-execution
# Setup workspace
/setup-mcp
# Install dependencies
uv sync
bun install
# Validate configuration
/validate-config
# Run tests
pytest tests/ -v
bun test- Use type hints for all function parameters and returns
- Follow PEP 8 style guide
- Use 4-space indentation
- Maximum line length: 100 characters
- Use docstrings (Google style)
def process_data(items: List[str], max_size: int = 100) -> Dict[str, int]:
"""
Process a list of items and return statistics.
Args:
items: List of items to process
max_size: Maximum size to process (default: 100)
Returns:
Dictionary with processing statistics
Raises:
ValueError: If items is empty
"""
if not items:
raise ValueError("items cannot be empty")
return {"count": len(items), "max": max_size}- Use strict TypeScript mode
- Define interfaces for complex objects
- Use 2-space indentation
- Maximum line length: 100 characters
- Use JSDoc comments
/**
* Process a list of items and return statistics.
*
* @param items - List of items to process
* @param maxSize - Maximum size to process (default: 100)
* @returns Processing statistics
* @throws {Error} If items is empty
*/
export function processData(
items: string[],
maxSize: number = 100
): Record<string, number> {
if (items.length === 0) {
throw new Error('items cannot be empty');
}
return { count: items.length, max: maxSize };
}# Run all tests
pytest tests/ -v
# Run specific test
pytest tests/test_file.py::test_function -v
# Run with coverage
pytest tests/ --cov=client --cov=skills# Run tests
bun test
# Run specific test
bun test taskExecutor.test.tsPython:
import pytest
from client.python import call_mcp_tool
@pytest.mark.asyncio
async def test_call_tool():
"""Test basic MCP tool call."""
result = await call_mcp_tool(
'filesystem',
'read_file',
{'path': 'test.txt'}
)
assert result is not NoneTypeScript:
import { callMCPTool } from '../client/typescript';
test('should call MCP tool', async () => {
const result = await callMCPTool('filesystem', 'read_file', {
path: 'test.txt'
});
expect(result).toBeDefined();
});-
Create a branch for your changes
git checkout -b feature/your-feature-name
-
Make your changes and commit them
git commit -m "Add your feature description" -
Write tests for new functionality
pytest tests/ -v bun test -
Update documentation if needed
- Add to relevant README files
- Update CHANGELOG.md with your changes
- Include code examples
-
Run linting and formatting
# Python ruff check src/ ruff format src/ # TypeScript npx prettier --write plugin/
-
Push your branch
git push origin feature/your-feature-name
-
Create a Pull Request on GitHub with:
- Clear description of changes
- Reference to related issues
- Screenshots/examples if relevant
Use clear, descriptive commit messages:
feat: add skill for extracting emails from text
fix: resolve race condition in metrics collection
docs: improve installation instructions
refactor: simplify token counting logic
test: add tests for retry logic
chore: update dependencies
- Be respectful and inclusive
- Provide constructive feedback
- Help others learn and grow
- Give credit to contributors
- Follow the Code of Conduct
For security vulnerabilities, do not open a public issue. Instead:
- Email security@anthropic.com with details
- Include steps to reproduce
- Allow time for a fix before disclosure
By contributing, you agree that your contributions will be licensed under the MIT License.
- Check existing issues and discussions
- Read the documentation in CLAUDE.md
- Open an issue to ask questions
Contributors will be:
- Added to the CONTRIBUTORS file
- Mentioned in release notes
- Recognized in the marketplace plugin listing
Thank you for contributing to making MCP code execution better! 🎉