Odel
Openlane MCP Server

Openlane MCP Server

Local
@gregdogGoApache-2.0Updated 4 days ago

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

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, 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, 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_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_contacts_listList contacts
openlane_contact_getGet a contact 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_evidence_create / openlane_evidence_updateCreate or update evidence; optional base64 file uploads
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_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_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 66 tools (40 read, 20 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).

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.

Licence

Apache License 2.0. See LICENSE.

Openlane names are used only to describe compatibility. Do not copy Openlane logos or imply official endorsement.