Openlane MCP Server

MCP server for Openlane GRC: controls, evidence, policies, risks, workflows, and approvals.

OtherGov0.8.0

Openlane MCP Server

CI Go License CodeQL

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:

  1. An Openlane token with the relevant object:read scope (or equivalent PAT permissions)
  2. 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

ToolDescription
openlane_controls_listList controls
openlane_controls_searchSearch controls by ref code, title, or description
openlane_control_getGet a control by ID (with relationship summaries)
openlane_programs_listList programs (optional name filter)
openlane_program_getGet a program by ID (with relationship summaries)
openlane_evidence_listList evidence metadata (optional program/control filters)
openlane_evidence_getGet evidence metadata by ID
openlane_policies_listList internal policies (optional status filter)
openlane_policies_awaiting_approvalList policies awaiting approval (native NEEDS_APPROVAL + your pending workflow assignments)
openlane_policy_getGet a policy by ID
openlane_risks_listList risks (optional program/entity/control/status filters)
openlane_risk_getGet a risk by ID (with relationship summaries)
openlane_findings_listList findings (optional program/assessment/open/status/severity filters)
openlane_finding_getGet a finding by ID
openlane_assessments_listList assessments
openlane_assessment_getGet an assessment by ID
openlane_control_implementations_listList control implementations
openlane_control_implementation_getGet a control implementation by ID
openlane_mapped_controls_listList cross-framework control mappings (MappedControl)
openlane_mapped_control_getGet a control mapping by ID
openlane_standards_listList standards / frameworks
openlane_standard_getGet a standard by ID
openlane_tasks_listList tasks
openlane_task_getGet a task by ID
openlane_entities_listList entities (vendors; optional risk/tier/review/security filters)
openlane_entity_getGet an entity by ID (vendor/security/commercial fields)
openlane_assets_listList assets
openlane_asset_getGet an asset by ID
openlane_platforms_listList platforms (system boundaries; optional name, display id, status, environment, region, criticality filters)
openlane_platform_getGet a platform by ID (narrative, owner roles, scope links, diagram metadata)
openlane_contacts_listList contacts
openlane_contact_getGet a contact by ID
openlane_reviews_listList vendor Risk Reviews (optional entity filter)
openlane_review_getGet a vendor Risk Review by ID
openlane_groups_listList groups (optional name filter)
openlane_group_getGet a group by ID
openlane_users_listList users (optional name/email filters)
openlane_user_getGet a user by ID
openlane_workflows_listList workflow definitions (optional schema/kind/active filters)
openlane_workflows_searchSearch workflow definitions by name or description
openlane_workflow_getGet a workflow definition by ID (with plain-English summary)
openlane_workflow_instances_listList workflow instances (optional definition/state/object filters)
openlane_workflow_instance_getGet a workflow instance by ID (assignments, events, proposal preview)
openlane_workflow_assignments_listList my workflow approval assignments
openlane_workflow_assignment_getGet a workflow assignment by ID (targets, due date, object context)
openlane_workflow_metadata_getGet workflow-eligible fields, edges, and resolver keys per object type

Write tools (require OPENLANE_ALLOW_WRITE=true or --allow-write):

ToolDescription
openlane_control_create / openlane_control_updateCreate or update a control
openlane_mapped_control_create / openlane_mapped_control_updateCreate or update cross-framework control mappings (MappedControl)
openlane_evidence_create / openlane_evidence_updateCreate or update evidence; optional control_ids / add_control_ids / remove_control_ids (org-owned controls only — not system catalog copies); optional base64 file uploads
openlane_controls_list / openlane_controls_searchOptional linkable_only returns org-owned controls suitable for evidence linking
openlane_policy_create / openlane_policy_updateCreate or update an internal policy
openlane_policy_submit_for_approval / openlane_policy_approve / openlane_policy_publish / openlane_policy_return_to_draftNative InternalPolicy status transitions (confirm required)
openlane_risk_create / openlane_risk_updateCreate or update a risk
openlane_task_create / openlane_task_updateCreate or update a task
openlane_entity_create / openlane_entity_updateCreate or update an entity (vendor); optional base64 logo upload or logo_remote_url
openlane_platform_create / openlane_platform_updateCreate or update a platform (system boundary); owner fields accept user id, email, name, or group id/name; optional scope link ids and base64 diagram uploads
openlane_contact_createCreate a contact (optional entity_ids)
openlane_vendor_risk_review_create / openlane_vendor_risk_review_updateCreate or update a vendor Risk Review
openlane_workflow_create / openlane_workflow_updateCreate or update a WorkflowDefinition (confirm required)
openlane_workflow_assignment_approve / openlane_workflow_assignment_rejectApprove or reject a WorkflowAssignment (confirm required)
openlane_workflow_assignment_request_changes / openlane_workflow_assignment_reassignRequest changes or reassign an assignment (confirm required)

Delete tools (require OPENLANE_ALLOW_DELETE=true or --allow-delete):

ToolDescription
openlane_control_deleteDelete a control by ID
openlane_mapped_control_deleteDelete a control mapping by ID
openlane_evidence_deleteDelete evidence by ID
openlane_policy_deleteDelete a policy by ID
openlane_risk_deleteDelete a risk by ID
openlane_task_deleteDelete a task by ID
openlane_workflow_deleteDelete a workflow definition by ID (confirm required)

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.

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
docker run -i --rm ghcr.io/gregdog/mcp-server-theopenlane:v0.8.0

Set up in your AI client

Merge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.

json
{
  "mcpServers": {
    "io-github-gregdog-mcp-server-theopenlane": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/gregdog/mcp-server-theopenlane:v0.8.0"
      ]
    }
  }
}

Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.

Claude Desktop setup reference

Package

ghcr.io/gregdog/mcp-server-theopenlane:v0.8.0docker

Compatible MCP Clients

Openlane MCP Server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.

Learn More