Openlane MCP Server
A secure, open-source Model Context Protocol server for the Openlane GRC platform.
This project is not an official Openlane product and is not endorsed by theopenlane, Inc.
Overview
openlane-mcp lets MCP clients such as Cursor and Claude Desktop query Openlane over stdio (default) or Streamable HTTP. It talks to Openlane Cloud or a self-hosted instance through the official Openlane Go client.
MCP Client
→ Openlane MCP Server (stdio or HTTP)
→ Official Openlane Go Client
→ Openlane API
The server is read-only by default. Write and delete tools are opt-in and independent. Openlane authorization still applies to every request.
Features
- Openlane MCP access for programs, controls, evidence, policies, risks, standards, tasks, entities (vendors), assets, platforms, contacts, findings, assessments, control implementations, groups, users, and workflows
- Enriched get tools with vendor/security fields and compact relationship summaries
- List filters on entities, risks, findings, evidence, programs, assessments, implementations, and workflows
- Opt-in create/update tools for controls, evidence, policies, risks, tasks, vendors/entities, contacts, vendor Risk Reviews, workflow definitions, workflow assignments, and native policy lifecycle
- Opt-in delete tools for the same domains plus workflow definitions (except programs and standards)
- Openlane Cloud and self-hosted Openlane (configurable base URL)
- stdio transport (default) and opt-in Streamable HTTP transport
- Native Go binary
- Docker image (published with GitHub Releases)
- MCP Registry listing on tagged releases (
io.github.GregDog/mcp-server-theopenlane)
Quick Start
Create an Openlane API token or PAT in console developer settings. Organization tokens start with tola_. Personal access tokens start with tolp_.
export OPENLANE_API_TOKEN="tola_..."
# Optional for multi-org PATs:
export OPENLANE_ORGANIZATION_ID="..."
openlane-mcp serve
Then connect an MCP client. See Client configuration.
Installation
From source
go install github.com/GregDog/mcp-server-theopenlane/cmd/openlane-mcp@latest
Requires Go 1.27 or later.
GitHub Releases
Binary archives will be published on tagged GitHub Releases (linux/darwin amd64+arm64, windows amd64) with SHA256 checksums.
Docker
docker run --rm -i \
-e OPENLANE_API_TOKEN \
-e OPENLANE_ORGANIZATION_ID \
ghcr.io/gregdog/mcp-server-theopenlane serve
Images are published with GitHub Releases to ghcr.io/gregdog/mcp-server-theopenlane.
Client configuration
Cursor (stdio, recommended)
This repository's .cursor/mcp.json uses scripts/mcp-serve.sh, which loads .env and runs the local binary:
{
"mcpServers": {
"openlane": {
"command": "bash",
"args": ["${workspaceFolder}/scripts/mcp-serve.sh"]
}
}
}
Or install globally and pass env vars directly:
{
"mcpServers": {
"openlane": {
"command": "openlane-mcp",
"args": ["serve"],
"env": {
"OPENLANE_API_TOKEN": "${env:OPENLANE_API_TOKEN}",
"OPENLANE_ORGANIZATION_ID": "${env:OPENLANE_ORGANIZATION_ID}"
}
}
}
}
Cursor (HTTP)
Start the server with bash scripts/mcp-http.sh (see HTTP transport), then use examples/cursor-http.mcp.json as a template.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"openlane": {
"command": "openlane-mcp",
"args": ["serve"],
"env": {
"OPENLANE_API_TOKEN": "tola_your_token_here"
}
}
}
}
Prefer environment substitution or a local secrets store over committing tokens. Examples in this repository use fictional values only.
Security
Read tools are always available. Write tools require OPENLANE_ALLOW_WRITE=true or --allow-write. Delete tools require OPENLANE_ALLOW_DELETE=true or --allow-delete.
A successful read still requires:
- An Openlane token with the relevant
object:readscope (or equivalent PAT permissions) - Openlane authorization for that object in the selected organization
Writes and deletes additionally require server opt-in (OPENLANE_ALLOW_WRITE / OPENLANE_ALLOW_DELETE) and matching Openlane token permissions. Workflow definition writes, workflow assignment actions, native policy lifecycle actions, and workflow deletes also require confirm: true on the tool call.
Tokens are never logged. See docs/security.md.
Tool coverage
Write tools (require OPENLANE_ALLOW_WRITE=true or --allow-write):
Delete tools (require OPENLANE_ALLOW_DELETE=true or --allow-delete):
See docs/tools.md for full details. With all modes enabled there are 77 tools (44 read, 27 write, 6 delete).
Enriched get tools return bounded relationship summaries (count + items) so agents can answer program, vendor, control, and finding questions without chaining dozens of shallow calls.
List responses are paginated (items, next_cursor, has_more, total_count). Default page size is 20; maximum is 50.
There is no dedicated control search GraphQL operation in the current Openlane Go client. openlane_controls_search uses official ControlWhereInput contains-filters.
File contents and presigned download URLs are not returned from read tools. Write tools accept optional base64-encoded files[] on evidence create/update (default max 10 MiB decoded per file).
Linking evidence to controls
openlane_evidence_create accepts optional control_ids; openlane_evidence_update supports add_control_ids / remove_control_ids. Only org-owned controls (owner_id set) may be linked — system catalog copies are rejected (core#1647). Use openlane_controls_search with linkable_only: true to list linkable controls. Program-imported controls may still show source: FRAMEWORK when owner_id is set.
openlane_control_update accepts owner_id and delegate_id as user id, email, name, or group id; user identifiers resolve to managed personal groups (Openlane controlOwnerID / delegateID). Read responses include control_owner and delegate objects with resolved user_email — do not use openlane_user_get on group ids. See docs/openlane-assignee-ids.md (user vs group vs org; what is fixed globally vs controls-only).
For large files[] base64 uploads, prefer a direct MCP client or automation script that passes the payload machine-to-machine. Agent loops that copy content_base64 between tool calls may truncate or corrupt the data.
HTTP transport
By default the server uses stdio. For local HTTP testing:
export OPENLANE_MCP_TRANSPORT=http
export OPENLANE_MCP_HTTP_ADDR=127.0.0.1:8090
openlane-mcp serve
The default bind is loopback only (127.0.0.1:8090). Do not use 0.0.0.0 or bare :port addresses unless you understand the exposure.
HTTP mode has no built-in authentication. Do not expose it directly to the public internet. Anyone who can reach the endpoint can use the server's Openlane token. For remote or shared-network deployment, place a trusted authentication reverse proxy (or equivalent private network controls) in front of the server. See docs/security.md.
Increase OPENLANE_MCP_HTTP_MAX_BODY_BYTES when uploading large evidence files over HTTP.
MCP Registry
Published to the MCP Registry as io.github.GregDog/mcp-server-theopenlane on each tagged release. The OCI package is ghcr.io/gregdog/mcp-server-theopenlane.
Development
make test
make build
./bin/openlane-mcp version
See docs/development.md.
Contributing
See CONTRIBUTING.md. To add or extend an MCP tool, see docs/adding-tools.md.
Issues labeled good first issue or help wanted are a good place to start.
Licence
Apache License 2.0. See LICENSE.
Openlane names are used only to describe compatibility. Do not copy Openlane logos or imply official endorsement.