@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.
- package/README.md +246 -0
- package/dist/index.js +332 -0
- 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
|
+
}
|