@thinkdata/cli 0.2.3 → 0.3.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/README.md +119 -0
- package/dist/bin/thinkdata.js +11 -0
- package/dist/bin/thinkdata.js.map +1 -1
- package/dist/cli.js +52450 -0
- package/dist/commands/compare.js +1 -1
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/extract.js +1 -1
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +91 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/serve.js +7 -7
- package/dist/commands/serve.js.map +1 -1
- package/dist/extractors/index.d.ts +15 -2
- package/dist/extractors/index.d.ts.map +1 -1
- package/dist/extractors/index.js +46 -10
- package/dist/extractors/index.js.map +1 -1
- package/dist/mcp/client.d.ts +104 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +103 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/resources.d.ts +12 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +113 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/toolManifest.d.ts +20 -0
- package/dist/mcp/toolManifest.d.ts.map +1 -0
- package/dist/mcp/toolManifest.js +38 -0
- package/dist/mcp/toolManifest.js.map +1 -0
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +652 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +19 -10
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkERD API Client
|
|
3
|
+
*
|
|
4
|
+
* MCP Server가 ThinkERD 클라우드 API와 통신하기 위한 HTTP 클라이언트입니다.
|
|
5
|
+
* PAT(Personal Access Token) 기반 인증을 사용합니다.
|
|
6
|
+
*
|
|
7
|
+
* @module client
|
|
8
|
+
*/
|
|
9
|
+
export class ThinkERDClient {
|
|
10
|
+
baseUrl;
|
|
11
|
+
headers;
|
|
12
|
+
constructor(apiUrl, token) {
|
|
13
|
+
this.baseUrl = apiUrl.replace(/\/+$/, '');
|
|
14
|
+
this.headers = {
|
|
15
|
+
'Authorization': `Bearer ${token}`,
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async request(path) {
|
|
20
|
+
const url = `${this.baseUrl}${path}`;
|
|
21
|
+
const res = await fetch(url, { headers: this.headers });
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
const body = await res.text().catch(() => '');
|
|
24
|
+
throw new Error(`ThinkERD API error ${res.status}: ${body || res.statusText}`);
|
|
25
|
+
}
|
|
26
|
+
// Content-Type에 따라 text 또는 JSON 파싱
|
|
27
|
+
const contentType = res.headers.get('content-type') || '';
|
|
28
|
+
if (contentType.includes('text/plain')) {
|
|
29
|
+
return res.text();
|
|
30
|
+
}
|
|
31
|
+
return res.json();
|
|
32
|
+
}
|
|
33
|
+
// ─── Diagrams ───
|
|
34
|
+
/** 사용자의 모든 다이어그램 목록 조회 */
|
|
35
|
+
async listDiagrams() {
|
|
36
|
+
return this.request('/api/mcp/diagrams');
|
|
37
|
+
}
|
|
38
|
+
/** 다이어그램 상세 (엔터티 + 관계 포함) */
|
|
39
|
+
async getDiagram(diagramId) {
|
|
40
|
+
return this.request(`/api/mcp/diagrams/${diagramId}`);
|
|
41
|
+
}
|
|
42
|
+
// ─── Entities ───
|
|
43
|
+
/** 단일 엔터티 상세 조회 */
|
|
44
|
+
async getEntity(diagramId, entityId) {
|
|
45
|
+
return this.request(`/api/mcp/diagrams/${diagramId}/entities/${entityId}`);
|
|
46
|
+
}
|
|
47
|
+
/** 엔터티 이름으로 검색 */
|
|
48
|
+
async searchEntities(diagramId, query) {
|
|
49
|
+
return this.request(`/api/mcp/diagrams/${diagramId}/entities?q=${encodeURIComponent(query)}`);
|
|
50
|
+
}
|
|
51
|
+
// ─── DDL ───
|
|
52
|
+
/** 다이어그램의 DDL 생성 */
|
|
53
|
+
async generateDDL(diagramId, dialect) {
|
|
54
|
+
const d = dialect ? `?dialect=${encodeURIComponent(dialect)}` : '';
|
|
55
|
+
return this.request(`/api/mcp/diagrams/${diagramId}/ddl${d}`);
|
|
56
|
+
}
|
|
57
|
+
// ─── Dictionary ───
|
|
58
|
+
/** 표준 사전 단어 목록 */
|
|
59
|
+
async getDictionary(projectId) {
|
|
60
|
+
return this.request(`/api/mcp/projects/${projectId}/dictionary`);
|
|
61
|
+
}
|
|
62
|
+
// ─── Drafts ───
|
|
63
|
+
/** 스키마 변경 제안 (Draft 생성) */
|
|
64
|
+
async proposeSchemaChange(diagramId, data) {
|
|
65
|
+
return this.postRequest(`/api/mcp/diagrams/${diagramId}/drafts`, data);
|
|
66
|
+
}
|
|
67
|
+
// ─── Sync / Push ───
|
|
68
|
+
async postRequest(path, body) {
|
|
69
|
+
const url = `${this.baseUrl}${path}`;
|
|
70
|
+
const res = await fetch(url, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: this.headers,
|
|
73
|
+
body: JSON.stringify(body),
|
|
74
|
+
});
|
|
75
|
+
if (!res.ok) {
|
|
76
|
+
const text = await res.text().catch(() => '');
|
|
77
|
+
throw new Error(`ThinkERD API error ${res.status}: ${text || res.statusText}`);
|
|
78
|
+
}
|
|
79
|
+
return res.json();
|
|
80
|
+
}
|
|
81
|
+
// ─── Context Provider (Project-level Ontology) ───
|
|
82
|
+
/** 자연어 질문 → 관련 엔터티 컨텍스트 (Graph RAG) */
|
|
83
|
+
async getProjectContext(projectId, question) {
|
|
84
|
+
return this.postRequest(`/api/mcp/projects/${projectId}/context`, { question });
|
|
85
|
+
}
|
|
86
|
+
/** 두 엔터티 간 JOIN 경로 탐색 */
|
|
87
|
+
async findJoinPath(projectId, from, to) {
|
|
88
|
+
return this.postRequest(`/api/mcp/projects/${projectId}/join-path`, { from, to });
|
|
89
|
+
}
|
|
90
|
+
/** 프로젝트 전체 스키마 요약 */
|
|
91
|
+
async getProjectSummary(projectId) {
|
|
92
|
+
return this.request(`/api/mcp/projects/${projectId}/summary`);
|
|
93
|
+
}
|
|
94
|
+
/** 메타데이터 풍부도 품질 보고 */
|
|
95
|
+
async checkMetadataQuality(projectId) {
|
|
96
|
+
return this.request(`/api/mcp/projects/${projectId}/quality`);
|
|
97
|
+
}
|
|
98
|
+
/** SPARQL 직접 실행 */
|
|
99
|
+
async queryOntology(projectId, query) {
|
|
100
|
+
return this.postRequest(`/api/ai/ontology/${projectId}/sparql`, { query });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resources 등록
|
|
3
|
+
*
|
|
4
|
+
* Resources는 읽기 전용 데이터를 노출합니다.
|
|
5
|
+
* AI 에이전트가 ThinkERD의 스키마 정보를 컨텍스트로 가져갈 수 있습니다.
|
|
6
|
+
*
|
|
7
|
+
* @module resources
|
|
8
|
+
*/
|
|
9
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import type { ThinkERDClient } from './client.js';
|
|
11
|
+
export declare function registerResources(server: McpServer, client: ThinkERDClient): void;
|
|
12
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgJjF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export function registerResources(server, client) {
|
|
2
|
+
// ── 다이어그램 목록 ──
|
|
3
|
+
server.resource('diagrams', 'thinkerd://diagrams', {
|
|
4
|
+
description: 'ThinkERD 프로젝트의 모든 다이어그램 목록을 반환합니다.',
|
|
5
|
+
}, async () => {
|
|
6
|
+
const diagrams = await client.listDiagrams();
|
|
7
|
+
return {
|
|
8
|
+
contents: [{
|
|
9
|
+
uri: 'thinkerd://diagrams',
|
|
10
|
+
mimeType: 'application/json',
|
|
11
|
+
text: JSON.stringify(diagrams, null, 2),
|
|
12
|
+
}],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
// ── 다이어그램 스키마 (엔터티 + 관계) ──
|
|
16
|
+
server.resource('diagram-schema', 'thinkerd://diagrams/{diagramId}/schema', {
|
|
17
|
+
description: '특정 다이어그램의 전체 스키마(엔터티, 컬럼, 관계)를 JSON으로 반환합니다.',
|
|
18
|
+
}, async (uri) => {
|
|
19
|
+
const diagramId = extractParam(uri.href, 'diagrams');
|
|
20
|
+
const data = await client.getDiagram(diagramId);
|
|
21
|
+
return {
|
|
22
|
+
contents: [{
|
|
23
|
+
uri: uri.href,
|
|
24
|
+
mimeType: 'application/json',
|
|
25
|
+
text: JSON.stringify(data, null, 2),
|
|
26
|
+
}],
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
// ── 단일 엔터티 상세 ──
|
|
30
|
+
server.resource('entity-detail', 'thinkerd://diagrams/{diagramId}/entities/{entityId}', {
|
|
31
|
+
description: '특정 엔터티의 논리명, 물리명, 컬럼 상세(타입, PK/FK, Nullable 등)를 반환합니다.',
|
|
32
|
+
}, async (uri) => {
|
|
33
|
+
const parts = uri.href.split('/');
|
|
34
|
+
const entitiesIdx = parts.indexOf('entities');
|
|
35
|
+
const diagramsIdx = parts.indexOf('diagrams');
|
|
36
|
+
const diagramId = parts[diagramsIdx + 1];
|
|
37
|
+
const entityId = parts[entitiesIdx + 1];
|
|
38
|
+
const entity = await client.getEntity(diagramId, entityId);
|
|
39
|
+
return {
|
|
40
|
+
contents: [{
|
|
41
|
+
uri: uri.href,
|
|
42
|
+
mimeType: 'application/json',
|
|
43
|
+
text: JSON.stringify(entity, null, 2),
|
|
44
|
+
}],
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
// ── DDL 생성 ──
|
|
48
|
+
server.resource('diagram-ddl', 'thinkerd://diagrams/{diagramId}/ddl', {
|
|
49
|
+
description: '다이어그램의 DDL(CREATE TABLE 구문)을 생성하여 반환합니다.',
|
|
50
|
+
}, async (uri) => {
|
|
51
|
+
const diagramId = extractParam(uri.href, 'diagrams');
|
|
52
|
+
const ddl = await client.generateDDL(diagramId);
|
|
53
|
+
return {
|
|
54
|
+
contents: [{
|
|
55
|
+
uri: uri.href,
|
|
56
|
+
mimeType: 'text/plain',
|
|
57
|
+
text: typeof ddl === 'string' ? ddl : JSON.stringify(ddl),
|
|
58
|
+
}],
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// ── 표준 사전 ──
|
|
62
|
+
server.resource('dictionary', 'thinkerd://projects/{projectId}/dictionary', {
|
|
63
|
+
description: '프로젝트의 표준 사전(단어, 도메인, 금칙어)을 반환합니다.',
|
|
64
|
+
}, async (uri) => {
|
|
65
|
+
const projectId = extractParam(uri.href, 'projects');
|
|
66
|
+
const words = await client.getDictionary(projectId);
|
|
67
|
+
return {
|
|
68
|
+
contents: [{
|
|
69
|
+
uri: uri.href,
|
|
70
|
+
mimeType: 'application/json',
|
|
71
|
+
text: JSON.stringify(words, null, 2),
|
|
72
|
+
}],
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
// ── 프로젝트 스키마 요약 (온톨로지) ──
|
|
76
|
+
server.resource('project-summary', 'thinkerd://projects/{projectId}/summary', {
|
|
77
|
+
description: '프로젝트 전체 데이터 모델의 요약(엔터티 수, 관계 수, 주제영역 구성, RDF 트리플 수)을 반환합니다.',
|
|
78
|
+
}, async (uri) => {
|
|
79
|
+
const projectId = extractParam(uri.href, 'projects');
|
|
80
|
+
const summary = await client.getProjectSummary(projectId);
|
|
81
|
+
return {
|
|
82
|
+
contents: [{
|
|
83
|
+
uri: uri.href,
|
|
84
|
+
mimeType: 'application/json',
|
|
85
|
+
text: JSON.stringify(summary, null, 2),
|
|
86
|
+
}],
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
// ── 메타데이터 품질 보고 ──
|
|
90
|
+
server.resource('metadata-quality', 'thinkerd://projects/{projectId}/quality', {
|
|
91
|
+
description: '프로젝트의 메타데이터 풍부도(설명, 동의어, 속성 입력률)를 분석한 품질 보고서를 반환합니다.',
|
|
92
|
+
}, async (uri) => {
|
|
93
|
+
const projectId = extractParam(uri.href, 'projects');
|
|
94
|
+
const report = await client.checkMetadataQuality(projectId);
|
|
95
|
+
return {
|
|
96
|
+
contents: [{
|
|
97
|
+
uri: uri.href,
|
|
98
|
+
mimeType: 'application/json',
|
|
99
|
+
text: JSON.stringify(report, null, 2),
|
|
100
|
+
}],
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** URI에서 특정 세그먼트 뒤의 ID를 추출하는 유틸리티 */
|
|
105
|
+
function extractParam(href, segment) {
|
|
106
|
+
const parts = href.split('/');
|
|
107
|
+
const idx = parts.indexOf(segment);
|
|
108
|
+
if (idx === -1 || idx + 1 >= parts.length) {
|
|
109
|
+
throw new Error(`Invalid URI: cannot extract '${segment}' parameter from ${href}`);
|
|
110
|
+
}
|
|
111
|
+
return parts[idx + 1];
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 배송되는 도구 목록의 **정본**.
|
|
3
|
+
*
|
|
4
|
+
* ## 왜 목록을 따로 적는가
|
|
5
|
+
*
|
|
6
|
+
* 2026-08-29 점검에서 **레포에 18종, npm에 5종**이 있는 것이 발견됐다. 13종은 한
|
|
7
|
+
* 번도 배송된 적이 없었다. 원인은 배포 자동화가 태그를 밀 때만 도는데 **태그 미는
|
|
8
|
+
* 것을 잊은 것**이고, 더 근본적으로는 "레포에 있는 것"과 "실제로 나간 것"을
|
|
9
|
+
* **아무도 대조하지 않은 것**이다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 대조를 사람이 아니라 테스트가 한다. 도구를 추가·삭제하면 이 파일도 같이
|
|
12
|
+
* 고쳐야 하고, 안 고치면 `toolContract.test.ts`가 실패한다.
|
|
13
|
+
*
|
|
14
|
+
* `@thinkdata/governance-types`의 `copilot-actions.ts`가 액션 프로토콜에 대해
|
|
15
|
+
* 하는 역할과 같다 (CLAUDE.md §4.5).
|
|
16
|
+
*/
|
|
17
|
+
/** 등록되는 도구 이름 — `registerTools`와 정확히 일치해야 한다 */
|
|
18
|
+
export declare const TOOL_MANIFEST: readonly ["get_entity", "search_entities", "generate_ddl", "validate_schema", "harvest_schema_semantics", "propose_schema_change", "get_business_dictionary", "analyze_legacy_sql", "semantic_search", "get_business_context", "generate_sql", "get_project_context", "find_join_path", "get_project_summary", "query_ontology", "check_metadata_quality"];
|
|
19
|
+
export type ToolName = (typeof TOOL_MANIFEST)[number];
|
|
20
|
+
//# sourceMappingURL=toolManifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolManifest.d.ts","sourceRoot":"","sources":["../../src/mcp/toolManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,gDAAgD;AAChD,eAAO,MAAM,aAAa,4VAmBhB,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 배송되는 도구 목록의 **정본**.
|
|
3
|
+
*
|
|
4
|
+
* ## 왜 목록을 따로 적는가
|
|
5
|
+
*
|
|
6
|
+
* 2026-08-29 점검에서 **레포에 18종, npm에 5종**이 있는 것이 발견됐다. 13종은 한
|
|
7
|
+
* 번도 배송된 적이 없었다. 원인은 배포 자동화가 태그를 밀 때만 도는데 **태그 미는
|
|
8
|
+
* 것을 잊은 것**이고, 더 근본적으로는 "레포에 있는 것"과 "실제로 나간 것"을
|
|
9
|
+
* **아무도 대조하지 않은 것**이다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 대조를 사람이 아니라 테스트가 한다. 도구를 추가·삭제하면 이 파일도 같이
|
|
12
|
+
* 고쳐야 하고, 안 고치면 `toolContract.test.ts`가 실패한다.
|
|
13
|
+
*
|
|
14
|
+
* `@thinkdata/governance-types`의 `copilot-actions.ts`가 액션 프로토콜에 대해
|
|
15
|
+
* 하는 역할과 같다 (CLAUDE.md §4.5).
|
|
16
|
+
*/
|
|
17
|
+
/** 등록되는 도구 이름 — `registerTools`와 정확히 일치해야 한다 */
|
|
18
|
+
export const TOOL_MANIFEST = [
|
|
19
|
+
// ── 스키마 조회 ──
|
|
20
|
+
'get_entity',
|
|
21
|
+
'search_entities',
|
|
22
|
+
'generate_ddl',
|
|
23
|
+
'validate_schema',
|
|
24
|
+
'harvest_schema_semantics',
|
|
25
|
+
'propose_schema_change',
|
|
26
|
+
'get_business_dictionary',
|
|
27
|
+
'analyze_legacy_sql',
|
|
28
|
+
// ── 의미 계층·온톨로지 ──
|
|
29
|
+
'semantic_search',
|
|
30
|
+
'get_business_context',
|
|
31
|
+
'generate_sql',
|
|
32
|
+
'get_project_context',
|
|
33
|
+
'find_join_path',
|
|
34
|
+
'get_project_summary',
|
|
35
|
+
'query_ontology',
|
|
36
|
+
'check_metadata_quality',
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=toolManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolManifest.js","sourceRoot":"","sources":["../../src/mcp/toolManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,eAAe;IACf,YAAY;IACZ,iBAAiB;IACjB,cAAc;IACd,iBAAiB;IACjB,0BAA0B;IAC1B,uBAAuB;IACvB,yBAAyB;IACzB,oBAAoB;IACpB,mBAAmB;IACnB,iBAAiB;IACjB,sBAAsB;IACtB,cAAc;IACd,qBAAqB;IACrB,gBAAgB;IAChB,qBAAqB;IACrB,gBAAgB;IAChB,wBAAwB;CAClB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA0vB7E"}
|