@arikusi/deepseek-mcp-server 1.0.3 → 1.1.1

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 (59) hide show
  1. package/CHANGELOG.md +68 -1
  2. package/README.md +120 -23
  3. package/dist/config.d.ts +48 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +68 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/cost.d.ts +24 -0
  8. package/dist/cost.d.ts.map +1 -0
  9. package/dist/cost.js +34 -0
  10. package/dist/cost.js.map +1 -0
  11. package/dist/deepseek-client.d.ts +10 -3
  12. package/dist/deepseek-client.d.ts.map +1 -1
  13. package/dist/deepseek-client.js +99 -37
  14. package/dist/deepseek-client.js.map +1 -1
  15. package/dist/errors.d.ts +71 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +74 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +0 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +35 -505
  22. package/dist/index.js.map +1 -1
  23. package/dist/prompts/advanced.d.ts +8 -0
  24. package/dist/prompts/advanced.d.ts.map +1 -0
  25. package/dist/prompts/advanced.js +187 -0
  26. package/dist/prompts/advanced.js.map +1 -0
  27. package/dist/prompts/core.d.ts +8 -0
  28. package/dist/prompts/core.d.ts.map +1 -0
  29. package/dist/prompts/core.js +188 -0
  30. package/dist/prompts/core.js.map +1 -0
  31. package/dist/prompts/function-calling.d.ts +7 -0
  32. package/dist/prompts/function-calling.d.ts.map +1 -0
  33. package/dist/prompts/function-calling.js +87 -0
  34. package/dist/prompts/function-calling.js.map +1 -0
  35. package/dist/prompts/index.d.ts +7 -0
  36. package/dist/prompts/index.d.ts.map +1 -0
  37. package/dist/prompts/index.js +13 -0
  38. package/dist/prompts/index.js.map +1 -0
  39. package/dist/schemas.d.ts +258 -0
  40. package/dist/schemas.d.ts.map +1 -0
  41. package/dist/schemas.js +56 -0
  42. package/dist/schemas.js.map +1 -0
  43. package/dist/server.d.ts +9 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +16 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/tools/deepseek-chat.d.ts +8 -0
  48. package/dist/tools/deepseek-chat.d.ts.map +1 -0
  49. package/dist/tools/deepseek-chat.js +162 -0
  50. package/dist/tools/deepseek-chat.js.map +1 -0
  51. package/dist/tools/index.d.ts +8 -0
  52. package/dist/tools/index.d.ts.map +1 -0
  53. package/dist/tools/index.js +9 -0
  54. package/dist/tools/index.js.map +1 -0
  55. package/dist/types.d.ts +135 -1
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/types.js +20 -1
  58. package/dist/types.js.map +1 -1
  59. package/package.json +10 -4
package/dist/types.d.ts CHANGED
@@ -9,13 +9,50 @@ export type DeepSeekModel = 'deepseek-chat' | 'deepseek-reasoner';
9
9
  /**
10
10
  * Message role in conversation
11
11
  */
12
- export type MessageRole = 'system' | 'user' | 'assistant';
12
+ export type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
13
13
  /**
14
14
  * Chat message structure
15
15
  */
16
16
  export interface ChatMessage {
17
17
  role: MessageRole;
18
18
  content: string;
19
+ tool_call_id?: string;
20
+ }
21
+ /**
22
+ * Function definition within a tool
23
+ */
24
+ export interface FunctionDefinition {
25
+ name: string;
26
+ description?: string;
27
+ parameters?: Record<string, unknown>;
28
+ strict?: boolean;
29
+ }
30
+ /**
31
+ * Tool definition for function calling
32
+ */
33
+ export interface ToolDefinition {
34
+ type: 'function';
35
+ function: FunctionDefinition;
36
+ }
37
+ /**
38
+ * Controls which tool the model calls
39
+ */
40
+ export type ToolChoice = 'auto' | 'none' | 'required' | {
41
+ type: 'function';
42
+ function: {
43
+ name: string;
44
+ };
45
+ };
46
+ /**
47
+ * Tool call returned by the model
48
+ */
49
+ export interface ToolCall {
50
+ id: string;
51
+ type: 'function';
52
+ function: {
53
+ name: string;
54
+ arguments: string;
55
+ };
19
56
  }
