@ai-support-agent/cli 0.0.4-beta.8 → 0.0.4
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/api-client.d.ts +5 -1
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +49 -62
- package/dist/api-client.js.map +1 -1
- package/dist/aws-credential-builder.d.ts +11 -2
- package/dist/aws-credential-builder.d.ts.map +1 -1
- package/dist/aws-credential-builder.js +47 -8
- package/dist/aws-credential-builder.js.map +1 -1
- package/dist/commands/api-chat-executor.d.ts.map +1 -1
- package/dist/commands/api-chat-executor.js +11 -3
- package/dist/commands/api-chat-executor.js.map +1 -1
- package/dist/commands/chat-executor.d.ts +1 -1
- package/dist/commands/chat-executor.d.ts.map +1 -1
- package/dist/commands/chat-executor.js +40 -42
- package/dist/commands/chat-executor.js.map +1 -1
- package/dist/commands/claude-code-runner.d.ts +4 -2
- package/dist/commands/claude-code-runner.d.ts.map +1 -1
- package/dist/commands/claude-code-runner.js +8 -4
- package/dist/commands/claude-code-runner.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/shared-chat-utils.d.ts +9 -1
- package/dist/commands/shared-chat-utils.d.ts.map +1 -1
- package/dist/commands/shared-chat-utils.js +24 -0
- package/dist/commands/shared-chat-utils.js.map +1 -1
- package/dist/config-manager.d.ts +1 -0
- package/dist/config-manager.d.ts.map +1 -1
- package/dist/config-manager.js +1 -0
- package/dist/config-manager.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -2
- package/dist/constants.js.map +1 -1
- package/dist/docker/docker-runner.d.ts +19 -0
- package/dist/docker/docker-runner.d.ts.map +1 -0
- package/dist/docker/docker-runner.js +221 -0
- package/dist/docker/docker-runner.js.map +1 -0
- package/dist/docker/dockerfile-path.d.ts +10 -0
- package/dist/docker/dockerfile-path.d.ts.map +1 -0
- package/dist/docker/dockerfile-path.js +25 -0
- package/dist/docker/dockerfile-path.js.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/locales/en.json +13 -1
- package/dist/locales/ja.json +13 -1
- package/dist/locales/locales/en.json +13 -1
- package/dist/locales/locales/ja.json +13 -1
- package/dist/mcp/config-writer.d.ts +17 -0
- package/dist/mcp/config-writer.d.ts.map +1 -0
- package/dist/mcp/config-writer.js +63 -0
- package/dist/mcp/config-writer.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +55 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/credentials.d.ts +5 -0
- package/dist/mcp/tools/credentials.d.ts.map +1 -0
- package/dist/mcp/tools/credentials.js +33 -0
- package/dist/mcp/tools/credentials.js.map +1 -0
- package/dist/mcp/tools/db-query.d.ts +13 -0
- package/dist/mcp/tools/db-query.d.ts.map +1 -0
- package/dist/mcp/tools/db-query.js +129 -0
- package/dist/mcp/tools/db-query.js.map +1 -0
- package/dist/mcp/tools/db-schemas.d.ts +5 -0
- package/dist/mcp/tools/db-schemas.d.ts.map +1 -0
- package/dist/mcp/tools/db-schemas.js +61 -0
- package/dist/mcp/tools/db-schemas.js.map +1 -0
- package/dist/mcp/tools/mcp-response.d.ts +15 -0
- package/dist/mcp/tools/mcp-response.d.ts.map +1 -0
- package/dist/mcp/tools/mcp-response.js +15 -0
- package/dist/mcp/tools/mcp-response.js.map +1 -0
- package/dist/mcp/tools/project-info.d.ts +5 -0
- package/dist/mcp/tools/project-info.d.ts.map +1 -0
- package/dist/mcp/tools/project-info.js +43 -0
- package/dist/mcp/tools/project-info.js.map +1 -0
- package/dist/project-agent.d.ts +4 -0
- package/dist/project-agent.d.ts.map +1 -1
- package/dist/project-agent.js +38 -2
- package/dist/project-agent.js.map +1 -1
- package/dist/project-dir.d.ts.map +1 -1
- package/dist/project-dir.js +5 -2
- package/dist/project-dir.js.map +1 -1
- package/dist/types.d.ts +31 -1
- package/dist/types.d.ts.map +1 -1
- package/docker/Dockerfile +39 -0
- package/package.json +6 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDockerfilePath = getDockerfilePath;
|
|
4
|
+
exports.getDockerContextDir = getDockerContextDir;
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
/**
|
|
8
|
+
* Get the path to the Dockerfile included in the npm package.
|
|
9
|
+
* __dirname at runtime is dist/docker/, so we go up two levels to reach the package root.
|
|
10
|
+
*/
|
|
11
|
+
function getDockerfilePath() {
|
|
12
|
+
const packageRoot = getDockerContextDir();
|
|
13
|
+
const dockerfilePath = (0, path_1.join)(packageRoot, 'docker', 'Dockerfile');
|
|
14
|
+
if (!(0, fs_1.existsSync)(dockerfilePath)) {
|
|
15
|
+
throw new Error(`Dockerfile not found: ${dockerfilePath}`);
|
|
16
|
+
}
|
|
17
|
+
return dockerfilePath;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the Docker build context directory (package root).
|
|
21
|
+
*/
|
|
22
|
+
function getDockerContextDir() {
|
|
23
|
+
return (0, path_1.join)(__dirname, '..', '..');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=dockerfile-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerfile-path.js","sourceRoot":"","sources":["../../src/docker/dockerfile-path.ts"],"names":[],"mappings":";;AAOA,8CAOC;AAKD,kDAEC;AArBD,+BAA2B;AAC3B,2BAA+B;AAE/B;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAA;IACzC,MAAM,cAAc,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;IAChE,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACpC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -63,7 +63,21 @@ program
|
|
|
63
63
|
.option('--verbose', (0, i18n_1.t)('cmd.start.verbose'))
|
|
64
64
|
.option('--no-auto-update', (0, i18n_1.t)('cmd.start.noAutoUpdate'))
|
|
65
65
|
.option('--update-channel <channel>', (0, i18n_1.t)('cmd.start.updateChannel'))
|
|
66
|
+
.option('--docker', (0, i18n_1.t)('cmd.start.docker'))
|
|
66
67
|
.action(async (opts) => {
|
|
68
|
+
if (opts.docker) {
|
|
69
|
+
const { runInDocker } = await Promise.resolve().then(() => __importStar(require('./docker/docker-runner')));
|
|
70
|
+
runInDocker({
|
|
71
|
+
token: opts.token,
|
|
72
|
+
apiUrl: opts.apiUrl,
|
|
73
|
+
pollInterval: (0, validators_1.parseIntervalOrExit)(opts.pollInterval, 'poll-interval'),
|
|
74
|
+
heartbeatInterval: (0, validators_1.parseIntervalOrExit)(opts.heartbeatInterval, 'heartbeat-interval'),
|
|
75
|
+
verbose: opts.verbose,
|
|
76
|
+
autoUpdate: opts.autoUpdate,
|
|
77
|
+
updateChannel: opts.updateChannel,
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
67
81
|
const updateChannel = (0, validators_1.validateUpdateChannel)(opts.updateChannel);
|
|
68
82
|
await (0, agent_runner_1.startAgent)({
|
|
69
83
|
token: opts.token,
|
|
@@ -113,6 +127,13 @@ program
|
|
|
113
127
|
(0, config_manager_1.saveConfig)({ language: lang });
|
|
114
128
|
logger_1.logger.success((0, i18n_1.t)('config.languageSet', { lang }));
|
|
115
129
|
});
|
|
130
|
+
program
|
|
131
|
+
.command('docker-login')
|
|
132
|
+
.description((0, i18n_1.t)('cmd.dockerLogin'))
|
|
133
|
+
.action(async () => {
|
|
134
|
+
const { dockerLogin } = await Promise.resolve().then(() => __importStar(require('./docker/docker-runner')));
|
|
135
|
+
dockerLogin();
|
|
136
|
+
});
|
|
116
137
|
(0, status_command_1.registerStatusCommand)(program);
|
|
117
138
|
(0, set_project_dir_1.registerSetProjectDirCommand)(program);
|
|
118
139
|
program.parse();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAmC;AAEnC,iDAA2C;AAC3C,uDAA0D;AAC1D,yDAA4D;AAC5D,gEAAyE;AACzE,+CAAiE;AACjE,iDAA6E;AAC7E,2CAA2C;AAE3C,uCAAwB;AAExB,qDAIyB;AACzB,iCAAoC;AACpC,qCAAiC;AAEjC,IAAA,eAAQ,GAAE,CAAA;AAEV,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,IAAA,QAAC,EAAC,iBAAiB,CAAC,CAAC;KACjC,OAAO,CAAC,yBAAa,CAAC;KACtB,MAAM,CAAC,eAAe,EAAE,IAAA,QAAC,EAAC,UAAU,CAAC,CAAC,CAAA;AAEzC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,IAAA,QAAC,EAAC,WAAW,CAAC,CAAC;KAC3B,MAAM,CAAC,iBAAiB,EAAE,IAAA,QAAC,EAAC,iBAAiB,CAAC,CAAC;KAC/C,MAAM,CAAC,iBAAiB,EAAE,IAAA,QAAC,EAAC,kBAAkB,CAAC,CAAC;KAChD,MAAM,CAAC,sBAAsB,EAAE,IAAA,QAAC,EAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnE,MAAM,CAAC,2BAA2B,EAAE,IAAA,QAAC,EAAC,6BAA6B,CAAC,EAAE,OAAO,CAAC;KAC9E,MAAM,CAAC,WAAW,EAAE,IAAA,QAAC,EAAC,mBAAmB,CAAC,CAAC;KAC3C,MAAM,CAAC,kBAAkB,EAAE,IAAA,QAAC,EAAC,wBAAwB,CAAC,CAAC;KACvD,MAAM,CAAC,4BAA4B,EAAE,IAAA,QAAC,EAAC,yBAAyB,CAAC,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/locales/en.json
CHANGED
|
@@ -104,5 +104,17 @@
|
|
|
104
104
|
"projectDir.noProject": "Project \"{{projectCode}}\" is not registered.",
|
|
105
105
|
"projectDir.initialized": "Project directory initialized: {{projectDir}} ({{projectCode}})",
|
|
106
106
|
"projectDir.usageHint": "Usage: set-project-dir --project <code> --path <path> OR --default <template>",
|
|
107
|
-
"projectDir.cleaned": "Cleaned up metadata directory: {{metadataDir}}"
|
|
107
|
+
"projectDir.cleaned": "Cleaned up metadata directory: {{metadataDir}}",
|
|
108
|
+
|
|
109
|
+
"cmd.start.docker": "Run inside a Docker container",
|
|
110
|
+
"cmd.dockerLogin": "Log in to Claude Code inside a Docker container",
|
|
111
|
+
"docker.notAvailable": "Docker is not available. Make sure Docker Desktop is running.",
|
|
112
|
+
"docker.building": "Building Docker image...",
|
|
113
|
+
"docker.buildComplete": "Docker image build complete",
|
|
114
|
+
"docker.imageFound": "Using existing Docker image ({{version}})",
|
|
115
|
+
"docker.starting": "Starting Docker container...",
|
|
116
|
+
"docker.runFailed": "Failed to run Docker container: {{message}}",
|
|
117
|
+
"docker.loginStep1": "Step 1: Run the following in your host terminal to get an OAuth token:",
|
|
118
|
+
"docker.loginStep2": "Step 2: Set the token as an environment variable and start in Docker mode:",
|
|
119
|
+
"docker.loginStep3": "The token is long-lived. Add the export to .bashrc or .zshrc to persist it."
|
|
108
120
|
}
|
package/dist/locales/ja.json
CHANGED
|
@@ -104,5 +104,17 @@
|
|
|
104
104
|
"projectDir.noProject": "プロジェクト \"{{projectCode}}\" は登録されていません。",
|
|
105
105
|
"projectDir.initialized": "プロジェクトディレクトリを初期化しました: {{projectDir}} ({{projectCode}})",
|
|
106
106
|
"projectDir.usageHint": "使い方: set-project-dir --project <code> --path <path> または --default <template>",
|
|
107
|
-
"projectDir.cleaned": "メタデータディレクトリを削除しました: {{metadataDir}}"
|
|
107
|
+
"projectDir.cleaned": "メタデータディレクトリを削除しました: {{metadataDir}}",
|
|
108
|
+
|
|
109
|
+
"cmd.start.docker": "Dockerコンテナ内で実行",
|
|
110
|
+
"cmd.dockerLogin": "Dockerコンテナ内でClaude Codeにログイン",
|
|
111
|
+
"docker.notAvailable": "Dockerが利用できません。Docker Desktopが起動していることを確認してください。",
|
|
112
|
+
"docker.building": "Dockerイメージをビルド中...",
|
|
113
|
+
"docker.buildComplete": "Dockerイメージのビルドが完了しました",
|
|
114
|
+
"docker.imageFound": "既存のDockerイメージを使用します ({{version}})",
|
|
115
|
+
"docker.starting": "Dockerコンテナを起動中...",
|
|
116
|
+
"docker.runFailed": "Dockerコンテナの実行に失敗しました: {{message}}",
|
|
117
|
+
"docker.loginStep1": "Step 1: ホスト側のターミナルで以下を実行し、OAuthトークンを取得してください:",
|
|
118
|
+
"docker.loginStep2": "Step 2: 取得したトークンを環境変数に設定してDockerモードで起動:",
|
|
119
|
+
"docker.loginStep3": "トークンは長期間有効です。毎回設定が必要な場合は .bashrc や .zshrc に export を追加してください。"
|
|
108
120
|
}
|
|
@@ -104,5 +104,17 @@
|
|
|
104
104
|
"projectDir.noProject": "Project \"{{projectCode}}\" is not registered.",
|
|
105
105
|
"projectDir.initialized": "Project directory initialized: {{projectDir}} ({{projectCode}})",
|
|
106
106
|
"projectDir.usageHint": "Usage: set-project-dir --project <code> --path <path> OR --default <template>",
|
|
107
|
-
"projectDir.cleaned": "Cleaned up metadata directory: {{metadataDir}}"
|
|
107
|
+
"projectDir.cleaned": "Cleaned up metadata directory: {{metadataDir}}",
|
|
108
|
+
|
|
109
|
+
"cmd.start.docker": "Run inside a Docker container",
|
|
110
|
+
"cmd.dockerLogin": "Log in to Claude Code inside a Docker container",
|
|
111
|
+
"docker.notAvailable": "Docker is not available. Make sure Docker Desktop is running.",
|
|
112
|
+
"docker.building": "Building Docker image...",
|
|
113
|
+
"docker.buildComplete": "Docker image build complete",
|
|
114
|
+
"docker.imageFound": "Using existing Docker image ({{version}})",
|
|
115
|
+
"docker.starting": "Starting Docker container...",
|
|
116
|
+
"docker.runFailed": "Failed to run Docker container: {{message}}",
|
|
117
|
+
"docker.loginStep1": "Step 1: Run the following in your host terminal to get an OAuth token:",
|
|
118
|
+
"docker.loginStep2": "Step 2: Set the token as an environment variable and start in Docker mode:",
|
|
119
|
+
"docker.loginStep3": "The token is long-lived. Add the export to .bashrc or .zshrc to persist it."
|
|
108
120
|
}
|
|
@@ -104,5 +104,17 @@
|
|
|
104
104
|
"projectDir.noProject": "プロジェクト \"{{projectCode}}\" は登録されていません。",
|
|
105
105
|
"projectDir.initialized": "プロジェクトディレクトリを初期化しました: {{projectDir}} ({{projectCode}})",
|
|
106
106
|
"projectDir.usageHint": "使い方: set-project-dir --project <code> --path <path> または --default <template>",
|
|
107
|
-
"projectDir.cleaned": "メタデータディレクトリを削除しました: {{metadataDir}}"
|
|
107
|
+
"projectDir.cleaned": "メタデータディレクトリを削除しました: {{metadataDir}}",
|
|
108
|
+
|
|
109
|
+
"cmd.start.docker": "Dockerコンテナ内で実行",
|
|
110
|
+
"cmd.dockerLogin": "Dockerコンテナ内でClaude Codeにログイン",
|
|
111
|
+
"docker.notAvailable": "Dockerが利用できません。Docker Desktopが起動していることを確認してください。",
|
|
112
|
+
"docker.building": "Dockerイメージをビルド中...",
|
|
113
|
+
"docker.buildComplete": "Dockerイメージのビルドが完了しました",
|
|
114
|
+
"docker.imageFound": "既存のDockerイメージを使用します ({{version}})",
|
|
115
|
+
"docker.starting": "Dockerコンテナを起動中...",
|
|
116
|
+
"docker.runFailed": "Dockerコンテナの実行に失敗しました: {{message}}",
|
|
117
|
+
"docker.loginStep1": "Step 1: ホスト側のターミナルで以下を実行し、OAuthトークンを取得してください:",
|
|
118
|
+
"docker.loginStep2": "Step 2: 取得したトークンを環境変数に設定してDockerモードで起動:",
|
|
119
|
+
"docker.loginStep3": "トークンは長期間有効です。毎回設定が必要な場合は .bashrc や .zshrc に export を追加してください。"
|
|
108
120
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 設定ファイルのパスを返す
|
|
3
|
+
*/
|
|
4
|
+
export declare function getMcpConfigPath(projectDir: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* MCP 設定 JSON を構築する
|
|
7
|
+
*
|
|
8
|
+
* token はファイルに書かない。環境変数参照にする。
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildMcpConfig(apiUrl: string, projectCode: string, mcpServerPath: string): Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* MCP 設定ファイルを書き出す
|
|
13
|
+
*
|
|
14
|
+
* 0o600 権限で作成し、token は環境変数参照にする。
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeMcpConfig(projectDir: string, apiUrl: string, token: string, projectCode: string, mcpServerPath: string): string;
|
|
17
|
+
//# sourceMappingURL=config-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/mcp/config-writer.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CA2BR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMcpConfigPath = getMcpConfigPath;
|
|
4
|
+
exports.buildMcpConfig = buildMcpConfig;
|
|
5
|
+
exports.writeMcpConfig = writeMcpConfig;
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
/**
|
|
9
|
+
* MCP 設定ファイルのパスを返す
|
|
10
|
+
*/
|
|
11
|
+
function getMcpConfigPath(projectDir) {
|
|
12
|
+
return (0, path_1.join)(projectDir, '.ai-support-agent', 'mcp', 'config.json');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* MCP 設定 JSON を構築する
|
|
16
|
+
*
|
|
17
|
+
* token はファイルに書かない。環境変数参照にする。
|
|
18
|
+
*/
|
|
19
|
+
function buildMcpConfig(apiUrl, projectCode, mcpServerPath) {
|
|
20
|
+
return {
|
|
21
|
+
mcpServers: {
|
|
22
|
+
'ai-support-agent': {
|
|
23
|
+
command: 'node',
|
|
24
|
+
args: [mcpServerPath],
|
|
25
|
+
env: {
|
|
26
|
+
AI_SUPPORT_AGENT_API_URL: apiUrl,
|
|
27
|
+
AI_SUPPORT_AGENT_TOKEN: '${AI_SUPPORT_AGENT_TOKEN}',
|
|
28
|
+
AI_SUPPORT_AGENT_PROJECT_CODE: projectCode,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* MCP 設定ファイルを書き出す
|
|
36
|
+
*
|
|
37
|
+
* 0o600 権限で作成し、token は環境変数参照にする。
|
|
38
|
+
*/
|
|
39
|
+
function writeMcpConfig(projectDir, apiUrl, token, projectCode, mcpServerPath) {
|
|
40
|
+
const configPath = getMcpConfigPath(projectDir);
|
|
41
|
+
const dir = (0, path_1.dirname)(configPath);
|
|
42
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true, mode: 0o700 });
|
|
43
|
+
// 実際の設定: token を直接埋め込む(ファイルは 0o600 で保護)
|
|
44
|
+
const config = {
|
|
45
|
+
mcpServers: {
|
|
46
|
+
'ai-support-agent': {
|
|
47
|
+
command: 'node',
|
|
48
|
+
args: [mcpServerPath],
|
|
49
|
+
env: {
|
|
50
|
+
AI_SUPPORT_AGENT_API_URL: apiUrl,
|
|
51
|
+
AI_SUPPORT_AGENT_TOKEN: token,
|
|
52
|
+
AI_SUPPORT_AGENT_PROJECT_CODE: projectCode,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2), {
|
|
58
|
+
mode: 0o600,
|
|
59
|
+
encoding: 'utf-8',
|
|
60
|
+
});
|
|
61
|
+
return configPath;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/mcp/config-writer.ts"],"names":[],"mappings":";;AAMA,4CAEC;AAOD,wCAkBC;AAOD,wCAiCC;AAzED,2BAA6C;AAC7C,+BAAoC;AAEpC;;GAEG;AACH,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,OAAO,IAAA,WAAI,EAAC,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAA;AACpE,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,MAAc,EACd,WAAmB,EACnB,aAAqB;IAErB,OAAO;QACL,UAAU,EAAE;YACV,kBAAkB,EAAE;gBAClB,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,aAAa,CAAC;gBACrB,GAAG,EAAE;oBACH,wBAAwB,EAAE,MAAM;oBAChC,sBAAsB,EAAE,2BAA2B;oBACnD,6BAA6B,EAAE,WAAW;iBAC3C;aACF;SACF;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,UAAkB,EAClB,MAAc,EACd,KAAa,EACb,WAAmB,EACnB,aAAqB;IAErB,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,UAAU,CAAC,CAAA;IAE/B,IAAA,cAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAEhD,wCAAwC;IACxC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,kBAAkB,EAAE;gBAClB,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,aAAa,CAAC;gBACrB,GAAG,EAAE;oBACH,wBAAwB,EAAE,MAAM;oBAChC,sBAAsB,EAAE,KAAK;oBAC7B,6BAA6B,EAAE,WAAW;iBAC3C;aACF;SACF;KACF,CAAA;IAED,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACzD,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAA;IAEF,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../api-client';
|
|
3
|
+
/**
|
|
4
|
+
* MCP サーバーを作成する
|
|
5
|
+
*/
|
|
6
|
+
export declare function createMcpServer(apiClient: ApiClient, projectCode: string): McpServer;
|
|
7
|
+
/**
|
|
8
|
+
* MCP サーバーを stdio transport で起動する
|
|
9
|
+
*/
|
|
10
|
+
export declare function startMcpServer(): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAMzC;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAYpF;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBpD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpServer = createMcpServer;
|
|
4
|
+
exports.startMcpServer = startMcpServer;
|
|
5
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
6
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
7
|
+
const api_client_1 = require("../api-client");
|
|
8
|
+
const credentials_1 = require("./tools/credentials");
|
|
9
|
+
const db_query_1 = require("./tools/db-query");
|
|
10
|
+
const db_schemas_1 = require("./tools/db-schemas");
|
|
11
|
+
const project_info_1 = require("./tools/project-info");
|
|
12
|
+
/**
|
|
13
|
+
* MCP サーバーを作成する
|
|
14
|
+
*/
|
|
15
|
+
function createMcpServer(apiClient, projectCode) {
|
|
16
|
+
const server = new mcp_js_1.McpServer({
|
|
17
|
+
name: 'ai-support-agent',
|
|
18
|
+
version: '1.0.0',
|
|
19
|
+
});
|
|
20
|
+
(0, db_query_1.registerDbQueryTool)(server, apiClient);
|
|
21
|
+
(0, db_schemas_1.registerDbSchemasTool)(server, apiClient);
|
|
22
|
+
(0, credentials_1.registerCredentialsTool)(server, apiClient);
|
|
23
|
+
(0, project_info_1.registerProjectInfoTool)(server, apiClient, projectCode);
|
|
24
|
+
return server;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* MCP サーバーを stdio transport で起動する
|
|
28
|
+
*/
|
|
29
|
+
async function startMcpServer() {
|
|
30
|
+
const apiUrl = process.env.AI_SUPPORT_AGENT_API_URL;
|
|
31
|
+
const token = process.env.AI_SUPPORT_AGENT_TOKEN;
|
|
32
|
+
const projectCode = process.env.AI_SUPPORT_AGENT_PROJECT_CODE;
|
|
33
|
+
if (!apiUrl || !token || !projectCode) {
|
|
34
|
+
const missing = [];
|
|
35
|
+
if (!apiUrl)
|
|
36
|
+
missing.push('AI_SUPPORT_AGENT_API_URL');
|
|
37
|
+
if (!token)
|
|
38
|
+
missing.push('AI_SUPPORT_AGENT_TOKEN');
|
|
39
|
+
if (!projectCode)
|
|
40
|
+
missing.push('AI_SUPPORT_AGENT_PROJECT_CODE');
|
|
41
|
+
throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
const apiClient = new api_client_1.ApiClient(apiUrl, token);
|
|
44
|
+
const server = createMcpServer(apiClient, projectCode);
|
|
45
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
46
|
+
await server.connect(transport);
|
|
47
|
+
}
|
|
48
|
+
// When executed directly
|
|
49
|
+
if (require.main === module) {
|
|
50
|
+
startMcpServer().catch((error) => {
|
|
51
|
+
process.stderr.write(`MCP server error: ${error}\n`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";;AAYA,0CAYC;AAKD,wCAiBC;AA9CD,oEAAmE;AACnE,wEAAgF;AAEhF,8CAAyC;AACzC,qDAA6D;AAC7D,+CAAsD;AACtD,mDAA0D;AAC1D,uDAA8D;AAE9D;;GAEG;AACH,SAAgB,eAAe,CAAC,SAAoB,EAAE,WAAmB;IACvE,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,IAAA,8BAAmB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,IAAA,kCAAqB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACxC,IAAA,qCAAuB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,IAAA,sCAAuB,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IAEvD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAA;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAA;IAE7D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACrD,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAClD,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QAC/D,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,IAAI,CAAC,CAAA;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../../api-client';
|
|
3
|
+
/** get_credentials ツールを MCP サーバーに登録する */
|
|
4
|
+
export declare function registerCredentialsTool(server: McpServer, apiClient: ApiClient): void;
|
|
5
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,yCAAyC;AACzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA+BrF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCredentialsTool = registerCredentialsTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const mcp_response_1 = require("./mcp-response");
|
|
6
|
+
/** get_credentials ツールを MCP サーバーに登録する */
|
|
7
|
+
function registerCredentialsTool(server, apiClient) {
|
|
8
|
+
server.tool('get_credentials', 'Get credentials for a service (AWS or database).', {
|
|
9
|
+
type: zod_1.z.enum(['aws', 'db']).describe('Credential type'),
|
|
10
|
+
name: zod_1.z.string().describe('Identifier (AWS account ID or DB connection name)'),
|
|
11
|
+
}, async ({ type, name }) => {
|
|
12
|
+
try {
|
|
13
|
+
if (type === 'aws') {
|
|
14
|
+
const credentials = await apiClient.getAwsCredentials(name);
|
|
15
|
+
return (0, mcp_response_1.mcpTextResponse)(JSON.stringify({
|
|
16
|
+
accessKeyId: credentials.accessKeyId,
|
|
17
|
+
secretAccessKey: credentials.secretAccessKey,
|
|
18
|
+
sessionToken: credentials.sessionToken,
|
|
19
|
+
region: credentials.region,
|
|
20
|
+
}, null, 2));
|
|
21
|
+
}
|
|
22
|
+
if (type === 'db') {
|
|
23
|
+
const credentials = await apiClient.getDbCredentials(name);
|
|
24
|
+
return (0, mcp_response_1.mcpTextResponse)(JSON.stringify(credentials, null, 2));
|
|
25
|
+
}
|
|
26
|
+
return (0, mcp_response_1.mcpErrorResponse)(`Unknown credential type: ${type}`);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return (0, mcp_response_1.mcpErrorResponse)((0, mcp_response_1.extractErrorMessage)(error));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/mcp/tools/credentials.ts"],"names":[],"mappings":";;AAOA,0DA+BC;AArCD,6BAAuB;AAGvB,iDAAuF;AAEvF,yCAAyC;AACzC,SAAgB,uBAAuB,CAAC,MAAiB,EAAE,SAAoB;IAC7E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,kDAAkD,EAClD;QACE,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACvD,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC/E,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;gBAC3D,OAAO,IAAA,8BAAe,EAAC,IAAI,CAAC,SAAS,CAAC;oBACpC,WAAW,EAAE,WAAW,CAAC,WAAW;oBACpC,eAAe,EAAE,WAAW,CAAC,eAAe;oBAC5C,YAAY,EAAE,WAAW,CAAC,YAAY;oBACtC,MAAM,EAAE,WAAW,CAAC,MAAM;iBAC3B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACd,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;gBAC1D,OAAO,IAAA,8BAAe,EAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9D,CAAC;YAED,OAAO,IAAA,+BAAgB,EAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,+BAAgB,EAAC,IAAA,kCAAmB,EAAC,KAAK,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../../api-client';
|
|
3
|
+
import type { DbCredentials } from '../../types';
|
|
4
|
+
/** SQL文が SELECT のみかどうか検証する */
|
|
5
|
+
export declare function validateSelectOnly(sql: string): {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
};
|
|
9
|
+
/** DB接続を作成してクエリを実行する */
|
|
10
|
+
export declare function executeQuery(credentials: DbCredentials, sql: string): Promise<unknown[]>;
|
|
11
|
+
/** db_query ツールを MCP サーバーに登録する */
|
|
12
|
+
export declare function registerDbQueryTool(server: McpServer, apiClient: ApiClient): void;
|
|
13
|
+
//# sourceMappingURL=db-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-query.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/db-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,8BAA8B;AAC9B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuBlF;AAED,wBAAwB;AACxB,wBAAsB,YAAY,CAChC,WAAW,EAAE,aAAa,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,EAAE,CAAC,CAwCpB;AAED,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA6BjF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.validateSelectOnly = validateSelectOnly;
|
|
37
|
+
exports.executeQuery = executeQuery;
|
|
38
|
+
exports.registerDbQueryTool = registerDbQueryTool;
|
|
39
|
+
const zod_1 = require("zod");
|
|
40
|
+
const mcp_response_1 = require("./mcp-response");
|
|
41
|
+
/** SQL文が SELECT のみかどうか検証する */
|
|
42
|
+
function validateSelectOnly(sql) {
|
|
43
|
+
const trimmed = sql.trim();
|
|
44
|
+
if (!trimmed) {
|
|
45
|
+
return { valid: false, error: 'SQL query is empty' };
|
|
46
|
+
}
|
|
47
|
+
// 禁止キーワードをチェック(大文字小文字無視)
|
|
48
|
+
const forbidden = ['DROP', 'DELETE', 'UPDATE', 'INSERT', 'TRUNCATE', 'ALTER', 'CREATE', 'GRANT', 'REVOKE'];
|
|
49
|
+
const upper = trimmed.toUpperCase();
|
|
50
|
+
for (const keyword of forbidden) {
|
|
51
|
+
// 単語境界でマッチ(前後が非単語文字 or 文字列の先頭/末尾)
|
|
52
|
+
const regex = new RegExp(`(?<![A-Z_])${keyword}(?![A-Z_])`);
|
|
53
|
+
if (regex.test(upper)) {
|
|
54
|
+
return { valid: false, error: `Forbidden SQL operation: ${keyword}` };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// SELECT で始まることを確認(WITH ... SELECT も許可)
|
|
58
|
+
if (!upper.startsWith('SELECT') && !upper.startsWith('WITH') && !upper.startsWith('EXPLAIN')) {
|
|
59
|
+
return { valid: false, error: 'Only SELECT, WITH, and EXPLAIN statements are allowed' };
|
|
60
|
+
}
|
|
61
|
+
return { valid: true };
|
|
62
|
+
}
|
|
63
|
+
/** DB接続を作成してクエリを実行する */
|
|
64
|
+
async function executeQuery(credentials, sql) {
|
|
65
|
+
if (credentials.engine === 'mysql') {
|
|
66
|
+
const mysql2 = await Promise.resolve().then(() => __importStar(require('mysql2/promise')));
|
|
67
|
+
const connection = await mysql2.createConnection({
|
|
68
|
+
host: credentials.host,
|
|
69
|
+
port: credentials.port,
|
|
70
|
+
user: credentials.user,
|
|
71
|
+
password: credentials.password,
|
|
72
|
+
database: credentials.database,
|
|
73
|
+
connectTimeout: 10000,
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
const [rows] = await connection.query(sql);
|
|
77
|
+
return rows;
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
await connection.end();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (credentials.engine === 'postgresql') {
|
|
84
|
+
const { Client } = await Promise.resolve().then(() => __importStar(require('pg')));
|
|
85
|
+
const client = new Client({
|
|
86
|
+
host: credentials.host,
|
|
87
|
+
port: credentials.port,
|
|
88
|
+
user: credentials.user,
|
|
89
|
+
password: credentials.password,
|
|
90
|
+
database: credentials.database,
|
|
91
|
+
connectionTimeoutMillis: 10000,
|
|
92
|
+
ssl: false,
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
await client.connect();
|
|
96
|
+
const result = await client.query(sql);
|
|
97
|
+
return result.rows;
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await client.end();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Unsupported database engine: ${credentials.engine}`);
|
|
104
|
+
}
|
|
105
|
+
/** db_query ツールを MCP サーバーに登録する */
|
|
106
|
+
function registerDbQueryTool(server, apiClient) {
|
|
107
|
+
server.tool('db_query', 'Execute a SELECT query on a project database. Only SELECT/WITH/EXPLAIN statements are allowed.', {
|
|
108
|
+
name: zod_1.z.string().describe('Database connection name (e.g. "MAIN", "READONLY")'),
|
|
109
|
+
sql: zod_1.z.string().describe('SQL query to execute (SELECT only)'),
|
|
110
|
+
}, async ({ name, sql }) => {
|
|
111
|
+
// Validate SQL
|
|
112
|
+
const validation = validateSelectOnly(sql);
|
|
113
|
+
if (!validation.valid) {
|
|
114
|
+
return (0, mcp_response_1.mcpErrorResponse)(validation.error);
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
// Get credentials from API
|
|
118
|
+
const credentials = await apiClient.getDbCredentials(name);
|
|
119
|
+
// Execute query
|
|
120
|
+
const rows = await executeQuery(credentials, sql);
|
|
121
|
+
// Format result
|
|
122
|
+
return (0, mcp_response_1.mcpTextResponse)(JSON.stringify(rows, null, 2));
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
return (0, mcp_response_1.mcpErrorResponse)((0, mcp_response_1.extractErrorMessage)(error));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=db-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-query.js","sourceRoot":"","sources":["../../../src/mcp/tools/db-query.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,gDAuBC;AAGD,oCA2CC;AAGD,kDA6BC;AA5GD,6BAAuB;AAIvB,iDAAuF;AAEvF,8BAA8B;AAC9B,SAAgB,kBAAkB,CAAC,GAAW;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAA;IACtD,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC1G,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,OAAO,YAAY,CAAC,CAAA;QAC3D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,OAAO,EAAE,EAAE,CAAA;QACvE,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAA;IACzF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,wBAAwB;AACjB,KAAK,UAAU,YAAY,CAChC,WAA0B,EAC1B,GAAW;IAEX,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,wDAAa,gBAAgB,GAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC/C,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,cAAc,EAAE,KAAK;SACtB,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC1C,OAAO,IAAiB,CAAA;QAC1B,CAAC;gBAAS,CAAC;YACT,MAAM,UAAU,CAAC,GAAG,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,uBAAuB,EAAE,KAAK;YAC9B,GAAG,EAAE,KAAK;SACX,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;YACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACtC,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,kCAAkC;AAClC,SAAgB,mBAAmB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,IAAI,CACT,UAAU,EACV,gGAAgG,EAChG;QACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAC/E,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;QACtB,eAAe;QACf,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,IAAA,+BAAgB,EAAC,UAAU,CAAC,KAAM,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAE1D,gBAAgB;YAChB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YAEjD,gBAAgB;YAChB,OAAO,IAAA,8BAAe,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,+BAAgB,EAAC,IAAA,kCAAmB,EAAC,KAAK,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../../api-client';
|
|
3
|
+
/** get_db_schemas ツールを MCP サーバーに登録する */
|
|
4
|
+
export declare function registerDbSchemasTool(server: McpServer, apiClient: ApiClient): void;
|
|
5
|
+
//# sourceMappingURL=db-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-schemas.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/db-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AA0C5C,wCAAwC;AACxC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAuBnF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDbSchemasTool = registerDbSchemasTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const db_query_1 = require("./db-query");
|
|
6
|
+
const mcp_response_1 = require("./mcp-response");
|
|
7
|
+
const MYSQL_SCHEMA_QUERY = `
|
|
8
|
+
SELECT
|
|
9
|
+
TABLE_NAME,
|
|
10
|
+
COLUMN_NAME,
|
|
11
|
+
DATA_TYPE,
|
|
12
|
+
IS_NULLABLE,
|
|
13
|
+
COLUMN_KEY,
|
|
14
|
+
COLUMN_DEFAULT,
|
|
15
|
+
EXTRA
|
|
16
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
17
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
18
|
+
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
|
19
|
+
`;
|
|
20
|
+
const PG_SCHEMA_QUERY = `
|
|
21
|
+
SELECT
|
|
22
|
+
c.table_name,
|
|
23
|
+
c.column_name,
|
|
24
|
+
c.data_type,
|
|
25
|
+
c.is_nullable,
|
|
26
|
+
CASE
|
|
27
|
+
WHEN tc.constraint_type = 'PRIMARY KEY' THEN 'PRI'
|
|
28
|
+
WHEN tc.constraint_type = 'UNIQUE' THEN 'UNI'
|
|
29
|
+
ELSE ''
|
|
30
|
+
END AS column_key,
|
|
31
|
+
c.column_default
|
|
32
|
+
FROM information_schema.columns c
|
|
33
|
+
LEFT JOIN information_schema.key_column_usage kcu
|
|
34
|
+
ON c.table_name = kcu.table_name
|
|
35
|
+
AND c.column_name = kcu.column_name
|
|
36
|
+
AND c.table_schema = kcu.table_schema
|
|
37
|
+
LEFT JOIN information_schema.table_constraints tc
|
|
38
|
+
ON kcu.constraint_name = tc.constraint_name
|
|
39
|
+
AND kcu.table_schema = tc.table_schema
|
|
40
|
+
WHERE c.table_schema = 'public'
|
|
41
|
+
ORDER BY c.table_name, c.ordinal_position
|
|
42
|
+
`;
|
|
43
|
+
/** get_db_schemas ツールを MCP サーバーに登録する */
|
|
44
|
+
function registerDbSchemasTool(server, apiClient) {
|
|
45
|
+
server.tool('get_db_schemas', 'Get the schema (tables and columns) of a project database.', {
|
|
46
|
+
name: zod_1.z.string().describe('Database connection name (e.g. "MAIN", "READONLY")'),
|
|
47
|
+
}, async ({ name }) => {
|
|
48
|
+
try {
|
|
49
|
+
const credentials = await apiClient.getDbCredentials(name);
|
|
50
|
+
const query = credentials.engine === 'mysql'
|
|
51
|
+
? MYSQL_SCHEMA_QUERY
|
|
52
|
+
: PG_SCHEMA_QUERY;
|
|
53
|
+
const rows = await (0, db_query_1.executeQuery)(credentials, query);
|
|
54
|
+
return (0, mcp_response_1.mcpTextResponse)(JSON.stringify(rows, null, 2));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return (0, mcp_response_1.mcpErrorResponse)((0, mcp_response_1.extractErrorMessage)(error));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=db-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-schemas.js","sourceRoot":"","sources":["../../../src/mcp/tools/db-schemas.ts"],"names":[],"mappings":";;AA8CA,sDAuBC;AApED,6BAAuB;AAGvB,yCAAyC;AACzC,iDAAuF;AAEvF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;CAY1B,CAAA;AAED,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBvB,CAAA;AAED,wCAAwC;AACxC,SAAgB,qBAAqB,CAAC,MAAiB,EAAE,SAAoB;IAC3E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4DAA4D,EAC5D;QACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KAChF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAE1D,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,KAAK,OAAO;gBAC1C,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,eAAe,CAAA;YAEnB,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YAEnD,OAAO,IAAA,8BAAe,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,+BAAgB,EAAC,IAAA,kCAAmB,EAAC,KAAK,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function mcpTextResponse(text: string): {
|
|
2
|
+
content: {
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
}[];
|
|
6
|
+
};
|
|
7
|
+
export declare function mcpErrorResponse(message: string): {
|
|
8
|
+
content: {
|
|
9
|
+
type: "text";
|
|
10
|
+
text: string;
|
|
11
|
+
}[];
|
|
12
|
+
isError: true;
|
|
13
|
+
};
|
|
14
|
+
export declare function extractErrorMessage(error: unknown): string;
|
|
15
|
+
//# sourceMappingURL=mcp-response.d.ts.map
|