@hiai-gg/docsmint 0.8.3 → 0.8.4

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 CHANGED
@@ -6,7 +6,7 @@ Write and organize notes, guides, and project documentation in one workspace.
6
6
  Find answers with search that understands related concepts, then give your
7
7
  agents access to the same documents through MCP, REST, the SDK, or CLI.
8
8
 
9
- **[Try managed DocsMint](https://docsmint.com)** to get started without
9
+ **[Connect DocsMint Cloud](https://docsmint.com/mcp/connect?source=github_mcp)** to get started without
10
10
  operating the stack, or **[self-host with Docker](#quickstart)** to run the
11
11
  Apache-2.0 application on your own infrastructure.
12
12
 
@@ -32,6 +32,32 @@ Apache-2.0 application on your own infrastructure.
32
32
 
33
33
  <img width="1920" height="974" alt="DocsMint installable document workspace" src="https://github.com/user-attachments/assets/94701d01-a361-4ca1-b16d-de2a0c64d684" />
34
34
 
35
+ ## Connect your AI agent
36
+
37
+ Connect DocsMint Cloud instantly or use your own self-hosted deployment. Search,
38
+ read, create, organize and update persistent knowledge through MCP with hybrid
39
+ retrieval, reranking and GraphRAG.
40
+
41
+ **Recommended: [DocsMint Cloud setup](https://docsmint.com/mcp/connect?source=github_mcp).**
42
+ No server installation is required. Sign up or log in, choose your workspace,
43
+ create an MCP/API credential in the authenticated browser UI, follow your client's
44
+ instructions, and verify the connection. Hosted MCP follows your plan and
45
+ workspace permissions. Prefer workspace-bound or category-scoped credentials.
46
+
47
+ The Cloud endpoint is `https://docsmint.com/mcp` (Streamable HTTP). OAuth-capable
48
+ clients discover authorization and open DocsMint login and consent in the browser.
49
+ Choose your workspace and explicit scopes; the authorization code uses PKCE S256.
50
+ Access tokens expire after one hour; reconnect through browser authorization when
51
+ they expire (no refresh tokens). API-key clients
52
+ send `Authorization: Bearer <key>`. Credentials cannot create or elevate other
53
+ credentials; lifecycle management belongs to the signed-in browser session.
54
+
55
+ **Self-hosted alternative:** run [DocsMint with Docker](#quickstart), create an API
56
+ key in its browser UI, and configure `HIAI_DOCS_URL` and `HIAI_DOCS_API_KEY` for
57
+ `npx --yes --package @hiai-gg/docsmint docsmint-mcp`. The npm package is a stdio
58
+ bridge to your running deployment, not a server installer. See the
59
+ [MCP guide](packages/mcp-server/README.md) for client configuration.
60
+
35
61
  ## Why DocsMint?
36
62
 
37
63
  - **Keep knowledge easy to edit.** Use a rich visual editor or Markdown;
@@ -47,25 +73,26 @@ Apache-2.0 application on your own infrastructure.
47
73
  - **Choose how you run it.** Use [managed DocsMint](https://docsmint.com) or
48
74
  self-host the application, database, search, queues, and files.
49
75
 
50
- ## What's new in 0.8.3?
76
+ ## What's new in 0.8.4?
51
77
 
52
- This maintenance release focuses on reliable saves and integrations:
78
+ MCP discovery now explains both supported deployment choices:
53
79
 
54
- - Pending editor saves stay attached to the document being edited, even when
55
- you switch documents.
56
- - Navigation waits for pending content saves; overlapping saves are serialized
57
- so an older request cannot overwrite a newer edit.
58
- - SDK document creation retries reuse an idempotency key to prevent duplicates
59
- after a lost response.
60
- - Workspace-wide tag management requires full write access; read-only and
61
- category-scoped credentials can no longer mutate the entire tag collection.
62
- - Partial category API-setting updates preserve omitted permissions.
63
- - Public workspace share links retain their workspace context when loading
64
- folders and documents.
80
+ - DocsMint Cloud is the recommended route for connecting without running a server.
81
+ - Self-hosted DocsMint remains the complete Apache-2.0 alternative with the same
82
+ npm/stdio bridge, tools, prompts, resources and public contracts.
83
+ - Registry, LobeHub and npm descriptions include hybrid search, reranking,
84
+ GraphRAG and scoped document access, with source-aware onboarding links.
85
+ - The MCP guide explains Cloud browser authorization for OAuth-capable clients,
86
+ existing API-key configuration and the separate self-hosted setup.
87
+ - Release checks now verify built public exports and MCP binaries before packaging.
88
+ - Authorization regression coverage includes mixed category scopes, external tenant
89
+ assertions, scoped attachment deletion, workspace tags and partial category updates.
90
+ - A deterministic offline retrieval baseline makes evaluation repeatable without
91
+ claiming a change to live retrieval quality.
65
92
 
66
- No schema migration is added. Existing public request and response shapes
67
- remain supported; the tag authorization fix intentionally rejects operations
68
- that exceeded the caller's permissions.
93
+ No database migration, tool redesign or SDK contract change is added. Hosted
94
+ OAuth is a DocsMint Cloud capability; this OSS release documents how to connect
95
+ and does not embed Cloud accounts, billing or analytics in self-hosted installs.
69
96
 
70
97
  Read the complete release history in the [changelog](CHANGELOG.md) or
71
98
  [GitHub Releases](https://github.com/HiAi-gg/docsmint/releases). See the
@@ -121,7 +148,7 @@ docker pull vgalibov/docsmint:web-latest
121
148
  docker pull vgalibov/docsmint:caddy-latest
122
149
  ```
123
150
 
124
- Use versioned tags `api-v0.8.3`, `web-v0.8.3`, and `caddy-v0.8.3` for
151
+ Use versioned tags `api-v0.8.4`, `web-v0.8.4`, and `caddy-v0.8.4` for
125
152
  reproducible deploys. The quickstart still builds the Compose stack from this repository so PostgreSQL,
126
153
  Redis, and SeaweedFS start together with the application.
127
154
 
@@ -227,7 +254,7 @@ Run the published stdio bridge against your own DocsMint API:
227
254
  "mcpServers": {
228
255
  "docsmint": {
229
256
  "command": "npx",
230
- "args": ["-y", "@hiai-gg/docsmint", "docsmint-mcp"],
257
+ "args": ["--yes", "--package", "@hiai-gg/docsmint", "docsmint-mcp"],
231
258
  "env": {
232
259
  "HIAI_DOCS_URL": "http://localhost:50700",
233
260
  "HIAI_DOCS_API_KEY": "your-global-or-category-key"
@@ -197081,6 +197081,9 @@ function canAccessContent(access, action) {
197081
197081
  function canManageCategories(access) {
197082
197082
  return !access.restricted && canAccessContent(access, "write");
197083
197083
  }
197084
+ function canManageWorkspaceTags(access) {
197085
+ return canManageCategories(access);
197086
+ }
197084
197087
  function isAuthorizedCategory(access, categoryId) {
197085
197088
  if (access.externalRole && !access.restricted)
197086
197089
  return true;
@@ -200601,26 +200604,8 @@ var authRoutes = new Elysia({ prefix: "/api/auth" }).all("/*", async ({ request,
200601
200604
  init_schema2();
200602
200605
  init_drizzle_orm();
200603
200606
  init_zod();
200604
- init_logger3();
200605
- var createCategorySchema = exports_external2.object({
200606
- name: exports_external2.string().trim().min(1).max(255),
200607
- apiMode: exports_external2.enum(["unavailable", "global", "category"]).optional(),
200608
- apiPermissionRead: exports_external2.boolean().optional(),
200609
- apiPermissionEdit: exports_external2.boolean().optional(),
200610
- apiPermissionWrite: exports_external2.boolean().optional()
200611
- });
200612
- var updateCategorySchema = exports_external2.object({
200613
- name: exports_external2.string().trim().min(1).max(255).optional(),
200614
- order: exports_external2.number().int().nonnegative().optional(),
200615
- apiMode: exports_external2.enum(["unavailable", "global", "category"]).optional(),
200616
- apiPermissionRead: exports_external2.boolean().optional(),
200617
- apiPermissionEdit: exports_external2.boolean().optional(),
200618
- apiPermissionWrite: exports_external2.boolean().optional()
200619
- });
200620
- var listQuerySchema = exports_external2.object({
200621
- page: exports_external2.coerce.number().int().min(1).default(1),
200622
- limit: exports_external2.coerce.number().int().min(1).max(100).default(20)
200623
- });
200607
+
200608
+ // ../../backend/src/lib/category-api-access.ts
200624
200609
  function normalizeApiMode(apiMode) {
200625
200610
  if (apiMode === "category")
200626
200611
  return "category";
@@ -200654,6 +200639,28 @@ function buildApiAccessValues(input) {
200654
200639
  apiPermissionWrite
200655
200640
  };
200656
200641
  }
200642
+
200643
+ // ../../backend/src/api/routes/categories.ts
200644
+ init_logger3();
200645
+ var createCategorySchema = exports_external2.object({
200646
+ name: exports_external2.string().trim().min(1).max(255),
200647
+ apiMode: exports_external2.enum(["unavailable", "global", "category"]).optional(),
200648
+ apiPermissionRead: exports_external2.boolean().optional(),
200649
+ apiPermissionEdit: exports_external2.boolean().optional(),
200650
+ apiPermissionWrite: exports_external2.boolean().optional()
200651
+ });
200652
+ var updateCategorySchema = exports_external2.object({
200653
+ name: exports_external2.string().trim().min(1).max(255).optional(),
200654
+ order: exports_external2.number().int().nonnegative().optional(),
200655
+ apiMode: exports_external2.enum(["unavailable", "global", "category"]).optional(),
200656
+ apiPermissionRead: exports_external2.boolean().optional(),
200657
+ apiPermissionEdit: exports_external2.boolean().optional(),
200658
+ apiPermissionWrite: exports_external2.boolean().optional()
200659
+ });
200660
+ var listQuerySchema = exports_external2.object({
200661
+ page: exports_external2.coerce.number().int().min(1).default(1),
200662
+ limit: exports_external2.coerce.number().int().min(1).max(100).default(20)
200663
+ });
200657
200664
  var categoryRoutes = new Elysia({ prefix: "/api" }).get("/categories", async ({ set: set2, request }) => {
200658
200665
  const access = await resolveContentAccess(request);
200659
200666
  const ctx = access.ctx;
@@ -235042,7 +235049,7 @@ var tagRoutes = new Elysia({ prefix: "/api" }).get("/tags", async ({ set: set2,
235042
235049
  set2.status = 401;
235043
235050
  return { error: "Unauthorized" };
235044
235051
  }
235045
- if (access.restricted || !canAccessContent(access, "write")) {
235052
+ if (!canManageWorkspaceTags(access)) {
235046
235053
  set2.status = 403;
235047
235054
  return { error: "Full workspace write access required" };
235048
235055
  }
@@ -235092,7 +235099,7 @@ var tagRoutes = new Elysia({ prefix: "/api" }).get("/tags", async ({ set: set2,
235092
235099
  set2.status = 401;
235093
235100
  return { error: "Unauthorized" };
235094
235101
  }
235095
- if (access.restricted || !canAccessContent(access, "write")) {
235102
+ if (!canManageWorkspaceTags(access)) {
235096
235103
  set2.status = 403;
235097
235104
  return { error: "Full workspace write access required" };
235098
235105
  }
@@ -235142,7 +235149,7 @@ var tagRoutes = new Elysia({ prefix: "/api" }).get("/tags", async ({ set: set2,
235142
235149
  set2.status = 401;
235143
235150
  return { error: "Unauthorized" };
235144
235151
  }
235145
- if (access.restricted || !canAccessContent(access, "write")) {
235152
+ if (!canManageWorkspaceTags(access)) {
235146
235153
  set2.status = 403;
235147
235154
  return { error: "Full workspace write access required" };
235148
235155
  }
@@ -238391,7 +238398,7 @@ var swaggerConfig = {
238391
238398
  },
238392
238399
  info: {
238393
238400
  title: "DocsMint API",
238394
- version: "0.8.3",
238401
+ version: "0.8.4",
238395
238402
  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.",
238396
238403
  contact: { name: "HiAi-gg", url: "https://github.com/HiAi-gg/docsmint" },
238397
238404
  license: {
package/dist/mcp-cli.js CHANGED
@@ -1052,7 +1052,7 @@ function registerDocsmintMcpCapabilities(server, client2) {
1052
1052
  registerExtendedCapabilities(server, client2, (handler11) => wrapHandler("extended", handler11));
1053
1053
  }
1054
1054
  function createDocsmintMcpServer(options = {}) {
1055
- const server = new McpServer({ name: "docsmint", version: "0.8.3" });
1055
+ const server = new McpServer({ name: "docsmint", version: "0.8.4" });
1056
1056
  const client2 = options.docsClient ? createMcpDocsClient(options.docsClient, options.requestContext) : options.client ?? createMcpDocsClient(createDefaultDocsClient(), options.requestContext);
1057
1057
  registerDocsmintMcpCapabilities(server, client2);
1058
1058
  return server;
@@ -1048,7 +1048,7 @@ function registerDocsmintMcpCapabilities(server, client2) {
1048
1048
  registerExtendedCapabilities(server, client2, (handler11) => wrapHandler("extended", handler11));
1049
1049
  }
1050
1050
  function createDocsmintMcpServer(options = {}) {
1051
- const server = new McpServer({ name: "docsmint", version: "0.8.3" });
1051
+ const server = new McpServer({ name: "docsmint", version: "0.8.4" });
1052
1052
  const client2 = options.docsClient ? createMcpDocsClient(options.docsClient, options.requestContext) : options.client ?? createMcpDocsClient(createDefaultDocsClient(), options.requestContext);
1053
1053
  registerDocsmintMcpCapabilities(server, client2);
1054
1054
  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.3",
4
+ "version": "0.8.4",
5
5
  "type": "module",
6
6
  "browser": {
7
7
  "./dist/backend-launcher.js": false,
@@ -15,12 +15,12 @@
15
15
  "./dist/backend-account-runtime-cleanup.js": false
16
16
  },
17
17
  "license": "Apache-2.0",
18
- "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.",
18
+ "description": "Managed or self-hosted knowledge workspace for AI agents with hybrid search, reranking, GraphRAG, and scoped document tools.",
19
19
  "repository": {
20
20
  "type": "git",
21
21
  "url": "https://github.com/HiAi-gg/docsmint"
22
22
  },
23
- "homepage": "https://github.com/hiai-gg/docsmint#readme",
23
+ "homepage": "https://docsmint.com/mcp/connect?source=npm_mcp",
24
24
  "bugs": {
25
25
  "url": "https://github.com/hiai-gg/docsmint/issues"
26
26
  },
@@ -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.3';
28
+ const VERSION = '0.8.4';
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
@@ -2,15 +2,15 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.HiAi-gg/docsmint",
4
4
  "title": "DocsMint",
5
- "description": "Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.",
6
- "websiteUrl": "https://docsmint.com/docs/mcp",
5
+ "description": "Cloud or self-hosted knowledge for AI agents: hybrid search, reranking, GraphRAG, scoped MCP tools.",
6
+ "websiteUrl": "https://docsmint.com/mcp/connect?source=mcp_registry",
7
7
  "repository": {
8
8
  "url": "https://github.com/HiAi-gg/docsmint",
9
9
  "source": "github",
10
10
  "id": "1249550690",
11
11
  "subfolder": "packages/mcp-server"
12
12
  },
13
- "version": "0.8.3",
13
+ "version": "0.8.4",
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.3",
33
+ "version": "0.8.4",
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 the DocsMint API.",
47
+ "description": "Base URL of your running self-hosted DocsMint API. For managed Cloud use https://docsmint.com/mcp.",
48
48
  "default": "http://localhost:50700"
49
49
  },
50
50
  {
51
51
  "name": "HIAI_DOCS_API_KEY",
52
- "description": "Workspace or category scoped DocsMint API key.",
52
+ "description": "Create an API key in your self-hosted DocsMint browser UI. 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": "Bearer DocsMint API key.",
66
+ "description": "DocsMint Cloud: no self-hosting required. OAuth-capable clients use browser authorization discovered at the hosted endpoint. API-key clients: sign up or log in at https://docsmint.com/mcp/connect?source=mcp_registry and create a workspace-bound or category-scoped MCP/API credential in the authenticated browser UI. Enter Bearer <key>. Credential management requires a browser session; MCP cannot create or elevate credentials. Self-hosted users should use the stdio package.",
67
67
  "isRequired": true,
68
68
  "isSecret": true
69
69
  },
@@ -81,7 +81,7 @@
81
81
  "license": "Apache-2.0",
82
82
  "licenseUrl": "https://www.apache.org/licenses/LICENSE-2.0",
83
83
  "licenseFile": "https://github.com/HiAi-gg/docsmint/blob/main/LICENSE",
84
- "documentationUrl": "https://docsmint.com/docs/mcp",
84
+ "documentationUrl": "https://docsmint.com/mcp/connect?source=mcp_registry",
85
85
  "catalog": {
86
86
  "tools": 17,
87
87
  "prompts": 2,