|
1 | | -# easyMCP |
| 1 | +# CAIRN |
2 | 2 |
|
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. |
4 | 4 |
|
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). |
6 | 6 |
|
7 | | -## What easyMCP does |
| 7 | +## What it does |
8 | 8 |
|
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. |
10 | 10 |
|
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:** |
15 | 12 |
|
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 | |
29 | 18 |
|
30 | 19 | ## Install |
31 | 20 |
|
32 | 21 | **As a Claude Code plugin (recommended):** |
33 | 22 |
|
34 | 23 | ``` |
35 | | -Install this plugin: https://github.com/Percona-Lab/easymcp |
| 24 | +Install this plugin: https://github.com/Percona-Lab/claude-plugins |
36 | 25 | ``` |
37 | 26 |
|
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" |
41 | 28 |
|
42 | | -**Or run the CLI directly:** |
| 29 | +**Or download and run directly:** |
43 | 30 |
|
44 | 31 | ```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 |
48 | 35 | ``` |
49 | 36 |
|
50 | | -Requires [uv](https://docs.astral.sh/uv/). Install with: `curl -LsSf https://astral.sh/uv/install.sh | sh` |
51 | | - |
52 | 37 | ## What gets generated |
53 | 38 |
|
| 39 | +### API integration (Python example) |
| 40 | + |
54 | 41 | ``` |
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 |
63 | 44 | 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 |
77 | 48 | ``` |
78 | 49 |
|
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) |
82 | 51 |
|
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 | +``` |
84 | 65 |
|
85 | | -## Project structure |
| 66 | +### Starter |
86 | 67 |
|
87 | 68 | ``` |
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) |
100 | 73 | ``` |
101 | 74 |
|
| 75 | +## Language support |
| 76 | + |
| 77 | +Both Python (FastMCP) and Node.js (@modelcontextprotocol/sdk) templates for all project types. |
| 78 | + |
102 | 79 | ## License |
103 | 80 |
|
104 | 81 | MIT |
0 commit comments