@crmforall/connector 0.1.1 → 0.1.3
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/contracts.d.ts +1 -0
- package/dist/contracts.js +2 -0
- package/dist/server.js +8 -0
- package/dist/tools.js +42 -0
- package/package.json +2 -1
package/dist/contracts.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export declare const MCP_TOOL: {
|
|
|
16
16
|
readonly IMPORT_PROSPECTS: "import_prospects";
|
|
17
17
|
readonly REGISTER_ENTRY_POINT: "register_entry_point";
|
|
18
18
|
readonly TRACK_ENGAGEMENT: "track_engagement";
|
|
19
|
+
readonly ONBOARDING_STATUS: "onboarding_status";
|
|
19
20
|
};
|
|
20
21
|
export type McpToolName = (typeof MCP_TOOL)[keyof typeof MCP_TOOL];
|
|
21
22
|
export declare const APPROVAL_SCOPE: {
|
package/dist/contracts.js
CHANGED
|
@@ -19,6 +19,7 @@ exports.MCP_TOOL = {
|
|
|
19
19
|
IMPORT_PROSPECTS: "import_prospects",
|
|
20
20
|
REGISTER_ENTRY_POINT: "register_entry_point",
|
|
21
21
|
TRACK_ENGAGEMENT: "track_engagement",
|
|
22
|
+
ONBOARDING_STATUS: "onboarding_status",
|
|
22
23
|
};
|
|
23
24
|
exports.APPROVAL_SCOPE = {
|
|
24
25
|
TARGET_SNAPSHOT_CREATE: "target_snapshot:create",
|
|
@@ -41,6 +42,7 @@ exports.TOOL_APPROVAL_REQUIREMENT = {
|
|
|
41
42
|
[exports.MCP_TOOL.IMPORT_PROSPECTS]: exports.APPROVAL_SCOPE.PROSPECT_IMPORT,
|
|
42
43
|
[exports.MCP_TOOL.REGISTER_ENTRY_POINT]: exports.APPROVAL_SCOPE.ENTRY_POINT_REGISTER,
|
|
43
44
|
[exports.MCP_TOOL.TRACK_ENGAGEMENT]: null,
|
|
45
|
+
[exports.MCP_TOOL.ONBOARDING_STATUS]: null,
|
|
44
46
|
};
|
|
45
47
|
/** 승인 토큰이 필요한 도구 — 토큰 없이 호출되면 즉시 거부한다. */
|
|
46
48
|
exports.APPROVAL_REQUIRED_TOOLS = new Set(Object.entries(exports.TOOL_APPROVAL_REQUIREMENT)
|
package/dist/server.js
CHANGED
|
@@ -30,6 +30,14 @@ async function main() {
|
|
|
30
30
|
const server = new mcp_js_1.McpServer({
|
|
31
31
|
name: "crmforall-connector",
|
|
32
32
|
version: "0.1.0",
|
|
33
|
+
}, {
|
|
34
|
+
instructions: [
|
|
35
|
+
"크렘포올 DB 커넥터입니다. 고객사 DB를 진단·연결·매핑해 크렘포올 플랫폼과 잇습니다.",
|
|
36
|
+
"온보딩 순서: onboarding_status로 현재 단계를 확인 → test_connection(연결·권한) → inspect_schema(컬럼 확인) → propose_field_mapping(후보) → validate_mapping(persist=true)으로 확정.",
|
|
37
|
+
"막히면 onboarding_status의 nextStep을 따르세요. 오류 응답의 hint도 다음 행동을 알려줍니다.",
|
|
38
|
+
"보안 원칙: DB 비밀번호·커넥터 시크릿·고객 개인정보(전화번호 원문 등)는 절대 사용자에게 출력하지 마세요. 컬럼명·집계·인원수만 다룹니다.",
|
|
39
|
+
"쓰기/발송 도구(create_target_snapshot·send_kakao_message 등)는 플랫폼의 사람 승인 토큰이 있어야 동작합니다. 승인 없이는 거부됩니다.",
|
|
40
|
+
].join("\n"),
|
|
33
41
|
});
|
|
34
42
|
(0, tools_1.registerTools)(server, {
|
|
35
43
|
config,
|
package/dist/tools.js
CHANGED
|
@@ -73,6 +73,48 @@ function requireMapping(rt, mappingVersion) {
|
|
|
73
73
|
}
|
|
74
74
|
function registerTools(server, rt) {
|
|
75
75
|
const s = rt.config.crmSchema;
|
|
76
|
+
// AI 온보딩 안내 — 지금 어디까지 됐고 다음에 뭘 할지 한 번에 알려준다.
|
|
77
|
+
server.tool(contracts_1.MCP_TOOL.ONBOARDING_STATUS, "온보딩 진행 상태와 다음 할 일을 반환한다. 연결 직후·중간에 호출해 흐름을 안내받는다 (승인 불필요).", {}, async () => {
|
|
78
|
+
const steps = [];
|
|
79
|
+
// 1) 자격증명/설정
|
|
80
|
+
steps.push({ step: "register", done: true, detail: `connectionId=${rt.config.connectionId}` });
|
|
81
|
+
// 2) DB 연결·권한
|
|
82
|
+
let dbReady = false;
|
|
83
|
+
let overpriv = false;
|
|
84
|
+
try {
|
|
85
|
+
const db = await rt.getDb();
|
|
86
|
+
const report = await db.checkReadiness({ crmSchema: s });
|
|
87
|
+
dbReady = report.ready;
|
|
88
|
+
overpriv = report.overprivileged;
|
|
89
|
+
steps.push({
|
|
90
|
+
step: "db_connection",
|
|
91
|
+
done: report.ready && !report.overprivileged,
|
|
92
|
+
detail: report.overprivileged ? "과권한 계정 — 권한 축소 필요" : report.ready ? "연결·스키마 정상" : "준비 미완 (doctor 참고)",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
steps.push({ step: "db_connection", done: false, detail: err instanceof Error ? err.message : String(err) });
|
|
97
|
+
}
|
|
98
|
+
// 3) 필드 매핑
|
|
99
|
+
const mapped = rt.config.mapping !== null;
|
|
100
|
+
steps.push({ step: "field_mapping", done: mapped, detail: mapped ? "매핑 확정됨" : "propose_field_mapping → validate_mapping(persist=true) 필요" });
|
|
101
|
+
// 다음 할 일 한 줄
|
|
102
|
+
let nextStep;
|
|
103
|
+
if (overpriv)
|
|
104
|
+
nextStep = "DB 계정이 과권한입니다. test_connection의 권한 축소 SQL을 DBA에게 전달해 권한을 낮춘 뒤 다시 시도하세요.";
|
|
105
|
+
else if (!dbReady)
|
|
106
|
+
nextStep = "DB 연결/스키마가 준비되지 않았습니다. test_connection으로 원인을 확인하세요.";
|
|
107
|
+
else if (!mapped)
|
|
108
|
+
nextStep = "inspect_schema로 컬럼을 본 뒤, propose_field_mapping으로 후보를 만들고 validate_mapping(persist=true)으로 확정하세요.";
|
|
109
|
+
else
|
|
110
|
+
nextStep = "온보딩 완료! preview_targets로 대상을 미리 보거나, 실시간 동기화를 켜세요.";
|
|
111
|
+
return ok({
|
|
112
|
+
ready: dbReady && !overpriv && mapped,
|
|
113
|
+
steps,
|
|
114
|
+
nextStep,
|
|
115
|
+
guidance: "이 순서로 진행하세요: test_connection → inspect_schema → propose_field_mapping → validate_mapping(persist=true) → (완료) preview_targets. 자격증명·비밀번호는 절대 출력하지 마세요.",
|
|
116
|
+
});
|
|
117
|
+
});
|
|
76
118
|
server.tool(contracts_1.MCP_TOOL.TEST_CONNECTION, "DB 연결 상태와 권한 요약을 반환한다 (승인 불필요, 민감정보 미노출)", {}, async () => {
|
|
77
119
|
try {
|
|
78
120
|
const db = await rt.getDb();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crmforall/connector",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "crmforall MCP 커넥터 — 운영 DB 읽기, CRM 스키마 쓰기(승인 토큰 필수), 대상 산출",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
],
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsc && chmod +x dist/server.js",
|
|
26
|
+
"prepack": "chmod +x dist/server.js",
|
|
26
27
|
"typecheck": "tsc --noEmit",
|
|
27
28
|
"test": "vitest run",
|
|
28
29
|
"start": "node dist/server.js"
|