@qikdev/mcp 1.0.0
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/LICENSE +21 -0
- package/README.md +237 -0
- package/build/bin/cli.d.ts +3 -0
- package/build/bin/cli.d.ts.map +1 -0
- package/build/bin/cli.js +265 -0
- package/build/bin/cli.js.map +1 -0
- package/build/src/config.d.ts +43 -0
- package/build/src/config.d.ts.map +1 -0
- package/build/src/config.js +152 -0
- package/build/src/config.js.map +1 -0
- package/build/src/index.d.ts +44 -0
- package/build/src/index.d.ts.map +1 -0
- package/build/src/index.js +731 -0
- package/build/src/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
export class ConfigManager {
|
|
6
|
+
configDir;
|
|
7
|
+
configFile;
|
|
8
|
+
mcpConfigFile;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.configDir = join(homedir(), '.qik-mcp');
|
|
11
|
+
this.configFile = join(this.configDir, 'config.json');
|
|
12
|
+
this.mcpConfigFile = join(homedir(), 'Library', 'Application Support', 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
|
|
13
|
+
}
|
|
14
|
+
async ensureConfigDir() {
|
|
15
|
+
try {
|
|
16
|
+
await fs.access(this.configDir);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
await fs.mkdir(this.configDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async saveConfig(config) {
|
|
23
|
+
await this.ensureConfigDir();
|
|
24
|
+
await fs.writeFile(this.configFile, JSON.stringify(config, null, 2));
|
|
25
|
+
}
|
|
26
|
+
async loadConfig() {
|
|
27
|
+
try {
|
|
28
|
+
const data = await fs.readFile(this.configFile, 'utf-8');
|
|
29
|
+
return JSON.parse(data);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async validateToken(token, apiUrl = 'https://api.qik.dev') {
|
|
36
|
+
try {
|
|
37
|
+
const response = await axios.get(`${apiUrl}/user`, {
|
|
38
|
+
headers: {
|
|
39
|
+
'Authorization': `Bearer ${token}`,
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
},
|
|
42
|
+
timeout: 10000,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
valid: true,
|
|
46
|
+
session: response.data,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (axios.isAxiosError(error)) {
|
|
51
|
+
if (error.response?.status === 401) {
|
|
52
|
+
return { valid: false, error: 'Invalid access token' };
|
|
53
|
+
}
|
|
54
|
+
else if (error.response?.status === 403) {
|
|
55
|
+
return { valid: false, error: 'Access denied - token may not have required permissions' };
|
|
56
|
+
}
|
|
57
|
+
else if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
|
|
58
|
+
return { valid: false, error: 'Cannot connect to Qik API - check your internet connection' };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { valid: false, error: error.message || 'Unknown error occurred' };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async addToMcpConfig(serverName = 'qik') {
|
|
65
|
+
try {
|
|
66
|
+
// Check if MCP config file exists
|
|
67
|
+
let mcpConfig = {};
|
|
68
|
+
try {
|
|
69
|
+
const data = await fs.readFile(this.mcpConfigFile, 'utf-8');
|
|
70
|
+
mcpConfig = JSON.parse(data);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// File doesn't exist, start with empty config
|
|
74
|
+
mcpConfig = { mcpServers: {} };
|
|
75
|
+
}
|
|
76
|
+
// Ensure mcpServers object exists
|
|
77
|
+
if (!mcpConfig.mcpServers) {
|
|
78
|
+
mcpConfig.mcpServers = {};
|
|
79
|
+
}
|
|
80
|
+
// Add or update the Qik server configuration
|
|
81
|
+
mcpConfig.mcpServers[serverName] = {
|
|
82
|
+
command: 'npx',
|
|
83
|
+
args: ['qik-mcp-server', 'run'],
|
|
84
|
+
};
|
|
85
|
+
// Ensure the directory exists
|
|
86
|
+
await fs.mkdir(join(this.mcpConfigFile, '..'), { recursive: true });
|
|
87
|
+
// Write the updated config
|
|
88
|
+
await fs.writeFile(this.mcpConfigFile, JSON.stringify(mcpConfig, null, 2));
|
|
89
|
+
return { success: true };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: `Failed to update MCP configuration: ${error.message}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async removeFromMcpConfig(serverName = 'qik') {
|
|
99
|
+
try {
|
|
100
|
+
const data = await fs.readFile(this.mcpConfigFile, 'utf-8');
|
|
101
|
+
const mcpConfig = JSON.parse(data);
|
|
102
|
+
if (mcpConfig.mcpServers && mcpConfig.mcpServers[serverName]) {
|
|
103
|
+
delete mcpConfig.mcpServers[serverName];
|
|
104
|
+
await fs.writeFile(this.mcpConfigFile, JSON.stringify(mcpConfig, null, 2));
|
|
105
|
+
}
|
|
106
|
+
return { success: true };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return {
|
|
110
|
+
success: false,
|
|
111
|
+
error: `Failed to remove from MCP configuration: ${error.message}`
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async isConfigured() {
|
|
116
|
+
const config = await this.loadConfig();
|
|
117
|
+
return config !== null && !!config.accessToken;
|
|
118
|
+
}
|
|
119
|
+
async getStatus() {
|
|
120
|
+
try {
|
|
121
|
+
const config = await this.loadConfig();
|
|
122
|
+
if (!config) {
|
|
123
|
+
return { configured: false };
|
|
124
|
+
}
|
|
125
|
+
const validation = await this.validateToken(config.accessToken, config.apiUrl);
|
|
126
|
+
// Check if MCP is configured
|
|
127
|
+
let mcpConfigured = false;
|
|
128
|
+
try {
|
|
129
|
+
const mcpData = await fs.readFile(this.mcpConfigFile, 'utf-8');
|
|
130
|
+
const mcpConfig = JSON.parse(mcpData);
|
|
131
|
+
mcpConfigured = !!(mcpConfig.mcpServers && mcpConfig.mcpServers[config.serverName || 'qik']);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
mcpConfigured = false;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
configured: true,
|
|
138
|
+
config,
|
|
139
|
+
tokenValid: validation.valid,
|
|
140
|
+
mcpConfigured,
|
|
141
|
+
...(validation.error && { error: validation.error }),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return {
|
|
146
|
+
configured: false,
|
|
147
|
+
error: error.message,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Qik Platform MCP Server
|
|
4
|
+
*
|
|
5
|
+
* This MCP server provides comprehensive integration with the Qik platform,
|
|
6
|
+
* enabling AI assistants to interact with Qik's content management system,
|
|
7
|
+
* user management, forms, files, and more.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Content management (CRUD operations)
|
|
11
|
+
* - Content type discovery via glossary
|
|
12
|
+
* - User and profile management
|
|
13
|
+
* - Form handling and submissions
|
|
14
|
+
* - File upload and management
|
|
15
|
+
* - Search and filtering capabilities
|
|
16
|
+
* - Scope and permission management
|
|
17
|
+
*/
|
|
18
|
+
export declare class QikMCPServer {
|
|
19
|
+
private server;
|
|
20
|
+
private axiosInstance;
|
|
21
|
+
private glossary;
|
|
22
|
+
constructor();
|
|
23
|
+
private initializeGlossary;
|
|
24
|
+
private formatError;
|
|
25
|
+
private setupToolHandlers;
|
|
26
|
+
private getUserSession;
|
|
27
|
+
private getGlossary;
|
|
28
|
+
private getContentDefinition;
|
|
29
|
+
private getContent;
|
|
30
|
+
private listContent;
|
|
31
|
+
private createContent;
|
|
32
|
+
private updateContent;
|
|
33
|
+
private deleteContent;
|
|
34
|
+
private listProfiles;
|
|
35
|
+
private createProfile;
|
|
36
|
+
private getForm;
|
|
37
|
+
private submitForm;
|
|
38
|
+
private uploadFile;
|
|
39
|
+
private searchContent;
|
|
40
|
+
private getScopes;
|
|
41
|
+
private getSmartlist;
|
|
42
|
+
run(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG;AAwFH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAyC;;YAwC3C,kBAAkB;IAUhC,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;YAmcX,cAAc;YAUd,WAAW;YAaX,oBAAoB;YAUpB,UAAU;YAkBV,WAAW;YAiBX,aAAa;YAgBb,aAAa;YAWb,aAAa;YAUb,YAAY;YAeZ,aAAa;YAmBb,OAAO;YAUP,UAAU;YAUV,UAAU;YA4BV,aAAa;YAgCb,SAAS;YAUT,YAAY;IAUpB,GAAG;CAKV"}
|