@arikusi/deepseek-mcp-server 1.1.1 → 1.3.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/CHANGELOG.md +44 -1
- package/README.md +134 -18
- package/dist/circuit-breaker.d.ts +37 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +101 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/cost.d.ts +30 -13
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +58 -19
- package/dist/cost.js.map +1 -1
- package/dist/deepseek-client.d.ts +23 -5
- package/dist/deepseek-client.d.ts.map +1 -1
- package/dist/deepseek-client.js +256 -115
- package/dist/deepseek-client.js.map +1 -1
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/resources/config.d.ts +7 -0
- package/dist/resources/config.d.ts.map +1 -0
- package/dist/resources/config.js +44 -0
- package/dist/resources/config.js.map +1 -0
- package/dist/resources/index.d.ts +7 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +13 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/models.d.ts +7 -0
- package/dist/resources/models.d.ts.map +1 -0
- package/dist/resources/models.js +62 -0
- package/dist/resources/models.js.map +1 -0
- package/dist/resources/usage.d.ts +7 -0
- package/dist/resources/usage.d.ts.map +1 -0
- package/dist/resources/usage.js +31 -0
- package/dist/resources/usage.js.map +1 -0
- package/dist/schemas.d.ts +72 -20
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +15 -2
- package/dist/schemas.js.map +1 -1
- package/dist/session.d.ts +68 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +184 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/deepseek-chat.d.ts +2 -1
- package/dist/tools/deepseek-chat.d.ts.map +1 -1
- package/dist/tools/deepseek-chat.js +97 -32
- package/dist/tools/deepseek-chat.js.map +1 -1
- package/dist/tools/deepseek-sessions.d.ts +7 -0
- package/dist/tools/deepseek-sessions.d.ts.map +1 -0
- package/dist/tools/deepseek-sessions.js +101 -0
- package/dist/tools/deepseek-sessions.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/usage-tracker.d.ts +40 -0
- package/dist/usage-tracker.d.ts.map +1 -0
- package/dist/usage-tracker.js +76 -0
- package/dist/usage-tracker.js.map +1 -0
- package/package.json +5 -2
package/dist/session.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Session Store
|
|
3
|
+
* Manages multi-turn conversation sessions within a single MCP server process lifetime
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from 'crypto';
|
|
6
|
+
import { getConfig } from './config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Singleton session store backed by an in-memory Map.
|
|
9
|
+
* Sessions live for the duration of the MCP server process.
|
|
10
|
+
* TTL-based cleanup prevents unbounded memory growth.
|
|
11
|
+
*/
|
|
12
|
+
export class SessionStore {
|
|
13
|
+
static instance = null;
|
|
14
|
+
sessions = new Map();
|
|
15
|
+
requestCounter = 0;
|
|
16
|
+
constructor() { }
|
|
17
|
+
static getInstance() {
|
|
18
|
+
if (!SessionStore.instance) {
|
|
19
|
+
SessionStore.instance = new SessionStore();
|
|
20
|
+
}
|
|
21
|
+
return SessionStore.instance;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reset singleton (for testing)
|
|
25
|
+
*/
|
|
26
|
+
static resetInstance() {
|
|
27
|
+
SessionStore.instance = null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a new session or return existing one
|
|
31
|
+
*/
|
|
32
|
+
create(sessionId) {
|
|
33
|
+
const id = sessionId || randomUUID();
|
|
34
|
+
const existing = this.sessions.get(id);
|
|
35
|
+
if (existing) {
|
|
36
|
+
existing.lastAccessedAt = Date.now();
|
|
37
|
+
return existing;
|
|
38
|
+
}
|
|
39
|
+
// Enforce max sessions limit
|
|
40
|
+
const config = getConfig();
|
|
41
|
+
if (this.sessions.size >= config.maxSessions) {
|
|
42
|
+
this.cleanup();
|
|
43
|
+
// If still at limit after cleanup, remove oldest session
|
|
44
|
+
if (this.sessions.size >= config.maxSessions) {
|
|
45
|
+
this.removeOldest();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const session = {
|
|
49
|
+
id,
|
|
50
|
+
messages: [],
|
|
51
|
+
createdAt: Date.now(),
|
|
52
|
+
lastAccessedAt: Date.now(),
|
|
53
|
+
totalCost: 0,
|
|
54
|
+
requestCount: 0,
|
|
55
|
+
};
|
|
56
|
+
this.sessions.set(id, session);
|
|
57
|
+
return session;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a session by ID, returns undefined if not found or expired
|
|
61
|
+
*/
|
|
62
|
+
get(sessionId) {
|
|
63
|
+
const session = this.sessions.get(sessionId);
|
|
64
|
+
if (!session)
|
|
65
|
+
return undefined;
|
|
66
|
+
// Check TTL
|
|
67
|
+
if (this.isExpired(session)) {
|
|
68
|
+
this.sessions.delete(sessionId);
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
session.lastAccessedAt = Date.now();
|
|
72
|
+
return session;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Add messages to a session
|
|
76
|
+
*/
|
|
77
|
+
addMessages(sessionId, messages) {
|
|
78
|
+
const session = this.get(sessionId);
|
|
79
|
+
if (!session) {
|
|
80
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
81
|
+
}
|
|
82
|
+
session.messages.push(...messages);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all messages from a session
|
|
86
|
+
*/
|
|
87
|
+
getMessages(sessionId) {
|
|
88
|
+
const session = this.get(sessionId);
|
|
89
|
+
if (!session)
|
|
90
|
+
return [];
|
|
91
|
+
return [...session.messages];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Delete a session
|
|
95
|
+
*/
|
|
96
|
+
delete(sessionId) {
|
|
97
|
+
return this.sessions.delete(sessionId);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* List all active (non-expired) sessions
|
|
101
|
+
*/
|
|
102
|
+
list() {
|
|
103
|
+
this.lazyCleanup();
|
|
104
|
+
const result = [];
|
|
105
|
+
for (const session of this.sessions.values()) {
|
|
106
|
+
if (!this.isExpired(session)) {
|
|
107
|
+
result.push({
|
|
108
|
+
id: session.id,
|
|
109
|
+
messageCount: session.messages.length,
|
|
110
|
+
createdAt: session.createdAt,
|
|
111
|
+
lastAccessedAt: session.lastAccessedAt,
|
|
112
|
+
totalCost: session.totalCost,
|
|
113
|
+
requestCount: session.requestCount,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Clean up expired sessions, returns number of removed sessions
|
|
121
|
+
*/
|
|
122
|
+
cleanup() {
|
|
123
|
+
let removed = 0;
|
|
124
|
+
for (const [id, session] of this.sessions) {
|
|
125
|
+
if (this.isExpired(session)) {
|
|
126
|
+
this.sessions.delete(id);
|
|
127
|
+
removed++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return removed;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get total cost across all sessions
|
|
134
|
+
*/
|
|
135
|
+
getTotalCost() {
|
|
136
|
+
let total = 0;
|
|
137
|
+
for (const session of this.sessions.values()) {
|
|
138
|
+
total += session.totalCost;
|
|
139
|
+
}
|
|
140
|
+
return total;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get active session count
|
|
144
|
+
*/
|
|
145
|
+
get size() {
|
|
146
|
+
return this.sessions.size;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Clear all sessions
|
|
150
|
+
*/
|
|
151
|
+
clear() {
|
|
152
|
+
const count = this.sessions.size;
|
|
153
|
+
this.sessions.clear();
|
|
154
|
+
return count;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Lazy cleanup: runs full cleanup every 10 requests
|
|
158
|
+
*/
|
|
159
|
+
lazyCleanup() {
|
|
160
|
+
this.requestCounter++;
|
|
161
|
+
if (this.requestCounter % 10 === 0) {
|
|
162
|
+
this.cleanup();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
isExpired(session) {
|
|
166
|
+
const config = getConfig();
|
|
167
|
+
const ttlMs = config.sessionTtlMinutes * 60 * 1000;
|
|
168
|
+
return Date.now() - session.lastAccessedAt > ttlMs;
|
|
169
|
+
}
|
|
170
|
+
removeOldest() {
|
|
171
|
+
let oldestId = null;
|
|
172
|
+
let oldestTime = Infinity;
|
|
173
|
+
for (const [id, session] of this.sessions) {
|
|
174
|
+
if (session.lastAccessedAt < oldestTime) {
|
|
175
|
+
oldestTime = session.lastAccessedAt;
|
|
176
|
+
oldestId = id;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (oldestId) {
|
|
180
|
+
this.sessions.delete(oldestId);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: deepseek_chat
|
|
3
|
-
* Chat completion with DeepSeek models
|
|
3
|
+
* Chat completion with DeepSeek models (V3.2)
|
|
4
|
+
* Supports multi-turn conversations via session_id
|
|
4
5
|
*/
|
|
5
6
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
7
|
import type { DeepSeekClient } from '../deepseek-client.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-chat.d.ts","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deepseek-chat.d.ts","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAuB5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAoQhF"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool: deepseek_chat
|
|
3
|
-
* Chat completion with DeepSeek models
|
|
3
|
+
* Chat completion with DeepSeek models (V3.2)
|
|
4
|
+
* Supports multi-turn conversations via session_id
|
|
4
5
|
*/
|
|
5
6
|
import { z } from 'zod';
|
|
6
7
|
import { getConfig } from '../config.js';
|
|
7
8
|
import { calculateCost, formatCost } from '../cost.js';
|
|
8
|
-
import { ExtendedMessageSchema, ChatInputWithToolsSchema, ToolDefinitionSchema, ToolChoiceSchema, } from '../schemas.js';
|
|
9
|
+
import { ExtendedMessageSchema, ChatInputWithToolsSchema, ToolDefinitionSchema, ToolChoiceSchema, ThinkingSchema, } from '../schemas.js';
|
|
9
10
|
import { getErrorMessage } from '../types.js';
|
|
11
|
+
import { SessionStore } from '../session.js';
|
|
12
|
+
import { UsageTracker } from '../usage-tracker.js';
|
|
10
13
|
/** Maximum allowed message content length (from config) */
|
|
11
14
|
function validateMessageLength(input) {
|
|
12
15
|
const maxLen = getConfig().maxMessageLength;
|
|
@@ -19,10 +22,10 @@ function validateMessageLength(input) {
|
|
|
19
22
|
export function registerChatTool(server, client) {
|
|
20
23
|
server.registerTool('deepseek_chat', {
|
|
21
24
|
title: 'DeepSeek Chat Completion',
|
|
22
|
-
description: 'Chat with DeepSeek AI models. Supports deepseek-chat for general conversations and ' +
|
|
23
|
-
'deepseek-reasoner
|
|
24
|
-
'
|
|
25
|
-
'
|
|
25
|
+
description: 'Chat with DeepSeek V3.2 AI models. Supports deepseek-chat for general conversations and ' +
|
|
26
|
+
'deepseek-reasoner for complex reasoning tasks with chain-of-thought explanations. ' +
|
|
27
|
+
'Features: multi-turn sessions (session_id), function calling (tools parameter), thinking mode, ' +
|
|
28
|
+
'JSON output mode, automatic cost tracking, and model fallback with circuit breaker resilience.',
|
|
26
29
|
inputSchema: {
|
|
27
30
|
messages: z
|
|
28
31
|
.array(ExtendedMessageSchema)
|
|
@@ -31,19 +34,19 @@ export function registerChatTool(server, client) {
|
|
|
31
34
|
model: z
|
|
32
35
|
.enum(['deepseek-chat', 'deepseek-reasoner'])
|
|
33
36
|
.default('deepseek-chat')
|
|
34
|
-
.describe('Model to use. deepseek-chat
|
|
37
|
+
.describe('Model to use. Both run DeepSeek V3.2 (128K context). deepseek-chat: non-thinking mode (max 8K output), deepseek-reasoner: thinking mode (max 64K output)'),
|
|
35
38
|
temperature: z
|
|
36
39
|
.number()
|
|
37
40
|
.min(0)
|
|
38
41
|
.max(2)
|
|
39
42
|
.optional()
|
|
40
|
-
.describe('Sampling temperature (0-2). Higher = more random. Default: 1.0'),
|
|
43
|
+
.describe('Sampling temperature (0-2). Higher = more random. Default: 1.0. Ignored when thinking mode is enabled.'),
|
|
41
44
|
max_tokens: z
|
|
42
45
|
.number()
|
|
43
46
|
.min(1)
|
|
44
|
-
.max(
|
|
47
|
+
.max(65536)
|
|
45
48
|
.optional()
|
|
46
|
-
.describe('Maximum tokens to generate.
|
|
49
|
+
.describe('Maximum tokens to generate. deepseek-chat: max 8192, deepseek-reasoner: max 65536'),
|
|
47
50
|
stream: z
|
|
48
51
|
.boolean()
|
|
49
52
|
.optional()
|
|
@@ -55,6 +58,16 @@ export function registerChatTool(server, client) {
|
|
|
55
58
|
.optional()
|
|
56
59
|
.describe('Array of tool definitions for function calling. Each tool has type "function" and a function object with name, description, and parameters (JSON Schema).'),
|
|
57
60
|
tool_choice: ToolChoiceSchema.optional().describe('Controls which tool the model calls. "auto" (default), "none", "required", or {type:"function",function:{name:"..."}}'),
|
|
61
|
+
thinking: ThinkingSchema.describe('Enable thinking mode for enhanced reasoning. When enabled, temperature/top_p/frequency_penalty/presence_penalty are automatically ignored. Use {type: "enabled"} to activate.'),
|
|
62
|
+
json_mode: z
|
|
63
|
+
.boolean()
|
|
64
|
+
.optional()
|
|
65
|
+
.describe('Enable JSON output mode. The model will output valid JSON. Include the word "json" in your prompt for best results. Supported by both models.'),
|
|
66
|
+
session_id: z
|
|
67
|
+
.string()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('Session ID for multi-turn conversations. When provided, previous messages from this session are prepended to the current messages. ' +
|
|
70
|
+
'If the session does not exist, it is created automatically. Omit for stateless single-turn requests.'),
|
|
58
71
|
},
|
|
59
72
|
outputSchema: {
|
|
60
73
|
content: z.string(),
|
|
@@ -64,6 +77,8 @@ export function registerChatTool(server, client) {
|
|
|
64
77
|
prompt_tokens: z.number(),
|
|
65
78
|
completion_tokens: z.number(),
|
|
66
79
|
total_tokens: z.number(),
|
|
80
|
+
prompt_cache_hit_tokens: z.number().optional(),
|
|
81
|
+
prompt_cache_miss_tokens: z.number().optional(),
|
|
67
82
|
}),
|
|
68
83
|
finish_reason: z.string(),
|
|
69
84
|
tool_calls: z
|
|
@@ -76,33 +91,78 @@ export function registerChatTool(server, client) {
|
|
|
76
91
|
}),
|
|
77
92
|
}))
|
|
78
93
|
.optional(),
|
|
94
|
+
session_id: z.string().optional(),
|
|
79
95
|
},
|
|
80
96
|
}, async (input) => {
|
|
81
97
|
try {
|
|
82
98
|
// Validate message content length
|
|
83
99
|
validateMessageLength(input);
|
|
84
|
-
// Validate input with extended schema (supports tools)
|
|
100
|
+
// Validate input with extended schema (supports tools + session_id)
|
|
85
101
|
const validated = ChatInputWithToolsSchema.parse(input);
|
|
86
|
-
|
|
102
|
+
// JSON mode guard: warn if "json" word is not in any message content
|
|
103
|
+
if (validated.json_mode) {
|
|
104
|
+
const hasJsonWord = validated.messages.some((m) => m.content.toLowerCase().includes('json'));
|
|
105
|
+
if (!hasJsonWord) {
|
|
106
|
+
console.error('[DeepSeek MCP] Warning: json_mode enabled but no "json" word found in messages. Results may be unreliable.');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Model-aware max_tokens warnings
|
|
110
|
+
if (validated.max_tokens) {
|
|
111
|
+
if (validated.model === 'deepseek-chat' && validated.max_tokens > 8192) {
|
|
112
|
+
console.error(`[DeepSeek MCP] Warning: deepseek-chat max output is 8192 tokens, requested ${validated.max_tokens}. API may truncate.`);
|
|
113
|
+
}
|
|
114
|
+
if (validated.model === 'deepseek-reasoner' && validated.max_tokens > 65536) {
|
|
115
|
+
console.error(`[DeepSeek MCP] Warning: deepseek-reasoner max output is 65536 tokens, requested ${validated.max_tokens}. API may truncate.`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Session management: build full message list
|
|
119
|
+
let allMessages = validated.messages;
|
|
120
|
+
const sessionStore = SessionStore.getInstance();
|
|
121
|
+
if (validated.session_id) {
|
|
122
|
+
// Create or get session
|
|
123
|
+
const session = sessionStore.create(validated.session_id);
|
|
124
|
+
// Prepend previous session messages to current messages
|
|
125
|
+
const previousMessages = sessionStore.getMessages(validated.session_id);
|
|
126
|
+
allMessages = [...previousMessages, ...validated.messages];
|
|
127
|
+
console.error(`[DeepSeek MCP] Session: id=${validated.session_id}, previous_messages=${previousMessages.length}, total_messages=${allMessages.length}`);
|
|
128
|
+
}
|
|
129
|
+
console.error(`[DeepSeek MCP] Request: model=${validated.model}, messages=${allMessages.length}, stream=${validated.stream}${validated.tools ? `, tools=${validated.tools.length}` : ''}${validated.thinking ? `, thinking=${validated.thinking.type}` : ''}${validated.json_mode ? ', json_mode=true' : ''}${validated.session_id ? `, session=${validated.session_id}` : ''}`);
|
|
130
|
+
// Build params for client
|
|
131
|
+
const clientParams = {
|
|
132
|
+
model: validated.model,
|
|
133
|
+
messages: allMessages,
|
|
134
|
+
temperature: validated.temperature,
|
|
135
|
+
max_tokens: validated.max_tokens,
|
|
136
|
+
tools: validated.tools,
|
|
137
|
+
tool_choice: validated.tool_choice,
|
|
138
|
+
thinking: validated.thinking,
|
|
139
|
+
response_format: validated.json_mode
|
|
140
|
+
? { type: 'json_object' }
|
|
141
|
+
: undefined,
|
|
142
|
+
};
|
|
87
143
|
// Call appropriate method based on stream parameter
|
|
88
144
|
const response = validated.stream
|
|
89
|
-
? await client.createStreamingChatCompletion(
|
|
90
|
-
|
|
91
|
-
messages: validated.messages,
|
|
92
|
-
temperature: validated.temperature,
|
|
93
|
-
max_tokens: validated.max_tokens,
|
|
94
|
-
tools: validated.tools,
|
|
95
|
-
tool_choice: validated.tool_choice,
|
|
96
|
-
})
|
|
97
|
-
: await client.createChatCompletion({
|
|
98
|
-
model: validated.model,
|
|
99
|
-
messages: validated.messages,
|
|
100
|
-
temperature: validated.temperature,
|
|
101
|
-
max_tokens: validated.max_tokens,
|
|
102
|
-
tools: validated.tools,
|
|
103
|
-
tool_choice: validated.tool_choice,
|
|
104
|
-
});
|
|
145
|
+
? await client.createStreamingChatCompletion(clientParams)
|
|
146
|
+
: await client.createChatCompletion(clientParams);
|
|
105
147
|
console.error(`[DeepSeek MCP] Response: tokens=${response.usage.total_tokens}, finish_reason=${response.finish_reason}${response.tool_calls ? `, tool_calls=${response.tool_calls.length}` : ''}`);
|
|
148
|
+
// Calculate cost
|
|
149
|
+
const costBreakdown = calculateCost(response.usage);
|
|
150
|
+
// Update session with new messages and response
|
|
151
|
+
if (validated.session_id) {
|
|
152
|
+
const session = sessionStore.get(validated.session_id);
|
|
153
|
+
if (session) {
|
|
154
|
+
// Add the new user messages to session
|
|
155
|
+
sessionStore.addMessages(validated.session_id, validated.messages);
|
|
156
|
+
// Add assistant response to session
|
|
157
|
+
sessionStore.addMessages(validated.session_id, [
|
|
158
|
+
{ role: 'assistant', content: response.content },
|
|
159
|
+
]);
|
|
160
|
+
session.totalCost += costBreakdown.totalCost;
|
|
161
|
+
session.requestCount++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Track usage globally
|
|
165
|
+
UsageTracker.getInstance().trackRequest(response.usage, costBreakdown.totalCost);
|
|
106
166
|
// Format response
|
|
107
167
|
let responseText = '';
|
|
108
168
|
// Add reasoning content if available (for deepseek-reasoner)
|
|
@@ -119,17 +179,21 @@ export function registerChatTool(server, client) {
|
|
|
119
179
|
responseText += `- Arguments: ${tc.function.arguments}\n\n`;
|
|
120
180
|
}
|
|
121
181
|
}
|
|
122
|
-
// Calculate cost
|
|
123
|
-
const cost = calculateCost(response.usage.prompt_tokens, response.usage.completion_tokens, response.model);
|
|
124
182
|
// Add usage stats with cost information (controlled by config)
|
|
125
183
|
if (getConfig().showCostInfo) {
|
|
126
184
|
responseText += `\n---\n**Request Information:**\n`;
|
|
127
185
|
responseText += `- **Tokens:** ${response.usage.total_tokens} (${response.usage.prompt_tokens} prompt + ${response.usage.completion_tokens} completion)\n`;
|
|
128
186
|
responseText += `- **Model:** ${response.model}\n`;
|
|
129
|
-
responseText += `- **Cost:** ${formatCost(
|
|
187
|
+
responseText += `- **Cost:** ${formatCost(costBreakdown)}`;
|
|
130
188
|
if (response.tool_calls?.length) {
|
|
131
189
|
responseText += `\n- **Tool Calls:** ${response.tool_calls.length}`;
|
|
132
190
|
}
|
|
191
|
+
if (validated.session_id) {
|
|
192
|
+
const session = sessionStore.get(validated.session_id);
|
|
193
|
+
if (session) {
|
|
194
|
+
responseText += `\n- **Session:** ${validated.session_id} (${session.messages.length} messages, ${session.requestCount} requests, $${session.totalCost.toFixed(4)} total)`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
133
197
|
}
|
|
134
198
|
return {
|
|
135
199
|
content: [
|
|
@@ -140,7 +204,8 @@ export function registerChatTool(server, client) {
|
|
|
140
204
|
],
|
|
141
205
|
structuredContent: {
|
|
142
206
|
...response,
|
|
143
|
-
cost_usd: parseFloat(
|
|
207
|
+
cost_usd: parseFloat(costBreakdown.totalCost.toFixed(6)),
|
|
208
|
+
...(validated.session_id ? { session_id: validated.session_id } : {}),
|
|
144
209
|
},
|
|
145
210
|
};
|
|
146
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-chat.js","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deepseek-chat.js","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: deepseek_sessions
|
|
3
|
+
* Session management for multi-turn conversations
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
export declare function registerSessionsTool(server: McpServer): void;
|
|
7
|
+
//# sourceMappingURL=deepseek-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek-sessions.d.ts","sourceRoot":"","sources":["../../src/tools/deepseek-sessions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG5D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: deepseek_sessions
|
|
3
|
+
* Session management for multi-turn conversations
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { SessionStore } from '../session.js';
|
|
7
|
+
import { getErrorMessage } from '../types.js';
|
|
8
|
+
export function registerSessionsTool(server) {
|
|
9
|
+
server.registerTool('deepseek_sessions', {
|
|
10
|
+
title: 'DeepSeek Session Management',
|
|
11
|
+
description: 'Manage multi-turn conversation sessions. List active sessions, delete a specific session, or clear all sessions. ' +
|
|
12
|
+
'Sessions store conversation history for use with the session_id parameter in deepseek_chat.',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
action: z
|
|
15
|
+
.enum(['list', 'clear', 'delete'])
|
|
16
|
+
.describe('Action to perform. "list": show all active sessions, "clear": remove all sessions, "delete": remove a specific session (requires session_id)'),
|
|
17
|
+
session_id: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Session ID to delete (required when action is "delete")'),
|
|
21
|
+
},
|
|
22
|
+
}, async (input) => {
|
|
23
|
+
try {
|
|
24
|
+
const store = SessionStore.getInstance();
|
|
25
|
+
switch (input.action) {
|
|
26
|
+
case 'list': {
|
|
27
|
+
const sessions = store.list();
|
|
28
|
+
if (sessions.length === 0) {
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: 'No active sessions.',
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
let text = `**Active Sessions (${sessions.length}):**\n\n`;
|
|
39
|
+
for (const s of sessions) {
|
|
40
|
+
const created = new Date(s.createdAt).toISOString();
|
|
41
|
+
const lastAccess = new Date(s.lastAccessedAt).toISOString();
|
|
42
|
+
text += `- **${s.id}**\n`;
|
|
43
|
+
text += ` Messages: ${s.messageCount} | Requests: ${s.requestCount} | Cost: $${s.totalCost.toFixed(4)}\n`;
|
|
44
|
+
text += ` Created: ${created} | Last access: ${lastAccess}\n\n`;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: 'text', text }],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
case 'delete': {
|
|
51
|
+
if (!input.session_id) {
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: 'Error: session_id is required for delete action.',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const deleted = store.delete(input.session_id);
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: deleted
|
|
68
|
+
? `Session "${input.session_id}" deleted successfully.`
|
|
69
|
+
: `Session "${input.session_id}" not found.`,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
case 'clear': {
|
|
75
|
+
const count = store.clear();
|
|
76
|
+
return {
|
|
77
|
+
content: [
|
|
78
|
+
{
|
|
79
|
+
type: 'text',
|
|
80
|
+
text: `Cleared ${count} session(s).`,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('[DeepSeek MCP] Session error:', error);
|
|
89
|
+
return {
|
|
90
|
+
content: [
|
|
91
|
+
{
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: `Error: ${getErrorMessage(error)}`,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
isError: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=deepseek-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek-sessions.js","sourceRoot":"","sources":["../../src/tools/deepseek-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAGhF"}
|
package/dist/tools/index.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* Registers all tools with the MCP server
|
|
4
4
|
*/
|
|
5
5
|
import { registerChatTool } from './deepseek-chat.js';
|
|
6
|
+
import { registerSessionsTool } from './deepseek-sessions.js';
|
|
6
7
|
export function registerAllTools(server, client) {
|
|
7
8
|
registerChatTool(server, client);
|
|
9
|
+
registerSessionsTool(server);
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAsB;IACxE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|