Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .github/workflows/scala.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@ permissions:
contents: read

jobs:
build:

cli-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run CLI tests
run: bash tests/tacit_test.sh

build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up JDK 17
Expand Down
116 changes: 103 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,57 @@ TACIT provides a standard MCP server that communicates via JSON-RPC over stdio.

Requires JDK 17+

### 1. Download Prebuilt Release JARs (Recommended)
### Installing TACIT

Use the release download script to get started quickly (no local build required).
It will download the latest server and library JARs from GitHub releases and place them in the current directory.
Choose one of the installation approaches below. The `tacit` CLI wrapper is the recommended option.

#### Option 1: Install `tacit` (Recommended)

`tacit` is a small wrapper command for managing TACIT locally. Use `tacit setup` once to install the command and fetch the latest release, `tacit update` to update the JARs, `tacit self update` to refresh the wrapper itself, and `tacit serve` to launch the MCP server.

```bash
# Download the wrapper directly (no git clone required)
curl -fsSL https://raw.githubusercontent.com/lampepfl/tacit/refs/heads/main/tacit -o tacit
chmod +x tacit

# Install it and download the latest TACIT release
./tacit setup
```

This installs the `tacit` command into `~/.local/bin`, ensures `~/.local/bin` is on `PATH`, and downloads the latest release into `~/.cache/tacit/`.

Common commands:

```bash
# Refresh the cached release if a new version exists
tacit update

# Refresh the tacit wrapper itself
tacit self update

# Start the MCP server
Comment on lines +42 to +51
tacit serve

# Remove the wrapper and cached release
tacit self uninstall
```

By default, `tacit` uses:

| Asset | Default path |
|------|--------------|
| MCP Server | `~/.cache/tacit/TACIT.jar` |
| Library | `~/.cache/tacit/TACIT-library.jar` |

#### Option 2: Download Prebuilt Release JARs Directly

If you do not want the wrapper, use the release download script instead.

```bash
# Download the script directly (no git clone required)
curl -fsSL https://raw.githubusercontent.com/lampepfl/tacit/refs/heads/main/download_release.sh -o download_release.sh
chmod +x download_release.sh

# Run it
./download_release.sh
```

Expand All @@ -43,8 +83,6 @@ chmod +x download_release.sh

# Download into a custom directory
./download_release.sh ./dist

# Use latest pre-release instead of latest stable release
./download_release.sh --pre-release ./dist
```

Expand All @@ -55,7 +93,9 @@ By default, this downloads:
| MCP Server | `./TACIT.jar` |
| Library | `./TACIT-library.jar` |

### 2. Build from Source (Alternative)
If you are developing TACIT or want to build from the current source tree, use the source build path.

#### Option 3: Build from Source

Requires JDK 17+ and sbt 1.12+.

Expand Down Expand Up @@ -83,14 +123,32 @@ This builds and copies two JARs:
| MCP Server | `./TACIT.jar` (or `./dist/TACIT.jar`) |
| Library | `./TACIT-library.jar` (or `./dist/TACIT-library.jar`) |

### 3. Configure Your Agent
Once TACIT is installed through any of the options above, configure your agent to launch the MCP server.


### Configure Your Agent

Add TACIT as an MCP server in your agent's configuration. Replace the paths below with absolute paths to your JARs (downloaded or built).
Add TACIT as an MCP server in your agent's configuration. If you installed `tacit` CLI, just use `tacit serve`. If you installed TACIT manually, use the explicit `java -jar ... --library-jar ...` form instead.

<details open>
<summary><b>Claude Code</b></summary>

Add to your project's `.mcp.json` (or `~/.claude.json` for global):
Add to your project's `.mcp.json` (or `~/.claude.json` for global).

With `tacit`:

```json
{
"mcpServers": {
"tacit": {
"command": "tacit",
"args": ["serve"]
}
}
}
```

With manual JAR paths:

```json
{
Expand All @@ -111,7 +169,24 @@ Add to your project's `.mcp.json` (or `~/.claude.json` for global):
<details>
<summary><b>OpenCode</b></summary>

Add to your `opencode.json`:
Add to your `opencode.json`.

With `tacit`:

```json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tacit": {
"type": "local",
"enabled": true,
"command": ["tacit", "serve"]
}
}
}
```

With manual JAR paths:

```json
{
Expand All @@ -135,7 +210,22 @@ Add to your `opencode.json`:
<details>
<summary><b>GitHub Copilot (VS Code)</b></summary>

Add to your `.vscode/mcp.json`:
Add to your `.vscode/mcp.json`.

With `tacit`:

```json
{
"servers": {
"tacit": {
"command": "tacit",
"args": ["serve"]
}
}
}
```

With manual JAR paths:

```json
{
Expand Down Expand Up @@ -375,7 +465,7 @@ Agent-generated code is compiled under Scala 3's *safe mode* (`import language.e

These restrictions prevent agents from "forgetting" capabilities through unsafe casts, reflection, or type system holes. Code that does not pass compilation is never executed.

The safe mode is an experimental feature and still under active development and testing. We current use a static code validator that checks for forbidden patterns to enforce the safe mode subset. We are planning to migrate to the official Scala 3 safe mode once soon.
The safe mode is an experimental feature and still under active development and testing. We currently use a static code validator that checks for forbidden patterns to enforce the safe mode subset. We are planning to migrate to the official Scala 3 safe mode once soon.

### LLM Integration

Expand Down
Loading