@apono-io/mcp-mysql 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 ADDED
@@ -0,0 +1,26 @@
1
+ # @apono-io/mcp-mysql
2
+
3
+ Apono MCP server for MySQL databases with JIT credential support.
4
+
5
+ ## Tools
6
+
7
+ | Tool | Description |
8
+ |------|------------|
9
+ | `query` | Execute a read-only SQL SELECT query and return results |
10
+ | `execute` | Execute a SQL statement that modifies data (INSERT, UPDATE, DELETE) |
11
+ | `list_databases` | List all databases on the server |
12
+ | `list_tables` | List all tables in a database |
13
+ | `describe_table` | Get column names, types, constraints, and indexes for a table |
14
+ | `get_table_indexes` | List indexes on a specific table |
15
+ | `explain_query` | Get the execution plan for a SQL query |
16
+
17
+ All tools (except `list_databases`) accept a `database` parameter.
18
+
19
+ ## Environment Variables
20
+
21
+ | Variable | Description |
22
+ |----------|------------|
23
+ | `MYSQL_HOST` | MySQL server hostname |
24
+ | `MYSQL_PORT` | MySQL server port (default: 3306) |
25
+ | `MYSQL_USER` | Database username |
26
+ | `MYSQL_PASSWORD` | Database password |
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerTools } from '../tools.js';
4
+ describe('registerTools', () => {
5
+ it('registers all 7 mysql tools without error', () => {
6
+ const server = new McpServer({ name: 'test', version: '0.0.1' });
7
+ expect(() => registerTools(server)).not.toThrow();
8
+ });
9
+ });
10
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import mysql from 'mysql2/promise';
2
+ export declare function getPool(database: string): mysql.Pool;
3
+ export declare function closeAllPools(): Promise<void>;
4
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAenC,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAOpD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD"}
package/dist/db.js ADDED
@@ -0,0 +1,27 @@
1
+ import mysql from 'mysql2/promise';
2
+ const pools = new Map();
3
+ function getPoolConfig() {
4
+ return {
5
+ host: process.env.MYSQL_HOST,
6
+ port: process.env.MYSQL_PORT ? parseInt(process.env.MYSQL_PORT, 10) : 3306,
7
+ user: process.env.MYSQL_USER,
8
+ password: process.env.MYSQL_PASSWORD,
9
+ waitForConnections: true,
10
+ connectionLimit: 5,
11
+ };
12
+ }
13
+ export function getPool(database) {
14
+ const existing = pools.get(database);
15
+ if (existing)
16
+ return existing;
17
+ const pool = mysql.createPool({ ...getPoolConfig(), database });
18
+ pools.set(database, pool);
19
+ return pool;
20
+ }
21
+ export async function closeAllPools() {
22
+ for (const pool of pools.values()) {
23
+ await pool.end();
24
+ }
25
+ pools.clear();
26
+ }
27
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,SAAS,aAAa;IACpB,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1E,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACpC,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,CAAC;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
@@ -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,20 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { registerTools } from './tools.js';
5
+ import { closeAllPools } from './db.js';
6
+ import { log } from './logger.js';
7
+ const server = new McpServer({
8
+ name: '@apono-io/mcp-mysql',
9
+ version: '0.0.1',
10
+ });
11
+ registerTools(server);
12
+ const transport = new StdioServerTransport();
13
+ await server.connect(transport);
14
+ log('Server started');
15
+ process.on('SIGINT', async () => {
16
+ log('Shutting down');
17
+ await closeAllPools();
18
+ process.exit(0);
19
+ });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAEtB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,GAAG,CAAC,eAAe,CAAC,CAAC;IACrB,MAAM,aAAa,EAAE,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function log(message: string, ...args: unknown[]): void;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAE7D"}
package/dist/logger.js ADDED
@@ -0,0 +1,5 @@
1
+ const PREFIX = '[mcp-mysql]';
2
+ export function log(message, ...args) {
3
+ console.error(`${PREFIX} ${message}`, ...args);
4
+ }
5
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,aAAa,CAAC;AAE7B,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,GAAG,IAAe;IACrD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTools(server: McpServer): void;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2IrD"}
package/dist/tools.js ADDED
@@ -0,0 +1,116 @@
1
+ import { z } from 'zod';
2
+ import { getPool } from './db.js';
3
+ import { log } from './logger.js';
4
+ function textContent(text) {
5
+ return { content: [{ type: 'text', text }] };
6
+ }
7
+ function errorContent(toolName, err) {
8
+ log(`Error in ${toolName}:`, err);
9
+ return { content: [{ type: 'text', text: `Error: ${String(err)}` }], isError: true };
10
+ }
11
+ function formatRows(rows, emptyHint) {
12
+ if (rows.length === 0) {
13
+ const hint = emptyHint ?? 'No rows returned.';
14
+ return `${hint} Note: this may be due to insufficient permissions granted to the current database user.`;
15
+ }
16
+ return JSON.stringify(rows, null, 2);
17
+ }
18
+ export function registerTools(server) {
19
+ server.tool('query', 'Execute a read-only SQL SELECT query and return results.', { database: z.string().describe('The database to query'), sql: z.string().describe('The SQL SELECT query to execute') }, async ({ database, sql }) => {
20
+ log(`Tool called: query on ${database}`);
21
+ try {
22
+ const pool = getPool(database);
23
+ const [rows] = await pool.query(sql);
24
+ return textContent(formatRows(rows));
25
+ }
26
+ catch (err) {
27
+ return errorContent('query', err);
28
+ }
29
+ });
30
+ server.tool('execute', 'Execute a SQL statement that modifies data (INSERT, UPDATE, DELETE).', { database: z.string().describe('The database to execute against'), sql: z.string().describe('The SQL statement to execute') }, async ({ database, sql }) => {
31
+ log(`Tool called: execute on ${database}`);
32
+ try {
33
+ const pool = getPool(database);
34
+ const [result] = await pool.query(sql);
35
+ const affectedRows = result.affectedRows ?? 0;
36
+ return textContent(`Statement executed successfully. Rows affected: ${affectedRows}`);
37
+ }
38
+ catch (err) {
39
+ return errorContent('execute', err);
40
+ }
41
+ });
42
+ server.tool('list_databases', 'List all databases on the server.', {}, async () => {
43
+ log('Tool called: list_databases');
44
+ try {
45
+ const pool = getPool('information_schema');
46
+ const [rows] = await pool.query(`SELECT SCHEMA_NAME AS database_name FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys') ORDER BY SCHEMA_NAME`);
47
+ const databases = rows.map((r) => r.database_name);
48
+ if (databases.length === 0) {
49
+ return textContent('No databases found. Note: this may be due to insufficient permissions granted to the current database user.');
50
+ }
51
+ return textContent(databases.join('\n'));
52
+ }
53
+ catch (err) {
54
+ return errorContent('list_databases', err);
55
+ }
56
+ });
57
+ server.tool('list_tables', 'List all tables in a database.', { database: z.string().describe('The database to inspect') }, async ({ database }) => {
58
+ log(`Tool called: list_tables on ${database}`);
59
+ try {
60
+ const pool = getPool(database);
61
+ const [rows] = await pool.query(`SELECT TABLE_NAME AS table_name, TABLE_TYPE AS table_type FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME`, [database]);
62
+ return textContent(formatRows(rows));
63
+ }
64
+ catch (err) {
65
+ return errorContent('list_tables', err);
66
+ }
67
+ });
68
+ server.tool('describe_table', 'Get column names, types, constraints, and indexes for a table.', {
69
+ database: z.string().describe('The database the table belongs to'),
70
+ table: z.string().describe('The table name'),
71
+ }, async ({ database, table }) => {
72
+ log(`Tool called: describe_table on ${database}.${table}`);
73
+ try {
74
+ const pool = getPool(database);
75
+ const [rows] = await pool.query(`SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type, IS_NULLABLE AS is_nullable, COLUMN_DEFAULT AS column_default, COLUMN_KEY AS column_key, EXTRA AS extra
76
+ FROM information_schema.COLUMNS
77
+ WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
78
+ ORDER BY ORDINAL_POSITION`, [database, table]);
79
+ return textContent(formatRows(rows));
80
+ }
81
+ catch (err) {
82
+ return errorContent('describe_table', err);
83
+ }
84
+ });
85
+ server.tool('get_table_indexes', 'List indexes on a specific table.', {
86
+ database: z.string().describe('The database the table belongs to'),
87
+ table: z.string().describe('The table name'),
88
+ }, async ({ database, table }) => {
89
+ log(`Tool called: get_table_indexes on ${database}.${table}`);
90
+ try {
91
+ const pool = getPool(database);
92
+ const [rows] = await pool.query(`SHOW INDEX FROM \`${table}\` FROM \`${database}\``);
93
+ return textContent(formatRows(rows));
94
+ }
95
+ catch (err) {
96
+ return errorContent('get_table_indexes', err);
97
+ }
98
+ });
99
+ server.tool('explain_query', 'Get the execution plan for a SQL query.', {
100
+ database: z.string().describe('The database to explain the query against'),
101
+ sql: z.string().describe('The SQL query to explain'),
102
+ analyze: z.boolean().default(false).describe('Whether to actually execute the query for real timing data'),
103
+ }, async ({ database, sql, analyze }) => {
104
+ log(`Tool called: explain_query on ${database}`);
105
+ try {
106
+ const pool = getPool(database);
107
+ const explainSql = analyze ? `EXPLAIN ANALYZE ${sql}` : `EXPLAIN ${sql}`;
108
+ const [rows] = await pool.query(explainSql);
109
+ return textContent(formatRows(rows));
110
+ }
111
+ catch (err) {
112
+ return errorContent('explain_query', err);
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,GAAY;IAClD,GAAG,CAAC,YAAY,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;AACzG,CAAC;AAED,SAAS,UAAU,CAAC,IAA+B,EAAE,SAAkB;IACrE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,SAAS,IAAI,mBAAmB,CAAC;QAC9C,OAAO,GAAG,IAAI,0FAA0F,CAAC;IAC3G,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,MAAM,CAAC,IAAI,CACT,OAAO,EACP,0DAA0D,EAC1D,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,EACvH,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE;QAC1B,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,WAAW,CAAC,UAAU,CAAC,IAAiC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,SAAS,EACT,sEAAsE,EACtE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,EAC9H,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE;QAC1B,GAAG,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,YAAY,GAAI,MAAc,CAAC,YAAY,IAAI,CAAC,CAAC;YACvD,OAAO,WAAW,CAAC,mDAAmD,YAAY,EAAE,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,mCAAmC,EACnC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,iLAAiL,CAClL,CAAC;YACF,MAAM,SAAS,GAAI,IAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,6GAA6G,CAAC,CAAC;YACpI,CAAC;YACD,OAAO,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gCAAgC,EAChC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,EAC5D,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,qIAAqI,EACrI,CAAC,QAAQ,CAAC,CACX,CAAC;YACF,OAAO,WAAW,CAAC,UAAU,CAAC,IAAiC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gEAAgE,EAChE;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC7C,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,GAAG,CAAC,kCAAkC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;qCAG2B,EAC3B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAClB,CAAC;YACF,OAAO,WAAW,CAAC,UAAU,CAAC,IAAiC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,mCAAmC,EACnC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC7C,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,GAAG,CAAC,qCAAqC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,KAAK,aAAa,QAAQ,IAAI,CAAC,CAAC;YACrF,OAAO,WAAW,CAAC,UAAU,CAAC,IAAiC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yCAAyC,EACzC;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QAC1E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACpD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;KAC3G,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;QACnC,GAAG,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,WAAW,CAAC,UAAU,CAAC,IAAiC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@apono-io/mcp-mysql",
3
+ "version": "0.0.1",
4
+ "description": "Apono MCP server for MySQL databases with JIT credential support",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "apono-mcp-mysql": "dist/index.js"
10
+ },
11
+ "files": ["dist", "README.md"],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "test": "vitest run",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.12.0",
19
+ "mysql2": "^3.12.0",
20
+ "zod": "^3.24.0"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "^5.7.0",
24
+ "vitest": "^3.0.0"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ }
29
+ }