basedoc-dameng-mcp 0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 bravejack
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # dameng-mcp
2
+
3
+ Read-only MCP server for Dameng (DM8). Built after rejecting `zqeast/dameng-mcp-server` for stdout-leaking the password and offering an unguarded `execute_sql`.
4
+
5
+ ## Guarantees
6
+
7
+ - **Read-only at the application layer.** Only `SELECT` / `WITH` / `EXPLAIN` are accepted. Multi-statement input is rejected. Leading line/block comments are stripped before classification, so `-- foo\nDROP TABLE t` is also rejected.
8
+ - **No password fallback.** `DAMENG_PASSWORD` must be set; missing → exit 2. Nothing defaults to `SYSDBA`.
9
+ - **stderr-only logging.** stdio's stdout is the JSON-RPC channel — every log line goes through `console.error`.
10
+ - **Timeout + row cap.** Every query is bounded by `DAMENG_QUERY_TIMEOUT_MS` (default 10s) and capped at `DAMENG_MAX_ROWS` (default 1000). On timeout the underlying connection is closed.
11
+ - **Pinned dependencies.** `dmdb`, `@modelcontextprotocol/sdk`, and `zod` are all locked to exact versions.
12
+
13
+ The first line of defense is still **using a low-privilege Dameng account**. The app-layer guard is belt-and-braces; the database account should not have DML/DDL grants in the first place.
14
+
15
+ ## Provision a read-only DB user
16
+
17
+ ```sql
18
+ CREATE USER MCP_RO IDENTIFIED BY "<strong-password>";
19
+ GRANT CONNECT TO MCP_RO;
20
+ GRANT SELECT ON <schema>.<table> TO MCP_RO;
21
+ -- or grant on a whole schema you trust:
22
+ -- GRANT SELECT ANY TABLE TO MCP_RO;
23
+ GRANT SELECT ON V$INSTANCE TO MCP_RO;
24
+ GRANT SELECT ON V$DATABASE TO MCP_RO;
25
+ ```
26
+
27
+ ## Build
28
+
29
+ ```bash
30
+ npm install
31
+ npm run build
32
+ ```
33
+
34
+ ## Configuration (env vars)
35
+
36
+ | Variable | Required | Default | Notes |
37
+ |---|---|---|---|
38
+ | `DAMENG_HOST` | yes | — | e.g. `dameng.example.com` |
39
+ | `DAMENG_PORT` | yes | — | e.g. `5236` |
40
+ | `DAMENG_USER` | yes | — | low-privilege account |
41
+ | `DAMENG_PASSWORD` | yes | — | no fallback |
42
+ | `DAMENG_SCHEMA` | no | — | default schema for `list_tables` / `describe_table` |
43
+ | `DAMENG_QUERY_TIMEOUT_MS` | no | `10000` | per-query timeout |
44
+ | `DAMENG_MAX_ROWS` | no | `1000` | hard cap on returned rows |
45
+ | `DAMENG_POOL_MIN` | no | `1` | |
46
+ | `DAMENG_POOL_MAX` | no | `4` | |
47
+ | `DAMENG_DOCS_ROOT` | no | — | absolute path to a directory of Markdown manuals. Enables the docs tools. |
48
+ | `DAMENG_DOCS_INCLUDE` | no | — | comma-separated top-level dir patterns to include (glob `*` supported). Recommended: `DM8-*` to scope to official manuals only. |
49
+ | `DAMENG_DOCS_EXCLUDE` | no | — | comma-separated top-level dir patterns to exclude. `node_modules` is always excluded. |
50
+
51
+ ## Tools
52
+
53
+ ### Database (require DB connection)
54
+ - `query(sql)` — run a single read-only statement.
55
+ - `list_tables(schema?)` — tables in a schema (defaults to `DAMENG_SCHEMA` or current user).
56
+ - `describe_table(table, schema?)` — columns + types for one table.
57
+ - `instance_status()` — `V$INSTANCE` + `V$DATABASE` snapshot.
58
+
59
+ ### Docs (require `DAMENG_DOCS_ROOT`)
60
+ - `list_manuals()` — discover what manuals exist; each entry has `fileCount` and a short index summary (from `00-目录索引.md` or `README.md`).
61
+ - `list_sections(manual)` — list `.md` chapters in one manual with their H1/H2 headings (with line numbers).
62
+ - `read_section(file, heading?, maxBytes?)` — read a chapter or a single heading-bounded section. Use this to pull full context after a `lookup_docs` hit.
63
+ - `lookup_docs(query, manual?, regex?, maxMatches?)` — keyword/regex search. Results are **grouped by section** (file + nearest heading), each match has line ± 1 line of context, sections sorted by match count descending.
64
+
65
+ **Recommended workflow** for the LLM client:
66
+ 1. `list_manuals()` → know what's available
67
+ 2. `lookup_docs("keyword", manual: "DM8-...")` → find candidate sections
68
+ 3. `read_section(file, heading)` → pull the full passage
69
+ 4. Synthesize the answer for the user
70
+
71
+ ### Safety
72
+ - `list_tables` / `describe_table` build their SQL internally and only accept identifier-shaped input (`[A-Za-z_][A-Za-z0-9_]*`).
73
+ - All docs tools only read `.md` files under `DAMENG_DOCS_ROOT`. `manual` and `file` parameters reject `..`, leading `.`, leading `/`, and other unsafe segments — no path traversal. `node_modules` directories are never walked.
74
+
75
+ ## Register with Claude Code
76
+
77
+ ```bash
78
+ claude mcp add dameng-prod \
79
+ -e DAMENG_HOST=<your-dameng-host> \
80
+ -e DAMENG_PORT=5236 \
81
+ -e DAMENG_USER=MCP_RO \
82
+ -e DAMENG_PASSWORD=<password> \
83
+ -e DAMENG_SCHEMA=<your-schema> \
84
+ -e DAMENG_DOCS_ROOT=/path/to/dameng-docs \
85
+ -e DAMENG_DOCS_INCLUDE='DM8-*' \
86
+ -- npx -y basedoc-dameng-mcp
87
+ ```
88
+
89
+ Or, if you cloned the repo and want to run from source:
90
+
91
+ ```bash
92
+ -- node /path/to/basedoc-dameng-mcp/dist/server.js
93
+ ```
94
+
95
+ Register one MCP server per Dameng instance. If the same box hosts multiple instances on different ports, use distinct names like `dameng-prod-a` / `dameng-prod-b`.
96
+
97
+ ## Tests
98
+
99
+ ```bash
100
+ npm test
101
+ ```
102
+
103
+ Tests cover the SQL guard (rejection rules, comment stripping, multi-statement detection), the config loader (required vars, no password fallback, type validation, docs-root + include/exclude validation), the timeout helper, and the docs layer (`searchDocs` grouping/ranking/context, `listManuals`, `listSections`, `readSection` heading extraction + path-traversal safety). The dmdb integration is not unit-tested; verify it by pointing at a real instance.
104
+
105
+ ## What is NOT here, by design
106
+
107
+ - No `execute_sql` / no DML / no DDL. If you need writes, write them directly with `dmctl`/JDBC, not through an LLM.
108
+ - No HTTP transport. stdio only — no inbound network surface.
109
+ - No automatic schema introspection on startup. Tools query system views on demand.
110
+
111
+ ## Known transitive vulnerabilities
112
+
113
+ `npm audit` flags issues in `@modelcontextprotocol/sdk`'s HTTP transport chain (`express-rate-limit` → `ip-address`) and in the dev-only Vitest/Vite chain. The stdio server we ship doesn't load the HTTP transport, and Vitest isn't part of the runtime. These will clear when upstream bumps; we don't paper over them with `npm audit fix --force`.
package/dist/config.js ADDED
@@ -0,0 +1,72 @@
1
+ export class ConfigError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "ConfigError";
5
+ }
6
+ }
7
+ const REQUIRED = ["DAMENG_HOST", "DAMENG_PORT", "DAMENG_USER", "DAMENG_PASSWORD"];
8
+ export function loadConfig(env) {
9
+ for (const key of REQUIRED) {
10
+ if (!env[key] || env[key].length === 0) {
11
+ throw new ConfigError(`Missing required env var: ${key}`);
12
+ }
13
+ }
14
+ const port = parsePositiveInt(env.DAMENG_PORT, "DAMENG_PORT");
15
+ const queryTimeoutMs = env.DAMENG_QUERY_TIMEOUT_MS
16
+ ? parsePositiveInt(env.DAMENG_QUERY_TIMEOUT_MS, "DAMENG_QUERY_TIMEOUT_MS")
17
+ : 10_000;
18
+ const maxRows = env.DAMENG_MAX_ROWS
19
+ ? parsePositiveInt(env.DAMENG_MAX_ROWS, "DAMENG_MAX_ROWS")
20
+ : 1000;
21
+ const poolMin = env.DAMENG_POOL_MIN
22
+ ? parsePositiveInt(env.DAMENG_POOL_MIN, "DAMENG_POOL_MIN")
23
+ : 1;
24
+ const poolMax = env.DAMENG_POOL_MAX
25
+ ? parsePositiveInt(env.DAMENG_POOL_MAX, "DAMENG_POOL_MAX")
26
+ : 4;
27
+ let docsRoot;
28
+ if (env.DAMENG_DOCS_ROOT) {
29
+ if (!env.DAMENG_DOCS_ROOT.startsWith("/")) {
30
+ throw new ConfigError(`DAMENG_DOCS_ROOT must be an absolute path, got "${env.DAMENG_DOCS_ROOT}"`);
31
+ }
32
+ docsRoot = env.DAMENG_DOCS_ROOT.replace(/\/+$/, "");
33
+ }
34
+ const docsInclude = parsePatternList(env.DAMENG_DOCS_INCLUDE);
35
+ const docsExclude = parsePatternList(env.DAMENG_DOCS_EXCLUDE);
36
+ return {
37
+ host: env.DAMENG_HOST,
38
+ port,
39
+ user: env.DAMENG_USER,
40
+ password: env.DAMENG_PASSWORD,
41
+ schema: env.DAMENG_SCHEMA,
42
+ queryTimeoutMs,
43
+ maxRows,
44
+ poolMin,
45
+ poolMax,
46
+ docsRoot,
47
+ docsInclude,
48
+ docsExclude,
49
+ };
50
+ }
51
+ function parsePatternList(raw) {
52
+ if (!raw)
53
+ return [];
54
+ return raw
55
+ .split(",")
56
+ .map((s) => s.trim())
57
+ .filter((s) => s.length > 0);
58
+ }
59
+ function parsePositiveInt(raw, name) {
60
+ if (!raw) {
61
+ throw new ConfigError(`${name} is required`);
62
+ }
63
+ if (!/^[0-9]+$/.test(raw)) {
64
+ throw new ConfigError(`${name} must be a positive integer, got "${raw}"`);
65
+ }
66
+ const n = Number(raw);
67
+ if (!Number.isFinite(n) || n <= 0) {
68
+ throw new ConfigError(`${name} must be > 0, got ${n}`);
69
+ }
70
+ return n;
71
+ }
72
+ //# 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,79 @@
1
+ import dmdb from "dmdb";
2
+ import { ensureReadOnly } from "./sql-guard.js";
3
+ import { withTimeout } from "./with-timeout.js";
4
+ export class Database {
5
+ config;
6
+ pool = null;
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ async connect() {
11
+ if (this.pool)
12
+ return;
13
+ const connectString = buildConnectString(this.config);
14
+ this.pool = await dmdb.createPool({
15
+ connectString,
16
+ poolMin: this.config.poolMin,
17
+ poolMax: this.config.poolMax,
18
+ poolAlias: "dameng-mcp",
19
+ });
20
+ console.error(`[dameng-mcp] connected to ${this.config.host}:${this.config.port} as ${this.config.user}`);
21
+ }
22
+ async close() {
23
+ if (!this.pool)
24
+ return;
25
+ const pool = this.pool;
26
+ this.pool = null;
27
+ await pool.close(2);
28
+ }
29
+ async runReadOnly(sql) {
30
+ const safeSql = ensureReadOnly(sql);
31
+ return this.runRaw(safeSql);
32
+ }
33
+ /**
34
+ * Internal helper used by built-in tools (list_tables, describe_table,
35
+ * instance_status) that build their own SELECT against system views.
36
+ * Still capped by maxRows and timeout. Never expose to user-supplied input.
37
+ */
38
+ async runRaw(sql) {
39
+ if (!this.pool) {
40
+ throw new Error("Database not connected");
41
+ }
42
+ const conn = await this.pool.getConnection();
43
+ let timedOut = false;
44
+ try {
45
+ const exec = conn.execute(sql, [], {
46
+ outFormat: dmdb.OUT_FORMAT_OBJECT,
47
+ maxRows: this.config.maxRows + 1,
48
+ autoCommit: false,
49
+ extendedMetaData: false,
50
+ });
51
+ const result = await withTimeout(exec, this.config.queryTimeoutMs, "query", () => {
52
+ timedOut = true;
53
+ conn.close().catch(() => { });
54
+ });
55
+ const allRows = result.rows ?? [];
56
+ const truncated = allRows.length > this.config.maxRows;
57
+ const rows = truncated ? allRows.slice(0, this.config.maxRows) : allRows;
58
+ const columns = (result.metaData ?? [])
59
+ .filter((m) => !Array.isArray(m))
60
+ .map((m) => m.name);
61
+ return { columns, rows, truncated, rowCount: rows.length };
62
+ }
63
+ finally {
64
+ if (!timedOut) {
65
+ await conn.close().catch(() => { });
66
+ }
67
+ }
68
+ }
69
+ }
70
+ function buildConnectString(c) {
71
+ const auth = `${encodeURIComponent(c.user)}:${encodeURIComponent(c.password)}`;
72
+ const params = new URLSearchParams();
73
+ if (c.schema)
74
+ params.set("schema", c.schema);
75
+ params.set("autoCommit", "false");
76
+ const qs = params.toString();
77
+ return `dm://${auth}@${c.host}:${c.port}${qs ? `?${qs}` : ""}`;
78
+ }
79
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,OAAO,QAAQ;IAGU;IAFrB,IAAI,GAAqB,IAAI,CAAC;IAEtC,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QACtB,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YAChC,aAAa;YACb,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CACX,6BAA6B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAA0B,GAAG,EAAE,EAAE,EAAE;gBAC1D,SAAS,EAAE,IAAI,CAAC,iBAAiB;gBACjC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC;gBAChC,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,OAAO,EACP,GAAG,EAAE;gBACH,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/B,CAAC,CACF,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YACvD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,kBAAkB,CAAC,CAAS;IACnC,MAAM,IAAI,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/E,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACjE,CAAC"}
package/dist/docs.js ADDED
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
package/dist/server.js ADDED
@@ -0,0 +1,333 @@
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 { z } from "zod";
5
+ import { loadConfig, ConfigError } from "./config.js";
6
+ import { Database } from "./database.js";
7
+ import { searchDocs, listManuals, listSections, readSection, DocsSearchError, } from "./docs.js";
8
+ import { SqlGuardError } from "./sql-guard.js";
9
+ import { TimeoutError } from "./with-timeout.js";
10
+ const IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
11
+ function quoteIdent(name) {
12
+ if (!IDENT.test(name)) {
13
+ throw new Error(`Invalid identifier: ${name}`);
14
+ }
15
+ return `"${name.toUpperCase()}"`;
16
+ }
17
+ function formatResult(r) {
18
+ const header = r.truncated
19
+ ? `(${r.rowCount} rows shown — truncated by maxRows)`
20
+ : `(${r.rowCount} rows)`;
21
+ if (r.rows.length === 0) {
22
+ return `${header}\n[no rows]`;
23
+ }
24
+ return `${header}\n${JSON.stringify(r.rows, replacer, 2)}`;
25
+ }
26
+ function replacer(_key, value) {
27
+ if (typeof value === "bigint")
28
+ return value.toString();
29
+ if (value instanceof Date)
30
+ return value.toISOString();
31
+ return value;
32
+ }
33
+ function toolError(message) {
34
+ return {
35
+ isError: true,
36
+ content: [{ type: "text", text: message }],
37
+ };
38
+ }
39
+ function toolText(text) {
40
+ return { content: [{ type: "text", text }] };
41
+ }
42
+ async function main() {
43
+ let config;
44
+ try {
45
+ config = loadConfig(process.env);
46
+ }
47
+ catch (e) {
48
+ if (e instanceof ConfigError) {
49
+ console.error(`[dameng-mcp] config error: ${e.message}`);
50
+ process.exit(2);
51
+ }
52
+ throw e;
53
+ }
54
+ const db = new Database(config);
55
+ await db.connect();
56
+ const server = new McpServer({
57
+ name: "dameng-mcp",
58
+ version: "0.1.0",
59
+ });
60
+ server.registerTool("query", {
61
+ description: "Execute a read-only SQL statement against Dameng. Only SELECT/WITH/EXPLAIN are accepted; multi-statement input is rejected. Results are capped by DAMENG_MAX_ROWS.",
62
+ inputSchema: {
63
+ sql: z.string().describe("Single SELECT, WITH, or EXPLAIN statement."),
64
+ },
65
+ annotations: { readOnlyHint: true, destructiveHint: false },
66
+ }, async ({ sql }) => {
67
+ try {
68
+ const result = await db.runReadOnly(sql);
69
+ return toolText(formatResult(result));
70
+ }
71
+ catch (e) {
72
+ return toolError(formatToolError(e));
73
+ }
74
+ });
75
+ server.registerTool("list_tables", {
76
+ description: "List tables in a schema. Defaults to DAMENG_SCHEMA (or the connected user's schema if unset).",
77
+ inputSchema: {
78
+ schema: z
79
+ .string()
80
+ .optional()
81
+ .describe("Schema/owner name. Identifier characters only."),
82
+ },
83
+ annotations: { readOnlyHint: true, destructiveHint: false },
84
+ }, async ({ schema }) => {
85
+ try {
86
+ const owner = schema ?? config.schema;
87
+ const sql = owner
88
+ ? `SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE OWNER = '${quoteIdent(owner).slice(1, -1)}' ORDER BY TABLE_NAME`
89
+ : `SELECT TABLE_NAME FROM USER_TABLES ORDER BY TABLE_NAME`;
90
+ const result = await db.runRaw(sql);
91
+ return toolText(formatResult(result));
92
+ }
93
+ catch (e) {
94
+ return toolError(formatToolError(e));
95
+ }
96
+ });
97
+ server.registerTool("describe_table", {
98
+ description: "Show columns and data types for a table.",
99
+ inputSchema: {
100
+ table: z.string().describe("Table name."),
101
+ schema: z.string().optional().describe("Schema/owner name (optional)."),
102
+ },
103
+ annotations: { readOnlyHint: true, destructiveHint: false },
104
+ }, async ({ table, schema }) => {
105
+ try {
106
+ const tableQ = quoteIdent(table).slice(1, -1);
107
+ const owner = schema ?? config.schema;
108
+ const sql = owner
109
+ ? `SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT
110
+ FROM ALL_TAB_COLUMNS
111
+ WHERE OWNER = '${quoteIdent(owner).slice(1, -1)}' AND TABLE_NAME = '${tableQ}'
112
+ ORDER BY COLUMN_ID`
113
+ : `SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT
114
+ FROM USER_TAB_COLUMNS
115
+ WHERE TABLE_NAME = '${tableQ}'
116
+ ORDER BY COLUMN_ID`;
117
+ const result = await db.runRaw(sql);
118
+ return toolText(formatResult(result));
119
+ }
120
+ catch (e) {
121
+ return toolError(formatToolError(e));
122
+ }
123
+ });
124
+ server.registerTool("lookup_docs", {
125
+ description: "Search the local Dameng knowledge base (Markdown manuals) for a phrase or pattern. Returns matches grouped by file with the nearest preceding heading. Requires DAMENG_DOCS_ROOT to be set.",
126
+ inputSchema: {
127
+ query: z.string().describe("Phrase to search for (literal, case-insensitive by default)."),
128
+ manual: z
129
+ .string()
130
+ .optional()
131
+ .describe("Optional top-level subdirectory under DAMENG_DOCS_ROOT to restrict the search (e.g. DM8-SQL语言使用手册)."),
132
+ regex: z
133
+ .boolean()
134
+ .optional()
135
+ .describe("Treat query as a JavaScript regex (case-insensitive). Default false."),
136
+ maxMatches: z
137
+ .number()
138
+ .int()
139
+ .positive()
140
+ .optional()
141
+ .describe("Cap on returned matches. Default 30."),
142
+ },
143
+ annotations: { readOnlyHint: true, destructiveHint: false },
144
+ }, async ({ query, manual, regex, maxMatches }) => {
145
+ if (!config.docsRoot)
146
+ return docsRootMissingError();
147
+ try {
148
+ const sections = await searchDocs({
149
+ root: config.docsRoot,
150
+ query,
151
+ manual,
152
+ regex,
153
+ maxMatches,
154
+ include: config.docsInclude,
155
+ exclude: config.docsExclude,
156
+ });
157
+ return toolText(formatSections(sections, maxMatches ?? 30));
158
+ }
159
+ catch (e) {
160
+ return toolError(formatToolError(e));
161
+ }
162
+ });
163
+ server.registerTool("list_manuals", {
164
+ description: "List the Dameng manuals available under DAMENG_DOCS_ROOT, with file counts and a short index summary per manual. Use this to discover what to pass to list_sections / lookup_docs(manual=...).",
165
+ inputSchema: {},
166
+ annotations: { readOnlyHint: true, destructiveHint: false },
167
+ }, async () => {
168
+ if (!config.docsRoot)
169
+ return docsRootMissingError();
170
+ try {
171
+ const manuals = await listManuals({
172
+ root: config.docsRoot,
173
+ include: config.docsInclude,
174
+ exclude: config.docsExclude,
175
+ });
176
+ return toolText(formatManuals(manuals));
177
+ }
178
+ catch (e) {
179
+ return toolError(formatToolError(e));
180
+ }
181
+ });
182
+ server.registerTool("list_sections", {
183
+ description: "List the .md files (chapters) inside one manual along with their H1/H2 headings. Use the (file, heading) pair to call read_section.",
184
+ inputSchema: {
185
+ manual: z.string().describe("Manual name (top-level dir under DAMENG_DOCS_ROOT)."),
186
+ },
187
+ annotations: { readOnlyHint: true, destructiveHint: false },
188
+ }, async ({ manual }) => {
189
+ if (!config.docsRoot)
190
+ return docsRootMissingError();
191
+ try {
192
+ const files = await listSections({ root: config.docsRoot, manual });
193
+ return toolText(formatSectionList(files));
194
+ }
195
+ catch (e) {
196
+ return toolError(formatToolError(e));
197
+ }
198
+ });
199
+ server.registerTool("read_section", {
200
+ description: "Read a Markdown chapter under DAMENG_DOCS_ROOT. With heading omitted, returns the whole file. With heading set, returns text from that heading until the next same-or-higher heading. Use after lookup_docs / list_sections to pull full context.",
201
+ inputSchema: {
202
+ file: z
203
+ .string()
204
+ .describe("Relative path under DAMENG_DOCS_ROOT, e.g. DM8-数据守护与读写分离集群/data-watch-version-upgrade.md"),
205
+ heading: z
206
+ .string()
207
+ .optional()
208
+ .describe("Heading text (without # markers) to extract a single section."),
209
+ maxBytes: z
210
+ .number()
211
+ .int()
212
+ .positive()
213
+ .optional()
214
+ .describe("Cap on returned content size. Default 64000."),
215
+ },
216
+ annotations: { readOnlyHint: true, destructiveHint: false },
217
+ }, async ({ file, heading, maxBytes }) => {
218
+ if (!config.docsRoot)
219
+ return docsRootMissingError();
220
+ try {
221
+ const r = await readSection({ root: config.docsRoot, file, heading, maxBytes });
222
+ const header = r.heading
223
+ ? `# ${r.file} — ${r.heading}${r.truncated ? " (truncated)" : ""}\n\n`
224
+ : `# ${r.file}${r.truncated ? " (truncated)" : ""}\n\n`;
225
+ return toolText(header + r.content);
226
+ }
227
+ catch (e) {
228
+ return toolError(formatToolError(e));
229
+ }
230
+ });
231
+ server.registerTool("instance_status", {
232
+ description: "Report Dameng instance and database status from V$INSTANCE / V$DATABASE.",
233
+ inputSchema: {},
234
+ annotations: { readOnlyHint: true, destructiveHint: false },
235
+ }, async () => {
236
+ try {
237
+ const inst = await db.runRaw(`SELECT NAME, INSTANCE_NAME, HOST_NAME, SVR_VERSION, STATUS$, MODE$, START_TIME FROM V$INSTANCE`);
238
+ const dbi = await db.runRaw(`SELECT NAME, STATUS$, ARCH_MODE, DSC_ROLE FROM V$DATABASE`);
239
+ return toolText(`# V$INSTANCE\n${formatResult(inst)}\n\n# V$DATABASE\n${formatResult(dbi)}`);
240
+ }
241
+ catch (e) {
242
+ return toolError(formatToolError(e));
243
+ }
244
+ });
245
+ const shutdown = async (signal) => {
246
+ console.error(`[dameng-mcp] received ${signal}, shutting down`);
247
+ try {
248
+ await server.close();
249
+ }
250
+ catch { }
251
+ try {
252
+ await db.close();
253
+ }
254
+ catch { }
255
+ process.exit(0);
256
+ };
257
+ process.on("SIGINT", () => void shutdown("SIGINT"));
258
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
259
+ const transport = new StdioServerTransport();
260
+ await server.connect(transport);
261
+ console.error("[dameng-mcp] ready on stdio");
262
+ }
263
+ function formatToolError(e) {
264
+ if (e instanceof SqlGuardError)
265
+ return `Rejected: ${e.message}`;
266
+ if (e instanceof DocsSearchError)
267
+ return `Docs: ${e.message}`;
268
+ if (e instanceof TimeoutError)
269
+ return `Timeout: ${e.message}`;
270
+ if (e instanceof Error)
271
+ return `${e.name}: ${e.message}`;
272
+ return String(e);
273
+ }
274
+ function docsRootMissingError() {
275
+ return toolError("DAMENG_DOCS_ROOT is not set. Configure it in the MCP server env to enable docs tools.");
276
+ }
277
+ function formatSections(sections, cap) {
278
+ if (sections.length === 0)
279
+ return "No matches.";
280
+ const totalShown = sections.reduce((n, s) => n + s.matches.length, 0);
281
+ const totalAll = sections.reduce((n, s) => n + s.matchCount, 0);
282
+ const truncated = totalShown >= cap || totalShown < totalAll;
283
+ const parts = [];
284
+ parts.push(truncated
285
+ ? `${totalShown} of ${totalAll} matches in ${sections.length} sections (capped — narrow query or increase maxMatches):`
286
+ : `${totalShown} match${totalShown === 1 ? "" : "es"} in ${sections.length} section${sections.length === 1 ? "" : "s"} (sorted by relevance):`);
287
+ for (const s of sections) {
288
+ const head = s.heading ?? "(no heading)";
289
+ parts.push(`\n## ${s.file} — ${head} [${s.matchCount} hit${s.matchCount === 1 ? "" : "s"}]`);
290
+ for (const m of s.matches) {
291
+ if (m.contextBefore)
292
+ parts.push(` ${m.contextBefore}`);
293
+ parts.push(` L${m.line}: ${m.text}`);
294
+ if (m.contextAfter)
295
+ parts.push(` ${m.contextAfter}`);
296
+ }
297
+ }
298
+ return parts.join("\n");
299
+ }
300
+ function formatManuals(manuals) {
301
+ if (manuals.length === 0)
302
+ return "No manuals found.";
303
+ const parts = [`${manuals.length} manual${manuals.length === 1 ? "" : "s"}:`];
304
+ for (const m of manuals) {
305
+ parts.push(`\n## ${m.manual} (${m.fileCount} file${m.fileCount === 1 ? "" : "s"})`);
306
+ if (m.indexSummary) {
307
+ parts.push(m.indexSummary);
308
+ }
309
+ }
310
+ return parts.join("\n");
311
+ }
312
+ function formatSectionList(files) {
313
+ if (files.length === 0)
314
+ return "No files in this manual.";
315
+ const parts = [`${files.length} file${files.length === 1 ? "" : "s"}:`];
316
+ for (const f of files) {
317
+ parts.push(`\n## ${f.file}`);
318
+ if (f.headings.length === 0) {
319
+ parts.push(" (no H1/H2 headings)");
320
+ continue;
321
+ }
322
+ for (const h of f.headings) {
323
+ const indent = " ".repeat(h.level);
324
+ parts.push(`${indent}L${h.line}: ${"#".repeat(h.level)} ${h.text}`);
325
+ }
326
+ }
327
+ return parts.join("\n");
328
+ }
329
+ main().catch((e) => {
330
+ console.error("[dameng-mcp] fatal:", e);
331
+ process.exit(1);
332
+ });
333
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ export class SqlGuardError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "SqlGuardError";
5
+ }
6
+ }
7
+ const ALLOWED_LEADING = new Set(["SELECT", "WITH", "EXPLAIN"]);
8
+ export function ensureReadOnly(input) {
9
+ const trimmed = input.trim();
10
+ if (trimmed.length === 0) {
11
+ throw new SqlGuardError("Empty SQL");
12
+ }
13
+ if (containsAdditionalStatement(trimmed)) {
14
+ throw new SqlGuardError("Multiple statements are not allowed");
15
+ }
16
+ const withoutTrailingSemi = stripTrailingSemicolon(trimmed);
17
+ const head = stripLeadingCommentsAndWhitespace(withoutTrailingSemi);
18
+ const firstWord = head.match(/^[A-Za-z_][A-Za-z_0-9]*/)?.[0];
19
+ if (!firstWord) {
20
+ throw new SqlGuardError("Could not determine statement type");
21
+ }
22
+ if (!ALLOWED_LEADING.has(firstWord.toUpperCase())) {
23
+ throw new SqlGuardError(`Statement type ${firstWord.toUpperCase()} is not allowed; only SELECT/WITH/EXPLAIN`);
24
+ }
25
+ return withoutTrailingSemi;
26
+ }
27
+ function stripTrailingSemicolon(s) {
28
+ return s.endsWith(";") ? s.slice(0, -1).trimEnd() : s;
29
+ }
30
+ function stripLeadingCommentsAndWhitespace(s) {
31
+ let i = 0;
32
+ while (i < s.length) {
33
+ const ch = s[i];
34
+ if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") {
35
+ i++;
36
+ continue;
37
+ }
38
+ if (ch === "-" && s[i + 1] === "-") {
39
+ const nl = s.indexOf("\n", i);
40
+ if (nl === -1)
41
+ return "";
42
+ i = nl + 1;
43
+ continue;
44
+ }
45
+ if (ch === "/" && s[i + 1] === "*") {
46
+ const end = s.indexOf("*/", i + 2);
47
+ if (end === -1)
48
+ return "";
49
+ i = end + 2;
50
+ continue;
51
+ }
52
+ return s.slice(i);
53
+ }
54
+ return "";
55
+ }
56
+ function containsAdditionalStatement(s) {
57
+ // Walk the string honoring quotes and comments. If we see a `;` and any
58
+ // non-whitespace, non-comment content follows it, that is a second statement.
59
+ let i = 0;
60
+ const n = s.length;
61
+ while (i < n) {
62
+ const ch = s[i];
63
+ if (ch === "'" || ch === '"') {
64
+ const quote = ch;
65
+ i++;
66
+ while (i < n) {
67
+ if (s[i] === "\\" && i + 1 < n) {
68
+ i += 2;
69
+ continue;
70
+ }
71
+ if (s[i] === quote) {
72
+ if (s[i + 1] === quote) {
73
+ i += 2;
74
+ continue;
75
+ }
76
+ i++;
77
+ break;
78
+ }
79
+ i++;
80
+ }
81
+ continue;
82
+ }
83
+ if (ch === "-" && s[i + 1] === "-") {
84
+ const nl = s.indexOf("\n", i);
85
+ if (nl === -1)
86
+ return false;
87
+ i = nl + 1;
88
+ continue;
89
+ }
90
+ if (ch === "/" && s[i + 1] === "*") {
91
+ const end = s.indexOf("*/", i + 2);
92
+ if (end === -1)
93
+ return false;
94
+ i = end + 2;
95
+ continue;
96
+ }
97
+ if (ch === ";") {
98
+ const rest = stripLeadingCommentsAndWhitespace(s.slice(i + 1));
99
+ return rest.length > 0;
100
+ }
101
+ i++;
102
+ }
103
+ return false;
104
+ }
105
+ //# sourceMappingURL=sql-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-guard.js","sourceRoot":"","sources":["../src/sql-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export class TimeoutError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "TimeoutError";
5
+ }
6
+ }
7
+ export function withTimeout(promise, ms, label, onTimeout) {
8
+ return new Promise((resolve, reject) => {
9
+ const timer = setTimeout(() => {
10
+ try {
11
+ onTimeout?.();
12
+ }
13
+ finally {
14
+ reject(new TimeoutError(`${label} exceeded ${ms}ms`));
15
+ }
16
+ }, ms);
17
+ promise.then((value) => {
18
+ clearTimeout(timer);
19
+ resolve(value);
20
+ }, (err) => {
21
+ clearTimeout(timer);
22
+ reject(err);
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=with-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-timeout.js","sourceRoot":"","sources":["../src/with-timeout.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,EAAU,EACV,KAAa,EACb,SAAsB;IAEtB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC;gBACH,SAAS,EAAE,EAAE,CAAC;YAChB,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,IAAI,YAAY,CAAC,GAAG,KAAK,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;YACN,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "basedoc-dameng-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Read-only MCP server for Dameng (DM8): SQL whitelist + local Markdown manual search (list_manuals / list_sections / read_section / lookup_docs).",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "bravejack",
8
+ "homepage": "https://github.com/bravejack/basedoc-dameng-mcp#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/bravejack/basedoc-dameng-mcp.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/bravejack/basedoc-dameng-mcp/issues"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "dameng",
20
+ "dm8",
21
+ "claude",
22
+ "anthropic",
23
+ "database",
24
+ "documentation"
25
+ ],
26
+ "bin": {
27
+ "basedoc-dameng-mcp": "dist/server.js"
28
+ },
29
+ "main": "dist/server.js",
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc -p tsconfig.json && chmod +x dist/server.js",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "start": "node dist/server.js",
40
+ "prepublishOnly": "npm run build && npm test"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "1.29.0",
44
+ "dmdb": "1.0.48286",
45
+ "zod": "4.4.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "22.10.2",
49
+ "typescript": "5.7.2",
50
+ "vitest": "2.1.8"
51
+ },
52
+ "engines": {
53
+ "node": ">=20.10"
54
+ }
55
+ }