Skip to content

Commit 2035603

Browse files
Rename to CAIRN, add api-integration and starter project types
CAIRN — Create Any Integration, Run Naturally. Renamed from easyMCP to reflect that this tool scaffolds ANY kind of MCP server, not just doc-search servers. Three project types: - api-integration: connector class + MCP server wrapping external APIs (like IBEX's Slack/Jira/Notion pattern). Prompts for service name, base URL, auth method, and tool definitions. - doc-search: the original percona-dk pattern (unchanged, just moved into templates/doc-search/) - starter: minimal MCP server with one example tool Other changes: - Restructured templates/ into templates/{type}/{language}/ - scaffold.py resolves: common/ + {type}/common/ + {type}/{language}/ - prompts.py asks project type first, then branches - Package renamed: easymcp -> cairn-mcp, CLI: cairn init - Python + Node.js templates for all three types Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c513ebf commit 2035603

41 files changed

Lines changed: 985 additions & 165 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,81 @@
1-
# easyMCP
1+
# CAIRN
22

3-
Scaffold production-ready MCP servers for **any domain** — with polished cross-platform installers that guide your users through setup.
3+
**Create Any Integration, Run Naturally.** Scaffold production-ready MCP servers for any domain.
44

5-
You define your data sources. easyMCP generates a complete, standalone project that includes everything your users need to install and run it: interactive prompts, progress bars, time estimates, and auto-configuration of AI clients. One command to scaffold. One command for your users to install.
5+
Named for the stacked stone trail markers that guide climbers on mountain paths. Part of the [Alpine Toolkit](https://github.com/Percona-Lab).
66

7-
## What easyMCP does
7+
## What it does
88

9-
easyMCP is a project generator. You answer a few questions — project name, language, data sources — and it outputs a complete MCP server project with:
9+
CAIRN generates complete, standalone MCP server projects. You pick a project type, answer a few prompts, and get a working project ready to push to GitHub.
1010

11-
**For you (the builder):**
12-
- A working MCP server, REST API, and ingestion pipeline — ready to customize
13-
- Python (FastMCP + ChromaDB + FastAPI) or Node.js (@modelcontextprotocol/sdk + ChromaDB + Express)
14-
- All the boilerplate: `pyproject.toml` / `package.json`, `.env`, `.gitignore`, `LICENSE`, `README`
11+
**Three project types:**
1512

16-
**For your users (the installers):**
17-
- `curl | bash` / `irm | iex` one-liner install scripts
18-
- A cross-platform interactive installer (`installer.py`) with:
19-
- ANSI colors with Windows support
20-
- Interactive stack selection — "Install all / Skip / Choose individually"
21-
- Live time and disk estimates per repo (fetched from GitHub API in parallel)
22-
- Review loop before committing
23-
- Progress bars during embedding
24-
- Auto-detection and configuration of Claude Desktop and Claude Code
25-
- Incremental re-ingestion (only re-embeds files that changed)
26-
- Smart rerun detection (existing install becomes update flow)
27-
28-
The generated project is **standalone** — no runtime dependency on easyMCP. Push it to GitHub and your users install with a one-liner.
13+
| Type | What it builds | Example |
14+
|------|---------------|---------|
15+
| **API integration** | Wrap an external REST API as MCP tools | Slack, Jira, Stripe connectors |
16+
| **Doc search** | Semantic search over GitHub repos with Markdown | percona-dk, internal docs servers |
17+
| **Starter** | Minimal MCP server with one example tool | Quick prototypes, custom tools |
2918

3019
## Install
3120

3221
**As a Claude Code plugin (recommended):**
3322

3423
```
35-
Install this plugin: https://github.com/Percona-Lab/easymcp
24+
Install this plugin: https://github.com/Percona-Lab/claude-plugins
3625
```
3726

38-
Then ask Claude: "Create a new MCP server for my docs"
39-
40-
**Or download the plugin zip** from the [latest release](https://github.com/Percona-Lab/easymcp/releases/latest) and extract to `~/.claude/plugins/easymcp/`
27+
Then ask Claude: "Create a new MCP server" or "Scaffold an API integration for Slack"
4128

42-
**Or run the CLI directly:**
29+
**Or download and run directly:**
4330

4431
```bash
45-
curl -fsSL -o /tmp/easymcp.whl \
46-
https://github.com/Percona-Lab/easymcp/releases/latest/download/easymcp-0.1.0-py3-none-any.whl
47-
uvx --from /tmp/easymcp.whl easymcp init
32+
curl -fsSL -o /tmp/cairn.whl \
33+
https://github.com/Percona-Lab/CAIRN/releases/latest/download/cairn_mcp-0.2.0-py3-none-any.whl
34+
uvx --from /tmp/cairn.whl cairn init
4835
```
4936

50-
Requires [uv](https://docs.astral.sh/uv/). Install with: `curl -LsSf https://astral.sh/uv/install.sh | sh`
51-
5237
## What gets generated
5338

39+
### API integration (Python example)
40+
5441
```
55-
acme-docs/
56-
install-acme-docs # Bash bootstrap (curl|bash one-liner)
57-
install-acme-docs.ps1 # PowerShell bootstrap (irm|iex one-liner)
58-
installer.py # Cross-platform interactive installer (stdlib only)
59-
README.md # With install instructions, MCP config examples
60-
LICENSE, .gitignore, .env.example
61-
62-
# Python template:
42+
slack-mcp/
43+
.gitignore, LICENSE, .env.example, README.md
6344
pyproject.toml
64-
src/acme_docs/
65-
mcp_server.py # FastMCP server with auto-refresh
66-
ingest.py # Incremental ingestion (file hashing, ChromaDB)
67-
server.py # FastAPI REST API (/search, /health, /stats)
68-
source_registry.py # Keyword-based source suggestions
69-
70-
# Node.js template:
71-
package.json
72-
src/
73-
mcp-server.js # @modelcontextprotocol/sdk server
74-
ingest.js # Ingestion pipeline
75-
server.js # Express REST API
76-
source-registry.js # Source suggestions
45+
src/slack_mcp/
46+
connector.py # API client class with auth + methods
47+
mcp_server.py # FastMCP server wrapping connector as tools
7748
```
7849

79-
## How it works
80-
81-
easyMCP is a Python CLI distributed as a wheel via [GitHub releases](https://github.com/Percona-Lab/easymcp/releases). It's also available as a Claude Code plugin through the [Percona claude-plugins marketplace](https://github.com/Percona-Lab/claude-plugins).
50+
### Doc search (Python example)
8251

83-
Templates use Jinja2 with alternate delimiters (`<% %>` for blocks, `<< >>` for variables) to avoid conflicts with Python `{}` and JavaScript template literals.
52+
```
53+
acme-dk/
54+
install-acme-dk # curl|bash one-liner
55+
install-acme-dk.ps1 # irm|iex one-liner
56+
installer.py # Cross-platform interactive installer
57+
.gitignore, LICENSE, .env.example, README.md
58+
pyproject.toml
59+
src/acme_dk/
60+
mcp_server.py # FastMCP with auto-refresh
61+
ingest.py # Incremental ingestion pipeline
62+
server.py # FastAPI REST API
63+
source_registry.py # Source suggestions
64+
```
8465

85-
## Project structure
66+
### Starter
8667

8768
```
88-
easymcp/
89-
pyproject.toml # CLI package
90-
src/easymcp/
91-
cli.py # Click-based CLI
92-
scaffold.py # Template rendering + file output
93-
prompts.py # Interactive prompt helpers
94-
template_engine.py # Jinja2 with alternate delimiters
95-
validators.py # Input validation
96-
templates/
97-
common/ # Shared: installer, README, LICENSE, etc.
98-
python/ # Python-specific templates
99-
nodejs/ # Node.js-specific templates
69+
my-tool/
70+
.gitignore, LICENSE, README.md
71+
pyproject.toml (or package.json)
72+
src/my_tool/mcp_server.py (or src/mcp-server.js)
10073
```
10174

75+
## Language support
76+
77+
Both Python (FastMCP) and Node.js (@modelcontextprotocol/sdk) templates for all project types.
78+
10279
## License
10380

10481
MIT

pyproject.toml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ requires = ["hatchling"]
33
build-backend = "hatchling.build"
44

55
[project]
6-
name = "easymcp"
7-
version = "0.1.0"
8-
description = "Scaffold production-ready MCP servers with polished cross-platform installers"
6+
name = "cairn-mcp"
7+
version = "0.2.0"
8+
description = "CAIRN — Create Any Integration, Run Naturally. Scaffold production-ready MCP servers."
99
readme = "README.md"
1010
license = "MIT"
1111
requires-python = ">=3.11"
1212
authors = [
1313
{ name = "Percona", email = "info@percona.com" },
1414
]
15-
keywords = ["mcp", "model-context-protocol", "scaffolding", "cli", "ai-tools"]
15+
keywords = ["mcp", "model-context-protocol", "scaffolding", "cli", "ai-tools", "cairn"]
1616
classifiers = [
1717
"Development Status :: 3 - Alpha",
1818
"Environment :: Console",
@@ -28,18 +28,18 @@ dependencies = [
2828
]
2929

3030
[project.scripts]
31-
easymcp = "easymcp.cli:main"
31+
cairn = "cairn.cli:main"
3232

3333
[project.urls]
34-
Homepage = "https://github.com/Percona-Lab/easymcp"
35-
Repository = "https://github.com/Percona-Lab/easymcp"
36-
Issues = "https://github.com/Percona-Lab/easymcp/issues"
34+
Homepage = "https://github.com/Percona-Lab/CAIRN"
35+
Repository = "https://github.com/Percona-Lab/CAIRN"
36+
Issues = "https://github.com/Percona-Lab/CAIRN/issues"
3737

3838
[tool.hatch.build.targets.wheel]
39-
packages = ["src/easymcp"]
39+
packages = ["src/cairn"]
4040

4141
[tool.hatch.build.targets.wheel.force-include]
42-
"templates" = "easymcp/templates"
42+
"templates" = "cairn/templates"
4343

4444
[tool.hatch.build.targets.sdist]
45-
include = ["src/easymcp", "templates", "README.md", "LICENSE"]
45+
include = ["src/cairn", "templates", "README.md", "LICENSE"]

src/cairn/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"""CAIRN — Create Any Integration, Run Naturally. Scaffold production-ready MCP servers."""
2+
3+
__version__ = "0.2.0"
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
"""easyMCP CLI - scaffold production-ready MCP server projects."""
1+
"""CAIRN CLI scaffold production-ready MCP server projects."""
22

33
import sys
44
from pathlib import Path
55

66
import click
77

8-
from easymcp import __version__
9-
from easymcp.prompts import run_prompts, c, info, error, BOLD
10-
from easymcp.scaffold import scaffold
8+
from cairn import __version__
9+
from cairn.prompts import run_prompts, c, info, error, BOLD
10+
from cairn.scaffold import scaffold
1111

1212

1313
@click.group()
14-
@click.version_option(__version__, prog_name="easymcp")
14+
@click.version_option(__version__, prog_name="cairn")
1515
def main():
16-
"""easyMCP - Scaffold production-ready MCP servers with polished installers."""
16+
"""CAIRN — Create Any Integration, Run Naturally. Scaffold production-ready MCP servers."""
1717
pass
1818

1919

0 commit comments

Comments
 (0)