ARCLinearGitHub-MCP
Bridges Linear issue tracking and GitHub repository management with ARC naming conventions, enabling composite workflows like creating a Linear issue and GitHub branch in one step.
README
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 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.
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 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
<p align="center">Made with 💛 by ARC Labs Studio</p>
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.