Provides a lightweight Model Context Protocol (MCP) server for exposing 'R' functions as tools over standard input and output ('stdio'). Designed for local, client-launched integrations, with protocol-aware tool definitions and results, JSON Schema helpers, and optional interoperability with 'ellmer'.
mcplite lets you expose R functions as Model Context Protocol
(MCP) tools. It runs a small server over standard input and output, which is the
transport most desktop MCP clients use to launch local tool servers.
Use it when you want an MCP client to call R code such as data lookups, calculations, report helpers, or local automation.
Install the released version from CRAN:
install.packages("mcplite")
Install the development version from GitHub:
pak::pak("tosidata/mcplite")
Save a complete server definition as server.R:
library(mcplite)
add_numbers <- tool(
function(x, y) {
x + y
},
name = "add_numbers",
description = "Add two numbers and return the result.",
arguments = list(
x = type_number("First number."),
y = type_number("Second number.")
)
)
mcp_server(list(add_numbers))
Configure your MCP client to launch the script. The command must resolve to
the Rscript executable. If Rscript is not discoverable, run
Sys.which("Rscript") in R and use the returned path as the client's command.
Keep the server script path absolute too. A Claude Desktop-style configuration
looks like this:
{
"mcpServers": {
"r-tools": {
"command": "Rscript",
"args": [
"--vanilla",
"/absolute/path/to/server.R"
]
}
}
}
Restart the client and check that it discovers add_numbers. As a first call,
ask it to run add_numbers with x = 2 and y = 3; the result should be 5.
mcp_server() starts serving immediately and runs until standard input closes,
so launch it through the MCP client rather than from an interactive R console.
For most tools, return an ordinary R value. Character values become text, while other JSON-serializable values are returned as JSON in a text content block. Bare lists are ordinary results, not MCP result objects.
Use tool_result() when a tool needs rich content blocks or structured results.
See ?tool_result for the result formats and compatibility details.
mcplite supports local, client-launched stdio tool servers. It does not
implement HTTP transport or the MCP prompts, resources, and sampling
capabilities. Tools can still return supported content blocks; content blocks
are tool results, not implementations of those MCP capabilities.
Compatible ellmer::tool() definitions can be passed directly to
mcp_server(). ellmer is optional and is not needed for tools defined with
mcplite.
See ?tool for tool definitions, help("tool-types", package = "mcplite") for
schema helpers, ?tool_result and
help("content-blocks", package = "mcplite") for rich results, and
?mcp_server for server behavior, scope, lifecycle, interoperability, and
tracing details.