Skip to main content
Glama
ARCLinearGitHub-MCP

ARCLinearGitHub-MCP

ARCLinearGitHub-MCP

Swift Platforms MCP License Status

Native Swift Model Context Protocol (MCP) server that bridges Linear (issue tracking) and GitHub (repository management), enforces ARC Labs naming conventions, and exposes 21 tools to Claude Code over stdio.

  • Multi-workspace — talk to several Linear workspaces from one binary via LINEAR_WORKSPACES.

  • Convention enforcement — branch, commit and PR validators with byte-compatible regex ported from the Python reference implementation.

  • Composite workflows — workflow_start_feature creates the Linear issue and the GitHub branch in a single round-trip.

  • Swift 6 + strict concurrency — every public type is Sendable, the data layer uses actors, no force-unwraps and no nonisolated(unsafe).

This is the Swift rewrite of the original Python LinearGitHub-MCP. The wire format is identical (same tool names, same request/response shape), so existing Claude Code configurations only need a binary-path swap.


Overview

ARCLinearGitHub-MCP is a Swift Package laid out following the microapps SPM pattern (Majid Jabrayilov) and ARC Clean Architecture:

Sources/
├── ARCMCPModels         Foundation — entities + error types
├── ARCMCPNetworking     Foundation — URLSession HTTP + retry policy
├── ARCMCPValidators     Foundation — branch + commit validators
├── ARCMCPLinear         Data       — GraphQL client + workspace registry
├── ARCMCPGitHub         Data       — REST client
├── ARCMCPCore           Orchestration — AppDependencies + MCP tools
├── ARCMCPMocks          Tests      — StubURLProtocol + AppDependencies.mock
└── arc-mcp              Executable — stdio MCP server

The 21 MCP tools live in ARCMCPCore/Tools/. Each handler decodes its arguments via ArgumentAccess, calls one or more closures on AppDependencies, then maps the entities back into the Python-compatible {success: bool, ...} envelope via Mappers.

Related MCP server: Linear MCP Server

Requirements

  • macOS 14 Sonoma or later

  • Swift 6.0 toolchain (Xcode 16+)

  • Linear API token and GitHub Personal Access Token

Installation

git clone https://github.com/arclabs-studio/ARCLinearGitHub-MCP.git
cd ARCLinearGitHub-MCP
make build-release

The binary lands at .build/release/arc-mcp.

Configuration

Every setting is read from the process environment.

export GITHUB_TOKEN=ghp_xxx
export GITHUB_ORG=arclabs-studio
export DEFAULT_PROJECT=PLAT
export DEFAULT_REPO=MyApp

# single-workspace
export LINEAR_API_KEY=lin_api_xxx

# or multi-workspace
export LINEAR_WORKSPACES='{"ios":"lin_api_a","backend":"lin_api_b"}'

Optional overrides: LINEAR_API_URL, GITHUB_API_URL, REQUEST_TIMEOUT.

Usage

Claude Code

Add the binary to ~/.claude/mcp-servers.json:

{
  "mcpServers": {
    "arc-linear-github": {
      "command": "/abs/path/.build/release/arc-mcp"
    }
  }
}

Restart Claude Code. /mcp lists 21 tools under arc-linear-github.

Programmatic embedding

import ARCMCPCore
import MCP

let settings = try Settings.fromEnvironment()
let server = Server(name: "my-mcp", version: "1.0.0",
                    capabilities: .init(tools: .init(listChanged: false)))
await ToolRegistry.register(on: server, dependencies: .production(settings: settings))
try await server.start(transport: StdioTransport())
await server.waitUntilCompleted()

Development

make lint        # SwiftLint
make format      # SwiftFormat (dry-run)
make fix         # Apply SwiftFormat
make build       # debug build
make test        # swift test --no-parallel (StubURLProtocol uses shared state)
make coverage    # tests with code coverage
make docs        # DocC archive for ARCMCPCore
make run         # build-release && exec arc-mcp

Project layout

Target

Purpose

ARCMCPModels

Codable Sendable Linear and GitHub entities + MCPDomainError

ARCMCPNetworking

HTTPClient actor, RetryPolicy, HTTPError

ARCMCPValidators

Pure branch + commit validators with ARC regex

ARCMCPLinear

GraphQL client + multi-workspace registry

ARCMCPGitHub

REST client + endpoint enum

ARCMCPCore

AppDependencies, MCP tool registry, mappers

ARCMCPMocks

StubURLProtocol + AppDependencies.mock for tests

