@hanna84/mcp-writing 2.11.0 → 2.12.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 CHANGED
@@ -4,11 +4,31 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [v2.12.0](https://github.com/hannasdev/mcp-writing.git
8
+ /compare/v2.11.1...v2.12.0)
9
+
10
+ - feat(registry): publish mcp-writing to the MCP Registry [`#114`](https://github.com/hannasdev/mcp-writing.git
11
+ /pull/114)
12
+
13
+ #### [v2.11.1](https://github.com/hannasdev/mcp-writing.git
14
+ /compare/v2.11.0...v2.11.1)
15
+
16
+ > 27 April 2026
17
+
18
+ - docs(prd): structure OpenClaw availability rollout [`#113`](https://github.com/hannasdev/mcp-writing.git
19
+ /pull/113)
20
+ - Release 2.11.1 [`7e0bd45`](https://github.com/hannasdev/mcp-writing.git
21
+ /commit/7e0bd454b53f809dea6ef47729332bd44d6f8b5f)
22
+
7
23
  #### [v2.11.0](https://github.com/hannasdev/mcp-writing.git
8
24
  /compare/v2.10.6...v2.11.0)
9
25
 
26
+ > 27 April 2026
27
+
10
28
  - feat: add GitHub Pages marketing landing page [`#111`](https://github.com/hannasdev/mcp-writing.git
11
29
  /pull/111)
30
+ - Release 2.11.0 [`8b4f336`](https://github.com/hannasdev/mcp-writing.git
31
+ /commit/8b4f336e5608dd43e9ffe7a7d0ffc536271aac02)
12
32
 
13
33
  #### [v2.10.6](https://github.com/hannasdev/mcp-writing.git
14
34
  /compare/v2.10.5...v2.10.6)
package/README.md CHANGED
@@ -6,6 +6,16 @@ An MCP service for AI-assisted reasoning and editing on long-form fiction projec
6
6
 
7
7
  Designed to work with [OpenClaw](https://github.com/openclaw/openclaw) but compatible with any MCP-capable AI gateway.
8
8
 
9
+ ## Quick launch
10
+
11
+ For local stdio MCP clients, run the published package directly:
12
+
13
+ ```sh
14
+ WRITING_SYNC_DIR=/path/to/sync-dir DB_PATH=./writing.db npx -y @hanna84/mcp-writing
15
+ ```
16
+
17
+ The CLI wrapper defaults to stdio transport and adds the Node 22 SQLite flag automatically when needed.
18
+
9
19
  ## What it does
10
20
 
11
21
  Instead of feeding an entire manuscript to an AI and hoping it fits in the context window, `mcp-writing` builds a structured index from your scene files. The AI queries that index first — finding relevant characters, beats, and loglines — then loads only the specific prose it needs.
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from "node:child_process";
4
+ import path from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const indexPath = path.join(__dirname, "..", "index.js");
10
+ const nodeMajorVersion = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
11
+
12
+ if (!process.env.MCP_TRANSPORT) {
13
+ process.env.MCP_TRANSPORT = "stdio";
14
+ }
15
+
16
+ if (nodeMajorVersion < 23) {
17
+ const child = spawn(process.execPath, ["--experimental-sqlite", indexPath, ...process.argv.slice(2)], {
18
+ env: process.env,
19
+ stdio: "inherit",
20
+ });
21
+
22
+ child.on("error", (error) => {
23
+ process.stderr.write(`[mcp-writing] FATAL: failed to launch stdio server: ${error.message}\n`);
24
+ process.exit(1);
25
+ });
26
+
27
+ child.on("exit", (code, signal) => {
28
+ if (signal) {
29
+ process.kill(process.pid, signal);
30
+ return;
31
+ }
32
+ process.exit(code ?? 0);
33
+ });
34
+ } else {
35
+ await import(pathToFileURL(indexPath).href);
36
+ }
package/package.json CHANGED
@@ -1,11 +1,16 @@
1
1
  {
2
2
  "name": "@hanna84/mcp-writing",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "MCP service for AI-assisted reasoning and editing on long-form fiction projects",
5
5
  "homepage": "https://hannasdev.github.io/mcp-writing/",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
+ "bin": {
9
+ "mcp-writing": "./bin/mcp-writing.js"
10
+ },
11
+ "mcpName": "io.github.hannasdev/mcp-writing",
8
12
  "files": [
13
+ "bin/",
9
14
  "index.js",
10
15
  "async-jobs.js",
11
16
  "async-progress.js",
@@ -50,6 +55,7 @@
50
55
  "lint": "eslint *.js scripts/ tools/",
51
56
  "docs": "node scripts/generate-tool-docs.mjs",
52
57
  "lint:metadata": "node scripts/lint-metadata.mjs",
58
+ "sync:server-json-version": "node scripts/sync-server-json-version.mjs",
53
59
  "test:unit": "node --experimental-sqlite --test test/unit/*.test.mjs",
54
60
  "test:integration": "node --experimental-sqlite --test --test-concurrency=1 test/integration/*.test.mjs",
55
61
  "test": "npm run test:unit && npm run test:integration"
@@ -0,0 +1,26 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const ROOT = path.resolve(__dirname, "..");
8
+ const packageJsonPath = path.join(ROOT, "package.json");
9
+ const serverJsonPath = path.join(ROOT, "server.json");
10
+
11
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
12
+ const serverJson = JSON.parse(fs.readFileSync(serverJsonPath, "utf8"));
13
+ const requestedVersion = process.argv[2]?.trim();
14
+ const nextVersion = requestedVersion || packageJson.version;
15
+
16
+ if (!nextVersion) {
17
+ throw new Error("Unable to determine target version for server.json");
18
+ }
19
+
20
+ serverJson.version = nextVersion;
21
+ serverJson.packages = (serverJson.packages ?? []).map((pkg) => ({
22
+ ...pkg,
23
+ version: nextVersion,
24
+ }));
25
+
26
+ fs.writeFileSync(serverJsonPath, `${JSON.stringify(serverJson, null, 2)}\n`, "utf8");