Linear Project

org.openlyuseful由 openlyuseful.org 发布v0.1.0更新于 Oct 24, 2026

Scope-gated Linear project administration with optional GitHub and Obsidian evidence adapters

发布方自己的服务:Linear

概览

AI 生成的概览

一个受范围门控的本地 MCP 服务器,用于管理 Linear 项目,并可选接入只读 GitHub 证据和本地 Obsidian 笔记适配器。

可以做什么
它提供读取工具来报告能力、解析精确的团队/项目/标签范围、列出范围内问题、查找对账候选,以及读取允许列表内的 GitHub 证据或 Obsidian 笔记。写入工具可创建或复用团队、引导项目与标签、幂等创建或更新范围内问题、移动已审核候选、关联证据,并更新笔记中由服务器管理的部分。变更操作需要字面确认字段,且全局写入必须已启用。
适用场景
当助手需要以精确范围标签管理 Linear 项目工作流时使用,例如创建专用团队或子团队、引导项目与首个问题,或关联 GitHub 与本地 Obsidian 证据。它面向受控且需明确确认的操作,而非无人值守的自动化。
运行要求
通过 stdio 在本地运行,需要 Node.js 20 或更高版本以及 pnpm 10。需要 Linear API 密钥或 OAuth 访问令牌、精确的 Linear 组织 ID,以及团队、项目和范围代码的允许列表。可选适配器需要带仓库允许列表的 GitHub 令牌,或绝对路径的 Obsidian 库及允许目录。写入需要 MCP_WRITES_ENABLED、未来的 MCP_WRITE_WINDOW_EXPIRES_AT 和审计日志路径。
安装前请注意
它处理 Linear 凭据(LINEAR_API_KEY 或 LINEAR_ACCESS_TOKEN)以及可选的 GITHUB_TOKEN;应存放在受保护的密钥存储中,而非客户端配置。写入工具会创建、更新和移动 Linear 记录,并可替换笔记中由服务器管理的部分,因此除受限写入窗口外应保持写入禁用,并回读结果。关联笔记只发送其 Obsidian URI 和标题,不发送内容。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Linear Project,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Linear Project MCP Server

A scope-gated Model Context Protocol server for administering Linear project workflows, with optional read-only GitHub evidence and local Obsidian note adapters.

The server complements the three skills in this repository. It supplies the integration capabilities those workflows need when an existing connector cannot create teams, enforce exact scope labels, or link local evidence safely.

What it supports

Linear arrangementProject scopeIssue identifier behavior
Existing teamExact project plus ACQI issue and project labelsKeeps the existing team key, such as OPEN-42
New dedicated team with key ACQIExact project plus ACQI labelsStarts at ACQI-1 only when the team is verified empty
New ACQI subteam under an existing parentExact project plus ACQI labelsStarts at ACQI-1 only when the subteam is verified empty

Linear identifiers belong to teams, not projects or labels. The server rejects a request that expects ACQI-1 on an existing OPEN team before creating a project, label, note, or issue. A first-identifier readback is an immediate safety check, not a concurrency lock; avoid simultaneous writers while bootstrapping the first issue.

Historical captures are separate from active work. They receive an exact [HISTORICAL] title prefix, the scope and HISTORICAL labels, Historical only: true, Actionability: none, and a deterministic source marker for replay safety.

Tools

ToolModePurpose
linear_project_capabilitiesReadReport adapters, reachability, allowlists, and write state
linear_project_resolve_scopeReadResolve one exact team/project/label scope
linear_project_create_teamWriteCreate or reuse a dedicated team or subteam with the scope key
linear_project_bootstrapWriteCreate or reuse a team, project, labels, optional links, and first issue
linear_project_list_scoped_issuesReadList only issues in the exact project carrying the scope label
linear_project_upsert_scoped_issueWriteIdempotently create or update active or historical work
linear_project_find_candidatesReadFind allowlisted reconciliation candidates without moving them
linear_project_move_candidateWriteMove one reviewed candidate with exact source-state and identifier safeguards
linear_project_link_evidenceWriteAdd a verified GitHub or Obsidian link to an in-scope issue
github_get_project_evidenceReadNormalize an allowlisted repository, commit, PR, or issue
obsidian_search_project_notesReadSearch allowlisted local Markdown notes
obsidian_read_project_noteReadRead one allowlisted local Markdown note
obsidian_upsert_project_noteWriteReplace only the server-managed section of a note

All tools use strict input schemas and structured output. Mutating tools require a literal confirmation field, and global writes must also be enabled.

Install and build