arc-mcp

@main stdio executable

Testing

Swift Testing. Run serially because StubURLProtocol keeps its handler in static OSAllocatedUnfairLock state:

swift test --no-parallel

Tests are organised per target:

  • ARCMCPModelsTests — Codable round-trip for every entity.

  • ARCMCPNetworkingTests — retry semantics with stubbed URLSession.

  • ARCMCPValidatorsTests — every case ported from tests/test_validators/.

  • ARCMCPLinearTests / ARCMCPGitHubTests — URLProtocol stubs + fixture JSON.

  • ARCMCPCoreTests — Settings env parsing + tool registry dispatch.

Architecture

  • Clean Architecture — Domain (ARCMCPModels, *Validators), Data (*Linear, *GitHub), Orchestration (ARCMCPCore).

  • Microapps SPM — one library target per concern, layered by build dependency.

  • Closure-based DI — every capability is a @Sendable async closure on AppDependencies. production(settings:) wires real actors; .mock (in ARCMCPMocks) returns canned values.

  • Strict concurrency — Swift 6 .v6 language mode across every target.

Conventions

  • Branches: <type>/<issue-id>-<description>

  • Commits: <type>(<scope>): <subject>

  • PRs: <Type>/<Issue-ID>: <Title>

Full reference: workflow_get_conventions tool, or ARCMCPValidators.NamingStandards.

License

MIT. See LICENSE.


Available Tools

19 tools
github_create_branchA

Create a branch following naming conventions.

Args: branch_type: Type of branch (feature, bugfix, hotfix, docs, spike, release) description: Short description for the branch name issue_id: Optional Linear issue ID (e.g., 'PROJ-123') repo: Repository name (defaults to configured default repo) base_branch: Base branch to create from (defaults to repo default branch)

Returns: Dictionary with created branch details or error

Example branch names: - feature/PROJ-123-user-authentication - bugfix/PROJ-456-login-crash - docs/update-readme

Inputs: branch_type (required), description (required), repo, issue_id, +1 more.

github_create_prA

Create a pull request with proper naming.

Args: branch: Head branch name title: PR title (will be formatted with issue_id if provided) body: PR description (optional) issue_id: Linear issue ID to link (e.g., 'PROJ-123') repo: Repository name (defaults to configured default repo) base_branch: Base branch (defaults to repo default branch) draft: Create as draft PR

Returns: Dictionary with created PR details or error

The PR title will be formatted as: '/: ' Example: 'Feature/PROJ-123: User Authentication'

Inputs: title (required), branch (required), body, repo, +3 more.

github_get_default_branchA

Get the default branch for a repository.

Args: repo: Repository name (defaults to configured default repo)

Returns: Dictionary with default branch name

Inputs: repo.

github_get_prB

Get details of a specific pull request.

Args: pr_number: Pull request number repo: Repository name (defaults to configured default repo)

Returns: Dictionary with PR details or error

Inputs: pr_number (required), repo.

github_list_branchesA

List branches in a GitHub repository.

Args: repo: Repository name (defaults to configured default repo) limit: Maximum number of branches to return

Returns: Dictionary with list of branches

Inputs: repo, limit.

github_list_prsA

List pull requests in a repository.

Args: repo: Repository name (defaults to configured default repo) state: PR state filter ('open', 'closed', 'all') limit: Maximum number of PRs to return

Returns: Dictionary with list of pull requests

Inputs: repo, limit, state.

linear_create_issueA

Create a new issue in Linear.

Args: title: Issue title description: Optional issue description (supports Markdown) project: Project/team key. Defaults to configured default_project. priority: Priority level (1=Urgent, 2=High, 3=Normal, 4=Low) labels: Optional list of label names to apply

Returns: Dictionary with created issue details or error

Inputs: title (required), labels, project, priority, +1 more.

linear_get_issueA

Get details of a specific Linear issue.

Args: issue_id: Issue identifier (e.g., 'PROJ-123')

Returns: Dictionary with issue details or error

Inputs: issue_id (required).

linear_list_issuesA

List issues from a Linear project.

Args: project: Project/team key (e.g., 'MYPROJECT'). Defaults to configured default_project. state: Optional state filter (e.g., 'In Progress', 'Todo', 'Done') limit: Maximum number of issues to return (default: 50)

Returns: Dictionary with list of issues and count

Inputs: limit, state, project.

linear_list_labelsA

List available labels for a project.

Args: project: Project/team key. Defaults to configured default_project.

Returns: Dictionary with list of labels

