ARCLinearGitHub-MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ARCLinearGitHub-MCP Start a new feature called 'add-dark-mode' in Linear and create a GitHub branch."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ARCLinearGitHub-MCP
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_featurecreates 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 nononisolated(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 serverThe 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-releaseThe 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-mcpProject layout
Target | Purpose |
| Codable |
|
|
| Pure branch + commit validators with ARC regex |
| GraphQL client + multi-workspace registry |
| REST client + endpoint enum |
|
|
|
|
|
|
Testing
Swift Testing. Run
serially because StubURLProtocol keeps its handler in static
OSAllocatedUnfairLock state:
swift test --no-parallelTests are organised per target:
ARCMCPModelsTests— Codable round-trip for every entity.ARCMCPNetworkingTests— retry semantics with stubbedURLSession.ARCMCPValidatorsTests— every case ported fromtests/test_validators/.ARCMCPLinearTests/ARCMCPGitHubTests—URLProtocolstubs + fixture JSON.ARCMCPCoreTests—Settingsenv 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 asyncclosure onAppDependencies.production(settings:)wires real actors;.mock(inARCMCPMocks) returns canned values.Strict concurrency — Swift 6
.v6language 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.
Related
Available Tools
19 toolsgithub_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:
Creates a new issue in Linear
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
Scored across 19 tools
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.
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.
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.
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
Related MCP Connectors
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Search, read and create Linear issues, projects, teams and cycles.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Related MCP Servers
- -licenseBqualityNot gradedmaintenanceEnables 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-
- AlicenseNot gradedqualityNot gradedmaintenanceEnables 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.-
- AlicenseNot gradedqualityDmaintenanceEnables end-to-end automation of developer workflows from Jira issue tracking to GitHub pull requests through natural language, allowing developers to search issues, create branches, commit changes, and manage PRs directly from their IDE.2MIT
- FlicenseNot gradedqualityDmaintenanceEnables seamless integration between GitHub, Obsidian, and AI assistants (Claude/ChatGPT) for managing documentation and code workflows.-