Requirements: Node.js 20 or newer and pnpm 10. pnpm 11 requires Node.js 22 or newer and cannot validate the Node.js 20 compatibility floor.

sh
pnpm install --frozen-lockfilecp .env.example .envpnpm checkpnpm build

The npm package name is @openly-useful/linear-project-mcp-server. It installs the linear-project-mcp-server protocol server and the bounded linear-project-mcp-write-window safety helper. The package can be run with npx @openly-useful/linear-project-mcp-server only after the first successful npm release. Until then, build and run it from a source checkout as shown below.

The official MCP Registry name is org.openlyuseful/linear-project. server.json, package.json.mcpName, the npm package version, and the registry package version must agree. The repo-local Openly Useful publisher projection records the founder-individual as current operator and a founder-owner authorization that is effective while LLC formation remains pending. prepublishOnly verifies that authorization and the exact npm identity, policies, namespace, repository provenance, and registration metadata. Provider authentication and review remain separate MCP Registry steps; builds, tests, validation, and pnpm pack --dry-run do not publish the record.

Configure

Copy .env.example and provide only the adapters you need.

Linear accepts either LINEAR_API_KEY or LINEAR_ACCESS_TOKEN. Every scoped Linear read and mutation requires an exact LINEAR_ALLOWED_ORGANIZATION_ID; every mutation additionally requires:

  • MCP_WRITES_ENABLED=true;
  • a future MCP_WRITE_WINDOW_EXPIRES_AT no more than 60 minutes away;
  • a safe, writable MCP_AUDIT_LOG_PATH when using the bundled write-window helper;
  • the exact code in LINEAR_ALLOWED_SCOPE_CODES, such as ACQI;
  • the destination team's ID in LINEAR_ALLOWED_TEAM_IDS, unless it is a dedicated team whose key exactly equals the scope code;
  • the project ID in LINEAR_ALLOWED_PROJECT_IDS when that optional allowlist is non-empty;
  • the mutating tool's literal confirmation field set to true.

For a new ACQI subteam, allowlist the parent team ID, select team_mode: "subteam", pass parent_team_id, and use team_key: "ACQI". The authenticated Linear identity must have permission to create teams in the workspace.

Leave LINEAR_ALLOWED_PROJECT_IDS empty only for the initial project bootstrap, because a new project's ID does not exist yet. After readback, add that exact ID before ongoing operation. Existing projects must already be allowlisted when the project-ID allowlist is non-empty, and all scoped operations require the exact scope project label.

GitHub is optional. Configure GITHUB_TOKEN and exact owner/name entries in GITHUB_ALLOWED_REPOSITORIES. The adapter makes GET requests only; use a fine-grained token with read-only metadata and contents, pull-request, or issue access required by the references you plan to inspect.

Obsidian is optional and local. OBSIDIAN_VAULT_PATH must be absolute, OBSIDIAN_ALLOWED_DIRECTORIES contains vault-relative directories, and OBSIDIAN_VAULT_NAME enables obsidian:// links. Only .md files under those directories are accessible. Traversal, symlinks, non-Markdown paths, and files over 200,000 bytes are rejected. Linking a note to Linear sends only its Obsidian URI and title, not its contents.

For operation auditing, set MCP_AUDIT_LOG_PATH to a normalized absolute path outside the repository. Its parent directory must already exist, belong to the current user, and not be group- or world-writable. The server appends compact NDJSON attempt/outcome records with operation IDs, tool names, modes, durations, outcomes, and safe error classes; it never logs tool arguments, result bodies, descriptions, credentials, or error messages. Once auditing is configured, an unavailable audit sink blocks writes before workflow execution and marks reads as audit-degraded.

Connect Codex

Use linear_project as the canonical Codex registration alias. This alias is a local client configuration key; it is intentionally different from the npm package and executable names.

From the server directory in a source checkout:

sh
pnpm install --frozen-lockfilepnpm buildMCP_ENTRYPOINT="$(pwd)/dist/index.js"codex mcp add linear_project -- node "$MCP_ENTRYPOINT"codex mcp get linear_project --jsoncodex mcp list --json

After the first npm release is available, a version-pinned registry installation can instead be registered with:

sh
codex mcp add linear_project -- npx --yes @openly-useful/[email protected]codex mcp get linear_project --jsoncodex mcp list --json

Do not add API tokens with codex mcp add --env, because that stores the supplied value in the local Codex configuration. Use a protected launcher or operating-system secret store that exports credentials only to the child process. Non-secret allowlist settings may be stored in client configuration, but the repository must never contain real organization, team, project, repository, or vault values.

