For the complete documentation index, see llms.txt. This page is also available as Markdown.

Add an MCP server

Ship an MCP server inside a plugin to give the agent live tools or data, not just instructions.

Takeaway Bundle an MCP server in a plugin when the agent needs a live capability, a tool or a data source, rather than instructions. Declare it in a .mcp.json at the plugin root; on install, Tessl materializes it into each agent's native MCP config.

A skill gives an agent instructions. An MCP (Model Context Protocol) server gives it a tool or data at runtime: query an internal feature-flag service, look up your component library, fetch a live API schema from staging. Add one only when the plugin genuinely needs a capability the agent does not already have. If the job is "tell the agent how to do X", that is a skill, not an MCP server.

This is also available through your agent: tessl install tessl/plugin-creator

Declare the server

Point the manifest at a bundled .mcp.json file:

{
  "mcpServers": ".mcp.json"
}

The value is the literal ".mcp.json" or "./.mcp.json". Declaring it is optional: the file is discovered by convention at the plugin root either way, so the field just lets you be explicit. The file declares the servers the plugin ships, in two transports:

{
  "mcpServers": {
    "feature-flags": {
      "type": "http",
      "url": "https://flags.internal.engteam.example/mcp"
    },
    "schema-linter": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@engteam/schema-linter-mcp"]
    }
  }
}
  • http - a remote server at a URL (http or https), with optional headers.

  • stdio - a local server Tessl launches, with a command and optional args and env.

Do not hard-code secrets in .mcp.json. If a server needs credentials, reference them from the environment rather than committing them.

What happens on install

Each agent configures MCP servers in its own way, and that is exactly the work Tessl does for you. When someone installs the plugin, Tessl reads the bundled .mcp.json and writes the servers into each agent's own MCP configuration, adapting the shape to that agent. A server declared once is available in Claude Code, Cursor, and other supported agents, without the author writing per-agent config.

Validate

Lint the plugin, then confirm the servers materialize by installing into a throwaway project and checking the agent's MCP config:

For the local development loop, see Develop and test locally.

Next

Last updated