Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
bradhe
left a comment
There was a problem hiding this comment.
I think it looks good! Let's ship it. Also a reminder that we need to document the dbt stuff in docs.tower.dev.
jo-sm
left a comment
There was a problem hiding this comment.
I only had a read through the readme.md file, and while I think moving some of the things like how to develop into their own doc are fine, I would highly suggest to remove any Tower marketing sounding stuff from the readme (e.g. "what Tower gives you"). When I look at readmes for tools, while I accept a little bit of non-dev fluff from a tool that's created/maintained by a SaaS company, it's a huge turn off to be sold the product when I just want to know how to use your tool, since I've likely already looked at your website and have a general understanding of the product/tool and just want to use it.
|
|
||
| ##### Claude Code | ||
| ## How It Works | ||
|
|
||
| Add the Tower MCP server to Claude Code using SSE transport: | ||
|
|
||
| ```bash | ||
| claude mcp add tower http://127.0.0.1:34567/sse --transport sse | ||
| ``` | ||
|
|
||
| Or with the JSON configuration directly: | ||
|
|
||
| ```json | ||
| { | ||
| "mcpServers": { | ||
| "tower": { | ||
| "url": "http://127.0.0.1:34567/sse", | ||
| "transport": "sse" | ||
| } | ||
| } | ||
| } | ||
| ┌────────────┐ ┌─────┐ ┌──────────────────────┐ ┌────────┐ ┌───────────┐ | ||
| │ Developer │ ──► │ CLI │ ──► │ Tower Control Plane │ ──► │ Runner │ ──► │ Lakehouse │ | ||
| └────────────┘ └─────┘ └──────────────────────┘ └────────┘ └───────────┘ | ||
| ``` | ||
|
|
||
| For custom ports, adjust the URL accordingly (e.g., `http://127.0.0.1:8080/sse`). | ||
|
|
||
| ##### Cursor | ||
|
|
||
| [](https://cursor.com/install-mcp?name=tower&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjM0NTY3L3NzZSJ9) | ||
| With an AI coding assistant (e.g. Claude, Cursor), the flow goes through the Tower MCP server: | ||
|
|
||
| If that doesn't work, try opening the following link in your browser or in your terminal with `open` on macOS, or `xdg-open` on Linux: | ||
| ``` | ||
| cursor://anysphere.cursor-deeplink/mcp/install?name=tower&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjM0NTY3L3NzZSJ9 | ||
| ┌────────────┐ ┌────────┐ ┌──────────────────┐ ┌──────────────────────┐ | ||
| │ Developer │ ──► │ Claude │ ──► │ MCP (Tower CLI) │ ──► │ Tower Control Plane │ ──► ... | ||
| └────────────┘ └────────┘ └──────────────────┘ └──────────────────────┘ | ||
| ``` | ||
|
|
||
| Or manually, add this to your Cursor MCP settings (`mcp.json`): | ||
| - **Apps** - Python + `requirements.txt` + **Towerfile** (entrypoint, source). Any Python; no SDK required. | ||
| - **Deploy** - `tower deploy` builds, uploads, stores encrypted. Tower cannot read your code. | ||
| - **Secrets** - `tower secrets`; env vars in runner only (AES-256). | ||
| - **Runtime** - Runner pulls app/config, decrypts, runs in sandboxed Python. Same model locally and in cloud. | ||
|
|
||
| ```json | ||
| { | ||
| "mcpServers": { | ||
| "tower": { | ||
| "url": "http://127.0.0.1:34567/sse" | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
| [How Tower works](https://docs.tower.dev/docs/architecture/how-tower-works). | ||
|
|
||
| ##### VS Code | ||
| --- |
There was a problem hiding this comment.
Don't really understand what this section is trying to communicate. I'd recommend removing it completely.
| ##### Claude Code | |
| ## How It Works | |
| Add the Tower MCP server to Claude Code using SSE transport: | |
| ```bash | |
| claude mcp add tower http://127.0.0.1:34567/sse --transport sse | |
| ``` | |
| Or with the JSON configuration directly: | |
| ```json | |
| { | |
| "mcpServers": { | |
| "tower": { | |
| "url": "http://127.0.0.1:34567/sse", | |
| "transport": "sse" | |
| } | |
| } | |
| } | |
| ┌────────────┐ ┌─────┐ ┌──────────────────────┐ ┌────────┐ ┌───────────┐ | |
| │ Developer │ ──► │ CLI │ ──► │ Tower Control Plane │ ──► │ Runner │ ──► │ Lakehouse │ | |
| └────────────┘ └─────┘ └──────────────────────┘ └────────┘ └───────────┘ | |
| ``` | |
| For custom ports, adjust the URL accordingly (e.g., `http://127.0.0.1:8080/sse`). | |
| ##### Cursor | |
| [](https://cursor.com/install-mcp?name=tower&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjM0NTY3L3NzZSJ9) | |
| With an AI coding assistant (e.g. Claude, Cursor), the flow goes through the Tower MCP server: | |
| If that doesn't work, try opening the following link in your browser or in your terminal with `open` on macOS, or `xdg-open` on Linux: | |
| ``` | |
| cursor://anysphere.cursor-deeplink/mcp/install?name=tower&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjM0NTY3L3NzZSJ9 | |
| ┌────────────┐ ┌────────┐ ┌──────────────────┐ ┌──────────────────────┐ | |
| │ Developer │ ──► │ Claude │ ──► │ MCP (Tower CLI) │ ──► │ Tower Control Plane │ ──► ... | |
| └────────────┘ └────────┘ └──────────────────┘ └──────────────────────┘ | |
| ``` | |
| Or manually, add this to your Cursor MCP settings (`mcp.json`): | |
| - **Apps** - Python + `requirements.txt` + **Towerfile** (entrypoint, source). Any Python; no SDK required. | |
| - **Deploy** - `tower deploy` builds, uploads, stores encrypted. Tower cannot read your code. | |
| - **Secrets** - `tower secrets`; env vars in runner only (AES-256). | |
| - **Runtime** - Runner pulls app/config, decrypts, runs in sandboxed Python. Same model locally and in cloud. | |
| ```json | |
| { | |
| "mcpServers": { | |
| "tower": { | |
| "url": "http://127.0.0.1:34567/sse" | |
| } | |
| } | |
| } | |
| ``` | |
| [How Tower works](https://docs.tower.dev/docs/architecture/how-tower-works). | |
| ##### VS Code | |
| --- |
| - [x] Code-first orchestration | ||
| - [x] Observability | ||
| - [x] Self-hosted runners | ||
| - [x] Interactive apps | ||
| - [ ] Organizations | ||
| - [ ] RBAC | ||
| - [ ] Iceberg ingestion |
There was a problem hiding this comment.
Not sure why this is relevant to someone looking at the readme of the CLI?
| If you need to get the latest OpenAPI SDK, you can run | ||
| `./scripts/generate-python-api-client.sh`. | ||
| - **License:** [MIT](LICENSE). | ||
| - Actively maintained; issues responded to promptly. |
There was a problem hiding this comment.
| - Actively maintained; issues responded to promptly. |
This is a show, don't tell kinda thing ;)
| ## Testing | ||
| We use pytest to run tests. Copy `pytest.ini.template` to `pytest.ini` and | ||
| replace the values of environment variables | ||
| [Full install options and optional features →](INSTALL-AND-REFERENCE.md) |
There was a problem hiding this comment.
| [Full install options and optional features →](INSTALL-AND-REFERENCE.md) | |
| [Full installation options and optional features →](INSTALL-AND-REFERENCE.md) |
Co-authored-by: Ben Lovell <ben@tower.dev>
Split old README into Overview, Advanced Installation Options, and Contributor Setup.
The Nix and Devenv setup is a little advanced to be on the main README, so, moved to a separate file and linked.
Added Features, Use Cases, Demos, Quickstarts to README