After registration, start a new Codex task if the current task's tool registry does not refresh. In that new task:

  1. Confirm the linear_project tools are visible.
  2. Call linear_project_capabilities and confirm writesEnabled is false, Linear is reachable, and the organization is allowed.
  3. Call linear_project_resolve_scope for the intended scope code and confirm the exact team, project, issue label, and project label all resolve.

Keep the package names distinct when troubleshooting:

NameUse
linear_projectcodex mcp add, codex mcp get, and codex mcp list registration alias.
@openly-useful/linear-project-mcp-servernpm package specifier used by npx and package managers.
org.openlyuseful/linear-projectOfficial MCP Registry server name and npm mcpName.
linear-project-mcp-serverInstalled executable and MCP protocol server artifact name.
linear-project-mcp-write-windowInstalled helper for bounded, explicit changes to write-window settings.

Connect another MCP client

Build the server, then configure a local stdio process in the client. The exact configuration key varies by client; a typical shape is:

json
{  "mcpServers": {    "linear_project": {      "command": "/path/to/protected/linear-project-mcp-launcher",      "args": []    }  }}

The protected launcher should load credentials from the client's secret store or protected process environment and then replace itself with the linear-project-mcp-server process. Do not commit the launcher, .env, or client configuration containing secrets.

Recommended operating sequence

  1. Start with writes disabled and call linear_project_capabilities.
  2. Resolve or inspect the exact destination with read-only tools.
  3. Configure the narrowest organization, team, project, scope, repository, and note-directory allowlists.
  4. Enable writes only for the intended operation.
  5. Bootstrap or upsert using deterministic source markers.
  6. Read back results and replay the operation; a completed import should create zero additional records.
  7. Disable writes again.

Configuration is read when a server process starts. Enabling or disabling MCP_WRITES_ENABLED therefore requires reconnecting or restarting the relevant MCP client session before checking capabilities or invoking a write. A safe write window is:

  1. Resolve and inspect the exact scope with writes disabled.
  2. Stop the connected server process, use the bounded helper against the protected runtime environment, and reconnect.
  3. Call linear_project_capabilities and confirm the expected write state and allowlists before one explicitly confirmed mutation.
  4. Read the mutated record back and replay the same deterministic operation; the replay must report zero additional changes.
  5. Stop the server process, disable the window with the helper, reconnect, and confirm the disabled state through linear_project_capabilities.

If any scope readback, replay, or disabled-state check fails, stop and leave writes disabled.

The helper accepts a 1–60 minute window, requires the scope code twice on enable, requires nonempty organization/team/project/scope allowlists plus MCP_AUDIT_LOG_PATH, and never extends a window implicitly. Use a protected environment file outside the repository:

sh
linear-project-mcp-write-window status --env-file /path/to/protected.envlinear-project-mcp-write-window enable --env-file /path/to/protected.env --scope ACQI --minutes 15 --confirm ACQI# Reconnect or restart the MCP client, verify capabilities, perform one scoped operation, read back, and replay.linear-project-mcp-write-window disable --env-file /path/to/protected.env# Reconnect or restart again, then verify writesEnabled is false.

enable writes MCP_WRITES_ENABLED=true and a bounded RFC 3339 MCP_WRITE_WINDOW_EXPIRES_AT. disable restores MCP_WRITES_ENABLED=false and clears the expiry. Every settings change requires reconnecting or restarting the server process; expiry is an additional fail-closed limit, not a substitute for disabling and reconnecting after the operation.

This server does not run a daemon, watch files, move reconciliation candidates automatically, or mark issues Done based only on repository evidence. The separate move tool requires exact source-state input and explicit confirmation; cross-team moves additionally require acknowledgement of identifier change and source-label replacement. Ongoing updates happen only when an MCP client explicitly invokes a tool.

Transport and deployment

The current release supports local stdio. That is intentional for the Obsidian adapter, which reads a local vault. A future remote deployment should use the MCP SDK's Streamable HTTP transport, omit local filesystem access, add server-side authentication, and preserve the same allowlist and confirmation gates.

Development

sh
pnpm typecheckpnpm testpnpm buildpnpm pack --dry-run

Tests use in-memory Linear and MCP transports plus temporary Obsidian fixtures. They do not contact live services. Read-only evaluation questions are in evaluations/read-only.xml.

Implementation references: MCP TypeScript SDK v2, Linear TypeScript SDK, Linear teams, GitHub REST authentication, and Obsidian URI.

License

MIT

来源:mcp/linear-project-mcp-server/README.md,提交 fceea90

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.0最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Linear 集成