@arikusi/deepseek-mcp-server 1.6.0 → 1.8.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 +33 -0
- package/README.md +52 -7
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/session.d.ts +5 -13
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +5 -20
- package/dist/session.js.map +1 -1
- 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 +1 -3
- package/dist/tools/deepseek-chat.js.map +1 -1
- package/dist/tools/deepseek-sessions.d.ts +2 -1
- package/dist/tools/deepseek-sessions.d.ts.map +1 -1
- package/dist/tools/deepseek-sessions.js +1 -3
- package/dist/tools/deepseek-sessions.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/transport-http.d.ts +15 -2
- package/dist/transport-http.d.ts.map +1 -1
- package/dist/transport-http.js +46 -9
- package/dist/transport-http.js.map +1 -1
- package/dist/usage-tracker.d.ts +12 -0
- package/dist/usage-tracker.d.ts.map +1 -1
- package/dist/usage-tracker.js +23 -6
- package/dist/usage-tracker.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.8.0] - 2026-06-14
|
|
11
|
+
|
|
12
|
+
### Security
|
|
13
|
+
- **Missing authentication on the self-hosted HTTP endpoint.** In HTTP transport mode the server holds your `DEEPSEEK_API_KEY` and uses it for every `deepseek_chat` call, yet `POST /mcp` had no authentication and the server bound to `0.0.0.0`, so any client that could reach the port could initialize a session, enumerate tools, and invoke them. The defaults now bind to loopback and an optional bearer token guards the endpoint. Reported independently; advisory and CVE coordination in progress.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- HTTP transport now binds to `127.0.0.1` by default (configurable via `HTTP_HOST`). The SDK's DNS rebinding protection is active on loopback. Binding to `0.0.0.0` without a token prints a startup security warning.
|
|
17
|
+
- `docker-compose.yml` publishes the port to `127.0.0.1` only, and the README's `docker run` example does the same.
|
|
18
|
+
- **Minimum Node.js is now 20.** Node 18 reached end of life in April 2025 and the test toolchain (vitest 4) no longer runs on it. The published package follows suit (`engines.node` is `>=20.0.0`); CI tests on Node 20, 22, and 24.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- `HTTP_AUTH_TOKEN`: when set, `POST/GET/DELETE /mcp` require `Authorization: Bearer <token>` (constant-time comparison). `/health` stays open for probes.
|
|
22
|
+
- `HTTP_ALLOWED_HOSTS`: comma-separated allowed `Host` headers, keeping DNS rebinding protection when binding to `0.0.0.0`.
|
|
23
|
+
- `SECURITY.md` with the disclosure policy and self-hosted HTTP hardening guidance.
|
|
24
|
+
- Auth and host-binding tests (`src/transport-auth.test.ts`).
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- Bumped `@modelcontextprotocol/sdk` to 1.29.0 and `vitest`/`@vitest/coverage-v8` to 4.1.8, clearing all transitive `npm audit` advisories (13 to 0).
|
|
28
|
+
|
|
29
|
+
## [1.7.0] - 2026-04-22
|
|
30
|
+
|
|
31
|
+
### Security
|
|
32
|
+
- **Cross-session data exposure in HTTP transport (high severity).** The `SessionStore` was a process-wide singleton shared across all connected HTTP clients. In HTTP transport mode, any client that provided another client's `session_id` to `deepseek_chat` would read that client's conversation history. The `deepseek_sessions` tool compounded this by letting any client enumerate all active session IDs (`list`), delete any session (`delete`), or wipe every tenant's sessions at once (`clear`). STDIO transport was unaffected because each STDIO client runs its own server process. Full advisory and CVE coordination pending.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
- **BREAKING (HTTP transport only).** Each HTTP session now gets an isolated `SessionStore` instance. Conversation history, session listings, and session deletion are scoped to the HTTP session that created them. Clients on the same server no longer share session state.
|
|
36
|
+
- `SessionStore` is no longer a singleton. `SessionStore.getInstance()` and `SessionStore.resetInstance()` have been removed. Construct instances with `new SessionStore()` and pass them explicitly to `registerChatTool`, `registerSessionsTool`, and `registerAllTools`.
|
|
37
|
+
- `UsageTracker.getStats().activeSessions` is wired to the STDIO store via `UsageTracker.setSessionSource()`. In HTTP transport it reports `0` by design — a process-wide count across isolated stores would be both meaningless and a minor cross-tenant information leak.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- `SessionStore` isolation tests: independent instances, no shared state, no cross-store effects on `clear`/`delete`/`list`.
|
|
41
|
+
- HTTP transport integration test (`src/transport-isolation.test.ts`) proving each `serverFactory` invocation produces a fresh store and that user-supplied `session_id` collisions across HTTP sessions do not merge data.
|
|
42
|
+
|
|
10
43
|
## [1.6.0] - 2026-03-17
|
|
11
44
|
|
|
12
45
|
### Added
|
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
<p align="center">
|
|
21
21
|
Compatible with Claude Code, Gemini CLI, Cursor, Windsurf, and any MCP-compatible client.<br />
|
|
22
|
-
Officially listed on the <a href="https://registry.modelcontextprotocol.io/?q=io.github.arikusi"><strong>MCP Registry</strong></a>, <a href="https://smithery.ai/servers/arikusi/deepseek-mcp-server">Smithery</a>, <a href="https://glama.ai/mcp/servers/arikusi/deepseek-mcp-server">Glama</a>,
|
|
22
|
+
Officially listed on the <a href="https://registry.modelcontextprotocol.io/?q=io.github.arikusi"><strong>MCP Registry</strong></a>, <a href="https://smithery.ai/servers/arikusi/deepseek-mcp-server">Smithery</a>, <a href="https://glama.ai/mcp/servers/arikusi/deepseek-mcp-server">Glama</a>, <a href="https://lobehub.com/mcp/arikusi-deepseek-mcp-server">LobeHub</a>, and <a href="https://fronteir.ai/mcp/arikusi-deepseek-mcp-server">Fronteir AI</a>.
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
25
|
<p align="center">
|
|
@@ -100,7 +100,7 @@ gemini mcp add deepseek npx @arikusi/deepseek-mcp-server -e DEEPSEEK_API_KEY=you
|
|
|
100
100
|
- **Remote Endpoint**: Hosted at `deepseek-mcp.tahirl.com/mcp` — BYOK (Bring Your Own Key), no install needed
|
|
101
101
|
- **HTTP Transport**: Self-hosted remote access via Streamable HTTP with `TRANSPORT=http`
|
|
102
102
|
- **Docker Ready**: Multi-stage Dockerfile with health checks for containerized deployment
|
|
103
|
-
- **Tested**:
|
|
103
|
+
- **Tested**: 265 tests, ~89% line coverage
|
|
104
104
|
- **Type-Safe**: Full TypeScript implementation
|
|
105
105
|
- **MCP Compatible**: Works with any MCP-compatible CLI (Claude Code, Gemini CLI, etc.)
|
|
106
106
|
|
|
@@ -317,7 +317,7 @@ JSON mode ensures the model outputs valid JSON. Include the word "json" in your
|
|
|
317
317
|
}
|
|
318
318
|
```
|
|
319
319
|
|
|
320
|
-
Use the same `session_id` across requests to maintain conversation context.
|
|
320
|
+
Use the same `session_id` across requests to maintain conversation context. Messages are stored in memory and prepended automatically. In HTTP transport each connected MCP session has its own isolated session store — a `session_id` created by one HTTP client is not visible to another (see HTTP Transport below).
|
|
321
321
|
|
|
322
322
|
### `deepseek_sessions`
|
|
323
323
|
|
|
@@ -429,6 +429,9 @@ The server is configured via environment variables. All settings except `DEEPSEE
|
|
|
429
429
|
| `ENABLE_MULTIMODAL` | `false` | Enable multimodal (image) input support |
|
|
430
430
|
| `TRANSPORT` | `stdio` | Transport mode: `stdio` or `http` |
|
|
431
431
|
| `HTTP_PORT` | `3000` | HTTP server port (when TRANSPORT=http) |
|
|
432
|
+
| `HTTP_HOST` | `127.0.0.1` | Bind address for HTTP transport. Loopback by default so a fresh run is not exposed. Set to `0.0.0.0` to accept remote connections (do this only with auth or a proxy in front) |
|
|
433
|
+
| `HTTP_AUTH_TOKEN` | _(unset)_ | When set, `POST /mcp` requires `Authorization: Bearer <token>`. `/health` stays open. Strongly recommended whenever the port is reachable beyond localhost |
|
|
434
|
+
| `HTTP_ALLOWED_HOSTS` | _(unset)_ | Comma-separated list of allowed `Host` headers for DNS rebinding protection when binding to `0.0.0.0` (e.g. `mcp.example.com,localhost`) |
|
|
432
435
|
|
|
433
436
|
**Example with custom config:**
|
|
434
437
|
```bash
|
|
@@ -559,20 +562,62 @@ curl http://localhost:3000/health
|
|
|
559
562
|
|
|
560
563
|
The MCP endpoint is available at `POST /mcp` (Streamable HTTP protocol).
|
|
561
564
|
|
|
565
|
+
**Securing the endpoint (read before exposing it).** In self-hosted HTTP mode the
|
|
566
|
+
server holds your `DEEPSEEK_API_KEY` and uses it for every `deepseek_chat` call.
|
|
567
|
+
Anyone who can reach `POST /mcp` can invoke tools and spend that key, so the
|
|
568
|
+
endpoint must not sit open on a public interface. The defaults are built around
|
|
569
|
+
this:
|
|
570
|
+
|
|
571
|
+
1. `HTTP_HOST` defaults to `127.0.0.1`, so a plain run only listens on loopback and the SDK's DNS rebinding protection is active. Nothing off the machine can reach it.
|
|
572
|
+
2. To accept remote connections, set `HTTP_HOST=0.0.0.0`, but then set `HTTP_AUTH_TOKEN` as well so `/mcp` requires `Authorization: Bearer <token>`. If you bind to `0.0.0.0` without a token, the server prints a loud warning on startup.
|
|
573
|
+
3. For an internet-facing deployment, put an authenticating reverse proxy with TLS in front and set `HTTP_ALLOWED_HOSTS` to your real hostname(s).
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
# Exposed deployment with a bearer token
|
|
577
|
+
TRANSPORT=http HTTP_HOST=0.0.0.0 HTTP_PORT=3000 \
|
|
578
|
+
HTTP_AUTH_TOKEN=$(openssl rand -hex 32) \
|
|
579
|
+
HTTP_ALLOWED_HOSTS=mcp.example.com \
|
|
580
|
+
DEEPSEEK_API_KEY=your-key node dist/index.js
|
|
581
|
+
|
|
582
|
+
# Calling it
|
|
583
|
+
curl -X POST http://mcp.example.com:3000/mcp \
|
|
584
|
+
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
585
|
+
-H "Content-Type: application/json" \
|
|
586
|
+
-H "Accept: application/json, text/event-stream" \
|
|
587
|
+
-d '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{}},"id":1}'
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
`HTTP_AUTH_TOKEN` is a static gateway token for the self-hosted endpoint and is
|
|
591
|
+
unrelated to your DeepSeek key. It is separate from the hosted BYOK endpoint
|
|
592
|
+
above, where clients pass their own DeepSeek key as the bearer.
|
|
593
|
+
|
|
594
|
+
**Session isolation (1.7.0+):** In HTTP transport each connected MCP session
|
|
595
|
+
gets its own `McpServer` instance and its own `SessionStore`. Conversation
|
|
596
|
+
history, session listings, and deletions are scoped to the MCP session that
|
|
597
|
+
created them, so one client cannot read, enumerate, or wipe another client's
|
|
598
|
+
sessions. STDIO transport is single-tenant by nature and unaffected.
|
|
599
|
+
|
|
562
600
|
### Docker
|
|
563
601
|
|
|
564
602
|
```bash
|
|
565
603
|
# Build
|
|
566
604
|
docker build -t deepseek-mcp-server .
|
|
567
605
|
|
|
568
|
-
# Run
|
|
569
|
-
docker run -d -p 3000:3000
|
|
606
|
+
# Run, reachable only from the host's loopback, with a bearer token
|
|
607
|
+
docker run -d -p 127.0.0.1:3000:3000 \
|
|
608
|
+
-e DEEPSEEK_API_KEY=your-key \
|
|
609
|
+
-e HTTP_AUTH_TOKEN=your-token \
|
|
610
|
+
deepseek-mcp-server
|
|
570
611
|
|
|
571
612
|
# Or use docker-compose
|
|
572
|
-
DEEPSEEK_API_KEY=your-key docker compose up -d
|
|
613
|
+
DEEPSEEK_API_KEY=your-key HTTP_AUTH_TOKEN=your-token docker compose up -d
|
|
573
614
|
```
|
|
574
615
|
|
|
575
|
-
The
|
|
616
|
+
The image runs HTTP transport on port 3000 with a health check. Inside the
|
|
617
|
+
container it binds `0.0.0.0` (required for the port mapping to work), so control
|
|
618
|
+
exposure at the publish layer: the example above and the bundled
|
|
619
|
+
`docker-compose.yml` publish to `127.0.0.1` only. If you publish the port on a
|
|
620
|
+
public interface, set `HTTP_AUTH_TOKEN`.
|
|
576
621
|
|
|
577
622
|
## Troubleshooting
|
|
578
623
|
|
package/dist/config.d.ts
CHANGED
|
@@ -24,6 +24,9 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
24
24
|
http: "http";
|
|
25
25
|
}>>;
|
|
26
26
|
httpPort: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
httpHost: z.ZodDefault<z.ZodString>;
|
|
28
|
+
httpAuthToken: z.ZodOptional<z.ZodString>;
|
|
29
|
+
httpAllowedHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
27
30
|
}, z.core.$strip>;
|
|
28
31
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
29
32
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;iBAqBhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA8DnC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
package/dist/config.js
CHANGED
|
@@ -22,6 +22,9 @@ const ConfigSchema = z.object({
|
|
|
22
22
|
enableMultimodal: z.boolean().default(false),
|
|
23
23
|
transport: z.enum(['stdio', 'http']).default('stdio'),
|
|
24
24
|
httpPort: z.number().positive().default(3000),
|
|
25
|
+
httpHost: z.string().min(1).default('127.0.0.1'),
|
|
26
|
+
httpAuthToken: z.string().min(1).optional(),
|
|
27
|
+
httpAllowedHosts: z.array(z.string().min(1)).optional(),
|
|
25
28
|
});
|
|
26
29
|
let cachedConfig = null;
|
|
27
30
|
/**
|
|
@@ -64,6 +67,11 @@ export function loadConfig() {
|
|
|
64
67
|
enableMultimodal: process.env.ENABLE_MULTIMODAL === 'true',
|
|
65
68
|
transport: (process.env.TRANSPORT || 'stdio'),
|
|
66
69
|
httpPort: process.env.HTTP_PORT ? parseInt(process.env.HTTP_PORT, 10) : 3000,
|
|
70
|
+
httpHost: process.env.HTTP_HOST || '127.0.0.1',
|
|
71
|
+
httpAuthToken: process.env.HTTP_AUTH_TOKEN || undefined,
|
|
72
|
+
httpAllowedHosts: process.env.HTTP_ALLOWED_HOSTS
|
|
73
|
+
? process.env.HTTP_ALLOWED_HOSTS.split(',').map((h) => h.trim()).filter(Boolean)
|
|
74
|
+
: undefined,
|
|
67
75
|
};
|
|
68
76
|
const result = ConfigSchema.safeParse(raw);
|
|
69
77
|
if (!result.success) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,8BAA8B,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACxD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;IACjD,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACtD,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* DeepSeek MCP Server
|
|
4
4
|
* Model Context Protocol server for DeepSeek API integration
|
|
5
5
|
*/
|
|
6
|
-
export declare function createSandboxServer(): import("@modelcontextprotocol/sdk/server/mcp
|
|
6
|
+
export declare function createSandboxServer(): import("@modelcontextprotocol/sdk/server/mcp").McpServer;
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAmHH,wBAAgB,mBAAmB,6DAWlC"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,8 @@ import { registerAllTools } from './tools/index.js';
|
|
|
12
12
|
import { registerAllPrompts } from './prompts/index.js';
|
|
13
13
|
import { registerAllResources } from './resources/index.js';
|
|
14
14
|
import { startHttpTransport } from './transport-http.js';
|
|
15
|
+
import { SessionStore } from './session.js';
|
|
16
|
+
import { UsageTracker } from './usage-tracker.js';
|
|
15
17
|
async function main() {
|
|
16
18
|
// Load and validate configuration
|
|
17
19
|
try {
|
|
@@ -29,10 +31,20 @@ async function main() {
|
|
|
29
31
|
const config = getConfig();
|
|
30
32
|
const deepseek = new DeepSeekClient();
|
|
31
33
|
const server = createServer();
|
|
34
|
+
// STDIO mode: single shared SessionStore for the lifetime of this process.
|
|
35
|
+
// (HTTP mode builds its own per-session stores below — see serverFactory.)
|
|
36
|
+
const stdioSessionStore = new SessionStore();
|
|
32
37
|
// Register tools, prompts, and resources
|
|
33
|
-
registerAllTools(server, deepseek);
|
|
38
|
+
registerAllTools(server, deepseek, stdioSessionStore);
|
|
34
39
|
registerAllPrompts(server);
|
|
35
40
|
registerAllResources(server);
|
|
41
|
+
// Wire the usage tracker's active-session count to the STDIO store.
|
|
42
|
+
// In HTTP mode this is intentionally NOT wired: each HTTP session owns its
|
|
43
|
+
// own store, so a process-wide count would be misleading and could leak
|
|
44
|
+
// tenant info.
|
|
45
|
+
if (config.transport !== 'http') {
|
|
46
|
+
UsageTracker.getInstance().setSessionSource(() => stdioSessionStore.list().length);
|
|
47
|
+
}
|
|
36
48
|
console.error(`[DeepSeek MCP] Starting server v${version}...`);
|
|
37
49
|
// Optional connection test (controlled by SKIP_CONNECTION_TEST env)
|
|
38
50
|
if (!config.skipConnectionTest) {
|
|
@@ -47,15 +59,23 @@ async function main() {
|
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
if (config.transport === 'http') {
|
|
50
|
-
// HTTP transport: per-session McpServer
|
|
62
|
+
// HTTP transport: per-session McpServer AND per-session SessionStore.
|
|
63
|
+
// DeepSeekClient is shared (stateless API client is fine cross-session).
|
|
64
|
+
// Each HTTP session gets an isolated SessionStore so that one client
|
|
65
|
+
// cannot read, list, or clear another client's conversation history.
|
|
51
66
|
const serverFactory = () => {
|
|
52
67
|
const s = createServer();
|
|
53
|
-
|
|
68
|
+
const sessionStore = new SessionStore();
|
|
69
|
+
registerAllTools(s, deepseek, sessionStore);
|
|
54
70
|
registerAllPrompts(s);
|
|
55
71
|
registerAllResources(s);
|
|
56
72
|
return s;
|
|
57
73
|
};
|
|
58
|
-
await startHttpTransport(serverFactory, config.httpPort
|
|
74
|
+
await startHttpTransport(serverFactory, config.httpPort, {
|
|
75
|
+
host: config.httpHost,
|
|
76
|
+
authToken: config.httpAuthToken,
|
|
77
|
+
allowedHosts: config.httpAllowedHosts,
|
|
78
|
+
});
|
|
59
79
|
}
|
|
60
80
|
else {
|
|
61
81
|
// Stdio transport (default)
|
|
@@ -83,7 +103,8 @@ export function createSandboxServer() {
|
|
|
83
103
|
loadConfig();
|
|
84
104
|
const client = new DeepSeekClient();
|
|
85
105
|
const server = createServer();
|
|
86
|
-
|
|
106
|
+
const sessionStore = new SessionStore();
|
|
107
|
+
registerAllTools(server, client, sessionStore);
|
|
87
108
|
registerAllPrompts(server);
|
|
88
109
|
registerAllResources(server);
|
|
89
110
|
return server;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,kCAAkC;IAClC,IAAI,CAAC;QACH,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,iBAAiB,GAAG,IAAI,YAAY,EAAE,CAAC;IAE7C,yCAAyC;IACzC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACtD,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,oEAAoE;IACpE,2EAA2E;IAC3E,wEAAwE;IACxE,eAAe;IACf,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,YAAY,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,KAAK,CAAC,CAAC;IAE/D,oEAAoE;IACpE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QAEpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CACX,kEAAkE,CACnE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,sEAAsE;QACtE,yEAAyE;QACzE,qEAAqE;QACrE,qEAAqE;QACrE,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC5C,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACtB,oBAAoB,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE;YACvD,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,SAAS,EAAE,MAAM,CAAC,aAAa;YAC/B,YAAY,EAAE,MAAM,CAAC,gBAAgB;SACtC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CACX,uFAAuF,CACxF,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,KAAK,CACX,wCAAwC,EACxC,OAAO,EACP,SAAS,EACT,MAAM,CACP,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,aAAa,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/C,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -6,7 +6,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { readFileSync } from 'fs';
|
|
7
7
|
import { dirname, join } from 'path';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
|
-
let version = '1.
|
|
9
|
+
let version = '1.8.0';
|
|
10
10
|
try {
|
|
11
11
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
package/dist/session.d.ts
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-Memory Session Store
|
|
3
|
-
* Manages multi-turn conversation sessions within a single MCP server
|
|
3
|
+
* Manages multi-turn conversation sessions within a single MCP server instance lifetime.
|
|
4
|
+
*
|
|
5
|
+
* One SessionStore per McpServer instance. In HTTP transport mode this means
|
|
6
|
+
* one store per connected HTTP session, which gives cross-client isolation.
|
|
7
|
+
* In STDIO mode a single store is shared for the life of the process.
|
|
4
8
|
*/
|
|
5
9
|
import type { ChatMessage, Session, SessionInfo } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Singleton session store backed by an in-memory Map.
|
|
8
|
-
* Sessions live for the duration of the MCP server process.
|
|
9
|
-
* TTL-based cleanup prevents unbounded memory growth.
|
|
10
|
-
*/
|
|
11
10
|
export declare class SessionStore {
|
|
12
|
-
private static instance;
|
|
13
11
|
private sessions;
|
|
14
12
|
private requestCounter;
|
|
15
|
-
private constructor();
|
|
16
|
-
static getInstance(): SessionStore;
|
|
17
|
-
/**
|
|
18
|
-
* Reset singleton (for testing)
|
|
19
|
-
*/
|
|
20
|
-
static resetInstance(): void;
|
|
21
13
|
/**
|
|
22
14
|
* Create a new session or return existing one
|
|
23
15
|
*/
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,cAAc,CAAK;IAE3B;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAgCnC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAc3C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;IAc7D;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAM7C;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,IAAI,IAAI,WAAW,EAAE;IAkBrB;;OAEG;IACH,OAAO,IAAI,MAAM;IAWjB;;OAEG;IACH,YAAY,IAAI,MAAM;IAQtB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,MAAM;IAMf;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;CAarB"}
|
package/dist/session.js
CHANGED
|
@@ -1,31 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-Memory Session Store
|
|
3
|
-
* Manages multi-turn conversation sessions within a single MCP server
|
|
3
|
+
* Manages multi-turn conversation sessions within a single MCP server instance lifetime.
|
|
4
|
+
*
|
|
5
|
+
* One SessionStore per McpServer instance. In HTTP transport mode this means
|
|
6
|
+
* one store per connected HTTP session, which gives cross-client isolation.
|
|
7
|
+
* In STDIO mode a single store is shared for the life of the process.
|
|
4
8
|
*/
|
|
5
9
|
import { randomUUID } from 'crypto';
|
|
6
10
|
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
11
|
export class SessionStore {
|
|
13
|
-
static instance = null;
|
|
14
12
|
sessions = new Map();
|
|
15
13
|
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
14
|
/**
|
|
30
15
|
* Create a new session or return existing one
|
|
31
16
|
*/
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
7
|
import type { DeepSeekClient } from '../deepseek-client.js';
|
|
8
|
-
|
|
8
|
+
import type { SessionStore } from '../session.js';
|
|
9
|
+
export declare function registerChatTool(server: McpServer, client: DeepSeekClient, sessionStore: SessionStore): void;
|
|
9
10
|
//# sourceMappingURL=deepseek-chat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;AAYzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
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;AAYzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAqBlD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,YAAY,GACzB,IAAI,CA8RN"}
|
|
@@ -8,7 +8,6 @@ import { getConfig } from '../config.js';
|
|
|
8
8
|
import { calculateCost, formatCost } from '../cost.js';
|
|
9
9
|
import { ExtendedMessageSchema, ChatInputWithToolsSchema, ToolDefinitionSchema, ToolChoiceSchema, ThinkingSchema, } from '../schemas.js';
|
|
10
10
|
import { getErrorMessage, getTextContent } from '../types.js';
|
|
11
|
-
import { SessionStore } from '../session.js';
|
|
12
11
|
import { UsageTracker } from '../usage-tracker.js';
|
|
13
12
|
/** Maximum allowed message content length (from config) */
|
|
14
13
|
function validateMessageLength(input) {
|
|
@@ -20,7 +19,7 @@ function validateMessageLength(input) {
|
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
export function registerChatTool(server, client) {
|
|
22
|
+
export function registerChatTool(server, client, sessionStore) {
|
|
24
23
|
// Use config's defaultModel if it's a valid model name
|
|
25
24
|
const cfg = getConfig();
|
|
26
25
|
const modelDefault = cfg.defaultModel === 'deepseek-reasoner' ? 'deepseek-reasoner' : 'deepseek-chat';
|
|
@@ -129,7 +128,6 @@ export function registerChatTool(server, client) {
|
|
|
129
128
|
}
|
|
130
129
|
// Session management: build full message list
|
|
131
130
|
let allMessages = validated.messages;
|
|
132
|
-
const sessionStore = SessionStore.getInstance();
|
|
133
131
|
if (validated.session_id) {
|
|
134
132
|
// Create or get session
|
|
135
133
|
const session = sessionStore.create(validated.session_id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-chat.js","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GAEf,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"deepseek-chat.js","sourceRoot":"","sources":["../../src/tools/deepseek-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* Session management for multi-turn conversations
|
|
4
4
|
*/
|
|
5
5
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
-
|
|
6
|
+
import type { SessionStore } from '../session.js';
|
|
7
|
+
export declare function registerSessionsTool(server: McpServer, store: SessionStore): void;
|
|
7
8
|
//# sourceMappingURL=deepseek-sessions.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuGjF"}
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
* Session management for multi-turn conversations
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
-
import { SessionStore } from '../session.js';
|
|
7
6
|
import { getErrorMessage } from '../types.js';
|
|
8
|
-
export function registerSessionsTool(server) {
|
|
7
|
+
export function registerSessionsTool(server, store) {
|
|
9
8
|
server.registerTool('deepseek_sessions', {
|
|
10
9
|
title: 'DeepSeek Session Management',
|
|
11
10
|
description: 'Manage multi-turn conversation sessions. List active sessions, delete a specific session, or clear all sessions. ' +
|
|
@@ -21,7 +20,6 @@ export function registerSessionsTool(server) {
|
|
|
21
20
|
},
|
|
22
21
|
}, async (input) => {
|
|
23
22
|
try {
|
|
24
|
-
const store = SessionStore.getInstance();
|
|
25
23
|
switch (input.action) {
|
|
26
24
|
case 'list': {
|
|
27
25
|
const sessions = store.list();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-sessions.js","sourceRoot":"","sources":["../../src/tools/deepseek-sessions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"deepseek-sessions.js","sourceRoot":"","sources":["../../src/tools/deepseek-sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -4,5 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
6
|
import type { DeepSeekClient } from '../deepseek-client.js';
|
|
7
|
-
|
|
7
|
+
import type { SessionStore } from '../session.js';
|
|
8
|
+
export declare function registerAllTools(server: McpServer, client: DeepSeekClient, sessionStore: SessionStore): void;
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,YAAY,GACzB,IAAI,CAGN"}
|
package/dist/tools/index.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { registerChatTool } from './deepseek-chat.js';
|
|
6
6
|
import { registerSessionsTool } from './deepseek-sessions.js';
|
|
7
|
-
export function registerAllTools(server, client) {
|
|
8
|
-
registerChatTool(server, client);
|
|
9
|
-
registerSessionsTool(server);
|
|
7
|
+
export function registerAllTools(server, client, sessionStore) {
|
|
8
|
+
registerChatTool(server, client, sessionStore);
|
|
9
|
+
registerSessionsTool(server, sessionStore);
|
|
10
10
|
}
|
|
11
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,MAAsB,EACtB,YAA0B;IAE1B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/C,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/transport-http.d.ts
CHANGED
|
@@ -4,6 +4,19 @@
|
|
|
4
4
|
* Each MCP session gets its own McpServer instance; DeepSeekClient is shared.
|
|
5
5
|
*/
|
|
6
6
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
-
export
|
|
8
|
-
|
|
7
|
+
export interface HttpAppOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Hostname for DNS rebinding protection. Defaults to '127.0.0.1', which makes
|
|
10
|
+
* the SDK auto-enable host-header validation. Set to '0.0.0.0' only when the
|
|
11
|
+
* deployment is meant to be reachable from other hosts (e.g. inside a
|
|
12
|
+
* container) — pair it with authToken and/or allowedHosts.
|
|
13
|
+
*/
|
|
14
|
+
host?: string;
|
|
15
|
+
/** When set, '/mcp' requires `Authorization: Bearer <token>`. '/health' stays open. */
|
|
16
|
+
authToken?: string;
|
|
17
|
+
/** Explicit allowed Host headers — keeps DNS rebinding protection on when binding to 0.0.0.0. */
|
|
18
|
+
allowedHosts?: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function createHttpApp(serverFactory: () => McpServer, opts?: HttpAppOptions): import("express").Express;
|
|
21
|
+
export declare function startHttpTransport(serverFactory: () => McpServer, port: number, opts?: HttpAppOptions): Promise<void>;
|
|
9
22
|
//# sourceMappingURL=transport-http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-http.d.ts","sourceRoot":"","sources":["../src/transport-http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"transport-http.d.ts","sourceRoot":"","sources":["../src/transport-http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAUD,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,SAAS,EAAE,IAAI,GAAE,cAAmB,6BA0GtF;AAED,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,SAAS,EAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
package/dist/transport-http.js
CHANGED
|
@@ -6,11 +6,38 @@
|
|
|
6
6
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
7
7
|
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
|
|
8
8
|
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
-
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
10
10
|
import { version } from './server.js';
|
|
11
11
|
const transports = {};
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/** Constant-time string comparison to avoid leaking the token via response timing. */
|
|
13
|
+
function timingSafeStringEqual(a, b) {
|
|
14
|
+
const ab = Buffer.from(a);
|
|
15
|
+
const bb = Buffer.from(b);
|
|
16
|
+
if (ab.length !== bb.length)
|
|
17
|
+
return false;
|
|
18
|
+
return timingSafeEqual(ab, bb);
|
|
19
|
+
}
|
|
20
|
+
export function createHttpApp(serverFactory, opts = {}) {
|
|
21
|
+
const { host = '127.0.0.1', authToken, allowedHosts } = opts;
|
|
22
|
+
const app = createMcpExpressApp(allowedHosts ? { host, allowedHosts } : { host });
|
|
23
|
+
// Optional bearer-token auth guarding the MCP endpoint. Registered before the
|
|
24
|
+
// /mcp route handlers so it runs first. /health is intentionally left open so
|
|
25
|
+
// container/orchestrator health probes work without credentials.
|
|
26
|
+
if (authToken) {
|
|
27
|
+
const expected = `Bearer ${authToken}`;
|
|
28
|
+
app.use('/mcp', (req, res, next) => {
|
|
29
|
+
const provided = req.headers['authorization'];
|
|
30
|
+
if (typeof provided === 'string' && timingSafeStringEqual(provided, expected)) {
|
|
31
|
+
next();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
res.status(401).json({
|
|
35
|
+
jsonrpc: '2.0',
|
|
36
|
+
error: { code: -32001, message: 'Unauthorized: missing or invalid bearer token' },
|
|
37
|
+
id: null,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
14
41
|
// Health check endpoint
|
|
15
42
|
app.get('/health', (_req, res) => {
|
|
16
43
|
res.json({
|
|
@@ -88,12 +115,22 @@ export function createHttpApp(serverFactory) {
|
|
|
88
115
|
});
|
|
89
116
|
return app;
|
|
90
117
|
}
|
|
91
|
-
export async function startHttpTransport(serverFactory, port) {
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
console.error(`[DeepSeek MCP]
|
|
118
|
+
export async function startHttpTransport(serverFactory, port, opts = {}) {
|
|
119
|
+
const host = opts.host ?? '127.0.0.1';
|
|
120
|
+
const app = createHttpApp(serverFactory, opts);
|
|
121
|
+
const exposed = host === '0.0.0.0' || host === '::';
|
|
122
|
+
if (exposed && !opts.authToken) {
|
|
123
|
+
console.error(`[DeepSeek MCP] SECURITY WARNING: binding to ${host} with no HTTP_AUTH_TOKEN set. ` +
|
|
124
|
+
'The /mcp endpoint is unauthenticated and reachable from any network that can ' +
|
|
125
|
+
'reach this port, so anyone could invoke tools and spend your DEEPSEEK_API_KEY. ' +
|
|
126
|
+
'Set HTTP_AUTH_TOKEN, put an authenticating reverse proxy in front, or bind to ' +
|
|
127
|
+
'127.0.0.1 via HTTP_HOST.');
|
|
128
|
+
}
|
|
129
|
+
const httpServer = app.listen(port, host, () => {
|
|
130
|
+
console.error(`[DeepSeek MCP] HTTP transport listening on http://${host}:${port}`);
|
|
131
|
+
console.error(`[DeepSeek MCP] Health check: http://${host}:${port}/health`);
|
|
132
|
+
console.error(`[DeepSeek MCP] MCP endpoint: http://${host}:${port}/mcp`);
|
|
133
|
+
console.error(`[DeepSeek MCP] Bearer-token auth on /mcp: ${opts.authToken ? 'ENABLED' : 'disabled'}`);
|
|
97
134
|
});
|
|
98
135
|
const shutdown = async () => {
|
|
99
136
|
console.error('[DeepSeek MCP] Shutting down HTTP transport...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-http.js","sourceRoot":"","sources":["../src/transport-http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"transport-http.js","sourceRoot":"","sources":["../src/transport-http.ts"],"names":[],"mappings":"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"}
|
package/dist/usage-tracker.d.ts
CHANGED
|
@@ -12,12 +12,24 @@ export declare class UsageTracker {
|
|
|
12
12
|
private totalCost;
|
|
13
13
|
private cacheHitTokens;
|
|
14
14
|
private cacheMissTokens;
|
|
15
|
+
private sessionSource;
|
|
15
16
|
private constructor();
|
|
16
17
|
static getInstance(): UsageTracker;
|
|
17
18
|
/**
|
|
18
19
|
* Reset singleton (for testing)
|
|
19
20
|
*/
|
|
20
21
|
static resetInstance(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Wire up a callback that reports the current active session count.
|
|
24
|
+
* In STDIO mode this maps to the single shared SessionStore.
|
|
25
|
+
* In HTTP mode no source is set — each HTTP session owns its own store,
|
|
26
|
+
* so a process-wide count would be misleading and could leak tenant info.
|
|
27
|
+
*/
|
|
28
|
+
setSessionSource(fn: () => number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Clear the session source (used in tests or when swapping stores)
|
|
31
|
+
*/
|
|
32
|
+
clearSessionSource(): void;
|
|
21
33
|
/**
|
|
22
34
|
* Track a completed API request
|
|
23
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-tracker.d.ts","sourceRoot":"","sources":["../src/usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-tracker.d.ts","sourceRoot":"","sources":["../src/usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAA+B;IAEpD,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,YAAY,CACV,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC,EACD,IAAI,EAAE,MAAM,GACX,IAAI;IAeP;;OAEG;IACH,QAAQ,IAAI,UAAU;IAsBtB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAK3B"}
|
package/dist/usage-tracker.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Usage Tracker
|
|
3
3
|
* Singleton that tracks aggregated API usage statistics
|
|
4
4
|
*/
|
|
5
|
-
import { SessionStore } from './session.js';
|
|
6
5
|
export class UsageTracker {
|
|
7
6
|
static instance = null;
|
|
8
7
|
totalRequests = 0;
|
|
@@ -12,6 +11,7 @@ export class UsageTracker {
|
|
|
12
11
|
totalCost = 0;
|
|
13
12
|
cacheHitTokens = 0;
|
|
14
13
|
cacheMissTokens = 0;
|
|
14
|
+
sessionSource = null;
|
|
15
15
|
constructor() { }
|
|
16
16
|
static getInstance() {
|
|
17
17
|
if (!UsageTracker.instance) {
|
|
@@ -25,6 +25,21 @@ export class UsageTracker {
|
|
|
25
25
|
static resetInstance() {
|
|
26
26
|
UsageTracker.instance = null;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Wire up a callback that reports the current active session count.
|
|
30
|
+
* In STDIO mode this maps to the single shared SessionStore.
|
|
31
|
+
* In HTTP mode no source is set — each HTTP session owns its own store,
|
|
32
|
+
* so a process-wide count would be misleading and could leak tenant info.
|
|
33
|
+
*/
|
|
34
|
+
setSessionSource(fn) {
|
|
35
|
+
this.sessionSource = fn;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clear the session source (used in tests or when swapping stores)
|
|
39
|
+
*/
|
|
40
|
+
clearSessionSource() {
|
|
41
|
+
this.sessionSource = null;
|
|
42
|
+
}
|
|
28
43
|
/**
|
|
29
44
|
* Track a completed API request
|
|
30
45
|
*/
|
|
@@ -46,11 +61,13 @@ export class UsageTracker {
|
|
|
46
61
|
*/
|
|
47
62
|
getStats() {
|
|
48
63
|
let activeSessions = 0;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
if (this.sessionSource) {
|
|
65
|
+
try {
|
|
66
|
+
activeSessions = this.sessionSource();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// callback failed — fall through with 0
|
|
70
|
+
}
|
|
54
71
|
}
|
|
55
72
|
return {
|
|
56
73
|
totalRequests: this.totalRequests,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../src/usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../src/usage-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,YAAY;IACf,MAAM,CAAC,QAAQ,GAAwB,IAAI,CAAC;IAE5C,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,iBAAiB,GAAG,CAAC,CAAC;IACtB,qBAAqB,GAAG,CAAC,CAAC;IAC1B,SAAS,GAAG,CAAC,CAAC;IACd,cAAc,GAAG,CAAC,CAAC;IACnB,eAAe,GAAG,CAAC,CAAC;IACpB,aAAa,GAA0B,IAAI,CAAC;IAEpD,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QAClB,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,EAAgB;QAC/B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY,CACV,KAMC,EACD,IAAY;QAEZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,aAAa,CAAC;QAC9C,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC,iBAAiB,CAAC;QACtD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QAEvB,IAAI,KAAK,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,uBAAuB,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;QACzD,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IACrC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arikusi/deepseek-mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"mcpName": "io.github.arikusi/deepseek",
|
|
5
5
|
"description": "MCP Server for DeepSeek API integration - enables Claude Code to use DeepSeek Chat and Reasoner models",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"license": "MIT",
|
|
47
47
|
"repository": {
|
|
48
48
|
"type": "git",
|
|
49
|
-
"url": "
|
|
49
|
+
"url": "https://github.com/arikusi/deepseek-mcp-server"
|
|
50
50
|
},
|
|
51
51
|
"bugs": {
|
|
52
52
|
"url": "https://github.com/arikusi/deepseek-mcp-server/issues"
|
|
@@ -62,18 +62,18 @@
|
|
|
62
62
|
"CHANGELOG.md"
|
|
63
63
|
],
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
65
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
66
66
|
"openai": "^6.27.0",
|
|
67
67
|
"zod": "^4.3.6"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@types/express": "^5.0.6",
|
|
71
71
|
"@types/node": "^22.10.5",
|
|
72
|
-
"@vitest/coverage-v8": "^4.
|
|
72
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
73
73
|
"typescript": "^5.7.3",
|
|
74
|
-
"vitest": "^4.
|
|
74
|
+
"vitest": "^4.1.8"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|
|
77
|
-
"node": ">=
|
|
77
|
+
"node": ">=20.0.0"
|
|
78
78
|
}
|
|
79
79
|
}
|