@vat-mcp/daily-report 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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,103 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { handleGetMissingDates, handleGetKintaiByDate } from "./tools/kintai.js";
6
+ import { handleGetTasks } from "./tools/task.js";
7
+ import { handleGetReportsByKintai, handleSubmitDailyReport, } from "./tools/report.js";
8
+ // ── 环境变量校验 ──────────────────────────────────────────────
9
+ const token = process.env.SMS_TOKEN;
10
+ if (!token) {
11
+ console.error("[Error] 环境变量 SMS_TOKEN 未设置,服务无法启动。");
12
+ console.error(" 用法: SMS_TOKEN=<your_bearer_token> node dist/index.js");
13
+ process.exit(1);
14
+ }
15
+ if (!process.env.SMS_BASE_URL) {
16
+ console.error("[Error] 环境变量 SMS_BASE_URL 未设置,服务无法启动。");
17
+ console.error(" 用法: SMS_BASE_URL=<your_api_base_url> node dist/index.js");
18
+ process.exit(1);
19
+ }
20
+ // ── MCP Server 初始化 ─────────────────────────────────────────
21
+ const server = new McpServer({
22
+ name: "mcp-daily-report",
23
+ version: "1.0.0",
24
+ });
25
+ async function runTool(fn) {
26
+ try {
27
+ const text = await fn();
28
+ return { content: [{ type: "text", text }] };
29
+ }
30
+ catch (error) {
31
+ const msg = error instanceof Error ? error.message : String(error);
32
+ console.error(`[Tool Error] ${msg}`);
33
+ return {
34
+ content: [{ type: "text", text: `❌ 操作失败:${msg}` }],
35
+ isError: true,
36
+ };
37
+ }
38
+ }
39
+ // ── Tool 1: get_missing_dates ─────────────────────────────────
40
+ server.registerTool("get_missing_dates", {
41
+ description: "查询未填写日报的日期列表,返回所有需要补填日报的日期",
42
+ }, async () => runTool(() => handleGetMissingDates(token)));
43
+ // ── Tool 2: get_tasks ─────────────────────────────────────────
44
+ server.registerTool("get_tasks", {
45
+ description: "获取当前用户的工作任务列表(项目列表),提交日报时必须选择其中一个 proposalId",
46
+ }, async () => runTool(() => handleGetTasks(token)));
47
+ // ── Tool 3: get_kintai_by_date ────────────────────────────────
48
+ server.registerTool("get_kintai_by_date", {
49
+ description: "根据日期获取考勤信息(包含 kintaiId),日期格式为 YYYY/MM/DD",
50
+ inputSchema: {
51
+ date: z
52
+ .string()
53
+ .regex(/^\d{4}\/\d{2}\/\d{2}$/, "日期格式必须为 YYYY/MM/DD")
54
+ .describe("日期,格式 YYYY/MM/DD,例如 2026/03/19"),
55
+ },
56
+ }, async ({ date }) => runTool(() => handleGetKintaiByDate(token, date)));
57
+ // ── Tool 4: get_reports_by_kintai ─────────────────────────────
58
+ server.registerTool("get_reports_by_kintai", {
59
+ description: "根据考勤ID查询该天已有的日报列表,用于在提交前确认是否已存在日报",
60
+ inputSchema: {
61
+ kintaiId: z
62
+ .number()
63
+ .int()
64
+ .positive()
65
+ .describe("考勤记录ID,从 get_kintai_by_date 返回结果中获取"),
66
+ },
67
+ }, async ({ kintaiId }) => runTool(() => handleGetReportsByKintai(token, kintaiId)));
68
+ // ── Tool 5: submit_daily_report ───────────────────────────────
69
+ server.registerTool("submit_daily_report", {
70
+ description: [
71
+ "提交日报。内部自动执行:",
72
+ "1) 根据 date 获取 kintaiId;",
73
+ "2) 检查是否已存在日报(如存在则中止并提示);",
74
+ "3) 调用 doAdd 接口提交。",
75
+ "提交前必须通过 get_tasks 选择有效的 proposalId。",
76
+ ].join(" "),
77
+ inputSchema: {
78
+ date: z
79
+ .string()
80
+ .regex(/^\d{4}\/\d{2}\/\d{2}$/, "日期格式必须为 YYYY/MM/DD")
81
+ .describe("日期,格式 YYYY/MM/DD"),
82
+ proposalId: z
83
+ .number()
84
+ .int()
85
+ .positive()
86
+ .describe("项目ID(必填),从 get_tasks 返回的 proposalId 字段获取"),
87
+ workName: z.string().min(1).describe("工作摘要/标题"),
88
+ workTime: z.string().min(1).describe("工时,例如 '8.0' 或 '4.5'"),
89
+ memo: z.string().min(1).describe("日报正文内容(具体工作描述)"),
90
+ },
91
+ }, async ({ date, proposalId, workName, workTime, memo }) => runTool(() => handleSubmitDailyReport(token, {
92
+ date,
93
+ proposalId,
94
+ workName,
95
+ workTime,
96
+ memo,
97
+ })));
98
+ // ── 启动 Transport ────────────────────────────────────────────
99
+ const transport = new StdioServerTransport();
100
+ console.error("[MCP] mcp-daily-report server starting...");
101
+ await server.connect(transport);
102
+ console.error("[MCP] mcp-daily-report server connected via stdio. Ready.");
103
+ //# 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,7 @@
1
+ import type { ApiResponse, MissingDateItem, WorkTask, KintaiDetail, DailyReport, SubmitReportPayload } from "../types/index.js";
2
+ export declare function getMissingDates(token: string): Promise<MissingDateItem[]>;
3
+ export declare function getTasksByUser(token: string): Promise<WorkTask[]>;
4
+ export declare function getKintaiByDate(token: string, date: string): Promise<KintaiDetail>;
5
+ export declare function getReportsByKintai(token: string, kintaiId: number): Promise<DailyReport[]>;
6
+ export declare function addDailyReport(token: string, payload: SubmitReportPayload): Promise<ApiResponse<unknown>>;
7
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAG3B,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CAS5B;AAGD,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CASvE;AAGD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAavB;AAGD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxB;AAGD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAS/B"}
@@ -0,0 +1,49 @@
1
+ import { createApiClient } from "../utils/request.js";
2
+ // ── 1. 查询未填写日报的日期 ────────────────────────────────────
3
+ export async function getMissingDates(token) {
4
+ console.error("[API] getMissingDates → GET /smsapi/kintaiAdmin/application/checkLeaveWork");
5
+ const client = createApiClient(token);
6
+ const res = await client.get("/smsapi/kintaiAdmin/application/checkLeaveWork");
7
+ const data = res.data.data ?? [];
8
+ console.error(`[API] getMissingDates ← ${data.length} item(s)`);
9
+ return data;
10
+ }
11
+ // ── 2. 获取当前用户工作任务列表 ────────────────────────────────
12
+ export async function getTasksByUser(token) {
13
+ console.error("[API] getTasksByUser → GET /smsapi/projectWorkTask/getListByUser");
14
+ const client = createApiClient(token);
15
+ const res = await client.get("/smsapi/projectWorkTask/getListByUser");
16
+ const data = res.data.data ?? [];
17
+ console.error(`[API] getTasksByUser ← ${data.length} task(s)`);
18
+ return data;
19
+ }
20
+ // ── 3. 根据日期获取考勤信息 ────────────────────────────────────
21
+ export async function getKintaiByDate(token, date) {
22
+ console.error(`[API] getKintaiByDate → GET /smsapi/kintaiAdmin/getDetail?time=${date}`);
23
+ const client = createApiClient(token);
24
+ const res = await client.get("/smsapi/kintaiAdmin/getDetail", { params: { time: date } });
25
+ const data = res.data.data;
26
+ if (!data || !data.kintaiId) {
27
+ throw new Error(`未找到日期 ${date} 的考勤记录`);
28
+ }
29
+ console.error(`[API] getKintaiByDate ← kintaiId=${data.kintaiId}`);
30
+ return data;
31
+ }
32
+ // ── 4. 根据考勤ID获取日报列表 ──────────────────────────────────
33
+ export async function getReportsByKintai(token, kintaiId) {
34
+ console.error(`[API] getReportsByKintai → GET /smsapi/kintaiWorkAdmin/getList?kintaiId=${kintaiId}`);
35
+ const client = createApiClient(token);
36
+ const res = await client.get("/smsapi/kintaiWorkAdmin/getList", { params: { kintaiId } });
37
+ const data = res.data.data ?? [];
38
+ console.error(`[API] getReportsByKintai ← ${data.length} report(s)`);
39
+ return data;
40
+ }
41
+ // ── 5. 添加日报 ───────────────────────────────────────────────
42
+ export async function addDailyReport(token, payload) {
43
+ console.error(`[API] addDailyReport → POST /smsapi/kintaiWorkAdmin/doAdd (kintaiId=${payload.kintaiId})`);
44
+ const client = createApiClient(token);
45
+ const res = await client.post("/smsapi/kintaiWorkAdmin/doAdd", payload);
46
+ console.error(`[API] addDailyReport ← code=${res.data.code} message=${res.data.message}`);
47
+ return res.data;
48
+ }
49
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function handleGetMissingDates(token: string): Promise<string>;
2
+ export declare function handleGetKintaiByDate(token: string, date: string): Promise<string>;
3
+ //# sourceMappingURL=kintai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kintai.d.ts","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1E;AAGD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -0,0 +1,20 @@
1
+ import { getMissingDates, getKintaiByDate } from "../services/api.js";
2
+ // ── get_missing_dates ─────────────────────────────────────────
3
+ export async function handleGetMissingDates(token) {
4
+ console.error("[Tool] get_missing_dates: start");
5
+ const dates = await getMissingDates(token);
6
+ if (dates.length === 0) {
7
+ console.error("[Tool] get_missing_dates: no missing dates found");
8
+ return "所有日期均已填写日报,无需补填。";
9
+ }
10
+ console.error(`[Tool] get_missing_dates: ${dates.length} date(s) pending`);
11
+ return JSON.stringify({ count: dates.length, dates }, null, 2);
12
+ }
13
+ // ── get_kintai_by_date ────────────────────────────────────────
14
+ export async function handleGetKintaiByDate(token, date) {
15
+ console.error(`[Tool] get_kintai_by_date: date=${date}`);
16
+ const kintai = await getKintaiByDate(token, date);
17
+ console.error(`[Tool] get_kintai_by_date: kintaiId=${kintai.kintaiId}`);
18
+ return JSON.stringify(kintai, null, 2);
19
+ }
20
+ //# sourceMappingURL=kintai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kintai.js","sourceRoot":"","sources":["../../src/tools/kintai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtE,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa;IACvD,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,IAAY;IAEZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SubmitReportParams } from "../types/index.js";
2
+ export declare function handleGetReportsByKintai(token: string, kintaiId: number): Promise<string>;
3
+ export declare function handleSubmitDailyReport(token: string, params: SubmitReportParams): Promise<string>;
4
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAWjB;AAGD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,CAmDjB"}
@@ -0,0 +1,50 @@
1
+ import { getReportsByKintai, getKintaiByDate, addDailyReport, } from "../services/api.js";
2
+ // ── get_reports_by_kintai ─────────────────────────────────────
3
+ export async function handleGetReportsByKintai(token, kintaiId) {
4
+ console.error(`[Tool] get_reports_by_kintai: kintaiId=${kintaiId}`);
5
+ const reports = await getReportsByKintai(token, kintaiId);
6
+ if (reports.length === 0) {
7
+ console.error(`[Tool] get_reports_by_kintai: no reports for kintaiId=${kintaiId}`);
8
+ return `kintaiId=${kintaiId} 当天暂无日报记录。`;
9
+ }
10
+ console.error(`[Tool] get_reports_by_kintai: ${reports.length} report(s) found`);
11
+ return JSON.stringify({ count: reports.length, reports }, null, 2);
12
+ }
13
+ // ── submit_daily_report ───────────────────────────────────────
14
+ export async function handleSubmitDailyReport(token, params) {
15
+ const { date, proposalId, workName, workTime, memo } = params;
16
+ console.error(`[Tool] submit_daily_report: date=${date} proposalId=${proposalId}`);
17
+ // Step 1: 根据日期获取 kintaiId
18
+ console.error("[Tool] submit_daily_report: [1/3] fetching kintaiId...");
19
+ const kintai = await getKintaiByDate(token, date);
20
+ const kintaiId = kintai.kintaiId;
21
+ console.error(`[Tool] submit_daily_report: kintaiId=${kintaiId}`);
22
+ // Step 2: 检查是否已有日报(避免重复提交)
23
+ console.error("[Tool] submit_daily_report: [2/3] checking existing reports...");
24
+ const existingReports = await getReportsByKintai(token, kintaiId);
25
+ if (existingReports.length > 0) {
26
+ console.error(`[Tool] submit_daily_report: already has ${existingReports.length} report(s), aborting`);
27
+ return JSON.stringify({
28
+ success: false,
29
+ message: `⚠️ 已存在日报:${date} 当天已有 ${existingReports.length} 条日报记录,请勿重复提交。`,
30
+ existingReports,
31
+ }, null, 2);
32
+ }
33
+ // Step 3: 提交日报
34
+ console.error("[Tool] submit_daily_report: [3/3] submitting report...");
35
+ const result = await addDailyReport(token, {
36
+ workContents: 4,
37
+ kintaiId,
38
+ proposalId,
39
+ workName,
40
+ workTime,
41
+ memo,
42
+ });
43
+ console.error("[Tool] submit_daily_report: success");
44
+ return JSON.stringify({
45
+ success: true,
46
+ message: `✅ 日报提交成功:${date}`,
47
+ result,
48
+ }, null, 2);
49
+ }
50
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/tools/report.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAa,EACb,QAAgB;IAEhB,OAAO,CAAC,KAAK,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yDAAyD,QAAQ,EAAE,CAAC,CAAC;QACnF,OAAO,YAAY,QAAQ,YAAY,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,MAA0B;IAE1B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9D,OAAO,CAAC,KAAK,CACX,oCAAoC,IAAI,eAAe,UAAU,EAAE,CACpE,CAAC;IAEF,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAElE,2BAA2B;IAC3B,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CACX,2CAA2C,eAAe,CAAC,MAAM,sBAAsB,CACxF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,YAAY,IAAI,SAAS,eAAe,CAAC,MAAM,gBAAgB;YACxE,eAAe;SAChB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,eAAe;IACf,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE;QACzC,YAAY,EAAE,CAAC;QACf,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,IAAI,EAAE;QAC3B,MAAM;KACP,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleGetTasks(token: string): Promise<string>;
2
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnE"}
@@ -0,0 +1,13 @@
1
+ import { getTasksByUser } from "../services/api.js";
2
+ // ── get_tasks ─────────────────────────────────────────────────
3
+ export async function handleGetTasks(token) {
4
+ console.error("[Tool] get_tasks: start");
5
+ const tasks = await getTasksByUser(token);
6
+ if (tasks.length === 0) {
7
+ console.error("[Tool] get_tasks: no tasks found");
8
+ return "当前用户没有可用的工作任务(项目)。";
9
+ }
10
+ console.error(`[Tool] get_tasks: ${tasks.length} task(s) found`);
11
+ return JSON.stringify({ count: tasks.length, tasks }, null, 2);
12
+ }
13
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface ApiResponse<T> {
2
+ code: number;
3
+ message: string;
4
+ data: T;
5
+ }
6
+ /** 未填写日报的日期条目(来自 checkLeaveWork) */
7
+ export interface MissingDateItem {
8
+ date: string;
9
+ [key: string]: unknown;
10
+ }
11
+ /** 工作任务/项目(来自 getListByUser) */
12
+ export interface WorkTask {
13
+ proposalId: number;
14
+ proposalName: string;
15
+ taskId?: number;
16
+ taskName?: string;
17
+ [key: string]: unknown;
18
+ }
19
+ /** 考勤详情(来自 getDetail) */
20
+ export interface KintaiDetail {
21
+ kintaiId: number;
22
+ time: string;
23
+ startTime?: string;
24
+ endTime?: string;
25
+ workTime?: string;
26
+ [key: string]: unknown;
27
+ }
28
+ /** 日报条目(来自 kintaiWorkAdmin/getList) */
29
+ export interface DailyReport {
30
+ kintaiWorkId: number;
31
+ kintaiId: number;
32
+ workName: string;
33
+ workTime: string;
34
+ memo: string;
35
+ proposalId: number;
36
+ [key: string]: unknown;
37
+ }
38
+ /** doAdd 请求体 */
39
+ export interface SubmitReportPayload {
40
+ workContents: 4;
41
+ kintaiId: number;
42
+ proposalId: number;
43
+ workName: string;
44
+ workTime: string;
45
+ memo: string;
46
+ }
47
+ /** submit_daily_report tool 的输入参数 */
48
+ export interface SubmitReportParams {
49
+ date: string;
50
+ proposalId: number;
51
+ workName: string;
52
+ workTime: string;
53
+ memo: string;
54
+ }
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;CACT;AAID,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,gCAAgC;AAChC,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,CAAC,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { type AxiosInstance } from "axios";
2
+ /**
3
+ * 创建带 Authorization 头的 Axios 实例。
4
+ * 所有日志输出到 stderr(避免干扰 MCP stdio 协议)。
5
+ */
6
+ export declare function createApiClient(token: string): AxiosInstance;
7
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAmB,MAAM,OAAO,CAAC;AAInE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CA6B5D"}
@@ -0,0 +1,30 @@
1
+ import axios from "axios";
2
+ const BASE_URL = process.env.SMS_BASE_URL;
3
+ /**
4
+ * 创建带 Authorization 头的 Axios 实例。
5
+ * 所有日志输出到 stderr(避免干扰 MCP stdio 协议)。
6
+ */
7
+ export function createApiClient(token) {
8
+ if (!BASE_URL) {
9
+ console.error("[Error] 环境变量 SMS_BASE_URL 未设置,服务无法启动。");
10
+ process.exit(1);
11
+ }
12
+ const client = axios.create({
13
+ baseURL: BASE_URL,
14
+ timeout: 30_000,
15
+ headers: {
16
+ "Content-Type": "application/json",
17
+ Authorization: `Bearer ${token}`,
18
+ },
19
+ });
20
+ // 响应拦截器:统一记录错误日志
21
+ client.interceptors.response.use((response) => response, (error) => {
22
+ const method = error.config?.method?.toUpperCase() ?? "?";
23
+ const url = error.config?.url ?? "?";
24
+ const status = error.response?.status ?? "network error";
25
+ console.error(`[HTTP Error] ${method} ${url} → ${status}: ${error.message}`);
26
+ return Promise.reject(error);
27
+ });
28
+ return client;
29
+ }
30
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAC;AAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAiB,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC;QAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,eAAe,CAAC;QACzD,OAAO,CAAC,KAAK,CACX,gBAAgB,MAAM,IAAI,GAAG,MAAM,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAC9D,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@vat-mcp/daily-report",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server for daily report system",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "vat-mcp-daily-report": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "keywords": [
14
+ "mcp",
15
+ "mcp-server",
16
+ "daily-report"
17
+ ],
18
+ "license": "MIT",
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "start": "dotenv -e .env -- node dist/index.js",
25
+ "dev": "dotenv -e .env -- tsx src/index.ts",
26
+ "inspect": "dotenv -e .env -- npx -y @modelcontextprotocol/inspector node dist/index.js",
27
+ "prepublishOnly": "pnpm build"
28
+ },
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.27.1",
31
+ "axios": "^1.13.6",
32
+ "zod": "^4.3.6"
33
+ },
34
+ "devDependencies": {
35
+ "dotenv-cli": "^11.0.0",
36
+ "@types/node": "^25.5.0",
37
+ "tsx": "^4.21.0",
38
+ "typescript": "^5.9.3"
39
+ }
40
+ }