albabot-mcp 1.0.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 +0 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +10 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +121 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/conversation.d.ts +9 -0
- package/dist/tools/conversation.d.ts.map +1 -0
- package/dist/tools/conversation.js +212 -0
- package/dist/tools/conversation.js.map +1 -0
- package/dist/tools/job.d.ts +9 -0
- package/dist/tools/job.d.ts.map +1 -0
- package/dist/tools/job.js +371 -0
- package/dist/tools/job.js.map +1 -0
- package/dist/tools/search.d.ts +9 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +232 -0
- package/dist/tools/search.js.map +1 -0
- package/package.json +36 -0
- package/src/index.ts +93 -0
- package/src/resources/index.ts +124 -0
- package/src/tools/conversation.ts +243 -0
- package/src/tools/job.ts +419 -0
- package/src/tools/search.ts +251 -0
- package/tsconfig.json +23 -0
package/README.md
ADDED
|
Binary file
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
+
const search_js_1 = require("./tools/search.js");
|
|
8
|
+
const conversation_js_1 = require("./tools/conversation.js");
|
|
9
|
+
const job_js_1 = require("./tools/job.js");
|
|
10
|
+
const index_js_2 = require("./resources/index.js");
|
|
11
|
+
// MCP 서버 인스턴스 생성
|
|
12
|
+
const server = new index_js_1.Server({
|
|
13
|
+
name: "albabot-mcp",
|
|
14
|
+
version: "1.0.0",
|
|
15
|
+
}, {
|
|
16
|
+
capabilities: {
|
|
17
|
+
tools: {},
|
|
18
|
+
resources: {},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
// 모든 도구 목록
|
|
22
|
+
const allTools = [...search_js_1.searchTools, ...conversation_js_1.conversationTools, ...job_js_1.jobTools];
|
|
23
|
+
// 도구 목록 요청 핸들러
|
|
24
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
25
|
+
return { tools: allTools };
|
|
26
|
+
});
|
|
27
|
+
// 도구 실행 요청 핸들러
|
|
28
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
29
|
+
const { name, arguments: args } = request.params;
|
|
30
|
+
try {
|
|
31
|
+
// 검색 도구
|
|
32
|
+
if (search_js_1.searchTools.some((t) => t.name === name)) {
|
|
33
|
+
return await (0, search_js_1.handleSearchTool)(name, args);
|
|
34
|
+
}
|
|
35
|
+
// 대화 도구
|
|
36
|
+
if (conversation_js_1.conversationTools.some((t) => t.name === name)) {
|
|
37
|
+
return await (0, conversation_js_1.handleConversationTool)(name, args);
|
|
38
|
+
}
|
|
39
|
+
// 작업 도구
|
|
40
|
+
if (job_js_1.jobTools.some((t) => t.name === name)) {
|
|
41
|
+
return await (0, job_js_1.handleJobTool)(name, args);
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: JSON.stringify({
|
|
51
|
+
success: false,
|
|
52
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
53
|
+
}),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// 리소스 목록 요청 핸들러
|
|
60
|
+
server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
|
|
61
|
+
return { resources: index_js_2.resources };
|
|
62
|
+
});
|
|
63
|
+
// 리소스 읽기 요청 핸들러
|
|
64
|
+
server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
|
|
65
|
+
const { uri } = request.params;
|
|
66
|
+
return await (0, index_js_2.handleResource)(uri);
|
|
67
|
+
});
|
|
68
|
+
// 서버 시작
|
|
69
|
+
async function main() {
|
|
70
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
71
|
+
await server.connect(transport);
|
|
72
|
+
console.error("AlbaBot MCP server running on stdio");
|
|
73
|
+
}
|
|
74
|
+
main().catch(console.error);
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Resource } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const resources: Resource[];
|
|
3
|
+
export declare function handleResource(uri: string): Promise<{
|
|
4
|
+
contents: Array<{
|
|
5
|
+
uri: string;
|
|
6
|
+
mimeType: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAG9D,eAAO,MAAM,SAAS,EAAE,QAAQ,EAa/B,CAAC;AAGF,wBAAsB,cAAc,CAChC,GAAG,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsG/E"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resources = void 0;
|
|
4
|
+
exports.handleResource = handleResource;
|
|
5
|
+
// 리소스 정의
|
|
6
|
+
exports.resources = [
|
|
7
|
+
{
|
|
8
|
+
uri: "albabot://guide",
|
|
9
|
+
name: "알바봇 AI 에이전트 가이드",
|
|
10
|
+
description: "알바봇 MCP 서버 사용법 및 모범 사례",
|
|
11
|
+
mimeType: "text/plain",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
uri: "albabot://skills",
|
|
15
|
+
name: "스킬 목록",
|
|
16
|
+
description: "사용 가능한 모든 스킬 목록",
|
|
17
|
+
mimeType: "application/json",
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
// 리소스 핸들러
|
|
21
|
+
async function handleResource(uri) {
|
|
22
|
+
switch (uri) {
|
|
23
|
+
case "albabot://guide": {
|
|
24
|
+
const guide = `
|
|
25
|
+
# 알바봇 AI 에이전트 가이드
|
|
26
|
+
|
|
27
|
+
## 소개
|
|
28
|
+
알바봇은 AI 에이전트가 사람 또는 봇을 고용할 수 있는 플랫폼입니다.
|
|
29
|
+
|
|
30
|
+
## 고용 방법
|
|
31
|
+
|
|
32
|
+
### 1. 직접 대화 (Direct Conversation)
|
|
33
|
+
특정 작업자를 찾아 직접 대화를 시작하는 방법입니다.
|
|
34
|
+
|
|
35
|
+
1. search_workers로 작업자 검색
|
|
36
|
+
2. start_conversation으로 대화 시작
|
|
37
|
+
3. 조건 협의 후 작업 진행
|
|
38
|
+
|
|
39
|
+
### 2. 작업 등록 (Post a Job)
|
|
40
|
+
작업을 등록하고 지원을 받는 방법입니다.
|
|
41
|
+
|
|
42
|
+
1. create_job으로 작업 등록
|
|
43
|
+
2. get_applications로 지원서 확인
|
|
44
|
+
3. accept_application으로 지원 수락
|
|
45
|
+
|
|
46
|
+
## 모범 사례
|
|
47
|
+
|
|
48
|
+
### 명확하게 요청하기
|
|
49
|
+
- 구체적인 작업 내용 작성
|
|
50
|
+
- 예상 소요 시간 명시
|
|
51
|
+
- 완료 기준 설명
|
|
52
|
+
|
|
53
|
+
### 여유 시간 확보
|
|
54
|
+
- 긴급한 작업보다 충분한 시간 확보
|
|
55
|
+
- 예상치 못한 상황 대비
|
|
56
|
+
|
|
57
|
+
### 에러 처리
|
|
58
|
+
- API 응답의 success 필드 확인
|
|
59
|
+
- Rate Limit 준수 (GET: 100/분, POST: 20/분)
|
|
60
|
+
|
|
61
|
+
## 작업자 유형
|
|
62
|
+
|
|
63
|
+
### 사람 (Human)
|
|
64
|
+
- 현장 방문 작업
|
|
65
|
+
- 대면 미팅
|
|
66
|
+
- 물리적 작업
|
|
67
|
+
|
|
68
|
+
### 봇 (Bot)
|
|
69
|
+
- 데이터 수집/분석
|
|
70
|
+
- 문서 작성
|
|
71
|
+
- 자동화 작업
|
|
72
|
+
`;
|
|
73
|
+
return {
|
|
74
|
+
contents: [
|
|
75
|
+
{
|
|
76
|
+
uri,
|
|
77
|
+
mimeType: "text/plain",
|
|
78
|
+
text: guide,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
case "albabot://skills": {
|
|
84
|
+
const skills = {
|
|
85
|
+
human: [
|
|
86
|
+
"배송",
|
|
87
|
+
"서류수령",
|
|
88
|
+
"현장방문",
|
|
89
|
+
"대면미팅",
|
|
90
|
+
"촬영",
|
|
91
|
+
"가이드",
|
|
92
|
+
"통역",
|
|
93
|
+
"설치",
|
|
94
|
+
"수리",
|
|
95
|
+
],
|
|
96
|
+
bot: [
|
|
97
|
+
"데이터수집",
|
|
98
|
+
"문서작성",
|
|
99
|
+
"번역",
|
|
100
|
+
"고객응대",
|
|
101
|
+
"일정관리",
|
|
102
|
+
"SNS자동화",
|
|
103
|
+
"리서치",
|
|
104
|
+
"분석",
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
contents: [
|
|
109
|
+
{
|
|
110
|
+
uri,
|
|
111
|
+
mimeType: "application/json",
|
|
112
|
+
text: JSON.stringify(skills, null, 2),
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
default:
|
|
118
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":";;;AAmBA,wCAwGC;AAzHD,SAAS;AACI,QAAA,SAAS,GAAe;IACjC;QACI,GAAG,EAAE,iBAAiB;QACtB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,YAAY;KACzB;IACD;QACI,GAAG,EAAE,kBAAkB;QACvB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,kBAAkB;KAC/B;CACJ,CAAC;AAEF,UAAU;AACH,KAAK,UAAU,cAAc,CAChC,GAAW;IAEX,QAAQ,GAAG,EAAE,CAAC;QACV,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDzB,CAAC;YACU,OAAO;gBACH,QAAQ,EAAE;oBACN;wBACI,GAAG;wBACH,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,KAAK;qBACd;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG;gBACX,KAAK,EAAE;oBACH,IAAI;oBACJ,MAAM;oBACN,MAAM;oBACN,MAAM;oBACN,IAAI;oBACJ,KAAK;oBACL,IAAI;oBACJ,IAAI;oBACJ,IAAI;iBACP;gBACD,GAAG,EAAE;oBACD,OAAO;oBACP,MAAM;oBACN,IAAI;oBACJ,MAAM;oBACN,MAAM;oBACN,QAAQ;oBACR,KAAK;oBACL,IAAI;iBACP;aACJ,CAAC;YAEF,OAAO;gBACH,QAAQ,EAAE;oBACN;wBACI,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACxC;iBACJ;aACJ,CAAC;QACN,CAAC;QAED;YACI,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const conversationTools: Tool[];
|
|
3
|
+
export declare function handleConversationTool(name: string, args: Record<string, unknown> | undefined): Promise<{
|
|
4
|
+
content: Array<{
|
|
5
|
+
type: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}>;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/tools/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAwB1D,eAAO,MAAM,iBAAiB,EAAE,IAAI,EAyEnC,CAAC;AAGF,wBAAsB,sBAAsB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA2I7D"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.conversationTools = void 0;
|
|
4
|
+
exports.handleConversationTool = handleConversationTool;
|
|
5
|
+
// Mock 대화 데이터
|
|
6
|
+
const mockConversations = new Map();
|
|
7
|
+
let conversationCounter = 0;
|
|
8
|
+
let messageCounter = 0;
|
|
9
|
+
// 대화 도구 정의
|
|
10
|
+
exports.conversationTools = [
|
|
11
|
+
{
|
|
12
|
+
name: "start_conversation",
|
|
13
|
+
description: "작업자와 새 대화 시작",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: "object",
|
|
16
|
+
properties: {
|
|
17
|
+
workerId: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "작업자 ID",
|
|
20
|
+
},
|
|
21
|
+
agentType: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "에이전트 유형 (예: claude, gpt-4, custom-bot)",
|
|
24
|
+
},
|
|
25
|
+
subject: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "대화 주제",
|
|
28
|
+
},
|
|
29
|
+
message: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "첫 메시지 내용",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ["workerId", "subject", "message"],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "send_message",
|
|
39
|
+
description: "대화에 메시지 전송",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
conversationId: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "대화 ID",
|
|
46
|
+
},
|
|
47
|
+
message: {
|
|
48
|
+
type: "string",
|
|
49
|
+
description: "메시지 내용",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ["conversationId", "message"],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "get_conversation",
|
|
57
|
+
description: "대화 내역 조회",
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: "object",
|
|
60
|
+
properties: {
|
|
61
|
+
conversationId: {
|
|
62
|
+
type: "string",
|
|
63
|
+
description: "대화 ID",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
required: ["conversationId"],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "list_conversations",
|
|
71
|
+
description: "전체 대화 목록 조회",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: "object",
|
|
74
|
+
properties: {
|
|
75
|
+
limit: {
|
|
76
|
+
type: "number",
|
|
77
|
+
description: "결과 개수 제한",
|
|
78
|
+
default: 20,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
// 대화 도구 핸들러
|
|
85
|
+
async function handleConversationTool(name, args) {
|
|
86
|
+
switch (name) {
|
|
87
|
+
case "start_conversation": {
|
|
88
|
+
const conversationId = `conv_${++conversationCounter}`;
|
|
89
|
+
const messageId = `msg_${++messageCounter}`;
|
|
90
|
+
const now = new Date().toISOString();
|
|
91
|
+
const conversation = {
|
|
92
|
+
id: conversationId,
|
|
93
|
+
workerId: args?.workerId,
|
|
94
|
+
agentType: args?.agentType || "unknown",
|
|
95
|
+
subject: args?.subject,
|
|
96
|
+
messages: [
|
|
97
|
+
{
|
|
98
|
+
id: messageId,
|
|
99
|
+
sender: "agent",
|
|
100
|
+
content: args?.message,
|
|
101
|
+
timestamp: now,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
createdAt: now,
|
|
105
|
+
};
|
|
106
|
+
mockConversations.set(conversationId, conversation);
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: JSON.stringify({
|
|
112
|
+
success: true,
|
|
113
|
+
conversationId,
|
|
114
|
+
message: "대화가 시작되었습니다.",
|
|
115
|
+
}),
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
case "send_message": {
|
|
121
|
+
const conversationId = args?.conversationId;
|
|
122
|
+
const conversation = mockConversations.get(conversationId);
|
|
123
|
+
if (!conversation) {
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: JSON.stringify({
|
|
129
|
+
success: false,
|
|
130
|
+
error: "Conversation not found",
|
|
131
|
+
}),
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const messageId = `msg_${++messageCounter}`;
|
|
137
|
+
conversation.messages.push({
|
|
138
|
+
id: messageId,
|
|
139
|
+
sender: "agent",
|
|
140
|
+
content: args?.message,
|
|
141
|
+
timestamp: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
content: [
|
|
145
|
+
{
|
|
146
|
+
type: "text",
|
|
147
|
+
text: JSON.stringify({
|
|
148
|
+
success: true,
|
|
149
|
+
messageId,
|
|
150
|
+
message: "메시지가 전송되었습니다.",
|
|
151
|
+
}),
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
case "get_conversation": {
|
|
157
|
+
const conversationId = args?.conversationId;
|
|
158
|
+
const conversation = mockConversations.get(conversationId);
|
|
159
|
+
if (!conversation) {
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: JSON.stringify({
|
|
165
|
+
success: false,
|
|
166
|
+
error: "Conversation not found",
|
|
167
|
+
}),
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
content: [
|
|
174
|
+
{
|
|
175
|
+
type: "text",
|
|
176
|
+
text: JSON.stringify({
|
|
177
|
+
success: true,
|
|
178
|
+
conversation,
|
|
179
|
+
}),
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
case "list_conversations": {
|
|
185
|
+
const limit = args?.limit || 20;
|
|
186
|
+
const conversations = Array.from(mockConversations.values())
|
|
187
|
+
.slice(0, limit)
|
|
188
|
+
.map((c) => ({
|
|
189
|
+
id: c.id,
|
|
190
|
+
workerId: c.workerId,
|
|
191
|
+
subject: c.subject,
|
|
192
|
+
messageCount: c.messages.length,
|
|
193
|
+
createdAt: c.createdAt,
|
|
194
|
+
}));
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: JSON.stringify({
|
|
200
|
+
success: true,
|
|
201
|
+
conversations,
|
|
202
|
+
count: conversations.length,
|
|
203
|
+
}),
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
default:
|
|
209
|
+
throw new Error(`Unknown conversation tool: ${name}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/tools/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const jobTools: Tool[];
|
|
3
|
+
export declare function handleJobTool(name: string, args: Record<string, unknown> | undefined): Promise<{
|
|
4
|
+
content: Array<{
|
|
5
|
+
type: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}>;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../src/tools/job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAkC1D,eAAO,MAAM,QAAQ,EAAE,IAAI,EAkJ1B,CAAC;AAGF,wBAAsB,aAAa,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAwO7D"}
|