20
57
  /**
21
58
  * Parameters for chat completion request
@@ -29,6 +66,8 @@ export interface ChatCompletionParams {
29
66
  frequency_penalty?: number;
30
67
  presence_penalty?: number;
31
68
  stop?: string | string[];
69
+ tools?: ToolDefinition[];
70
+ tool_choice?: ToolChoice;
32
71
  }
33
72
  /**
34
73
  * Response from DeepSeek chat completion
@@ -43,6 +82,7 @@ export interface ChatCompletionResponse {
43
82
  total_tokens: number;
44
83
  };
45
84
  finish_reason: string;
85
+ tool_calls?: ToolCall[];
46
86
  }
47
87
  /**
48
88
  * Tool input schema for deepseek_chat tool
@@ -51,11 +91,27 @@ export interface DeepSeekChatInput {
51
91
  messages: Array<{
52
92
  role: string;
53
93
  content: string;
94
+ tool_call_id?: string;
54
95
  }>;
55
96
  model?: 'deepseek-chat' | 'deepseek-reasoner';
56
97
  temperature?: number;
57
98
  max_tokens?: number;
58
99
  stream?: boolean;
100
+ tools?: Array<{
101
+ type: 'function';
102
+ function: {
103
+ name: string;
104
+ description?: string;
105
+ parameters?: Record<string, unknown>;
106
+ strict?: boolean;
107
+ };
108
+ }>;
109
+ tool_choice?: 'auto' | 'none' | 'required' | {
110
+ type: 'function';
111
+ function: {
112
+ name: string;
113
+ };
114
+ };
59
115
  }
60
116
  /**
61
117
  * Error response structure
@@ -67,4 +123,82 @@ export interface DeepSeekError {
67
123
  code: string;
68
124
  };
69
125
  }
126
+ /**
127
+ * DeepSeek chat completion message (extends OpenAI with reasoning_content)
128
+ */
129
+ export interface DeepSeekChatCompletionMessage {
130
+ content: string | null;
131
+ role: 'assistant';
132
+ tool_calls?: Array<{
133
+ id: string;
134
+ type: 'function';
135
+ function: {
136
+ name: string;
137
+ arguments: string;
138
+ };
139
+ }>;
140
+ reasoning_content?: string;
141
+ }
142
+ /**
143
+ * DeepSeek chat completion choice
144
+ */
145
+ export interface DeepSeekChatCompletionChoice {
146
+ message: DeepSeekChatCompletionMessage;
147
+ finish_reason: string;
148
+ index: number;
149
+ }
150
+ /**
151
+ * DeepSeek chat completion response (extends OpenAI response)
152
+ */
153
+ export interface DeepSeekRawResponse {
154
+ id: string;
155
+ choices: DeepSeekChatCompletionChoice[];
156
+ model: string;
157
+ usage?: {
158
+ prompt_tokens: number;
159
+ completion_tokens: number;
160
+ total_tokens: number;
161
+ };
162
+ }
163
+ /**
164
+ * DeepSeek stream delta
165
+ */
166
+ export interface DeepSeekStreamDelta {
167
+ content?: string;
168
+ reasoning_content?: string;
169
+ tool_calls?: Array<{
170
+ index: number;
171
+ id?: string;
172
+ type?: 'function';
173
+ function?: {
174
+ name?: string;
175
+ arguments?: string;
176
+ };
177
+ }>;
178
+ }
179
+ /**
180
+ * DeepSeek stream chunk
181
+ */
182
+ export interface DeepSeekStreamChunk {
183
+ choices: Array<{
184
+ delta: DeepSeekStreamDelta;
185
+ finish_reason: string | null;
186
+ }>;
187
+ model: string;
188
+ usage?: {
189
+ prompt_tokens: number;
190
+ completion_tokens: number;
191
+ total_tokens: number;
192
+ };
193
+ }
194
+ /**
195
+ * Check if a message has reasoning_content (DeepSeek Reasoner)
196
+ */
197
+ export declare function hasReasoningContent(message: unknown): message is {
198
+ reasoning_content: string;
199
+ };
200
+ /**
201
+ * Extract error message from unknown error
202
+ */
203
+ export declare function getErrorMessage(error: unknown): string;
70
204
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -2,5 +2,24 @@
2
2
  * DeepSeek MCP Server Types
3
3
  * Type definitions for DeepSeek API integration with Model Context Protocol
4
4
  */
5
- export {};
5
+ // ─── Type Guards ───────────────────────────────────────────────
6
+ /**
7
+ * Check if a message has reasoning_content (DeepSeek Reasoner)
8
+ */
9
+ export function hasReasoningContent(message) {
10
+ return (typeof message === 'object' &&
11
+ message !== null &&
12
+ 'reasoning_content' in message &&
13
+ typeof message.reasoning_content === 'string');
14
+ }
15
+ /**
16
+ * Extract error message from unknown error
17
+ */
18
+ export function getErrorMessage(error) {
19
+ if (error instanceof Error)
20
+ return error.message;
21
+ if (typeof error === 'string')
22
+ return error;
23
+ return 'Unknown error';
24
+ }
6
25
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6MH,kEAAkE;AAElE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAgB;IAEhB,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QAChB,mBAAmB,IAAI,OAAO;QAC9B,OAAQ,OAAmC,CAAC,iBAAiB,KAAK,QAAQ,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,eAAe,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arikusi/deepseek-mcp-server",
3
- "version": "1.0.3",
3
+ "version": "1.1.1",
4
4
  "description": "MCP Server for DeepSeek API integration - enables Claude Code to use DeepSeek Chat and Reasoner models",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -12,7 +12,9 @@
12
12
  "watch": "tsc --watch",
13
13
  "prepare": "npm run build",
14
14
  "start": "node dist/index.js",
15
- "test": "echo \"No tests yet\" && exit 0",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "test:coverage": "vitest run --coverage",
16
18
  "lint": "tsc --noEmit",
17
19
  "prepublishOnly": "npm run build"
18
20
  },
@@ -27,7 +29,9 @@
27
29
  "claude-code",
28
30
  "ai",
29
31
  "llm",
30
- "openai-compatible"
32
+ "openai-compatible",
33
+ "function-calling",
34
+ "tool-use"
31
35
  ],
32
36
  "author": "arikusi",
33
37
  "license": "MIT",
@@ -55,7 +59,9 @@
55
59
  },
56
60
  "devDependencies": {
57
61
  "@types/node": "^22.10.5",
58
- "typescript": "^5.7.3"
62
+ "@vitest/coverage-v8": "^4.0.18",
63
+ "typescript": "^5.7.3",
64
+ "vitest": "^4.0.18"
59
65
  },
60
66
  "engines": {
61
67
  "node": ">=18.0.0"