mcp-rgek 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/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # MCP RGEK - Knowledge Base Server
2
+
3
+ MCP Server for accessing RGEK Knowledge Base.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g mcp-rgek
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ Set environment variables:
14
+ ```bash
15
+ export RGEK_API_URL="http://your-api-url:8000"
16
+ export RGEK_API_USER="your-username"
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ Add to your MCP client configuration:
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "rgek": {
26
+ "command": "mcp-rgek"
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ ## Tools
33
+
34
+ - `search_articles`: Search articles by query with optional filters
35
+ - `get_article`: Get specific article by ID
36
+ - `list_categories`: List available areas and tags
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,226 @@
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, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import axios from 'axios';
6
+ const API_BASE_URL = process.env.RGEK_API_URL || 'http://localhost:8181/base';
7
+ const API_USER = process.env.RGEK_API_USER;
8
+ class RGEKServer {
9
+ server;
10
+ constructor() {
11
+ this.server = new Server({
12
+ name: 'mcp-rgek',
13
+ version: '1.0.0',
14
+ }, {
15
+ capabilities: {
16
+ tools: {},
17
+ },
18
+ });
19
+ this.setupToolHandlers();
20
+ }
21
+ setupToolHandlers() {
22
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
23
+ tools: [
24
+ {
25
+ name: 'search_articles',
26
+ description: 'Search for information in the RGEK knowledge base. Use this when the user asks for specific information, documentation, procedures, or knowledge that might be stored in the company knowledge base.',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ keywords: {
31
+ type: 'array',
32
+ items: { type: 'string' },
33
+ description: 'Keywords extracted from user query to search for relevant information (max 5)',
34
+ maxItems: 5,
35
+ },
36
+ areas: {
37
+ type: 'array',
38
+ items: { type: 'number' },
39
+ description: 'Optional area IDs to filter by',
40
+ },
41
+ tags: {
42
+ type: 'array',
43
+ items: { type: 'number' },
44
+ description: 'Optional tag IDs to filter by',
45
+ },
46
+ page: {
47
+ type: 'number',
48
+ description: 'Page number (default: 1)',
49
+ default: 1,
50
+ },
51
+ per_page: {
52
+ type: 'number',
53
+ description: 'Items per page (default: 10)',
54
+ default: 10,
55
+ },
56
+ },
57
+ required: ['keywords'],
58
+ },
59
+ },
60
+ {
61
+ name: 'get_article',
62
+ description: 'Get a specific article by ID',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ id: {
67
+ type: 'number',
68
+ description: 'Article ID',
69
+ },
70
+ },
71
+ required: ['id'],
72
+ },
73
+ },
74
+ {
75
+ name: 'list_categories',
76
+ description: 'List available areas and tags',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {},
80
+ },
81
+ },
82
+ ],
83
+ }));
84
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
85
+ const { name, arguments: args } = request.params;
86
+ try {
87
+ switch (name) {
88
+ case 'search_articles':
89
+ return await this.searchArticles(args);
90
+ case 'get_article':
91
+ return await this.getArticle(args);
92
+ case 'list_categories':
93
+ return await this.listCategories();
94
+ default:
95
+ throw new Error(`Unknown tool: ${name}`);
96
+ }
97
+ }
98
+ catch (error) {
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
104
+ },
105
+ ],
106
+ };
107
+ }
108
+ });
109
+ }
110
+ async getToken() {
111
+ if (!API_USER) {
112
+ throw new Error('RGEK_API_USER not configured');
113
+ }
114
+ const response = await axios.post(`${API_BASE_URL}/security/token/`, {
115
+ usuario: API_USER
116
+ }, {
117
+ headers: {
118
+ 'Content-Type': 'application/json'
119
+ }
120
+ });
121
+ return response.data.resultado.respuesta.token;
122
+ }
123
+ async makeRequest(endpoint, params) {
124
+ const token = await this.getToken();
125
+ const response = await axios.get(`${API_BASE_URL}${endpoint}`, {
126
+ headers: {
127
+ 'Authorization': `Bearer ${token}`
128
+ },
129
+ params,
130
+ });
131
+ return response.data;
132
+ }
133
+ async searchArticles(args) {
134
+ const { keywords, areas, tags, page = 1, per_page = 10 } = args;
135
+ const token = await this.getToken();
136
+ const searches = keywords.slice(0, 5).map((keyword) => axios.post(`${API_BASE_URL}/conocimiento/buscar/combinado`, {
137
+ keyword,
138
+ areas: areas || [],
139
+ tags: tags || [],
140
+ }, {
141
+ headers: {
142
+ 'Authorization': `Bearer ${token}`,
143
+ 'Content-Type': 'application/json'
144
+ },
145
+ params: { page: 1, per_page: 20 },
146
+ }));
147
+ const responses = await Promise.all(searches);
148
+ const allArticles = new Map();
149
+ let totalResults = 0;
150
+ responses.forEach(response => {
151
+ const data = response.data.resultado.respuesta;
152
+ totalResults += data.total;
153
+ data.data.forEach((article) => {
154
+ if (!allArticles.has(article.id)) {
155
+ allArticles.set(article.id, article);
156
+ }
157
+ });
158
+ });
159
+ const uniqueArticles = Array.from(allArticles.values())
160
+ .slice((page - 1) * per_page, page * per_page);
161
+ return {
162
+ content: [
163
+ {
164
+ type: 'text',
165
+ text: JSON.stringify({
166
+ keywords_used: keywords,
167
+ articles: uniqueArticles,
168
+ total: allArticles.size,
169
+ total_searches: totalResults,
170
+ page,
171
+ per_page,
172
+ }, null, 2),
173
+ },
174
+ ],
175
+ };
176
+ }
177
+ async getArticle(args) {
178
+ const { id } = args;
179
+ const token = await this.getToken();
180
+ const response = await axios.get(`${API_BASE_URL}/conocimiento/articulo/${id}`, {
181
+ headers: {
182
+ 'Authorization': `Bearer ${token}`
183
+ }
184
+ });
185
+ return {
186
+ content: [
187
+ {
188
+ type: 'text',
189
+ text: JSON.stringify(response.data.resultado.respuesta, null, 2),
190
+ },
191
+ ],
192
+ };
193
+ }
194
+ async listCategories() {
195
+ const token = await this.getToken();
196
+ const [areasResponse, tagsResponse] = await Promise.all([
197
+ axios.get(`${API_BASE_URL}/conocimiento/areas`, {
198
+ headers: { 'Authorization': `Bearer ${token}` },
199
+ params: { page: 1, per_page: 100 }
200
+ }),
201
+ axios.get(`${API_BASE_URL}/conocimiento/tags`, {
202
+ headers: { 'Authorization': `Bearer ${token}` },
203
+ params: { page: 1, per_page: 100 }
204
+ }),
205
+ ]);
206
+ return {
207
+ content: [
208
+ {
209
+ type: 'text',
210
+ text: JSON.stringify({
211
+ areas: areasResponse.data.resultado.respuesta.data,
212
+ tags: tagsResponse.data.resultado.respuesta.data,
213
+ }, null, 2),
214
+ },
215
+ ],
216
+ };
217
+ }
218
+ async run() {
219
+ const transport = new StdioServerTransport();
220
+ await this.server.connect(transport);
221
+ console.error('RGEK MCP server running on stdio');
222
+ }
223
+ }
224
+ const server = new RGEKServer();
225
+ server.run().catch(console.error);
226
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "mcp-rgek",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server for RGEK Knowledge Base",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "mcp-rgek": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsx src/index.ts"
14
+ },
15
+ "dependencies": {
16
+ "@modelcontextprotocol/sdk": "^0.6.0",
17
+ "axios": "^1.6.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.0.0",
21
+ "typescript": "^5.0.0",
22
+ "tsx": "^4.0.0"
23
+ },
24
+ "files": [
25
+ "dist/**/*"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public"
29
+ }
30
+ }