@archiesun/yonsuit-fin-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.
Files changed (152) hide show
  1. package/.env.example +46 -0
  2. package/CHANGELOG.md +67 -0
  3. package/README.md +300 -0
  4. package/dist/auth/index.d.ts +25 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +101 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth/token-manager.d.ts +41 -0
  9. package/dist/auth/token-manager.d.ts.map +1 -0
  10. package/dist/auth/token-manager.js +309 -0
  11. package/dist/auth/token-manager.js.map +1 -0
  12. package/dist/client/base-client.d.ts +60 -0
  13. package/dist/client/base-client.d.ts.map +1 -0
  14. package/dist/client/base-client.js +472 -0
  15. package/dist/client/base-client.js.map +1 -0
  16. package/dist/client/errors.d.ts +109 -0
  17. package/dist/client/errors.d.ts.map +1 -0
  18. package/dist/client/errors.js +218 -0
  19. package/dist/client/errors.js.map +1 -0
  20. package/dist/client/index.d.ts +139 -0
  21. package/dist/client/index.d.ts.map +1 -0
  22. package/dist/client/index.js +246 -0
  23. package/dist/client/index.js.map +1 -0
  24. package/dist/client/types.d.ts +125 -0
  25. package/dist/client/types.d.ts.map +1 -0
  26. package/dist/client/types.js +3 -0
  27. package/dist/client/types.js.map +1 -0
  28. package/dist/config/constants.d.ts +300 -0
  29. package/dist/config/constants.d.ts.map +1 -0
  30. package/dist/config/constants.js +188 -0
  31. package/dist/config/constants.js.map +1 -0
  32. package/dist/config/env.d.ts +91 -0
  33. package/dist/config/env.d.ts.map +1 -0
  34. package/dist/config/env.js +163 -0
  35. package/dist/config/env.js.map +1 -0
  36. package/dist/config/index.d.ts +45 -0
  37. package/dist/config/index.d.ts.map +1 -0
  38. package/dist/config/index.js +159 -0
  39. package/dist/config/index.js.map +1 -0
  40. package/dist/index.d.ts +19 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +329 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/server/index.d.ts +3 -0
  45. package/dist/server/index.d.ts.map +1 -0
  46. package/dist/server/index.js +12 -0
  47. package/dist/server/index.js.map +1 -0
  48. package/dist/server/mcp-server.d.ts +43 -0
  49. package/dist/server/mcp-server.d.ts.map +1 -0
  50. package/dist/server/mcp-server.js +410 -0
  51. package/dist/server/mcp-server.js.map +1 -0
  52. package/dist/services/archive-service.d.ts +116 -0
  53. package/dist/services/archive-service.d.ts.map +1 -0
  54. package/dist/services/archive-service.js +358 -0
  55. package/dist/services/archive-service.js.map +1 -0
  56. package/dist/services/index.d.ts +4 -0
  57. package/dist/services/index.d.ts.map +1 -0
  58. package/dist/services/index.js +10 -0
  59. package/dist/services/index.js.map +1 -0
  60. package/dist/services/voucher-service.d.ts +39 -0
  61. package/dist/services/voucher-service.d.ts.map +1 -0
  62. package/dist/services/voucher-service.js +348 -0
  63. package/dist/services/voucher-service.js.map +1 -0
  64. package/dist/services/voucher.service.d.ts +34 -0
  65. package/dist/services/voucher.service.d.ts.map +1 -0
  66. package/dist/services/voucher.service.js +214 -0
  67. package/dist/services/voucher.service.js.map +1 -0
  68. package/dist/signature/index.d.ts +20 -0
  69. package/dist/signature/index.d.ts.map +1 -0
  70. package/dist/signature/index.js +85 -0
  71. package/dist/signature/index.js.map +1 -0
  72. package/dist/tools/account.d.ts +110 -0
  73. package/dist/tools/account.d.ts.map +1 -0
  74. package/dist/tools/account.js +425 -0
  75. package/dist/tools/account.js.map +1 -0
  76. package/dist/tools/currency.d.ts +112 -0
  77. package/dist/tools/currency.d.ts.map +1 -0
  78. package/dist/tools/currency.js +606 -0
  79. package/dist/tools/currency.js.map +1 -0
  80. package/dist/tools/custom-doc.d.ts +175 -0
  81. package/dist/tools/custom-doc.d.ts.map +1 -0
  82. package/dist/tools/custom-doc.js +695 -0
  83. package/dist/tools/custom-doc.js.map +1 -0
  84. package/dist/tools/index.d.ts +18 -0
  85. package/dist/tools/index.d.ts.map +1 -0
  86. package/dist/tools/index.js +84 -0
  87. package/dist/tools/index.js.map +1 -0
  88. package/dist/tools/subject.d.ts +138 -0
  89. package/dist/tools/subject.d.ts.map +1 -0
  90. package/dist/tools/subject.js +525 -0
  91. package/dist/tools/subject.js.map +1 -0
  92. package/dist/tools/voucher.d.ts +13 -0
  93. package/dist/tools/voucher.d.ts.map +1 -0
  94. package/dist/tools/voucher.js +827 -0
  95. package/dist/tools/voucher.js.map +1 -0
  96. package/dist/tools/vouchertype.d.ts +77 -0
  97. package/dist/tools/vouchertype.d.ts.map +1 -0
  98. package/dist/tools/vouchertype.js +446 -0
  99. package/dist/tools/vouchertype.js.map +1 -0
  100. package/dist/types/auth.d.ts +116 -0
  101. package/dist/types/auth.d.ts.map +1 -0
  102. package/dist/types/auth.js +3 -0
  103. package/dist/types/auth.js.map +1 -0
  104. package/dist/types/common.d.ts +237 -0
  105. package/dist/types/common.d.ts.map +1 -0
  106. package/dist/types/common.js +3 -0
  107. package/dist/types/common.js.map +1 -0
  108. package/dist/types/config.types.d.ts +59 -0
  109. package/dist/types/config.types.d.ts.map +1 -0
  110. package/dist/types/config.types.js +3 -0
  111. package/dist/types/config.types.js.map +1 -0
  112. package/dist/types/index.d.ts +7 -0
  113. package/dist/types/index.d.ts.map +1 -0
  114. package/dist/types/index.js +22 -0
  115. package/dist/types/index.js.map +1 -0
  116. package/dist/types/mcp.types.d.ts +55 -0
  117. package/dist/types/mcp.types.d.ts.map +1 -0
  118. package/dist/types/mcp.types.js +3 -0
  119. package/dist/types/mcp.types.js.map +1 -0
  120. package/dist/types/voucher.d.ts +251 -0
  121. package/dist/types/voucher.d.ts.map +1 -0
  122. package/dist/types/voucher.js +3 -0
  123. package/dist/types/voucher.js.map +1 -0
  124. package/dist/types/yonyou.types.d.ts +90 -0
  125. package/dist/types/yonyou.types.d.ts.map +1 -0
  126. package/dist/types/yonyou.types.js +3 -0
  127. package/dist/types/yonyou.types.js.map +1 -0
  128. package/dist/utils/crypto.d.ts +37 -0
  129. package/dist/utils/crypto.d.ts.map +1 -0
  130. package/dist/utils/crypto.js +305 -0
  131. package/dist/utils/crypto.js.map +1 -0
  132. package/dist/utils/index.d.ts +10 -0
  133. package/dist/utils/index.d.ts.map +1 -0
  134. package/dist/utils/index.js +77 -0
  135. package/dist/utils/index.js.map +1 -0
  136. package/dist/utils/logger.d.ts +4 -0
  137. package/dist/utils/logger.d.ts.map +1 -0
  138. package/dist/utils/logger.js +38 -0
  139. package/dist/utils/logger.js.map +1 -0
  140. package/dist/utils/url.d.ts +40 -0
  141. package/dist/utils/url.d.ts.map +1 -0
  142. package/dist/utils/url.js +202 -0
  143. package/dist/utils/url.js.map +1 -0
  144. package/docs/api.md +1091 -0
  145. package/docs/configuration.md +675 -0
  146. package/docs/deployment.md +651 -0
  147. package/docs/services.md +232 -0
  148. package/docs/troubleshooting.md +617 -0
  149. package/docs/usage.md +828 -0
  150. package/package.json +72 -0
  151. package/tsconfig.build.json +10 -0
  152. package/yonsuit-fin-mcp-1.0.0.tgz +0 -0
