{"_id":"linear-mcp","_rev":"3-a41c79914063bf2930e35b78e3259bc1","name":"linear-mcp","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"linear-mcp","version":"1.0.0","keywords":["linear","mcp","model-context-protocol","cline","issue-tracking","project-management"],"author":{"name":"ModelContextProtocol"},"license":"MIT","_id":"linear-mcp@1.0.0","maintainers":[{"name":"dvcrn","email":"npm@davemail.io"}],"homepage":"https://github.com/dvcrn/linear-mcp#readme","bugs":{"url":"https://github.com/dvcrn/linear-mcp/issues"},"dist":{"shasum":"b7bd5bb7442c316c1dab4d27891b4ed01a81934f","tarball":"https://registry.npmjs.org/linear-mcp/-/linear-mcp-1.0.0.tgz","fileCount":68,"integrity":"sha512-sh1DQieZyBezzNhl13n8oRO/zcWP3xs+aaU4gPnN0vhaIrsqlGA12Im1Jpw9BfR8oqDhTXgw22ZStUoysWVcpQ==","signatures":[{"sig":"MEUCICYsK3Emf4wWm71lxCPB4fZHp/leVAvVDDCdMJZ1ByfDAiEAwt1U8nuFD3MxZ1Yks3PuGAYphzzuLvg3C0sAaD9jqM0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149808},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"}},"gitHead":"afa5272eed3d293fb2b1dcbac241e49e96311a5c","private":false,"scripts":{"dev":"nodemon --watch src --ext ts --exec \"npm run build && npm start\"","test":"jest","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepare":"npm run build","test:oauth":"node --loader ts-node/esm scripts/test-oauth.ts","test:watch":"jest --watch","test:coverage":"jest --coverage","get-test-tokens":"node --loader ts-node/esm scripts/get-test-tokens.ts","test:integration":"jest --testMatch '**/*.integration.test.ts'"},"_npmUser":{"name":"dvcrn","email":"npm@davemail.io"},"repository":{"url":"git+https://github.com/dvcrn/linear-mcp.git","type":"git"},"_npmVersion":"11.0.0","description":"An MCP server for interacting with Linear's API, providing tools for managing issues, projects, and teams","directories":{},"_nodeVersion":"23.5.0","dependencies":{"graphql":"^16.10.0","@linear/sdk":"^38.0.0","graphql-tag":"^2.12.6","@modelcontextprotocol/sdk":"^1.4.0","@graphql-typed-document-node/core":"^3.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","open":"^10.1.0","dotenv":"^16.4.7","express":"^4.21.2","nodemon":"^3.1.9","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.10","@types/dotenv":"^8.2.3","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/linear-mcp_1.0.0_1741306801385_0.1087162377838955","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"linear-mcp","version":"1.1.0","keywords":["linear","mcp","model-context-protocol","cline","issue-tracking","project-management"],"author":{"name":"ModelContextProtocol"},"license":"MIT","_id":"linear-mcp@1.1.0","maintainers":[{"name":"dvcrn","email":"npm@davemail.io"}],"homepage":"https://github.com/dvcrn/linear-mcp#readme","bugs":{"url":"https://github.com/dvcrn/linear-mcp/issues"},"dist":{"shasum":"cce916dd1ab75e63cdcf1d5e959b7989b548fadc","tarball":"https://registry.npmjs.org/linear-mcp/-/linear-mcp-1.1.0.tgz","fileCount":68,"integrity":"sha512-LSCmZrIKtjArLxjCrtpdTLRJ1giEYPd+2HroFSstDkOtp6PlWi3WJkcZ4YYwZNHBTIcWxWjx6unD7gUQuifaPQ==","signatures":[{"sig":"MEUCIQC2YUX5JGlIpZCOYaofKvqZtPygXyhdJXtzpU7l++Bb5AIgFG+up/DUBSF+qyJuo+vU8F0u/+xHDe+V6yqvuXgBfZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172953},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"}},"gitHead":"c8d27e939aab28d70f78633abb587a532f01d776","private":false,"scripts":{"dev":"nodemon --watch src --ext ts --exec \"npm run build && npm start\"","test":"jest","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepare":"npm run build","test:oauth":"node --loader ts-node/esm scripts/test-oauth.ts","test:watch":"jest --watch","test:coverage":"jest --coverage","get-test-tokens":"node --loader ts-node/esm scripts/get-test-tokens.ts","test:integration":"jest --testMatch '**/*.integration.test.ts'"},"_npmUser":{"name":"dvcrn","email":"npm@davemail.io"},"repository":{"url":"git+https://github.com/dvcrn/linear-mcp.git","type":"git"},"_npmVersion":"11.0.0","description":"An MCP server for interacting with Linear's API, providing tools for managing issues, projects, and teams","directories":{},"_nodeVersion":"23.5.0","dependencies":{"graphql":"^16.10.0","@linear/sdk":"^38.0.0","graphql-tag":"^2.12.6","@modelcontextprotocol/sdk":"^1.4.0","@graphql-typed-document-node/core":"^3.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","open":"^10.1.0","dotenv":"^16.4.7","express":"^4.21.2","nodemon":"^3.1.9","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.10","@types/dotenv":"^8.2.3","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/linear-mcp_1.1.0_1741344206729_0.15511104791027153","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"linear-mcp","version":"1.2.0","description":"An MCP server for interacting with Linear's API, providing tools for managing issues, projects, and teams","private":false,"repository":{"type":"git","url":"git+https://github.com/dvcrn/linear-mcp.git"},"main":"build/index.js","type":"module","types":"build/index.d.ts","exports":{".":{"types":"./build/index.d.ts","default":"./build/index.js"}},"publishConfig":{"access":"public"},"engines":{"node":">=16.0.0"},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:integration":"jest --testMatch '**/*.integration.test.ts'","get-test-tokens":"node --loader ts-node/esm scripts/get-test-tokens.ts","test:oauth":"node --loader ts-node/esm scripts/test-oauth.ts","prepare":"npm run build","build":"tsc && chmod +x build/index.js","start":"node build/index.js","dev":"nodemon --watch src --ext ts --exec \"npm run build && npm start\""},"keywords":["linear","mcp","model-context-protocol","cline","issue-tracking","project-management"],"author":{"name":"ModelContextProtocol"},"license":"MIT","devDependencies":{"@types/dotenv":"^8.2.3","@types/express":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^22.10.10","dotenv":"^16.4.7","express":"^4.21.2","jest":"^29.7.0","nodemon":"^3.1.9","open":"^10.1.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.3"},"dependencies":{"@graphql-typed-document-node/core":"^3.2.0","@linear/sdk":"^38.0.0","@modelcontextprotocol/sdk":"^1.4.0","graphql":"^16.10.0","graphql-tag":"^2.12.6"},"_id":"linear-mcp@1.2.0","gitHead":"ed30d27909feb18eab1da38896b615f48b1fcf4d","bugs":{"url":"https://github.com/dvcrn/linear-mcp/issues"},"homepage":"https://github.com/dvcrn/linear-mcp#readme","_nodeVersion":"23.5.0","_npmVersion":"11.0.0","dist":{"integrity":"sha512-y5AMNpNYB4lW1iPSoq0XLXV7Q9GblXPgT7fURsIqFfIJwuHuQiK6JIIjg8vo8d6EOUNzw1CN3RD7RFxnq8sqUg==","shasum":"232812606ec67ca4151de07597aeaeea2914bb6c","tarball":"https://registry.npmjs.org/linear-mcp/-/linear-mcp-1.2.0.tgz","fileCount":68,"unpackedSize":179589,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDuOQ4D7ytTbJ6WWHdim3JZ5D0NdoSb3E3nMNyFC5NNpQIhAOxRe+s9wH5fiHBQJCVNBNr7KoW+gYMeIhRh9pN6N+IF"}]},"_npmUser":{"name":"dvcrn","email":"npm@davemail.io"},"directories":{},"maintainers":[{"name":"dvcrn","email":"npm@davemail.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/linear-mcp_1.2.0_1741426112907_0.46801054823741506"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-07T00:20:01.312Z","modified":"2025-03-08T09:28:33.284Z","1.0.0":"2025-03-07T00:20:01.588Z","1.1.0":"2025-03-07T10:43:26.926Z","1.2.0":"2025-03-08T09:28:33.095Z"},"bugs":{"url":"https://github.com/dvcrn/linear-mcp/issues"},"author":{"name":"ModelContextProtocol"},"license":"MIT","homepage":"https://github.com/dvcrn/linear-mcp#readme","keywords":["linear","mcp","model-context-protocol","cline","issue-tracking","project-management"],"repository":{"type":"git","url":"git+https://github.com/dvcrn/linear-mcp.git"},"description":"An MCP server for interacting with Linear's API, providing tools for managing issues, projects, and teams","maintainers":[{"name":"dvcrn","email":"npm@davemail.io"}],"readme":"# Linear MCP Server\n\nAn MCP server for interacting with Linear's API. This server provides a set of tools for managing Linear issues, projects, and teams through Cline.\n\n## Setup Guide\n\n### 1. Get Linear API Token\n\n1. Go to Linear: Settings > API > OAuth application > \"Cline MCP\"\n2. Under \"Developer Token\", click \"Create & copy token\"\n3. Select \"Application\" and copy the generated token\n\n### 2. Configure Cline MCP\n\n1. Open your Cline MCP settings file:\n   - macOS: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`\n   - Windows: `%APPDATA%/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`\n   - Linux: `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`\n\n2. Add the Linear MCP server configuration:\n   ```json\n   {\n     \"mcpServers\": {\n       \"linear\": {\n         \"command\": \"npx\",\n         \"args\": [\"linear-mcp\"],\n         \"env\": {\n           \"LINEAR_ACCESS_TOKEN\": \"your_linear_api_token_here\"\n         },\n         \"disabled\": false,\n         \"autoApprove\": []\n       }\n     }\n   }\n   ```\n\nThat's it! The server will be automatically downloaded and run through npx when needed.\n\n**Note**: Replace `your_linear_api_token_here` with the API token you generated in step 1.\n\n## Available Actions\n\nThe server currently supports the following operations:\n\n### Issue Management\n- ✅ Create issues with full field support (title, description, team, project, etc.)\n- ✅ Update existing issues (priority, description, etc.)\n- ✅ Delete issues (single or bulk deletion)\n- ✅ Search issues with filtering and by identifier\n- ✅ Associate issues with projects\n- ✅ Create parent/child issue relationships\n- ✅ Comment management (create, update, delete comments)\n- ✅ Comment resolution handling (resolve/unresolve comments)\n- ✅ Create customer needs from attachments\n\n### Project Management\n- ✅ Create projects with associated issues\n- ✅ Get project information\n- ✅ List all projects with optional filtering\n- ✅ Associate issues with projects\n\n### Team Management\n- ✅ Get team information (with states and workflow details)\n- ✅ Access team states and labels\n\n### Authentication\n- ✅ Personal Access Token (PAT) authentication\n- ✅ Secure token storage\n\n### Batch Operations\n- ✅ Bulk issue creation\n- ✅ Bulk issue deletion\n\n### Bulk Updates (In Testing)\n- 🚧 Bulk issue updates (parallel processing implemented, needs testing)\n\n## Features in Development\n\nThe following features are currently being worked on:\n\n### Issue Management\n- 🚧 Complex search filters\n- 🚧 Pagination support for large result sets\n\n### Metadata Operations\n- 🚧 Label management (create/update/assign)\n- 🚧 Cycle/milestone management\n\n### Project Management\n- 🚧 Project template support\n- 🚧 Advanced project operations\n\n### Authentication\n- 🚧 OAuth flow with automatic token refresh\n\n### Performance & Security\n- 🚧 Rate limiting\n- 🚧 Detailed logging\n- 🚧 Load testing and optimization\n\n## Using Multiple Linear Workspaces\n\nYou can connect to multiple Linear workspaces by adding the Linear MCP server multiple times with different `TOOL_PREFIX` values. This allows you to work with separate Linear workspaces within the same Cline environment.\n\n### Configuration Example\n\n```json\n{\n  \"mcpServers\": {\n    \"company1-linear\": {\n      \"command\": \"npx\",\n      \"args\": [\"linear-mcp\"],\n      \"env\": {\n        \"LINEAR_ACCESS_TOKEN\": \"your_company1_linear_token_here\",\n        \"TOOL_PREFIX\": \"company1\"\n      },\n      \"disabled\": false,\n      \"autoApprove\": []\n    },\n    \"company2-linear\": {\n      \"command\": \"npx\",\n      \"args\": [\"linear-mcp\"],\n      \"env\": {\n        \"LINEAR_ACCESS_TOKEN\": \"your_company2_linear_token_here\",\n        \"TOOL_PREFIX\": \"company2\"\n      },\n      \"disabled\": false,\n      \"autoApprove\": []\n    },\n    \"company3-linear\": {\n      \"command\": \"npx\",\n      \"args\": [\"linear-mcp\"],\n      \"env\": {\n        \"LINEAR_ACCESS_TOKEN\": \"your_company3_linear_token_here\",\n        \"TOOL_PREFIX\": \"company3\"\n      },\n      \"disabled\": false,\n      \"autoApprove\": []\n    }\n  }\n}\n```\n\n### How It Works\n\nWhen you set a `TOOL_PREFIX` value:\n\n1. All tool names are prefixed with it (e.g., `company1_linear_create_issue`)\n2. Tool descriptions include the prefix (e.g., \"For 'company1' Linear workspace: Create a new issue\")\n\nThis makes it clear which workspace each tool is operating on and prevents conflicts between different Linear instances.\n\n## Contributing\n\nIf you want to contribute to the development of this MCP server, follow these steps:\n\n1. Clone the repository\n2. Install dependencies:\n   ```bash\n   npm install\n   ```\n3. Copy `.env.example` to `.env`:\n   ```bash\n   cp .env.example .env\n   ```\n4. Add your Linear API token to `.env`:\n   ```\n   LINEAR_ACCESS_TOKEN=your_personal_access_token\n   ```\n\n### Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build and run the server locally\nnpm run build\nnpm start\n\n# Or use development mode with auto-reload\nnpm run dev\n```\n\n### Integration Testing\n\nIntegration tests verify that authentication and API calls work correctly:\n\n1. Set up authentication in `.env` (PAT recommended for testing)\n2. Run integration tests:\n   ```bash\n   npm run test:integration\n   ```\n\nFor OAuth testing:\n1. Configure OAuth credentials in `.env`:\n   ```\n   LINEAR_CLIENT_ID=your_oauth_client_id\n   LINEAR_CLIENT_SECRET=your_oauth_client_secret\n   LINEAR_REDIRECT_URI=http://localhost:3000/callback\n   ```\n2. Remove `.skip` from OAuth tests in `src/__tests__/auth.integration.test.ts`\n3. Run integration tests\n","readmeFilename":"README.md"}