@ign8t/mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +246 -0
  2. package/dist/index.js +332 -0
  3. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,246 @@
1
+ # ign8t MCP Server
2
+
3
+ Seamlessly integrate ign8t project management into your AI-powered development workflow. Access your projects, documents, and tasks directly from Cursor, Claude Desktop, and other MCP-compatible AI tools.
4
+
5
+ ## What is MCP?
6
+
7
+ Model Context Protocol (MCP) is an open standard that enables AI assistants to securely access external tools and data sources. With the ign8t MCP server, your AI assistant can:
8
+
9
+ - 📋 Access all your ign8t projects without switching contexts
10
+ - 📄 Read BRD, PRD, and TRD documents to understand requirements
11
+ - 📊 View and manage your backlog in real-time
12
+ - ✅ Update task statuses as you complete work
13
+ - 🔍 Search across all tasks and projects
14
+ - 🎯 Get AI-powered task recommendations
15
+ - 🧠 Access full context including related requirements and documentation
16
+
17
+ ## Quick Start
18
+
19
+ ### 1. Install the MCP Server
20
+
21
+ ```bash
22
+ pnpm install -g @ign8t/mcp
23
+ ```
24
+
25
+ ### 2. Get Your API Key
26
+
27
+ 1. Log in to [ign8t.com](https://ign8t.com)
28
+ 2. Navigate to **Settings → API Keys**
29
+ 3. Click **"Create New API Key"**
30
+ 4. Give it a descriptive name (e.g., "Cursor Integration")
31
+ 5. Copy the generated key (you won't see it again!)
32
+
33
+ ### 3. Configure Your AI Tool
34
+
35
+ <details>
36
+ <summary><strong>Cursor IDE</strong></summary>
37
+
38
+ Add to `~/.cursor/mcp/settings.json`:
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "ign8t": {
44
+ "command": "ign8t-mcp",
45
+ "env": {
46
+ "IGN8T_API_KEY": "your-api-key-here" // This is all you need!
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ Restart Cursor to activate the integration.
54
+
55
+ </details>
56
+
57
+ <details>
58
+ <summary><strong>Claude Desktop</strong></summary>
59
+
60
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):
61
+
62
+ ```json
63
+ {
64
+ "mcpServers": {
65
+ "ign8t": {
66
+ "command": "ign8t-mcp",
67
+ "env": {
68
+ "IGN8T_API_KEY": "your-api-key-here" // This is all you need!
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ For Windows: `%APPDATA%\Claude\claude_desktop_config.json`
76
+
77
+ Restart Claude Desktop to activate.
78
+
79
+ </details>
80
+
81
+ ### 4. Verify Installation
82
+
83
+ Ask your AI assistant:
84
+
85
+ ```
86
+ "Can you list my ign8t projects?"
87
+ ```
88
+
89
+ If configured correctly, it will show your active projects!
90
+
91
+ ## Usage Examples
92
+
93
+ Once configured, you can interact with ign8t naturally through your AI assistant:
94
+
95
+ ### Project Management
96
+
97
+ ```
98
+ "Show me all my active projects"
99
+ "Get details about the [project name] project"
100
+ "Show me the BRD for [project name]"
101
+ "Display all documents for my current project"
102
+ ```
103
+
104
+ ### Task Workflow
105
+
106
+ ```
107
+ "What should I work on next?"
108
+ "Show me the backlog for [project name]"
109
+ "Search for tasks related to authentication"
110
+ "Update task [id] to in_progress"
111
+ "Mark task [id] as done with note: 'Implemented OAuth2'"
112
+ "Get full context for task [id]"
113
+ ```
114
+
115
+ ### Resources
116
+
117
+ The MCP server also provides quick access to resources:
118
+
119
+ - `ign8t://projects` - List of all your projects
120
+ - `ign8t://current-tasks` - Your active tasks across all projects
121
+
122
+ ## Available Tools Reference
123
+
124
+ | Tool | Description | Example Use |
125
+ | -------------------- | --------------------------------------------- | ------------------------------------------- |
126
+ | `list_projects` | List all projects with optional status filter | "Show my archived projects" |
127
+ | `get_project` | Get detailed project information | "Get details for project abc123" |
128
+ | `get_documents` | Retrieve BRD, PRD, TRD documents | "Show me the PRD for project xyz" |
129
+ | `get_backlog` | View epics, stories, and tasks | "Display backlog including completed items" |
130
+ | `get_next_task` | AI-recommended next task | "What should I work on next?" |
131
+ | `update_task_status` | Change task status with notes | "Set task 123 to blocked: waiting on API" |
132
+ | `search_tasks` | Search across tasks | "Find all tasks mentioning 'payment'" |
133
+ | `get_task_context` | Full task context with requirements | "Show context for task 456" |
134
+
135
+ ## Workflow Integration
136
+
137
+ The ign8t MCP server is designed to fit seamlessly into your development workflow:
138
+
139
+ 1. **Start your day**: "What are my current tasks?"
140
+ 2. **Get context**: "Show me the requirements for this task"
141
+ 3. **Update progress**: "Mark this task as in progress"
142
+ 4. **Search when stuck**: "Find similar tasks I've completed"
143
+ 5. **Complete work**: "Mark task as done and get my next task"
144
+
145
+ ## Troubleshooting
146
+
147
+ <details>
148
+ <summary><strong>AI assistant can't find ign8t commands</strong></summary>
149
+
150
+ 1. Verify the MCP server is installed: `which ign8t-mcp`
151
+ 2. Check your AI tool's configuration file has the correct path
152
+ 3. Restart your AI tool after configuration changes
153
+ 4. Ensure your API key is valid and active
154
+ </details>
155
+
156
+ <details>
157
+ <summary><strong>Getting "Invalid API key" errors</strong></summary>
158
+
159
+ 1. Verify your API key in the ign8t dashboard
160
+ 2. Check that the key is correctly set in your configuration
161
+ 3. Ensure there are no extra spaces or quotes around the key
162
+ 4. Generate a new key if the current one isn't working
163
+ </details>
164
+
165
+ <details>
166
+ <summary><strong>Can't see my projects</strong></summary>
167
+
168
+ 1. Ensure you're logged into the correct ign8t account
169
+ 2. Verify the API key belongs to your account
170
+ 3. Check that you have active projects in ign8t
171
+ 4. Try the command "list all my projects including archived"
172
+ </details>
173
+
174
+ ## Advanced Configuration
175
+
176
+ ### Custom API Endpoint (Optional)
177
+
178
+ The MCP server connects to `https://ign8t.com` by default. For enterprise deployments, self-hosted instances, or local development, you can override the API endpoint:
179
+
180
+ ```json
181
+ {
182
+ "mcpServers": {
183
+ "ign8t": {
184
+ "command": "ign8t-mcp",
185
+ "env": {
186
+ "IGN8T_API_KEY": "your-api-key",
187
+ "IGN8T_API_URL": "https://your-domain.com" // Optional - only for custom deployments
188
+ }
189
+ }
190
+ }
191
+ }
192
+ ```
193
+
194
+ **Note**: Most users don't need to set `IGN8T_API_URL`. It's only required if you're:
195
+
196
+ - Using an enterprise or self-hosted ign8t instance
197
+ - Developing locally (e.g., `http://localhost:3000`)
198
+ - Using a custom domain
199
+
200
+ ### Development Mode
201
+
202
+ For local development and testing:
203
+
204
+ 1. Clone this repository
205
+ 2. Install dependencies: `pnpm install`
206
+ 3. Copy `.env.example` to `.env` and add your API key (for development only!)
207
+ 4. Run in dev mode: `pnpm dev`
208
+ 5. Configure your AI tool to use the local path
209
+
210
+ **Note**: The `.env` file is ONLY for developers working on the MCP server itself. End users should configure their API key in their IDE's MCP settings, not in `.env` files.
211
+
212
+ ## Contributing
213
+
214
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
215
+
216
+ ### Development Setup
217
+
218
+ ```bash
219
+ # Clone the repository
220
+ git clone https://github.com/ign8t/mcp-server.git
221
+ cd mcp-server
222
+
223
+ # Install dependencies
224
+ pnpm install
225
+
226
+ # Run tests
227
+ pnpm test
228
+
229
+ # Build
230
+ pnpm build
231
+ ```
232
+
233
+ ## Support
234
+
235
+ - 📚 **Documentation**: [docs.ign8t.com/mcp](https://docs.ign8t.com/mcp)
236
+ - 🐛 **Issues**: [GitHub Issues](https://github.com/ign8t/mcp-server/issues)
237
+ - 💬 **Community**: [Discord](https://discord.gg/ign8t)
238
+ - 📧 **Email**: support@ign8t.com
239
+
240
+ ## License
241
+
242
+ MIT © ign8t team
243
+
244
+ ---
245
+
246
+ Built with ❤️ by the ign8t team to enhance your AI-powered development workflow.
package/dist/index.js ADDED
@@ -0,0 +1,332 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import * as dotenv from "dotenv";
6
+ // Load environment variables
7
+ dotenv.config();
8
+ // Configuration
9
+ const API_KEY = process.env.IGN8T_API_KEY;
10
+ const API_URL = process.env.IGN8T_API_URL || "https://ign8t.com";
11
+ if (!API_KEY) {
12
+ console.error("Error: IGN8T_API_KEY environment variable is required");
13
+ console.error("Get your API key from https://ign8t.com/settings/api-keys");
14
+ process.exit(1);
15
+ }
16
+ // Create MCP server instance
17
+ const server = new Server({
18
+ name: "ign8t-mcp",
19
+ version: "1.0.0",
20
+ }, {
21
+ capabilities: {
22
+ resources: {},
23
+ tools: {},
24
+ },
25
+ });
26
+ // Helper function to call ign8t API
27
+ async function callIgn8tAPI(endpoint, data = {}) {
28
+ try {
29
+ const response = await fetch(`${API_URL}/api/mcp${endpoint}`, {
30
+ method: "POST",
31
+ headers: {
32
+ "Content-Type": "application/json",
33
+ "X-API-Key": API_KEY,
34
+ },
35
+ body: JSON.stringify(data),
36
+ });
37
+ if (!response.ok) {
38
+ const error = await response.text();
39
+ throw new Error(error || `API error: ${response.status}`);
40
+ }
41
+ return response.json();
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error) {
45
+ throw error;
46
+ }
47
+ throw new Error("Failed to connect to ign8t API");
48
+ }
49
+ }
50
+ // Define available tools
51
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
52
+ return {
53
+ tools: [
54
+ {
55
+ name: "list_projects",
56
+ description: "List all your ign8t projects",
57
+ inputSchema: {
58
+ type: "object",
59
+ properties: {
60
+ status: {
61
+ type: "string",
62
+ enum: ["active", "archived", "all"],
63
+ description: "Filter by project status",
64
+ default: "active",
65
+ },
66
+ },
67
+ },
68
+ },
69
+ {
70
+ name: "get_project",
71
+ description: "Get detailed information about a specific project",
72
+ inputSchema: {
73
+ type: "object",
74
+ properties: {
75
+ project_id: {
76
+ type: "string",
77
+ description: "The project ID",
78
+ },
79
+ },
80
+ required: ["project_id"],
81
+ },
82
+ },
83
+ {
84
+ name: "get_documents",
85
+ description: "Get BRD, PRD, and TRD documents for a project",
86
+ inputSchema: {
87
+ type: "object",
88
+ properties: {
89
+ project_id: {
90
+ type: "string",
91
+ description: "The project ID",
92
+ },
93
+ document_type: {
94
+ type: "string",
95
+ enum: ["brd", "prd", "trd", "all"],
96
+ description: "Type of document to retrieve",
97
+ default: "all",
98
+ },
99
+ },
100
+ required: ["project_id"],
101
+ },
102
+ },
103
+ {
104
+ name: "get_backlog",
105
+ description: "Get the backlog (epics, stories, tasks) for a project",
106
+ inputSchema: {
107
+ type: "object",
108
+ properties: {
109
+ project_id: {
110
+ type: "string",
111
+ description: "The project ID",
112
+ },
113
+ include_completed: {
114
+ type: "boolean",
115
+ description: "Include completed tasks",
116
+ default: false,
117
+ },
118
+ },
119
+ required: ["project_id"],
120
+ },
121
+ },
122
+ {
123
+ name: "get_next_task",
124
+ description: "Get the next recommended task to work on",
125
+ inputSchema: {
126
+ type: "object",
127
+ properties: {
128
+ project_id: {
129
+ type: "string",
130
+ description: "The project ID",
131
+ },
132
+ context: {
133
+ type: "string",
134
+ description: "Optional context about what you want to work on",
135
+ },
136
+ },
137
+ required: ["project_id"],
138
+ },
139
+ },
140
+ {
141
+ name: "update_task_status",
142
+ description: "Update the status of a task",
143
+ inputSchema: {
144
+ type: "object",
145
+ properties: {
146
+ task_id: {
147
+ type: "string",
148
+ description: "The task ID",
149
+ },
150
+ status: {
151
+ type: "string",
152
+ enum: ["todo", "in_progress", "review", "done", "blocked"],
153
+ description: "New status for the task",
154
+ },
155
+ notes: {
156
+ type: "string",
157
+ description: "Optional notes about the status change",
158
+ },
159
+ },
160
+ required: ["task_id", "status"],
161
+ },
162
+ },
163
+ {
164
+ name: "search_tasks",
165
+ description: "Search for tasks across all your projects or within a specific project",
166
+ inputSchema: {
167
+ type: "object",
168
+ properties: {
169
+ query: {
170
+ type: "string",
171
+ description: "Search query",
172
+ },
173
+ project_id: {
174
+ type: "string",
175
+ description: "Optional: limit search to specific project",
176
+ },
177
+ status: {
178
+ type: "string",
179
+ enum: ["todo", "in_progress", "review", "done", "blocked", "all"],
180
+ description: "Filter by status",
181
+ default: "all",
182
+ },
183
+ },
184
+ required: ["query"],
185
+ },
186
+ },
187
+ {
188
+ name: "get_task_context",
189
+ description: "Get full context for a task including related BRD/PRD/TRD sections",
190
+ inputSchema: {
191
+ type: "object",
192
+ properties: {
193
+ task_id: {
194
+ type: "string",
195
+ description: "The task ID",
196
+ },
197
+ },
198
+ required: ["task_id"],
199
+ },
200
+ },
201
+ ],
202
+ };
203
+ });
204
+ // Handle tool calls
205
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
206
+ const { name, arguments: args } = request.params;
207
+ try {
208
+ let result;
209
+ switch (name) {
210
+ case "list_projects":
211
+ result = await callIgn8tAPI("/projects/list", args);
212
+ break;
213
+ case "get_project":
214
+ result = await callIgn8tAPI("/projects/get", args);
215
+ break;
216
+ case "get_documents":
217
+ result = await callIgn8tAPI("/documents/get", args);
218
+ break;
219
+ case "get_backlog":
220
+ result = await callIgn8tAPI("/backlog/get", args);
221
+ break;
222
+ case "get_next_task":
223
+ result = await callIgn8tAPI("/tasks/next", args);
224
+ break;
225
+ case "update_task_status":
226
+ result = await callIgn8tAPI("/tasks/update-status", args);
227
+ break;
228
+ case "search_tasks":
229
+ result = await callIgn8tAPI("/tasks/search", args);
230
+ break;
231
+ case "get_task_context":
232
+ result = await callIgn8tAPI("/tasks/context", args);
233
+ break;
234
+ default:
235
+ throw new Error(`Unknown tool: ${name}`);
236
+ }
237
+ return {
238
+ content: [
239
+ {
240
+ type: "text",
241
+ text: typeof result === "string" ? result : JSON.stringify(result, null, 2),
242
+ },
243
+ ],
244
+ };
245
+ }
246
+ catch (error) {
247
+ return {
248
+ content: [
249
+ {
250
+ type: "text",
251
+ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`,
252
+ },
253
+ ],
254
+ isError: true,
255
+ };
256
+ }
257
+ });
258
+ // Define available resources
259
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
260
+ return {
261
+ resources: [
262
+ {
263
+ uri: "ign8t://projects",
264
+ name: "Your Projects",
265
+ description: "List of all your ign8t projects",
266
+ mimeType: "application/json",
267
+ },
268
+ {
269
+ uri: "ign8t://current-tasks",
270
+ name: "Current Tasks",
271
+ description: "Your current in-progress tasks across all projects",
272
+ mimeType: "application/json",
273
+ },
274
+ ],
275
+ };
276
+ });
277
+ // Handle resource reads
278
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
279
+ const { uri } = request.params;
280
+ try {
281
+ if (uri === "ign8t://projects") {
282
+ const projects = await callIgn8tAPI("/projects/list", { status: "active" });
283
+ return {
284
+ contents: [
285
+ {
286
+ uri,
287
+ mimeType: "application/json",
288
+ text: JSON.stringify(projects, null, 2),
289
+ },
290
+ ],
291
+ };
292
+ }
293
+ if (uri === "ign8t://current-tasks") {
294
+ const tasks = await callIgn8tAPI("/tasks/current", {});
295
+ return {
296
+ contents: [
297
+ {
298
+ uri,
299
+ mimeType: "application/json",
300
+ text: JSON.stringify(tasks, null, 2),
301
+ },
302
+ ],
303
+ };
304
+ }
305
+ throw new Error(`Unknown resource: ${uri}`);
306
+ }
307
+ catch (error) {
308
+ return {
309
+ contents: [
310
+ {
311
+ uri,
312
+ mimeType: "application/json",
313
+ text: JSON.stringify({
314
+ error: error instanceof Error ? error.message : "Unknown error",
315
+ }),
316
+ },
317
+ ],
318
+ };
319
+ }
320
+ });
321
+ // Start the server
322
+ async function main() {
323
+ const transport = new StdioServerTransport();
324
+ await server.connect(transport);
325
+ console.error("ign8t MCP server v1.0.0");
326
+ console.error(`Connected to: ${API_URL}`);
327
+ console.error("Ready to serve requests...");
328
+ }
329
+ main().catch((error) => {
330
+ console.error("Server error:", error);
331
+ process.exit(1);
332
+ });
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@ign8t/mcp",
3
+ "version": "0.0.1",
4
+ "description": "MCP server for ign8t project management - AI IDE integration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "ign8t-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx src/index.ts",
18
+ "clean": "rm -rf dist",
19
+ "test": "node debug-mcp.js",
20
+ "prepublishOnly": "pnpm clean && pnpm build"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "ign8t",
25
+ "ai",
26
+ "ai-ide",
27
+ "cursor",
28
+ "claude"
29
+ ],
30
+ "author": "nocodecat",
31
+ "license": "MIT",
32
+ "homepage": "https://github.com/nocodecat/mcp-server",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/nocodecat/mcp-server.git"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^0.5.0",
39
+ "dotenv": "^16.3.1"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.10.5",
43
+ "tsx": "^4.7.0",
44
+ "typescript": "^5.3.3"
45
+ }
46
+ }