damoxing-datasource-mcp
@damoxing/datasource-manager
中文文档: README.zh-CN.md
HTTP非依存のマルチデータソースライフサイクルマネージャー。
以下の機能を備えています:
データソース設定の読み込み
データソース状態の追跡
汎用ルートキー解決(
jgbh互換性あり)ハートビート
プール復旧
接続エラー時のワンショット再試行
グレースフルシャットダウン
コアマネージャーはHTTPに依存しません。Express、ワーカー、CLI、その他のNode.jsサービス内で実行できます。
データベースアダプターはOracle、OceanBase(Oracle / MySQLモード)、MySQL、DM、PostgreSQL、GaussDB/openGauss、Kingbaseに対応しています。ドライバーはオプションのピア依存関係であり、対応するアダプターが使用された場合にのみ読み込まれます。
アダプター契約
アダプターインスタンスは以下を公開する必要があります:
{
isOracle: Boolean,
adapterType: String,
initialize: async () => {},
close: async () => {},
all: async (sql, params) => [],
get: async (sql, params) => row,
run: async (sql, params) => result,
exec: async (sql) => {},
transaction: async (work) => result
}withConnection(callback)はオプションです。
Related MCP server: telemetry-mcp
使用方法
CommonJS:
const {
DataSourceManager,
createDefaultAdapterFactories
} = require('@damoxing/datasource-manager');
const manager = new DataSourceManager({
config,
logger,
shutdownSignals: ['SIGTERM'],
adapterFactories: createDefaultAdapterFactories(logger),
});
await manager.initialize();
const db = manager.getByJgbh('1001');
const row = await db.get('SELECT 1 AS health_check');
await manager.closeAll();ESM:
import {
DataSourceManager,
createDefaultAdapterFactories
} from '@damoxing/datasource-manager';
const manager = new DataSourceManager({
config,
logger,
adapterFactories: createDefaultAdapterFactories(logger),
});新しいビジネス固有でないコードにはgetByRouteKey()を使用します:
const db = manager.getByRouteKey('tenant-a');getByJgbh()は互換性ラッパーとして残ります。
Codex用MCPサーバー
このパッケージにはstdio MCPサーバーが含まれており、Codexが同じマネージャーとアダプター層を通じて設定されたデータソースを検査できます:
npm run build
DAMOXING_MCP_CONFIG=/absolute/path/to/datasources.json node dist/cjs/mcp/server.jsパッケージインストール後、binエントリは次のとおりです:
damoxing-datasource-mcpMCPサーバーは、ヘルス、読み取り専用クエリ、テーブル/ルーチンメタデータ、実行計画ツール、およびMCP専用の固定物理セッションを公開します:
damoxing_open_sessiondamoxing_session_querydamoxing_session_execdamoxing_session_commitdamoxing_session_rollbackdamoxing_cancel_session_operationdamoxing_get_noticesdamoxing_get_audit_eventsdamoxing_close_session
同じsessionIdを持つすべての操作は、同じリースされたデータベース接続を使用し、直列化されます。PostgreSQL互換セッションは明示的なトランザクション内で実行されます。クローズおよび異常な接続クリーンアップは、リースを解放する前にロールバックします。失われた固定接続は、別の接続で再試行されることはありません。
固定セッションはデフォルトで読み取り専用です。読み取り/書き込みセッションを開くには、DAMOXING_MCP_ALLOW_WRITE=trueとconfirmWrite=trueが必要です。DAMOXING_MCP_PRODUCTION_DATASOURCESにリストされているデータソースIDは、DAMOXING_MCP_ALLOW_PRODUCTION_DEBUG=trueが設定され、呼び出しがconfirmProduction=trueを渡さない限り拒否されます。破壊的なSQLには、さらにDAMOXING_MCP_ALLOW_DESTRUCTIVE=trueとconfirmDestructive=trueが必要です。
セッションポリシーは以下で制限できます:
DAMOXING_MCP_MAX_SESSIONS(デフォルト5)DAMOXING_MCP_MAX_SESSIONS_PER_DATASOURCE(デフォルト2)DAMOXING_MCP_SESSION_IDLE_TIMEOUT_MS(デフォルト300000)DAMOXING_MCP_SESSION_MAX_LIFETIME_MS(デフォルト1800000)DAMOXING_MCP_SESSION_CLEANUP_INTERVAL_MS(デフォルト30000)DAMOXING_MCP_AUDIT_MAX_EVENTS(デフォルト1000)
MCPセッションレジストリは、制限付きのインメモリ監査証跡を保持します。監査イベントには、アクション、結果、データソース/セッション識別子、経過時間、行数、SQLの種類、正規化されたSQLフィンガープリント、パラメータ数/名前が含まれます。SQLテキストとパラメータ値は決して保存されません。damoxing_get_audit_eventsを使用して、編集されたイベントを取得します。
固定セッションマネージャー、レジストリ、タイマー、および予約接続は、MCPエントリポイントによって遅延作成されます。@damoxing/datasource-managerを直接インポートしても、MCP SDKは読み込まれず、MCPリソースも作成されません。
2026年7月15日のローカルOrbStackラボからの固定セッション統合結果:
データベース | 固定接続 / トランザクション | セッション状態 | 通知 | タイムアウト / キャンセル |
PostgreSQL | 合格 | 一時テーブルとセッション変数合格 | 合格 | ネイティブ |
openGauss | 合格 | 一時テーブルとセッション変数合格 | 合格 | ネイティブ |
Oracle | 合格 | 安定したSIDと | PostgreSQL NOTICEセマンティクスは利用不可 |
|
DM | 合格 | 安定したセッションIDとグローバル一時テーブル合格 | 現在のドライバーでは公開されていません | 現在の |
Kingbase | 保留中 | ローカルコンテナデータベースプロセスが開発ライセンスの期限切れのため起動できません | 未確認 | 未確認 |
npm run test:integration:session:pg、npm run test:integration:session:opengauss、npm run test:integration:session:oracle、npm run test:integration:session:dmを実行して、検証済みのマトリックスを再現します。
このフェーズは固定セッションの基盤であり、完全なストアドルーチンデバッグではありません。構造化されたOUT/INOUT値、カーソルハンドル/フェッチ、ルーチンプロファイリング、ネイティブブレークポイントは、今後のロードマップ作業です。
リポジトリスキルはskills/damoxing-database-mcpにあります。
ヘルス出力
getHealth()は、安定したサニタイズされたスキーマを返します:
{
generatedAt,
initialized,
strictRouting,
defaultDatasourceId,
routeCount,
heartbeat: {
enabled,
running,
intervalMs
},
shutdownHooks: {
installed,
signals
},
summary: {
total,
ready,
failed,
unhealthy,
byStatus: {
configured,
initializing,
ready,
unhealthy,
failed,
recovering,
closed
}
},
datasources: [
{
id,
type,
status,
jgbhCount,
routeKeyCount,
isDefault,
lastHeartbeatAt,
lastReadyAt,
lastRecoverAt,
lastStatusChangeAt,
lastError
}
]
}データソース設定はヘルス出力に含まれないため、パスワードや接続文字列が公開されることはありません。
ロギング
データソースエラーは、構造化されたコンテキストを2番目のロガー引数として記録します:
{
datasourceId,
type,
jgbh,
jgbhList,
routeKeys,
status,
lastError,
error
}SQLテキストのロギングはデフォルトで有効です。SQLパラメータのロギングは、本番環境の機密情報が漏洩するのを防ぐため、デフォルトで無効になっています。
アダプターオプションを使用してパラメータロギングを制御します:
const adapterFactories = createDefaultAdapterFactories({
logger,
logSql: true,
logParams: 'redacted',
redactKeys: ['password', 'token', 'secret'],
redactValue: '[REDACTED]'
});logParamsは以下を受け入れます:
falseまたは'off':SQLパラメータをログに記録しないtrueまたは'redacted':機密キーを編集してパラメータをログに記録する'raw':ローカルデバッグ専用に生のパラメータをログに記録する
グレースフルシャットダウン
shutdownSignalsを使用して、プロセスがシグナルを受信したときにすべてのプールを閉じます:
const manager = new DataSourceManager({
shutdownSignals: ['SIGTERM', 'SIGINT'],
exitOnShutdownSignal: true,
adapterFactories,
config
});closeAll()は、ハートビートタイマーを停止し、シャットダウンフックを削除し、アダプターを閉じ、データソースをclosedとしてマークします。
設定形状
{
"strict_routing": true,
"default_datasource": "oracle_main",
"datasources": [
{
"id": "oracle_main",
"type": "oracle",
"jgbh_list": ["1001"],
"route_keys": ["tenant-a"],
"config": {}
}
]
}プールガバナンス
データソースレベルまたはconfig.poolの下で正規化されたプールオプションを使用します:
{
"id": "pg_main",
"type": "pg",
"pool": {
"minPoolSize": 1,
"maxPoolSize": 10,
"acquireTimeoutMs": 3000,
"connectTimeoutMs": 3000,
"idleTimeoutMs": 60000,
"maxLifetimeMs": 1800000,
"keepaliveMs": 30000
},
"config": {}
}マネージャーはサポートされているオプションを各ドライバーにマッピングし、サポートされていないオプションをデータソースコンテキストとともにログに記録します。minPoolSize > maxPoolSizeなどの無効な値は、設定ビルド中に失敗します。
applyPoolGovernance(type, config, pool)は、テストおよび診断用にエクスポートされています。
メトリクス
getMetrics()は、SQLテキスト、パラメータ、パスワード、または接続文字列なしで、カウンター、ゲージ、およびレイテンシサマリーを返します:
const metrics = manager.getMetrics();メトリクスは現在、初期化、ハートビート、復旧、クエリ成功/失敗、接続エラー、再試行、およびトランザクション接続エラーを追跡します。
ランタイムガバナンス
データソースは実行時に変更できます:
await manager.addDatasource({ id: 'tenant_a', type: 'pg', route_keys: ['TENANT_A'], config: {} });
await manager.updateDatasource('tenant_a', { id: 'tenant_a', type: 'pg', route_keys: ['TENANT_A'], config: {} });
await manager.removeDatasource('tenant_a');
await manager.reloadConfig(nextConfig);updateDatasource()は、古いプールを閉じる前に、置き換えを初期化してpingします。置き換えの初期化が失敗した場合、古いデータソースはアクティブなままです。
読み取り/書き込みグループ
グループルーティングはHTTP非依存です:
{
"groups": {
"tenant_a": {
"write": "tenant_a_master",
"read": [
"tenant_a_read_1",
{ "id": "tenant_a_read_2", "weight": 2 }
],
"strategy": "round-robin",
"fallbackToWrite": true
}
}
}const readDb = manager.getReadHandle('tenant_a');
const writeDb = manager.getWriteHandle('tenant_a');読み取り戦略はround-robin、random、weighted、first-readyです。異常な読み取りレプリカはスキップされます。
設定シークレット
設定値は、環境変数補間、環境参照、シークレットリゾルバーフック、および暗号化された値をサポートしています:
const manager = new DataSourceManager({
env: process.env,
secretResolver: async key => loadSecret(key),
decryptor: async value => decrypt(value),
config
});{
"password": "env:DB_PASSWORD",
"token": "secret:database/token",
"connectString": "postgres://app:${DB_PASSWORD}@localhost/db",
"encrypted": "ENC(ciphertext)"
}解決されたシークレットは、ヘルス出力、メトリクス出力、構造化されたデータソースエラー状態、およびマネージャーログから編集されます。
再試行ルール
接続のようなエラーは、プール復旧後に1回再試行される場合があります。
トランザクションは自動的に再生されません。トランザクションが接続エラーで失敗した場合、マネージャーはプールを再構築し、元のエラーを再スローします。
npmパッケージング
このパッケージはsrc/の下でTypeScriptで作成され、両方のモジュール形式をビルドします:
CommonJS:
dist/cjs/index.jsESM:
dist/esm/index.mjs型:
dist/types/index.d.ts
公開前にローカルでビルドします:
npm install
npm run release:checkESM出力は、TypeScriptからesbuildでコンパイルされます。ルートとアダプターの集約インポートはデータベースドライバーを遅延ロードするため、パッケージをインポートしてもoracledb、dmdb、またはpgがすぐに読み込まれることはありません。
組み込みのデータベースドライバーは、オプションのピア依存関係として宣言されています:
oracledb(Oracle用)mysql2(MySQLおよび両方のOceanBase Oracle/MySQLテナントモード用)dmdb(DM用)pg(PostgreSQL、GaussDB/openGauss、およびKingbase用)
パッケージルートをインポートしても、これらのドライバーはすぐに読み込まれません。アダプタークラスにアクセスしたり、createDefaultAdapterFactories()を通じてアダプターを作成したりすると、そのデータソースタイプに必要なドライバーのみが読み込まれます。
セマンティックバージョニング、レジストリ、トークン、証明、および最終公開チェックリストのガイダンスについては、RELEASE.mdを参照してください。
エンタープライズデータソースフレームワークのバックログと優先順位については、ROADMAP.mdを参照してください。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityFmaintenanceRead-only MCP server for SQL databases (SQL Server, Postgres, SQLite) with multi-server support and three-layer safety using AST validation and linting.MIT
- Alicense-qualityAmaintenanceA read-only MCP server for querying telemetry data from configurable backends. Provides tools to list sources, describe schemas, run bounded queries, and compute aggregates.MIT
- FlicenseAqualityCmaintenanceLocal stdio MCP server for read-only Microsoft SQL Server access through Python and pyodbc, providing test connection, list tables, describe table, and query tools.4
- Alicense-qualityAmaintenanceMCP server that connects to SQL databases (SQLite, PostgreSQL, MSSQL, MySQL) and provides tools to run read-only queries, list schemas/tables, and manage connections via stdio transport.Apache 2.0
Related MCP Connectors
Hosted MCP server for agent governance: MCP config audits, injection scans, scope-policy checks.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server for managing Prisma Postgres.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/xiaochen201807/damoxing-datasource-manager'
If you have feedback or need assistance with the MCP directory API, please join our Discord server