All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog ,
and this project adheres to Semantic Versioning .
- Apify Actor integration:
actor.py, Dockerfile, apify.json, .actor/input_schema.json
for running skill-to-mcp as an Apify Actor on the Apify Store
- ZIP output: Apify actor now saves a ZIP archive of the generated files to the key-value store
parse_skill_text(): New function in parser.py for parsing raw skill text without filesystem access
- Security hardening:
sanitize_skill_text() with 10 KB size limit and null-byte stripping
_mask_api_key() to protect API keys in log output
_validate_output_path() to prevent path traversal attacks
- Exponential backoff: Rate limit (429) and server error (5xx) handling with exponential backoff in
llm.py
- Dynamic versioning:
__version__ now uses importlib.metadata as single source of truth
- Smithery support:
smithery.yaml for deploying on Smithery
- New files:
skill_to_mcp/__main__.py — enable python -m skill_to_mcp
tests/conftest.py — shared pytest fixtures
tests/test_actor.py — Apify actor pipeline tests
CHANGELOG.md — version history
CONTRIBUTING.md — contributor guide
USAGE.md — advanced use cases documentation
MIGRATION.md — breaking change migration guide
examples/webpage-reader/ — real-world example
examples/calculator/ — simple newcomer example
- Test coverage: +20 new tests (99 → 119), covering:
infer_handler_impl() with mock API
_json_to_python_literal() edge cases (string "true"/"false"/"null")
parse_skill_text() with raw text input
--templates-dir custom templates
- Batch processing (2+ files) with summary table
--with-example-impl end-to-end
- Backoff exponential, mask API key, sanitize skill text, validate output path
- CI/CD: Coverage reporting with pytest-cov + Codecov badge
- README badges: Coverage, License, Python Versions, PyPI Downloads
_json_to_python_literal(): Refactored to use recursive JSON parsing, preventing
false replacements inside JSON string values
pyproject.toml: Added jsonschema>=4.0 to dev dependencies, apify>=2.0 as optional dependency
.gitignore: Added Apify runtime paths (apify_storage/, apify_dataset/, apify_kv_store/)
_json_to_python_literal() no longer corrupts JSON string values containing "true"/"false"/"null"
- CLI with
generate command (9 flags) and version command
- Core pipeline: Parser → LLM inference → Validator → Renderer
- 5 Jinja2 templates:
server.py, models.py, handler.py, pyproject.toml, README.md
- Transport: stdio (default) + HTTP SSE
- Advanced features:
--with-example-impl: LLM generates handler implementation
--templates-dir: Custom Jinja2 templates directory
- Batch processing: multiple SKILL.md files at once
- 99 unit/integration/E2E tests
- CI/CD: GitHub Action for test + PyPI publish, matrix Python 3.10/3.11/3.12
- Documentation: README.md (EN), README.it.md (IT), project_state.md, architecture.md
- API key fallback:
DEEPSEEK_API_KEY → OPENAI_API_KEY
- Retry logic: 3 automatic retry attempts for schema inference
- LLM model: Default
deepseek-v4-flash, configurable via --model
- Output validation: snake_case, JSON Schema types, required fields, array items
- Colored CLI output: Rich library with panels, tables, syntax highlighting
- MCP compatibility: Validated against Claude Desktop, Cursor IDE, Continue.dev