@hiai-gg/docsmint 0.8.7 → 0.8.8
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/README.md +23 -20
- package/dist/backend/index.js +49 -46
- package/dist/mcp-cli.js +1 -1
- package/dist/mcp-server.js +1 -1
- package/package.json +2 -2
- package/packages/cli/src/index.ts +1 -1
- package/server.json +6 -6
package/README.md
CHANGED
|
@@ -42,17 +42,21 @@ instructions, and verify the connection. Hosted MCP follows your plan and
|
|
|
42
42
|
workspace permissions. Prefer workspace-bound or category-scoped credentials.
|
|
43
43
|
|
|
44
44
|
The Cloud endpoint is `https://docsmint.com/mcp` (Streamable HTTP). OAuth-capable
|
|
45
|
-
clients discover
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
clients discover the hosted resource and authorization-server metadata; the current
|
|
46
|
+
authorization metadata advertises client registration at
|
|
47
|
+
`https://docsmint.com/oauth/register` (DCR). The hosted flow uses authorization-code
|
|
48
|
+
PKCE S256; metadata advertises only the `authorization_code` grant and no token
|
|
49
|
+
endpoint client authentication. CIMD is not part of the current contract. Browser consent binds the
|
|
50
|
+
one-hour opaque access token to the selected workspace, optional category, and
|
|
51
|
+
requested scopes. Refresh tokens are not issued. API-key clients can instead send
|
|
52
|
+
`Authorization: Bearer <key>` with an MCP/API credential created in the authenticated
|
|
53
|
+
browser UI. Credentials cannot create or elevate other credentials; lifecycle
|
|
54
|
+
management belongs to the signed-in browser session.
|
|
51
55
|
|
|
52
56
|
**Self-hosted alternative:** run [DocsMint with Docker](#quickstart), create an API
|
|
53
57
|
key in its browser UI, and configure `HIAI_DOCS_URL` and `HIAI_DOCS_API_KEY` for
|
|
54
58
|
`npx --yes --package @hiai-gg/docsmint docsmint-mcp`. The npm package is a stdio
|
|
55
|
-
bridge to your
|
|
59
|
+
bridge to your own API, not a server installer or hosted OAuth server. See the
|
|
56
60
|
[MCP guide](https://github.com/HiAi-gg/docsmint/blob/main/packages/mcp-server/README.md) for client configuration.
|
|
57
61
|
|
|
58
62
|
## Why DocsMint?
|
|
@@ -70,20 +74,19 @@ bridge to your running deployment, not a server installer. See the
|
|
|
70
74
|
- **Choose how you run it.** Use [managed DocsMint](https://docsmint.com) or
|
|
71
75
|
self-host the application, database, search, queues, and files.
|
|
72
76
|
|
|
73
|
-
## What's new in 0.8.
|
|
77
|
+
## What's new in 0.8.8?
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
- Clarify that hosted MCP authorization belongs to DocsMint Cloud and that the
|
|
80
|
+
stdio bridge uses an API key to connect to your own DocsMint API.
|
|
81
|
+
- Synchronize MCP Registry and LobeHub descriptions with the current Cloud
|
|
82
|
+
authorization contract and the self-hosted boundary.
|
|
83
|
+
- Keep the published catalog aligned with the implementation: 21 tools,
|
|
84
|
+
2 prompts, and 3 resources, with regression checks for route and metadata drift.
|
|
85
|
+
- Update vulnerability reporting details and clarify that OAuth protocol flaws
|
|
86
|
+
remain in scope for the product where they occur.
|
|
76
87
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
- Discover clearer tool descriptions, parameter guidance, and destructive-operation annotations.
|
|
80
|
-
- Apply GraphRAG query text and related-document result limits consistently.
|
|
81
|
-
|
|
82
|
-
The MCP surface grows additively from 17 to 21 tools. Existing tool names remain
|
|
83
|
-
available. No database migration is required. Hosted clients receive these tools
|
|
84
|
-
when their DocsMint host adopts this release.
|
|
85
|
-
|
|
86
|
-
Read the [release notes](https://github.com/HiAi-gg/docsmint/releases/tag/v0.8.7)
|
|
88
|
+
No MCP capabilities, existing integrations, or database schema change in this
|
|
89
|
+
release. See the [release notes](https://github.com/HiAi-gg/docsmint/releases/tag/v0.8.8)
|
|
87
90
|
and [changelog](https://github.com/HiAi-gg/docsmint/blob/main/CHANGELOG.md).
|
|
88
91
|
|
|
89
92
|
## Install with an AI agent
|
|
@@ -136,7 +139,7 @@ docker pull vgalibov/docsmint:web-latest
|
|
|
136
139
|
docker pull vgalibov/docsmint:caddy-latest
|
|
137
140
|
```
|
|
138
141
|
|
|
139
|
-
Use versioned tags `api-v0.8.
|
|
142
|
+
Use versioned tags `api-v0.8.8`, `web-v0.8.8`, and `caddy-v0.8.8` for
|
|
140
143
|
reproducible deploys. Caddy is the supporting reverse proxy with rate limiting;
|
|
141
144
|
it is separate from the API and web application. The quickstart still builds the Compose stack from this repository so PostgreSQL,
|
|
142
145
|
Redis, and SeaweedFS start together with the application.
|
package/dist/backend/index.js
CHANGED
|
@@ -232059,50 +232059,6 @@ function stripQuotes2(value) {
|
|
|
232059
232059
|
return trimmed;
|
|
232060
232060
|
}
|
|
232061
232061
|
|
|
232062
|
-
// ../../backend/src/api/routes/health.ts
|
|
232063
|
-
function createHealthRoutes(dependencies) {
|
|
232064
|
-
return new Elysia().get("/api/health", async ({ request, set: set2 }) => {
|
|
232065
|
-
const ip = request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? request.headers.get("x-real-ip") ?? "unknown";
|
|
232066
|
-
const rateLimit = await dependencies.rateLimiter(ip, request);
|
|
232067
|
-
set2.headers = {
|
|
232068
|
-
"X-RateLimit-Remaining": String(rateLimit.remaining),
|
|
232069
|
-
...rateLimit.retryAfter ? { "Retry-After": String(rateLimit.retryAfter) } : {}
|
|
232070
|
-
};
|
|
232071
|
-
if (!rateLimit.allowed) {
|
|
232072
|
-
set2.status = 429;
|
|
232073
|
-
return { error: "Too many requests" };
|
|
232074
|
-
}
|
|
232075
|
-
const [databaseAvailable, redisAvailable, storageAvailable] = await Promise.all([
|
|
232076
|
-
dependencies.databaseAvailable(),
|
|
232077
|
-
dependencies.redisAvailable(),
|
|
232078
|
-
dependencies.storageAvailable()
|
|
232079
|
-
]);
|
|
232080
|
-
const queueAvailable = dependencies.queueAvailable();
|
|
232081
|
-
const readiness = evaluatePipelineHealth({
|
|
232082
|
-
databaseAvailable,
|
|
232083
|
-
redisAvailable,
|
|
232084
|
-
storageAvailable,
|
|
232085
|
-
queueAvailable,
|
|
232086
|
-
recoveryAvailable: true,
|
|
232087
|
-
oldestInteractiveWaitMs: 0,
|
|
232088
|
-
interactiveSloMs: Number.POSITIVE_INFINITY,
|
|
232089
|
-
graphAvailable: true
|
|
232090
|
-
});
|
|
232091
|
-
if (readiness.status === "unhealthy")
|
|
232092
|
-
set2.status = 503;
|
|
232093
|
-
return {
|
|
232094
|
-
status: readiness.status === "unhealthy" ? "unhealthy" : "ok",
|
|
232095
|
-
service: "docsmint",
|
|
232096
|
-
timestamp: new Date().toISOString(),
|
|
232097
|
-
database: databaseAvailable ? "ok" : "error",
|
|
232098
|
-
redis: redisAvailable ? "ok" : "error",
|
|
232099
|
-
storage: storageAvailable ? "ok" : "error",
|
|
232100
|
-
queue: queueAvailable ? "ok" : "error",
|
|
232101
|
-
...readiness.reasons.length ? { reasons: readiness.reasons } : {}
|
|
232102
|
-
};
|
|
232103
|
-
});
|
|
232104
|
-
}
|
|
232105
|
-
|
|
232106
232062
|
// ../../backend/src/api/routes/keys.ts
|
|
232107
232063
|
init_schema2();
|
|
232108
232064
|
init_drizzle_orm();
|
|
@@ -235959,6 +235915,53 @@ var webhookRoutes = new Elysia({ prefix: "/api/webhooks" }).post("/storage", asy
|
|
|
235959
235915
|
return { received: true };
|
|
235960
235916
|
});
|
|
235961
235917
|
|
|
235918
|
+
// ../../backend/src/api/register-routes.ts
|
|
235919
|
+
var selfHostedApiRoutes = new Elysia().use(authRoutes).use(tagRoutes).use(categoryRoutes).use(attachmentRoutes).use(shareRoutes).use(searchRoutes).use(documentRoutes).use(folderRoutes).use(versionRoutes).use(webhookRoutes).use(collaborationRoutes).use(graphRoutes).use(keysRoutes).use(pluginsRoutes).use(visibilityRoutes).use(adminRoutes).use(metricsRoutes);
|
|
235920
|
+
|
|
235921
|
+
// ../../backend/src/api/routes/health.ts
|
|
235922
|
+
function createHealthRoutes(dependencies) {
|
|
235923
|
+
return new Elysia().get("/api/health", async ({ request, set: set2 }) => {
|
|
235924
|
+
const ip = request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? request.headers.get("x-real-ip") ?? "unknown";
|
|
235925
|
+
const rateLimit = await dependencies.rateLimiter(ip, request);
|
|
235926
|
+
set2.headers = {
|
|
235927
|
+
"X-RateLimit-Remaining": String(rateLimit.remaining),
|
|
235928
|
+
...rateLimit.retryAfter ? { "Retry-After": String(rateLimit.retryAfter) } : {}
|
|
235929
|
+
};
|
|
235930
|
+
if (!rateLimit.allowed) {
|
|
235931
|
+
set2.status = 429;
|
|
235932
|
+
return { error: "Too many requests" };
|
|
235933
|
+
}
|
|
235934
|
+
const [databaseAvailable, redisAvailable, storageAvailable] = await Promise.all([
|
|
235935
|
+
dependencies.databaseAvailable(),
|
|
235936
|
+
dependencies.redisAvailable(),
|
|
235937
|
+
dependencies.storageAvailable()
|
|
235938
|
+
]);
|
|
235939
|
+
const queueAvailable = dependencies.queueAvailable();
|
|
235940
|
+
const readiness = evaluatePipelineHealth({
|
|
235941
|
+
databaseAvailable,
|
|
235942
|
+
redisAvailable,
|
|
235943
|
+
storageAvailable,
|
|
235944
|
+
queueAvailable,
|
|
235945
|
+
recoveryAvailable: true,
|
|
235946
|
+
oldestInteractiveWaitMs: 0,
|
|
235947
|
+
interactiveSloMs: Number.POSITIVE_INFINITY,
|
|
235948
|
+
graphAvailable: true
|
|
235949
|
+
});
|
|
235950
|
+
if (readiness.status === "unhealthy")
|
|
235951
|
+
set2.status = 503;
|
|
235952
|
+
return {
|
|
235953
|
+
status: readiness.status === "unhealthy" ? "unhealthy" : "ok",
|
|
235954
|
+
service: "docsmint",
|
|
235955
|
+
timestamp: new Date().toISOString(),
|
|
235956
|
+
database: databaseAvailable ? "ok" : "error",
|
|
235957
|
+
redis: redisAvailable ? "ok" : "error",
|
|
235958
|
+
storage: storageAvailable ? "ok" : "error",
|
|
235959
|
+
queue: queueAvailable ? "ok" : "error",
|
|
235960
|
+
...readiness.reasons.length ? { reasons: readiness.reasons } : {}
|
|
235961
|
+
};
|
|
235962
|
+
});
|
|
235963
|
+
}
|
|
235964
|
+
|
|
235962
235965
|
// ../../backend/src/lib/api-key-owner.ts
|
|
235963
235966
|
init_schema2();
|
|
235964
235967
|
init_config();
|
|
@@ -238422,7 +238425,7 @@ var swaggerConfig = {
|
|
|
238422
238425
|
},
|
|
238423
238426
|
info: {
|
|
238424
238427
|
title: "DocsMint API",
|
|
238425
|
-
version: "0.8.
|
|
238428
|
+
version: "0.8.8",
|
|
238426
238429
|
description: "Self-hosted AI-native knowledge workspace and installable PWA with hybrid search, GraphRAG, REST, SDK, CLI, and MCP access for people and AI agents.",
|
|
238427
238430
|
contact: { name: "HiAi-gg", url: "https://github.com/HiAi-gg/docsmint" },
|
|
238428
238431
|
license: {
|
|
@@ -238476,7 +238479,7 @@ var app = new Elysia().use(bodySizeLimit).onError(({ error: error53, set: set2 }
|
|
|
238476
238479
|
redisAvailable: () => redis.ping().then(() => true, () => false),
|
|
238477
238480
|
storageAvailable: () => storage.send(new ListBucketsCommand({})).then(() => true, () => false),
|
|
238478
238481
|
queueAvailable: () => pipelineRuntime.workers.size === PIPELINE_STAGES.length && [...pipelineRuntime.workers.values()].every((worker2) => worker2.isRunning?.() === true)
|
|
238479
|
-
})).use(csrfMiddleware).use(authMiddleware).use(
|
|
238482
|
+
})).use(csrfMiddleware).use(authMiddleware).use(selfHostedApiRoutes);
|
|
238480
238483
|
app.listen({
|
|
238481
238484
|
port: config3.API_PORT,
|
|
238482
238485
|
development: config3.NODE_ENV !== "production",
|
package/dist/mcp-cli.js
CHANGED
|
@@ -1097,7 +1097,7 @@ function registerDocsmintMcpCapabilities(server, client2) {
|
|
|
1097
1097
|
registerLifecycleCapabilities(server, client2, (handler11) => wrapHandler("lifecycle", handler11));
|
|
1098
1098
|
}
|
|
1099
1099
|
function createDocsmintMcpServer(options = {}) {
|
|
1100
|
-
const server = new McpServer({ name: "docsmint", version: "0.8.
|
|
1100
|
+
const server = new McpServer({ name: "docsmint", version: "0.8.8" });
|
|
1101
1101
|
const client2 = options.docsClient ? createMcpDocsClient(options.docsClient, options.requestContext) : options.client ?? createMcpDocsClient(createDefaultDocsClient(), options.requestContext);
|
|
1102
1102
|
registerDocsmintMcpCapabilities(server, client2);
|
|
1103
1103
|
return server;
|
package/dist/mcp-server.js
CHANGED
|
@@ -1093,7 +1093,7 @@ function registerDocsmintMcpCapabilities(server, client2) {
|
|
|
1093
1093
|
registerLifecycleCapabilities(server, client2, (handler11) => wrapHandler("lifecycle", handler11));
|
|
1094
1094
|
}
|
|
1095
1095
|
function createDocsmintMcpServer(options = {}) {
|
|
1096
|
-
const server = new McpServer({ name: "docsmint", version: "0.8.
|
|
1096
|
+
const server = new McpServer({ name: "docsmint", version: "0.8.8" });
|
|
1097
1097
|
const client2 = options.docsClient ? createMcpDocsClient(options.docsClient, options.requestContext) : options.client ?? createMcpDocsClient(createDefaultDocsClient(), options.requestContext);
|
|
1098
1098
|
registerDocsmintMcpCapabilities(server, client2);
|
|
1099
1099
|
return server;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hiai-gg/docsmint",
|
|
3
3
|
"mcpName": "io.github.HiAi-gg/docsmint",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.8",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"browser": {
|
|
7
7
|
"./dist/backend-launcher.js": false,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"./dist/backend-account-runtime-cleanup.js": false
|
|
16
16
|
},
|
|
17
17
|
"license": "Apache-2.0",
|
|
18
|
-
"description": "
|
|
18
|
+
"description": "DocsMint SDK and CLI plus a self-hosted MCP stdio bridge that uses your API key. For DocsMint Cloud MCP, connect to https://docsmint.com/mcp.",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
21
|
"url": "https://github.com/HiAi-gg/docsmint"
|
|
@@ -25,7 +25,7 @@ import { registerSearch } from './commands/search.js';
|
|
|
25
25
|
import { registerSnapshot } from './commands/snapshot.js';
|
|
26
26
|
import { registerUpdate } from './commands/update.js';
|
|
27
27
|
|
|
28
|
-
const VERSION = '0.8.
|
|
28
|
+
const VERSION = '0.8.8';
|
|
29
29
|
|
|
30
30
|
const program = new Command();
|
|
31
31
|
program.name('docsmint').description('CLI for the DocsMint knowledge workspace').version(VERSION);
|
package/server.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"id": "1249550690",
|
|
11
11
|
"subfolder": "packages/mcp-server"
|
|
12
12
|
},
|
|
13
|
-
"version": "0.8.
|
|
13
|
+
"version": "0.8.8",
|
|
14
14
|
"icons": [
|
|
15
15
|
{
|
|
16
16
|
"src": "https://raw.githubusercontent.com/HiAi-gg/docsmint/main/frontend/static/logo-dark.png",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"registryType": "npm",
|
|
31
31
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
32
32
|
"identifier": "@hiai-gg/docsmint",
|
|
33
|
-
"version": "0.8.
|
|
33
|
+
"version": "0.8.8",
|
|
34
34
|
"runtimeHint": "npx",
|
|
35
35
|
"transport": {
|
|
36
36
|
"type": "stdio"
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"environmentVariables": [
|
|
45
45
|
{
|
|
46
46
|
"name": "HIAI_DOCS_URL",
|
|
47
|
-
"description": "Base URL of your running self-hosted DocsMint API. For
|
|
47
|
+
"description": "Base URL of your running self-hosted DocsMint REST API, for example http://localhost:50700. For Cloud MCP, use the Streamable HTTP remote below.",
|
|
48
48
|
"default": "http://localhost:50700"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"name": "HIAI_DOCS_API_KEY",
|
|
52
|
-
"description": "Create an API key in your self-hosted DocsMint browser UI. Prefer workspace-bound or category-scoped credentials.",
|
|
52
|
+
"description": "Create an API key in your self-hosted DocsMint browser UI. The stdio bridge uses it only with your own API; it does not install the Cloud OAuth server. Prefer workspace-bound or category-scoped credentials.",
|
|
53
53
|
"isRequired": true,
|
|
54
54
|
"isSecret": true
|
|
55
55
|
}
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"headers": [
|
|
64
64
|
{
|
|
65
65
|
"name": "Authorization",
|
|
66
|
-
"description": "DocsMint Cloud
|
|
66
|
+
"description": "DocsMint Cloud remote at https://docsmint.com/mcp; no self-hosted server is required. Discovery advertises /oauth/authorize, /oauth/token, and active DCR at https://docsmint.com/oauth/register. Metadata supports the code response type, authorization_code grant only, no token-endpoint client authentication, and PKCE S256; CIMD is not part of the contract. Access tokens last one hour, have no refresh token, and are bound by browser consent to a workspace, optional category, and requested scopes. API-key clients can use Authorization: Bearer <key> with a workspace-bound or category-scoped credential created at https://docsmint.com/mcp/connect?source=mcp_registry. Credential management requires a browser session. For self-hosting, use the stdio package with your own API and API key; it does not install the Cloud OAuth server.",
|
|
67
67
|
"isRequired": true,
|
|
68
68
|
"isSecret": true
|
|
69
69
|
},
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"licenseFile": "https://github.com/HiAi-gg/docsmint/blob/main/LICENSE",
|
|
84
84
|
"documentationUrl": "https://docsmint.com/mcp/connect?source=mcp_registry",
|
|
85
85
|
"catalog": {
|
|
86
|
-
"tools":
|
|
86
|
+
"tools": 21,
|
|
87
87
|
"prompts": 2,
|
|
88
88
|
"resources": 3
|
|
89
89
|
}
|