Inputs: project.

linear_list_statesA

List available workflow states for a project.

Args: project: Project/team key. Defaults to configured default_project.

Returns: Dictionary with list of states

Inputs: project.

linear_list_workspacesA

List all configured workspaces and their teams.

Returns: Dictionary with workspace names and their associated teams

Inputs: no named parameters.

linear_update_issueA

Update an existing Linear issue.

Args: issue_id: Issue identifier (e.g., 'PROJ-123') state: New state name (e.g., 'In Progress', 'Done') assignee: Assignee name or email title: New title priority: New priority (1=Urgent, 2=High, 3=Normal, 4=Low)

Returns: Dictionary with updated issue details or error

Inputs: issue_id (required), state, title, assignee, +1 more.

workflow_generate_branch_nameA

Generate a valid branch name following naming conventions.

Args: branch_type: Type of branch (feature, bugfix, hotfix, docs, spike, release) description: Short description for the branch issue_id: Optional Linear issue ID (e.g., 'PROJ-123')

Returns: Dictionary with generated branch name

Examples: - branch_type='feature', issue_id='PROJ-123', description='user authentication' -> 'feature/PROJ-123-user-authentication' - branch_type='docs', description='Update README' -> 'docs/update-readme'

Inputs: branch_type (required), description (required), issue_id.

workflow_generate_commit_messageB

Generate a valid commit message following Conventional Commits.

Args: commit_type: Type of commit (feat, fix, docs, etc.) subject: The commit subject/description scope: Optional scope of the commit

Returns: Dictionary with generated commit message

Examples: - commit_type='feat', scope='auth', subject='Add user authentication' -> 'feat(auth): add user authentication' - commit_type='fix', subject='Resolve annotation crash' -> 'fix: resolve annotation crash'

Inputs: subject (required), commit_type (required), scope.

workflow_get_conventionsA

Get naming conventions reference.

Returns a reference of all naming conventions used by this MCP server.

Inputs: no named parameters.

workflow_start_featureA

Start a new feature workflow: create Linear issue and GitHub branch.

This is a convenience tool that combines:

  1. Creates a new issue in Linear

  2. Creates a properly named branch in GitHub

Args: title: Feature title (used for both issue and branch) description: Optional description for the Linear issue repo: GitHub repository name. Defaults to configured default_repo. project: Linear project/team key. Defaults to configured default_project. priority: Issue priority (1=Urgent, 2=High, 3=Normal, 4=Low) branch_type: Type of branch (default: 'feature')

Returns: Dictionary with created issue and branch details

Inputs: title (required), repo, project, priority, +2 more.

workflow_validate_branch_nameA

Validate a branch name against naming conventions.

Args: branch_name: The branch name to validate

Returns: Dictionary with validation result and details

Valid branch format: /- Types: feature, bugfix, hotfix, docs, spike, release Examples: - feature/PROJ-123-user-authentication - bugfix/PROJ-456-login-crash - docs/update-readme

Inputs: branch_name (required).

workflow_validate_commit_messageA

Validate a commit message against Conventional Commits format.

Args: message: The commit message to validate

Returns: Dictionary with validation result and details

Valid commit format: (): Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert Examples: - feat(auth): add user authentication - fix(map): resolve annotation crash - docs(readme): update installation steps

Inputs: message (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 19 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: GitHub and Linear operations are separated by prefix, workflow utilities are unique (validation, generation, composite). No two tools have overlapping functionality that would cause confusion.

    Naming Consistency5/5

    All tool names use consistent snake_case verb_noun pattern with clear prefixes (github_, linear_, workflow_). Conventions are uniform across the entire set, making it easy to predict tool names.

    Tool Count4/5

    With 19 tools, the server is slightly heavy but still well-scoped for its integration purpose. Each tool serves a distinct need, so the count is justified.

    Completeness5/5

    The tool surface covers core GitHub and Linear operations (CRUD for issues, branches, PRs) plus workflow enforcements (validation, generation). Missing features like PR reviews are out of scope for this integration server.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • -
      license
      B
      quality
      Not graded
      maintenance
      Enables AI-driven orchestration of GitHub development workflows including automated issue analysis, code generation, code review, and PR creation through multiple specialized agents. Integrates with GitHub Actions to automate the complete development process from issue to pull request.
      7
      -
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables comprehensive issue tracking and project management through Linear's GraphQL API. Supports creating and managing issues, organizing projects and sprints, team collaboration, and roadmap planning for modern development workflows.
      -