Skip to content

MCP & LSP

MCP servers

Tapioca is an MCP client for stdio servers and remote streamable HTTP servers. Their tools are namespaced server__tool and offered alongside the built-ins, and a server that announces tools/list_changed is re-read without a restart. Protocol revision is negotiated (2025-06-18 down to 2024-11-05).

A server's prompts become slash commands (/server__prompt) and its resources attach like files (@server:uri), so both arrive through the doors you already use.

MCP tools prompt like built-in ones, and their grants appear as mcp:<tool> — they can also be targeted by permission rules, e.g. deny = ["mcp:*__delete_*"].

stdio servers

toml
[[mcp]]
name = "filesystem"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
  [mcp.env]
  EXAMPLE = "value"

The server runs as a child process speaking JSON-RPC 2.0 over stdio. Provider API keys and secret_env variables are scrubbed from its environment; it receives only what you set explicitly in [mcp.env].

Remote servers over HTTP

toml
[[mcp]]
name = "example"
url = "https://mcp.example.com/mcp"
  [mcp.headers]
  Authorization = "Bearer ${EXAMPLE_MCP_TOKEN}"

Headers are sent on every request; ${VAR} expands from the environment so tokens stay out of the config file.

The mcp dashboard panel shows connected servers and their tools.

LSP diagnostics

Configure language servers under [[lsp]] and every file the agent writes is checked; errors come back attached to the tool result (4:2 error: undefined: doesNotExist), so the agent fixes them in the same turn rather than after a build.

toml
[[lsp]]
name = "gopls"
command = "gopls"
extensions = [".go"]

extensions maps file types to the server, args passes extra arguments. Servers start with the app, and like every other subprocess they get a scrubbed environment.

Released under the MIT License.