mcp-supabase-selfhosted 1.0.0 → 1.1.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/dist/index.js +66 -1
- package/package.json +2 -2
- package/src/index.ts +77 -1
package/dist/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { getConfig } from './config/env.js';
|
|
6
6
|
import { toolsDefinitions, handleExecuteSql, handleListBuckets, handleCreateBucket, handleDeleteBucket, handleListTables, handleListUsers, handleCreateUser, handleDeleteUser, handleGetSchema, handleGetAdvisors, handleListFiles, handleListRlsPolicies, handleGetActiveConnections, } from './tools/index.js';
|
|
7
|
+
import { query } from './db/postgres.js';
|
|
7
8
|
async function main() {
|
|
8
9
|
// 1. Validar la configuración al inicio
|
|
9
10
|
getConfig();
|
|
@@ -14,8 +15,72 @@ async function main() {
|
|
|
14
15
|
}, {
|
|
15
16
|
capabilities: {
|
|
16
17
|
tools: {},
|
|
18
|
+
resources: {},
|
|
19
|
+
prompts: {},
|
|
17
20
|
},
|
|
18
21
|
});
|
|
22
|
+
// --- RECURSOS (Resources) ---
|
|
23
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
24
|
+
return {
|
|
25
|
+
resources: [
|
|
26
|
+
{
|
|
27
|
+
uri: 'supabase://database/schema',
|
|
28
|
+
name: 'Esquema completo de la base de datos',
|
|
29
|
+
description: 'Devuelve la estructura de todas las tablas y columnas del esquema public.',
|
|
30
|
+
mimeType: 'application/json',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
36
|
+
if (request.params.uri === 'supabase://database/schema') {
|
|
37
|
+
const sql = `
|
|
38
|
+
SELECT table_name, column_name, data_type
|
|
39
|
+
FROM information_schema.columns
|
|
40
|
+
WHERE table_schema = 'public'
|
|
41
|
+
ORDER BY table_name, ordinal_position;
|
|
42
|
+
`;
|
|
43
|
+
const rows = await query(sql);
|
|
44
|
+
return {
|
|
45
|
+
contents: [
|
|
46
|
+
{
|
|
47
|
+
uri: request.params.uri,
|
|
48
|
+
mimeType: 'application/json',
|
|
49
|
+
text: JSON.stringify(rows, null, 2),
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
throw new Error('Resource not found');
|
|
55
|
+
});
|
|
56
|
+
// --- PROMPTS ---
|
|
57
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
58
|
+
return {
|
|
59
|
+
prompts: [
|
|
60
|
+
{
|
|
61
|
+
name: 'audit-security',
|
|
62
|
+
description: 'Realiza una auditoría de seguridad completa de la instancia de Supabase.',
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
68
|
+
if (request.params.name === 'audit-security') {
|
|
69
|
+
return {
|
|
70
|
+
description: 'Auditoría de seguridad de Supabase',
|
|
71
|
+
messages: [
|
|
72
|
+
{
|
|
73
|
+
role: 'user',
|
|
74
|
+
content: {
|
|
75
|
+
type: 'text',
|
|
76
|
+
text: 'Por favor, realiza los siguientes pasos para auditar mi instancia:\n1. Usa get_advisors para detectar problemas de rendimiento y RLS.\n2. Usa list_rls_policies para revisar todas las reglas de acceso activas.\n3. Usa get_active_connections para ver si hay accesos sospechosos o bloqueos.\n4. Finalmente, entrégame un reporte detallado con recomendaciones de seguridad.',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
throw new Error('Prompt not found');
|
|
83
|
+
});
|
|
19
84
|
// 3. Registrar el manejador para listar herramientas (Tools)
|
|
20
85
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
21
86
|
return {
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-supabase-selfhosted",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "An open-source Model Context Protocol (MCP) server designed specifically for self-hosted Supabase instances.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"mcp-supabase-selfhosted": "
|
|
8
|
+
"mcp-supabase-selfhosted": "dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"test": "tsx --test tests/tools.test.ts",
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
CallToolRequestSchema,
|
|
6
|
+
ListToolsRequestSchema,
|
|
7
|
+
ListResourcesRequestSchema,
|
|
8
|
+
ReadResourceRequestSchema,
|
|
9
|
+
ListPromptsRequestSchema,
|
|
10
|
+
GetPromptRequestSchema,
|
|
11
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
5
12
|
import { getConfig } from './config/env.js';
|
|
6
13
|
import {
|
|
7
14
|
toolsDefinitions,
|
|
@@ -19,6 +26,7 @@ import {
|
|
|
19
26
|
handleListRlsPolicies,
|
|
20
27
|
handleGetActiveConnections,
|
|
21
28
|
} from './tools/index.js';
|
|
29
|
+
import { query } from './db/postgres.js';
|
|
22
30
|
|
|
23
31
|
async function main() {
|
|
24
32
|
// 1. Validar la configuración al inicio
|
|
@@ -33,10 +41,78 @@ async function main() {
|
|
|
33
41
|
{
|
|
34
42
|
capabilities: {
|
|
35
43
|
tools: {},
|
|
44
|
+
resources: {},
|
|
45
|
+
prompts: {},
|
|
36
46
|
},
|
|
37
47
|
},
|
|
38
48
|
);
|
|
39
49
|
|
|
50
|
+
// --- RECURSOS (Resources) ---
|
|
51
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
52
|
+
return {
|
|
53
|
+
resources: [
|
|
54
|
+
{
|
|
55
|
+
uri: 'supabase://database/schema',
|
|
56
|
+
name: 'Esquema completo de la base de datos',
|
|
57
|
+
description: 'Devuelve la estructura de todas las tablas y columnas del esquema public.',
|
|
58
|
+
mimeType: 'application/json',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
65
|
+
if (request.params.uri === 'supabase://database/schema') {
|
|
66
|
+
const sql = `
|
|
67
|
+
SELECT table_name, column_name, data_type
|
|
68
|
+
FROM information_schema.columns
|
|
69
|
+
WHERE table_schema = 'public'
|
|
70
|
+
ORDER BY table_name, ordinal_position;
|
|
71
|
+
`;
|
|
72
|
+
const rows = await query(sql);
|
|
73
|
+
return {
|
|
74
|
+
contents: [
|
|
75
|
+
{
|
|
76
|
+
uri: request.params.uri,
|
|
77
|
+
mimeType: 'application/json',
|
|
78
|
+
text: JSON.stringify(rows, null, 2),
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
throw new Error('Resource not found');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// --- PROMPTS ---
|
|
87
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
88
|
+
return {
|
|
89
|
+
prompts: [
|
|
90
|
+
{
|
|
91
|
+
name: 'audit-security',
|
|
92
|
+
description: 'Realiza una auditoría de seguridad completa de la instancia de Supabase.',
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
99
|
+
if (request.params.name === 'audit-security') {
|
|
100
|
+
return {
|
|
101
|
+
description: 'Auditoría de seguridad de Supabase',
|
|
102
|
+
messages: [
|
|
103
|
+
{
|
|
104
|
+
role: 'user',
|
|
105
|
+
content: {
|
|
106
|
+
type: 'text',
|
|
107
|
+
text: 'Por favor, realiza los siguientes pasos para auditar mi instancia:\n1. Usa get_advisors para detectar problemas de rendimiento y RLS.\n2. Usa list_rls_policies para revisar todas las reglas de acceso activas.\n3. Usa get_active_connections para ver si hay accesos sospechosos o bloqueos.\n4. Finalmente, entrégame un reporte detallado con recomendaciones de seguridad.',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
throw new Error('Prompt not found');
|
|
114
|
+
});
|
|
115
|
+
|
|
40
116
|
// 3. Registrar el manejador para listar herramientas (Tools)
|
|
41
117
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
42
118
|
return {
|