> For the complete documentation index, see [llms.txt](https://docs.tessl.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tessl.io/reference/mcp-tools.md).

# MCP tools

The Tessl MCP (Model Context Protocol) server provides tools that AI coding agents can use to search for, install, and work with plugins from the Tessl registry.

## Registry MCP server vs. workspace MCP gateway

Tessl exposes MCP through two distinct entry points — pick the one that matches what you need:

* **Registry MCP server (`tessl mcp start`)**: a local stdio server that gives the agent the tools listed on this page. They cover authentication, registry search, plugin install and update, workspace management, publishing, and skill review. Use it when the agent needs to discover and manage Tessl plugins. This is the server `tessl init` configures for auto-detected agents.
* **Workspace MCP gateway (`tessl mcp proxy <workspace>/<mcp>`)** — a stdio proxy that connects the agent to an external MCP server registered in a Tessl workspace. Use it when several teammates need to share access to an upstream MCP server (such as a third-party integration) without each person re-running its OAuth flow. See [MCP gateway](/reference/mcp-gateway.md) for how to create and connect to one.

The rest of this page documents the tools exposed by the registry MCP server.

## Server Configuration

The Tessl MCP server can be configured in your AI coding agent's MCP configuration or by running:

```sh
tessl init --agent <agent-name>
```

**Server Details:**

* **Command**: `tessl mcp start`
* **Type**: stdio
* **Name**: Tessl Registry MCP

## Available Tools

The registry MCP server exposes 17 tools:

| Tool                                                | Purpose                                    | Authentication |
| --------------------------------------------------- | ------------------------------------------ | -------------- |
| [`login`](#login)                                   | Authenticate with Tessl                    | Not required   |
| [`search`](#search)                                 | Search the registry                        | Not required   |
| [`install`](#install)                               | Install plugins into a project             | Not required   |
| [`uninstall`](#uninstall)                           | Remove plugins from a project              | Not required   |
| [`outdated`](#outdated)                             | List installed plugins with newer versions | Not required   |
| [`update`](#update)                                 | Update named plugins                       | Not required   |
| [`status`](#status)                                 | Report authentication and sync status      | Not required   |
| [`skills_available`](#skills_available)             | List installable skills in your workspaces | Required       |
| [`workspace_list`](#workspace_list)                 | List your workspaces                       | Required       |
| [`workspace_list_members`](#workspace_list_members) | List members of a workspace                | Required       |
| [`workspace_create`](#workspace_create)             | Create a workspace                         | Required       |
| [`new_plugin`](#new_plugin)                         | Scaffold a new plugin                      | Required       |
| [`tile_publish`](#tile_publish)                     | Publish a plugin directory                 | Required       |
| [`skill_publish`](#skill_publish)                   | Publish a skill directory                  | Required       |
| [`review_run`](#review_run)                         | Start a skill review                       | Required       |
| [`review_fix`](#review_fix)                         | Start a skill-improvement fix run          | Required       |
| [`review_view`](#review_view)                       | Read review or fix run results             | Required       |

Tools marked "Required" start the browser authentication flow automatically if you call them while signed out. Tools marked "Not required" work without being signed in, though `search` and `install` may return a hint suggesting `login` when missing credentials limit their results: they never trigger the sign-in flow themselves.

### login

Authenticate with Tessl to access registry features.

**Authentication**: Not required (this tool provides authentication)

**Parameters**

None

**Notes**

* Attempts to open authentication URL in your browser automatically
* Authentication happens asynchronously - credentials are saved in the background
* After completing authentication once, authenticated tools work automatically
* Triggers automatic dependency sync after successful login

***

### search

Search for plugins in the Tessl registry by name, package URL (PURL), or HTTP URL.

**Authentication**: Not required. If you are signed out, results are limited to public plugins and the response includes a hint suggesting `login`

**Parameters**

* `query` (string, required): Search query - can be a plugin name, package URL, or HTTP URL

**Notes**

* Works with partial names and package URLs (PURLs)
* Supports HTTP URLs from package registries (e.g., npm, PyPI)
* Returns plugin name, version, description, and installation command

**Example**

```json
{
  "query": "svelte"
}
```

***

### install

Install plugins into your project. Can install a specific plugin or sync all missing plugins from tessl.json.

**Authentication**: Not required. If you are signed out, only public plugins can be installed

**Parameters**

* `packageName` (string, optional): plugin name to install (e.g., "workspace/plugin" or "workspace/plugin\@version"). If not provided, installs all missing plugins from tessl.json
* `projectDir` (string, optional): Project directory. Defaults to the tessl project found by walking up from the MCP server's working directory. Required if no project is found. Only used when `packageName` is also supplied, in which case supplying it creates a new tessl project at that path. Without `packageName`, the sync writes nothing to disk if there are no plugins to add or remove
* `skills` (string array, optional): Skill names to install, for a source that exposes selectable skills (a GitHub repository with several skills, or a registry plugin skill). If omitted for such a source, the tool lists the available skills instead of installing

**Notes**

* plugins are installed to `.tessl/plugins/<workspace>/<plugin>/` in your project
* Your project's `tessl.json` is automatically updated with the plugin reference
* If a plugin is already installed and up-to-date, it will be skipped
* If no version is specified, installs the latest version
* `packageName` also accepts a GitHub source (`https://github.com/user/repo` or `github:user/repo`). For a repository with several skills, pass `skills`. The tool lists the available skills if you omit it

**Example: Install specific plugin**

```json
{
  "packageName": "tessl/svelte@5.38.0"
}
```

**Example: Sync all missing plugins**

```json
{}
```

***

### uninstall

Uninstall a plugin from your project.

**Authentication**: Not required

**Parameters**

* `packageName` (string, required): plugin name to uninstall (e.g., "workspace/plugin"). Also accepts a source such as `file:path/to/plugin`
* `skills` (string array, optional): Specific skills to remove instead of the whole plugin. If every skill is removed, the plugin is uninstalled

**Notes**

* Removes the plugin from `tessl.json` and deletes files from `.tessl/plugins/`
* Does not require authentication (local operation only)
* Only affects your local project - doesn't unpublish from the registry

**Example**

```json
{
  "packageName": "tessl/svelte"
}
```

***

### outdated

Check which installed plugins have newer versions available in the registry.

**Authentication**: Not required

**Parameters**

* `projectDir` (string, optional): Project directory to check. Defaults to the tessl project found by walking up from the MCP server's working directory

**Notes**

* Reports only. It does not change any installed plugin
* Use `update` to apply the newer versions it lists

**Example**

```json
{
  "projectDir": "./my-app"
}
```

***

### update

Update named plugins to newer versions.

**Authentication**: Not required

**Parameters**

* `tiles` (string array, required): plugin names to update (e.g., `["engteam/svelte"]`). At least one name is required
* `force` (boolean, optional): Include breaking updates. Defaults to `false`

**Notes**

* There is no "update everything" form. Name the plugins you want changed
* Without `force`, updates that cross a major version are skipped

**Example**

```json
{
  "tiles": ["engteam/svelte"],
  "force": false
}
```

***

### status

Check authentication status and plugin synchronization status for your project.

**Authentication**: Not required

**Parameters**

None

**Notes**

* Returns JSON with authentication status and plugin sync summary
* Shows plugins that are up-to-date, missing, outdated, or invalid
* Useful for checking if you need to run `tessl install` to sync plugins

**Example**

```json
{                                                                     
       "authentication": {
         "authenticated": true,
         "email": "example@tessl.io"
       },
       "manifest": {
         "summary": {
           "upToDate": 1,
           "missing": 0,
           "outdated": 0,
           "invalid": 0
         },
         "tiles": {
           "upToDate": [
             {
               "workspaceName": "tessl",
               "tileName": "pypi-fastapi",
               "manifestVersion": "0.116.0",
               "installedVersion": "0.116.0"
             }
           ],
           "missing": [],
           "outdated": [],
           "invalidPackages": []
         }
       }
     }

```

***

### skills\_available

List the installable skills across the workspaces you are a member of.

**Authentication**: Required

**Parameters**

* `workspace` (string, optional): Filter results to a single workspace by name or ID

**Notes**

* Each result includes the name, version, description, and an installation reference you can pass straight to `install`
* Use it to see what your team already publishes before you scaffold something new
* Without `workspace`, the tool queries every workspace you belong to at once. If any one of those queries fails, the whole call fails. Pass `workspace` to scope the call to a single workspace and make retries cheaper

**Example**

```json
{
  "workspace": "engteam"
}
```

***

### workspace\_list

List all workspaces that you are a member of.

**Authentication**: Required

**Parameters**

None

**Notes**

* Returns the workspace name and ID for each membership
* Use the ID with `workspace_list_members`, or as the workspace argument to the publish tools

**Example**

```json
{}
```

***

### workspace\_list\_members

List all members of a workspace.

**Authentication**: Required

**Parameters**

* `workspace` (string, required): Name or ID of the workspace to list members for

**Example**

```json
{
  "workspace": "engteam"
}
```

***

### workspace\_create

Create a new workspace.

**Authentication**: Required

**Parameters**

* `name` (string, required): Name of the workspace to create (1-100 characters)
* `orgId` (string, optional): ID of the organization to create the workspace in

**Notes**

* Without `orgId`, the workspace is created in your default organization

**Example**

```json
{
  "name": "engteam"
}
```

***

### new\_plugin

Scaffold a new plugin, generating the files you then edit to add the context you want.

**Authentication**: Required

**Parameters**

* `name` (string, required): plugin name in `workspace/plugin-name` format
* `summary` (string, required): Brief description of the plugin
* `path` (string, optional): Directory to create the plugin in. Defaults to `plugins/{plugin-name}`
* `rules` (string or object, optional): Rule name to create. The object form takes `name` and an optional `description` holding the initial rule instructions
* `skill` (object, optional): Skill to include, with `name` and `description`
* `isPrivate` (boolean, optional): Make the plugin private. Defaults to `true`

**Notes**

* You must pass at least one of `skill` or `rules`. A plugin with neither has no content to generate

**Example**

```json
{
  "name": "engteam/svelte",
  "summary": "Svelte 5 conventions for our apps",
  "skill": {
    "name": "svelte-runes",
    "description": "How to use runes for reactive state"
  }
}
```

***

### tile\_publish

Publish a plugin directory to the Tessl registry and return the registry URL.

**Authentication**: Required

**Parameters**

* `path` (string, optional): Path to the plugin directory to publish. Defaults to the current directory
* `workspace` (string, optional): Workspace name override

**Notes**

* Requires an existing manifest in the directory, and never changes its visibility. Use `skill_publish` to publish a skill that has no manifest yet
* Auto-bumps the patch version on collision, so you do not manage versions yourself
* Skips eval publishing. Use the CLI for evals

**Example**

```json
{
  "path": "plugins/svelte"
}
```

***

### skill\_publish

Publish a skill directory to the Tessl registry and return the registry URL.

**Authentication**: Required

**Parameters**

* `path` (string, optional): Path to the skill directory to publish. Defaults to the current directory
* `workspace` (string, optional): Workspace to create the manifest under when the skill has neither a `tile.json` nor a `plugin.json` yet. Ignored when either manifest already exists, since its name decides the destination workspace
* `public` (boolean, optional): Make the skill publicly visible in the registry. Defaults to private

**Notes**

* Auto-bumps the patch version on collision
* Skips eval publishing. Use the CLI for evals

**Example**

```json
{
  "path": "plugins/svelte/skills/svelte-runes",
  "workspace": "engteam"
}
```

***

### review\_run

Start an asynchronous review of a skill.

**Authentication**: Required

**Parameters**

* `path` (string, optional): Path to a skill file or skill directory. Defaults to the current directory
* `workspace` (string, optional): Workspace name or ID. Resolved automatically when not provided
* `kind` (string, optional): `quality` for a skill quality review, or `security` for a security findings review. Defaults to `quality`

**Notes**

* Returns a run ID immediately. Poll `review_view` for the result
* Quality reviews (`kind: "quality"`) consume credits; security reviews (`kind: "security"`) are free. Either way, call it once per user action. `review_view` reports the actual charge once the run finishes

**Example**

```json
{
  "path": "plugins/svelte/skills/svelte-runes",
  "kind": "quality"
}
```

***

### review\_fix

Start an asynchronous skill-improvement fix run.

**Authentication**: Required

**Parameters**

* `path` (string, optional): Path to a skill file or skill directory. Defaults to the current directory
* `workspace` (string, optional): Workspace name or ID. Resolved automatically when not provided
* `threshold` (number, optional): Stop improving once the review score reaches this percentage (0-100). Defaults to the server default
* `maxIterations` (number, optional): Maximum number of improve-then-review iterations (1-10). Defaults to the server default

**Notes**

* Returns a fix run ID immediately, and writes nothing locally
* When the run completes, call `review_view` with `apply: true` and the skill path to write the improved skill back. This is the equivalent of `tessl review fix --yes`
* A fix run consumes credits. Call it once per user action

**Example**

```json
{
  "path": "plugins/svelte/skills/svelte-runes",
  "threshold": 90
}
```

***

### review\_view

Fetch the current status and results for a review run or a fix run.

**Authentication**: Required

**Parameters**

* `runId` (string, required): The run ID returned by `review_run`, or the fix run ID returned by `review_fix`
* `apply` (boolean, optional): Fix runs only. When `true`, writes the completed fix run's improved skill back to the local files. Defaults to `false`, which reports the score and summary and changes nothing on disk
* `path` (string, optional): Fix runs only, paired with `apply`. Path to the local skill file or directory to write the improvement into. Defaults to the current directory. Use the same skill the fix run was started against

**Notes**

* Poll until `status` is `completed`, `failed`, or `cancelled`. These are the only terminal states
* Review and fix runs typically take from tens of seconds to a few minutes. Poll every 5-10 seconds rather than continuously

**Example**

```json
{
  "runId": "run_01j9x2c8",
  "apply": true,
  "path": "plugins/svelte/skills/svelte-runes"
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tessl.io/reference/mcp-tools.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
