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.