package/.env.example ADDED
@@ -0,0 +1,46 @@
1
+ # 用友API配置
2
+ YONYOU_API_BASE_URL=https://api.yonyoucloud.com
3
+ YONYOU_APP_KEY=your_app_key_here
4
+ YONYOU_APP_SECRET=your_app_secret_here
5
+ YONYOU_TENANT_ID=your_tenant_id_here
6
+ YONYOU_USER_ID=your_user_id_here
7
+
8
+ # 数据中心配置
9
+ YONYOU_DATA_CENTER_DOMAIN=your_data_center_domain_here
10
+
11
+ # 认证配置
12
+ YONYOU_AUTH_TYPE=app_auth
13
+ YONYOU_TOKEN_CACHE_TTL=7200
14
+
15
+ # 签名配置
16
+ YONYOU_SIGNATURE_ALGORITHM=SHA256
17
+ YONYOU_SIGNATURE_VERSION=v1
18
+
19
+ # 日志配置
20
+ LOG_LEVEL=info
21
+ LOG_FORMAT=json
22
+ LOG_FILE_PATH=./logs/yonyou-mcp.log
23
+
24
+ # MCP服务器配置
25
+ MCP_SERVER_NAME=yonyou-mcp
26
+ MCP_SERVER_VERSION=1.0.0
27
+ MCP_TRANSPORT_TYPE=stdio
28
+
29
+ # 网络配置
30
+ HTTP_TIMEOUT=30000
31
+ HTTP_MAX_RETRIES=3
32
+ HTTP_RETRY_DELAY=1000
33
+
34
+ # 业务配置
35
+ DEFAULT_ACCOUNT_BOOK=default_book_code
36
+ DEFAULT_CURRENCY=CNY
37
+ DEFAULT_VOUCHER_TYPE=记-1
38
+
39
+ # 缓存配置
40
+ CACHE_ENABLED=true
41
+ CACHE_TTL=3600
42
+ CACHE_MAX_SIZE=1000
43
+
44
+ # 安全配置
45
+ ENABLE_REQUEST_SIGNATURE=true
46
+ ENABLE_RESPONSE_VALIDATION=true
package/CHANGELOG.md ADDED
@@ -0,0 +1,67 @@
1
+ # 更新日志
2
+
3
+ 本文档记录项目的所有重要变更。
4
+
5
+ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
+ 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [1.0.0] - 2026-03-11
9
+
10
+ ### 新增
11
+
12
+ - 项目基础架构搭建
13
+ - 完整的目录结构设计
14
+ - src/config - 配置管理模块
15
+ - src/auth - 认证授权模块
16
+ - src/signature - 签名验证模块
17
+ - src/client - API客户端模块
18
+ - src/tools - MCP工具定义模块
19
+ - src/services - 业务服务模块
20
+ - src/utils - 工具函数模块
21
+ - src/types - 类型定义模块
22
+ - src/server - MCP服务器模块
23
+ - TypeScript项目配置
24
+ - tsconfig.json - 开发环境配置
25
+ - tsconfig.build.json - 生产构建配置
26
+ - 项目依赖配置
27
+ - Node.js v20.x 支持
28
+ - @modelcontextprotocol/sdk - MCP协议SDK
29
+ - axios - HTTP客户端
30
+ - crypto-js - 加密签名
31
+ - winston - 日志管理
32
+ - zod - 数据验证
33
+ - dotenv - 环境变量管理
34
+ - 环境变量配置模板 (.env.example)
35
+ - 开发工具配置
36
+ - ESLint代码检查
37
+ - Prettier代码格式化
38
+ - Jest测试框架
39
+ - 基础文档
40
+ - README.md - 项目说明文档
41
+ - CHANGELOG.md - 更新日志
42
+
43
+ ### 技术栈
44
+
45
+ - 运行时: Node.js v20.x
46
+ - 语言: TypeScript 5.7.x
47
+ - 协议: Model Context Protocol (MCP)
48
+ - HTTP客户端: Axios
49
+ - 日志: Winston
50
+ - 验证: Zod
51
+
52
+ ### 下一步计划
53
+
54
+ - [ ] 实现配置管理模块
55
+ - [ ] 实现认证模块
56
+ - [ ] 实现签名模块
57
+ - [ ] 实现API客户端
58
+ - [ ] 实现MCP工具
59
+ - [ ] 实现业务服务
60
+ - [ ] 编写单元测试
61
+ - [ ] 完善文档
62
+
63
+ ## 版本说明
64
+
65
+ - **主版本号**: 不兼容的API修改
66
+ - **次版本号**: 向下兼容的功能性新增
67
+ - **修订号**: 向下兼容的问题修正
package/README.md ADDED
@@ -0,0 +1,300 @@
1
+ # 用友做账MCP服务器
2
+
3
+ 基于 Model Context Protocol (MCP) 的用友财务系统对接服务,为AI助手提供用友做账能力。
4
+
5
+ ## 项目简介
6
+
7
+ 本项目是一个MCP(Model Context Protocol)服务器实现,旨在为AI助手(如Claude、ChatGPT等)提供与用友财务系统交互的能力。通过标准化的MCP协议,AI助手可以调用各种财务操作工具,实现凭证管理、科目查询、账簿查询等功能。
8
+
9
+ ### 核心特性
10
+
11
+ - **完整的MCP协议支持** - 完全兼容MCP SDK,支持工具、资源、提示词管理
12
+ - **全面的用友API对接** - 支持凭证、科目、账簿、币种、档案等多种业务操作
13
+ - **自动签名和认证** - 内置用友API签名机制,自动处理Token管理
14
+ - **类型安全** - 使用TypeScript开发,提供完整的类型定义
15
+ - **完善的错误处理** - 详细的错误信息和日志记录
16
+ - **缓存优化** - 内置缓存机制,减少API调用次数
17
+
18
+ ## 系统要求
19
+
20
+ - Node.js >= 20.0.0
21
+ - npm >= 9.0.0
22
+
23
+ ## 快速开始
24
+
25
+ ### 1. 安装依赖
26
+
27
+ ```bash
28
+ npm install
29
+ ```
30
+
31
+ ### 2. 配置环境变量
32
+
33
+ 复制环境变量示例文件:
34
+
35
+ ```bash
36
+ cp .env.example .env
37
+ ```
38
+
39
+ 编辑 `.env` 文件,填入实际的用友API配置:
40
+
41
+ ```env
42
+ # 用友API配置(必填)
43
+ YONYOU_APP_KEY=your_app_key_here
44
+ YONYOU_APP_SECRET=your_app_secret_here
45
+ YONYOU_TENANT_ID=your_tenant_id_here
46
+ YONYOU_DATA_CENTER_DOMAIN=your_data_center_domain_here
47
+
48
+ # 用户ID(可选)
49
+ YONYOU_USER_ID=your_user_id_here
50
+ ```
51
+
52
+ ### 3. 构建项目
53
+
54
+ ```bash
55
+ npm run build
56
+ ```
57
+
58
+ ### 4. 运行服务
59
+
60
+ **开发模式:**
61
+ ```bash
62
+ npm run dev
63
+ ```
64
+
65
+ **生产模式:**
66
+ ```bash
67
+ npm start
68
+ ```
69
+
70
+ ## 在AI助手中配置
71
+
72
+ ### Claude Desktop配置
73
+
74
+ 在Claude Desktop的配置文件中添加:
75
+
76
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
77
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
78
+
79
+ ```json
80
+ {
81
+ "mcpServers": {
82
+ "yonyou": {
83
+ "command": "node",
84
+ "args": ["/path/to/yonyou-mcp/dist/index.js"],
85
+ "env": {
86
+ "YONYOU_APP_KEY": "your_app_key",
87
+ "YONYOU_APP_SECRET": "your_app_secret",
88
+ "YONYOU_TENANT_ID": "your_tenant_id",
89
+ "YONYOU_DATA_CENTER_DOMAIN": "your_domain"
90
+ }
91
+ }
92
+ }
93
+ }
94
+ ```
95
+
96
+ ### 其他MCP客户端
97
+
98
+ 本项目遵循标准MCP协议,可以在任何支持MCP的客户端中使用。请参考各客户端的文档进行配置。
99
+
100
+ ## 项目结构
101
+
102
+ ```
103
+ yonyou-mcp/
104
+ ├── src/
105
+ │ ├── config/ # 配置管理
106
+ │ │ ├── constants.ts # 常量定义
107
+ │ │ ├── env.ts # 环境变量处理
108
+ │ │ └── index.ts # 配置导出
109
+ │ ├── auth/ # 认证模块
110
+ │ │ ├── index.ts # 认证管理
111
+ │ │ └── token-manager.ts # Token缓存管理
112
+ │ ├── signature/ # 签名模块
113
+ │ │ └── index.ts # API签名实现
114
+ │ ├── client/ # API客户端
115
+ │ │ ├── base-client.ts # 基础HTTP客户端
116
+ │ │ ├── errors.ts # 错误定义
117
+ │ │ └── types.ts # 客户端类型
118
+ │ ├── tools/ # MCP工具定义
119
+ │ │ ├── voucher.ts # 凭证工具
120
+ │ │ ├── subject.ts # 科目工具
121
+ │ │ ├── account.ts # 账簿工具
122
+ │ │ ├── currency.ts # 币种工具
123
+ │ │ ├── vouchertype.ts # 凭证类型工具
124
+ │ │ ├── custom-doc.ts # 自定义档案工具
125
+ │ │ └── index.ts # 工具导出
126
+ │ ├── services/ # 业务服务
127
+ │ │ ├── voucher-service.ts # 凭证服务
128
+ │ │ └── archive-service.ts # 档案服务
129
+ │ ├── utils/ # 工具函数
130
+ │ │ ├── crypto.ts # 加密工具
131
+ │ │ ├── logger.ts # 日志工具
132
+ │ │ └── url.ts # URL处理
133
+ │ ├── types/ # 类型定义
134
+ │ │ ├── auth.ts # 认证类型
135
+ │ │ ├── voucher.ts # 凭证类型
136
+ │ │ ├── yonyou.types.ts # 用友API类型
137
+ │ │ └── mcp.types.ts # MCP类型
138
+ │ ├── server/ # MCP服务器
139
+ │ │ └── mcp-server.ts # 服务器实现
140
+ │ └── index.ts # 入口文件
141
+ ├── dist/ # 编译输出
142
+ ├── tests/ # 测试文件
143
+ ├── docs/ # 文档目录
144
+ │ ├── api.md # API文档
145
+ │ ├── usage.md # 使用指南
146
+ │ └── troubleshooting.md # 故障排除
147
+ ├── logs/ # 日志目录
148
+ ├── package.json
149
+ ├── tsconfig.json
150
+ ├── tsconfig.build.json
151
+ └── .env.example
152
+ ```
153
+
154
+ ## MCP工具列表
155
+
156
+ ### 凭证管理
157
+
158
+ | 工具名称 | 描述 |
159
+ |---------|------|
160
+ | `query_voucher_list` | 查询凭证列表,支持多条件筛选和分页 |
161
+ | `query_voucher_detail` | 查询凭证详情,包含所有分录明细 |
162
+ | `save_voucher` | 创建或更新凭证 |
163
+ | `delete_voucher` | 删除凭证(支持批量) |
164
+
165
+ ### 科目管理
166
+
167
+ | 工具名称 | 描述 |
168
+ |---------|------|
169
+ | `account_query` | 查询科目列表 |
170
+ | `account_detail` | 查询科目详情 |
171
+ | `account_create` | 创建科目 |
172
+ | `account_update` | 更新科目 |
173
+ | `account_tree` | 查询科目树形结构 |
174
+
175
+ ### 账簿查询
176
+
177
+ | 工具名称 | 描述 |
178
+ |---------|------|
179
+ | `accountbook_query` | 查询账簿列表 |
180
+ | `accountbook_detail` | 查询账簿详情 |
181
+ | `ledger_general` | 查询总账 |
182
+ | `ledger_detail` | 查询明细账 |
183
+ | `ledger_balance` | 查询余额表 |
184
+
185
+ ### 凭证类型
186
+
187
+ | 工具名称 | 描述 |
188
+ |---------|------|
189
+ | `vouchertype_query` | 查询凭证类型列表 |
190
+ | `vouchertype_detail` | 查询凭证类型详情 |
191
+ | `vouchertype_create` | 创建凭证类型 |
192
+ | `vouchertype_update` | 更新凭证类型 |
193
+ | `vouchertype_default` | 获取默认凭证类型 |
194
+
195
+ ### 币种管理
196
+
197
+ | 工具名称 | 描述 |
198
+ |---------|------|
199
+ | `currency_query` | 查询币种列表 |
200
+ | `currency_detail` | 查询币种详情 |
201
+ | `currency_base` | 获取本位币 |
202
+ | `currency_create` | 创建币种 |
203
+ | `currency_update` | 更新币种 |
204
+ | `exchange_rate_query` | 查询汇率 |
205
+ | `currency_batch_query` | 批量查询币种 |
206
+
207
+ ### 自定义档案
208
+
209
+ | 工具名称 | 描述 |
210
+ |---------|------|
211
+ | `customdoc_query` | 查询自定义档案列表 |
212
+ | `customdoc_detail` | 查询自定义档案详情 |
213
+ | `department_query` | 查询部门档案 |
214
+ | `supplier_query` | 查询供应商档案 |
215
+ | `customer_query` | 查询客户档案 |
216
+ | `project_query` | 查询项目档案 |
217
+ | `personnel_query` | 查询人员档案 |
218
+ | `settlement_method_query` | 查询结算方式档案 |
219
+
220
+ ## 开发指南
221
+
222
+ ### 代码规范
223
+
224
+ ```bash
225
+ npm run lint # 代码检查
226
+ npm run format # 代码格式化
227
+ npm run typecheck # 类型检查
228
+ ```
229
+
230
+ ### 测试
231
+
232
+ ```bash
233
+ npm test # 运行测试
234
+ npm run test:watch # 监听模式
235
+ npm run test:coverage # 测试覆盖率
236
+ ```
237
+
238
+ ### 构建
239
+
240
+ ```bash
241
+ npm run build # 构建项目
242
+ npm run clean # 清理构建产物
243
+ ```
244
+
245
+ ## 环境变量说明
246
+
247
+ ### 必填配置
248
+
249
+ | 变量名 | 描述 | 示例 |
250
+ |-------|------|------|
251
+ | `YONYOU_APP_KEY` | 用友应用Key | `your_app_key` |
252
+ | `YONYOU_APP_SECRET` | 用友应用Secret | `your_app_secret` |
253
+ | `YONYOU_TENANT_ID` | 租户ID | `your_tenant_id` |
254
+ | `YONYOU_DATA_CENTER_DOMAIN` | 数据中心域名 | `api.yonyoucloud.com` |
255
+
256
+ ### 可选配置
257
+
258
+ | 变量名 | 描述 | 默认值 |
259
+ |-------|------|--------|
260
+ | `YONYOU_USER_ID` | 用户ID | - |
261
+ | `YONYOU_API_BASE_URL` | API基础URL | `https://api.yonyoucloud.com` |
262
+ | `YONYOU_AUTH_TYPE` | 认证类型 | `app_auth` |
263
+ | `YONYOU_TOKEN_CACHE_TTL` | Token缓存时间(秒) | `7200` |
264
+ | `LOG_LEVEL` | 日志级别 | `info` |
265
+ | `LOG_FORMAT` | 日志格式 | `json` |
266
+ | `HTTP_TIMEOUT` | HTTP超时时间(ms) | `30000` |
267
+ | `HTTP_MAX_RETRIES` | 最大重试次数 | `3` |
268
+
269
+ ## 文档
270
+
271
+ - [API文档](./docs/api.md) - 所有工具的详细API说明
272
+ - [使用指南](./docs/usage.md) - 详细的使用示例和最佳实践
273
+ - [故障排除](./docs/troubleshooting.md) - 常见问题和解决方案
274
+
275
+ ## 安全说明
276
+
277
+ - 所有API请求均需签名验证
278
+ - 敏感信息通过环境变量管理,不会记录到日志
279
+ - Token自动缓存和刷新,避免频繁认证
280
+ - 支持请求和响应验证
281
+
282
+ ## 许可证
283
+
284
+ MIT
285
+
286
+ ## 更新日志
287
+
288
+ 查看 [CHANGELOG.md](./CHANGELOG.md) 了解版本更新历史。
289
+
290
+ ## 贡献指南
291
+
292
+ 欢迎提交Issue和Pull Request。在提交代码前,请确保:
293
+
294
+ 1. 代码通过所有测试
295
+ 2. 代码符合项目的代码规范
296
+ 3. 添加必要的文档和注释
297
+
298
+ ## 技术支持
299
+
300
+ 如有问题,请提交Issue或联系项目维护者。
@@ -0,0 +1,25 @@
1
+ export { TokenManager, tokenManager } from './token-manager';
2
+ export type { TokenInfo, TokenResponse } from '../types';
3
+ import { TokenManager } from './token-manager';
4
+ import { TokenInfo, AuthStatus, AuthConfig } from '../types';
5
+ export declare class AuthManager {
6
+ private tokenManager;
7
+ private config;
8
+ constructor(tokenManager: TokenManager);
9
+ getAccessToken(): Promise<string>;
10
+ refreshAccessToken(): Promise<string>;
11
+ getTokenInfo(): TokenInfo | undefined;
12
+ getAuthStatus(): AuthStatus;
13
+ private isTokenValid;
14
+ isTokenExpiringSoon(threshold?: number): boolean;
15
+ clearTokenCache(): void;
16
+ getAuthConfig(): Partial<AuthConfig>;
17
+ validateConfig(): {
18
+ valid: boolean;
19
+ errors: string[];
20
+ };
21
+ stopAutoRefresh(): void;
22
+ }
23
+ export declare const authManager: AuthManager;
24
+ export default authManager;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG7D,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAgB,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM7D,qBAAa,WAAW;IAEtB,OAAO,CAAC,YAAY,CAAe;IAGnC,OAAO,CAAC,MAAM,CAAa;gBAMf,YAAY,EAAE,YAAY;IAiBhC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAQjC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAS3C,YAAY,IAAI,SAAS,GAAG,SAAS;IAQrC,aAAa,IAAI,UAAU;IAsB3B,OAAO,CAAC,YAAY;IAYpB,mBAAmB,CAAC,SAAS,GAAE,MAAY,GAAG,OAAO;IAOrD,eAAe,IAAI,IAAI;IASvB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAepC,cAAc,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAgCtD,eAAe,IAAI,IAAI;CAGxB;AAKD,eAAO,MAAM,WAAW,aAAgC,CAAC;AAEzD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authManager = exports.AuthManager = exports.tokenManager = exports.TokenManager = void 0;
4
+ var token_manager_1 = require("./token-manager");
5
+ Object.defineProperty(exports, "TokenManager", { enumerable: true, get: function () { return token_manager_1.TokenManager; } });
6
+ Object.defineProperty(exports, "tokenManager", { enumerable: true, get: function () { return token_manager_1.tokenManager; } });
7
+ const token_manager_2 = require("./token-manager");
8
+ const utils_1 = require("../utils");
9
+ const config_1 = require("../config");
10
+ class AuthManager {
11
+ tokenManager;
12
+ config;
13
+ constructor(tokenManager) {
14
+ this.tokenManager = tokenManager;
15
+ this.config = {
16
+ appKey: config_1.appConfig.yonyou.appKey,
17
+ appSecret: config_1.appConfig.yonyou.appSecret,
18
+ tenantId: config_1.appConfig.yonyou.tenantId,
19
+ userId: config_1.appConfig.yonyou.userId,
20
+ dataCenterDomain: config_1.appConfig.yonyou.dataCenterDomain,
21
+ authType: config_1.appConfig.yonyou.authType,
22
+ tokenCacheTtl: config_1.appConfig.yonyou.tokenCacheTtl,
23
+ };
24
+ }
25
+ async getAccessToken() {
26
+ return this.tokenManager.getAccessToken();
27
+ }
28
+ async refreshAccessToken() {
29
+ utils_1.logger.info('强制刷新访问令牌');
30
+ return this.tokenManager.refreshToken();
31
+ }
32
+ getTokenInfo() {
33
+ return this.tokenManager.getTokenInfo();
34
+ }
35
+ getAuthStatus() {
36
+ const tokenInfo = this.getTokenInfo();
37
+ return {
38
+ isAuthenticated: !!tokenInfo && this.isTokenValid(tokenInfo),
39
+ authType: this.config.authType,
40
+ authenticatedAt: tokenInfo?.createdAt,
41
+ expiresAt: tokenInfo ? tokenInfo.createdAt + tokenInfo.expiresIn * 1000 : undefined,
42
+ app: {
43
+ appId: this.config.appKey,
44
+ appName: 'Yonyou MCP App',
45
+ appType: 'api',
46
+ tenantId: this.config.tenantId,
47
+ },
48
+ };
49
+ }
50
+ isTokenValid(tokenInfo) {
51
+ const now = Date.now();
52
+ const expiresAt = tokenInfo.createdAt + tokenInfo.expiresIn * 1000;
53
+ return now < expiresAt - 60000;
54
+ }
55
+ isTokenExpiringSoon(threshold = 300) {
56
+ return this.tokenManager.isTokenExpiringSoon(threshold);
57
+ }
58
+ clearTokenCache() {
59
+ this.tokenManager.clearCache();
60
+ utils_1.logger.info('Token缓存已清除');
61
+ }
62
+ getAuthConfig() {
63
+ return {
64
+ appKey: this.config.appKey ? `******${this.config.appKey.slice(-4)}` : '',
65
+ tenantId: this.config.tenantId,
66
+ userId: this.config.userId,
67
+ dataCenterDomain: this.config.dataCenterDomain,
68
+ authType: this.config.authType,
69
+ tokenCacheTtl: this.config.tokenCacheTtl,
70
+ };
71
+ }
72
+ validateConfig() {
73
+ const errors = [];
74
+ if (!this.config.appKey) {
75
+ errors.push('缺少 appKey 配置');
76
+ }
77
+ if (!this.config.appSecret) {
78
+ errors.push('缺少 appSecret 配置');
79
+ }
80
+ if (!this.config.tenantId) {
81
+ errors.push('缺少 tenantId 配置');
82
+ }
83
+ if (!this.config.dataCenterDomain) {
84
+ errors.push('缺少 dataCenterDomain 配置');
85
+ }
86
+ if (this.config.authType === 'user_auth' && !this.config.userId) {
87
+ errors.push('用户认证模式下缺少 userId 配置');
88
+ }
89
+ return {
90
+ valid: errors.length === 0,
91
+ errors,
92
+ };
93
+ }
94
+ stopAutoRefresh() {
95
+ this.tokenManager.stopAutoRefresh();
96
+ }
97
+ }
98
+ exports.AuthManager = AuthManager;
99
+ exports.authManager = new AuthManager(token_manager_2.tokenManager);
100
+ exports.default = exports.authManager;
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { TokenInfo } from '../types';
2
+ interface TokenManagerConfig {
3
+ expiresIn: number;
4
+ refreshAhead: number;
5
+ minValidity: number;
6
+ cacheDir: string;
7
+ enableFileCache: boolean;
8
+ }
9
+ export declare class TokenManager {
10
+ private memoryCache;
11
+ private refreshLocks;
12
+ private httpClient;
13
+ private signature;
14
+ private config;
15
+ private refreshTimer;
16
+ private readonly cacheKey;
17
+ constructor(config?: Partial<TokenManagerConfig>);
18
+ getAccessToken(): Promise<string>;
19
+ refreshToken(): Promise<string>;
20
+ getTokenInfo(): TokenInfo | undefined;
21
+ isTokenExpiringSoon(threshold?: number): boolean;
22
+ clearCache(): void;
23
+ stopAutoRefresh(): void;
24
+ destroy(): void;
25
+ private fetchTokenWithLock;
26
+ private doFetchToken;
27
+ private backgroundRefresh;
28
+ private isTokenValid;
29
+ private shouldRefreshToken;
30
+ private getFromMemoryCache;
31
+ private getFromFileCache;
32
+ private saveToCache;
33
+ private saveToFileCache;
34
+ private ensureCacheDir;
35
+ private loadFromFileCache;
36
+ private getCacheFilePath;
37
+ private getCacheVersion;
38
+ }
39
+ export declare const tokenManager: TokenManager;
40
+ export default tokenManager;
41
+ //# sourceMappingURL=token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAgC,MAAM,UAAU,CAAC;AAkBnE,UAAU,kBAAkB;IAE1B,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,EAAE,MAAM,CAAC;IAEjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAMD,qBAAa,YAAY;IAEvB,OAAO,CAAC,WAAW,CAA0C;IAG7D,OAAO,CAAC,YAAY,CAA2C;IAG/D,OAAO,CAAC,UAAU,CAAgB;IAGlC,OAAO,CAAC,SAAS,CAAkB;IAGnC,OAAO,CAAC,MAAM,CAAqB;IAGnC,OAAO,CAAC,YAAY,CAA+B;IAGnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAKtB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IA6C1C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IA2CjC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAcrC,YAAY,IAAI,SAAS,GAAG,SAAS;IAUrC,mBAAmB,CAAC,SAAS,GAAE,MAAiC,GAAG,OAAO;IAc1E,UAAU,IAAI,IAAI;IAuBlB,eAAe,IAAI,IAAI;IAWvB,OAAO,IAAI,IAAI;YAWD,kBAAkB;YAwBlB,YAAY;YAgEZ,iBAAiB;IAY/B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,eAAe;CAIxB;AAKD,eAAO,MAAM,YAAY,cAAqB,CAAC;AAE/C,eAAe,YAAY,CAAC"}