Gleam
Embed the StackQL MCP server in a Gleam application on the Erlang/BEAM target. The library integrates with OTP supervision, downloads and verifies the signed binary, and spawns it over stdio.
The embedded binary is downloaded and sha256-verified on first run, or vendored into your app. See the common contract.
Install
gleam add stackql_mcp
Targets Erlang/BEAM only (not the JavaScript target). The server is exposed as an OTP child via child_spec() so it can sit inside your own supervision tree.
Quick start
import gleam/io
import gleam/int
import gleam/list
import envoy
import stackql_mcp
pub fn main() {
let config =
stackql_mcp.Config(
..stackql_mcp.default_config(),
auth: [stackql_mcp.auth_for("github", "null_auth")],
)
let assert Ok(server) =
stackql_mcp.start(
config: config,
home: "/home/u",
os: "linux",
arch: "x86_64",
getenv: envoy.get,
)
let assert Ok(tools) = stackql_mcp.list_tools(server)
io.println(int.to_string(list.length(tools)) <> " tools available")
stackql_mcp.stop(server)
}
The API is stackql_mcp.start(), stop(), and child_spec() for lifecycle; list_tools() and call_tool() for operations (with supervised_list_tools() and supervised_call_tool() variants for use under a supervisor); and Config, default_config(), and auth_for() for configuration.
Modes
The mode is set on Config.mode and defaults to read_only. Set it to safe, delete_safe, or full_access to escalate:
stackql_mcp.Config(..stackql_mcp.default_config(), mode: stackql_mcp.safe)
Escalation is explicit - the server will not enable mutation or lifecycle tools unless you opt in.
Vendoring / embedding
On start the library downloads the platform's StackQL bundle, verifies it against baked-in sha256 pins, and caches it in the shared family cache. Resolution precedence:
- Explicit
Config.binary. STACKQL_MCP_BINenvironment variable.- Shared cache at
~/.stackql/mcp-server-bin/<version>/<platform-key>/.
For offline or air-gapped deployments, set STACKQL_MCP_BUNDLE to point at a local bundle.
Demo app
pipewatch is the planned demo for this library. It is on the roadmap and not yet implemented.