@ainecto/mcp 0.2.0 → 0.5.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/README.md CHANGED
@@ -1,160 +1,320 @@
1
- # @ai-erd/mcp
1
+ # ainecto — AiNecto CLI and MCP connector
2
+
3
+ Published as `ainecto`, `@ainecto/mcp` and `@ainecto/cli` — the same code. Command: `ainecto`.
4
+ The older names (`ai-erd`, `@ai-erd/mcp`, `@ai-erd/cli`, command `ai-erd`) still get the same code and
5
+ still work.
6
+
7
+ **In a terminal, from your repository root:** `npx -y ainecto@latest init` — it asks which role this
8
+ repository's AI sessions should have and which AiNecto project to use, and signs you in through the
9
+ browser if needed.
10
+
11
+ ## For AI agents
12
+
13
+ **Ask the user which role this repository's AI sessions should have — Design, Development, Test, or Validation. Never pick one yourself. Then, from the repository root: `npx -y ainecto@latest init --role <role>` (it signs the user in through the browser if needed).**
14
+
15
+ - Use a long command timeout (at least 6 minutes): sign-in waits up to 5 minutes for the user.
16
+ - If `init` lists projects, ask the user which one and re-run with `--project <uuid>`. If it says
17
+ this is not the repository root, re-run from the folder it names.
18
+ - **No restart is needed.** Right after `init`, keep working in the same session through the CLI:
19
+ `ainecto` commands run from the repository read its role on every call (read `.ainecto/HARNESS.md`,
20
+ then `ainecto tools list` and `ainecto tools call <tool> '<json>'`). Do not use MCP tools the session
21
+ started with for that work — they keep the role (or no role) the session started with.
22
+ - A new session is optional and only adds the role's MCP tools (Claude Code: exit, then `claude -c`
23
+ in this folder to keep the conversation; approve the `ainecto` server from `.mcp.json` when asked).
24
+ Codex: save the profile `init` prints and start with `codex -p <role>`.
25
+ - **A server added during a session is not available in that session.** In our test, a server added
26
+ with `claude mcp add` while Claude Code was running did not attach to the running session — that is
27
+ why the CLI is the way to keep going. `/mcp` shows what the current session actually loaded.
28
+ - Inside the repository, `ainecto` commands (`ainecto tools call …`) use the repository's role
29
+ automatically — do not pass `--role`; a different `--role` is refused.
30
+ - Claude Code's auto mode may block running an external package with `npx`. If it does, ask the user
31
+ to allow the command.
32
+
33
+ To connect AiNecto without a repository role (for example before `init`), add the remote server at
34
+ **user scope** under the name `ainecto` — a local-scope entry would hide the `.mcp.json` that `init`
35
+ writes, and a different name would sit next to it as a second server with no role:
2
36
 
3
- AI-ERD MCP connector and first-party CLI.
37
+ ```bash
38
+ claude mcp add --scope user --transport http ainecto https://ainecto.com/mcp # Claude Code
39
+ codex mcp add ainecto --url https://ainecto.com/mcp # Codex
40
+ ```
41
+
42
+ The client signs the user in on first use. That session has no role until `init` runs and a new
43
+ session starts.
44
+
45
+ ## Upgrading from ai-erd (0.4.x)
4
46
 
5
- This package exposes two entry points:
47
+ Version 0.5.0 renamed what `init` writes into a repository. A repository set up by 0.4.x keeps
48
+ working: the CLI reads the `ai-erd` server entry, the `.ai-erd/` folder, the `<!-- ai-erd:begin -->`
49
+ block and `AI_ERD_ROLE` as its own. Running `npx -y ainecto@latest init` again moves them to the new
50
+ names — nothing is left behind twice:
6
51
 
7
- - `npx -y @ai-erd/mcp` or `ainecto mcp`: raw stdio-to-HTTP JSON-RPC proxy for AI-ERD MCP.
8
- - `ainecto <command>`: human CLI for auth and low-level tool calls.
52
+ | 0.4.x | 0.5.0 |
53
+ | --- | --- |
54
+ | server entry `"ai-erd"` (`npx -y @ai-erd/mcp --role …`) | `"ainecto"` (`npx -y @ainecto/mcp --role …`) — the old entry is replaced |
55
+ | folder `.ai-erd/` (`HARNESS.md`, `config.json`, `init-record.json`) | `.ainecto/` — moved, and the old folder removed if 0.4.x created it |
56
+ | block `<!-- ai-erd:begin -->` … `<!-- ai-erd:end -->` | `<!-- ainecto:begin -->` … — replaced in place |
57
+ | `AI_ERD_ROLE` | `AINECTO_ROLE` — both are read; when both are set, `AINECTO_ROLE` wins |
9
58
 
10
- Phase 1 keeps the connector as a raw proxy. File, stdin, and inline JSON parsing are only available in first-party CLI commands.
59
+ `ainecto init --undo` still puts back what was there before the 0.4.x `init`, with or without that
60
+ second `init`. Not renamed: the role header and OAuth scope the server reads, and the sign-in on
61
+ this machine.
11
62
 
12
- ## Local Setup
63
+ - If you added AiNecto earlier as `ai-erd` at Claude Code **user** scope or in Codex, remove it
64
+ (`claude mcp remove ai-erd -s user`, `codex mcp remove ai-erd`) and add it as `ainecto` as above:
65
+ under a different name it no longer hides behind the repository's entry.
66
+ - Claude Code shows the tools as `mcp__ainecto__…` instead of `mcp__ai-erd__…` — update any allow
67
+ list that names the old prefix.
68
+ - An `ai-erd` 0.4.x installed globally does not know the new names: inside a repository set up by
69
+ 0.5.0 it finds no role (so no restriction), and running its `init` there adds a second entry, block
70
+ and folder. Update it (`npm install -g ai-erd@latest` gets this same code). If that already
71
+ happened, 0.5.0 stops and says how to undo it (`npx -y -p @ai-erd/mcp@0.4.6 ai-erd init --undo`).
72
+
73
+ ## Set up a repository (roles)
13
74
 
14
75
  ```bash
15
- npm install
16
- npm run typecheck
17
- npm test
18
- npm run build
19
- npm link
76
+ npx -y ainecto@latest init # in a terminal: asks for the role and the project
77
+ npx -y ainecto@latest init --role development # agents, scripts, CI: nothing is asked
20
78
  ```
21
79
 
80
+ In a terminal (stdin and stdout both a TTY, no `--json`, and not under an agent or CI — `CLAUDECODE`,
81
+ `CI`, `GEMINI_CLI`, `CODEX_SANDBOX`, `CURSOR_AGENT`) `init` asks for what was not given:
82
+ - the role, unless `--role` or `AINECTO_ROLE` is set — by number, with no default. The role already
83
+ set on the repository is the default only when there is one (if its agent configs disagree, there
84
+ is no default);
85
+ - the project, unless `--project` is set — by number; «Create a new project» is offered to Design only.
86
+
87
+ Ctrl+C or Ctrl+D at a question cancels without writing repository files (Ctrl+D exits with 130). A
88
+ sign-in you already completed stays saved, and choosing «Create a new project» creates it right away.
89
+ Anywhere else (an agent's shell, CI) it asks nothing. In both cases:
90
+
91
+ - If this machine is not signed in to AiNecto yet, `init` opens a browser and continues once the user
92
+ approves — **once per machine** (per server), not per role. The sign-in URL is printed first (with
93
+ `--json`, as one JSON line on stderr: `{"event":"login_url","url":…}`), and sign-in gives up after
94
+ 5 minutes. It fails at once
95
+ when the command that opens the browser is missing, or (except on Windows, where the exit code is
96
+ not reliable) exits with an error.
97
+ - Outside a terminal, with no `--role`/`AINECTO_ROLE` it uses the role already set on the repository.
98
+ If there is none (or the repository's agent configs disagree) it stops and says to ask the user —
99
+ it never picks a role for you. If the account has more than one project it lists them and stops;
100
+ re-run with `--project <uuid>`. With no project yet,
101
+ only a Design session can create one (`--yes`, optionally `--project-name <name>`); in any other
102
+ role it asks you to have the user create the project, then re-run with the same role.
103
+ - It stops when run from a sub-folder of a git repository, and tells you the root.
104
+ - It writes one `ainecto` server entry carrying `--role` into `.mcp.json` (Claude Code) and
105
+ `.cursor/mcp.json` (Cursor), and prints the Codex profile to use (`codex -p <role>`).
106
+ - `ainecto` commands in the repository use the new role **at once**; MCP tools pick it up in a **new
107
+ session** (a running session's MCP tools keep the role they started with). Roles are a working
108
+ guardrail, not a security boundary.
109
+ - `ainecto init --dry-run` shows what would change (it does not sign in or refresh a sign-in);
110
+ `ainecto init --undo` removes what it wrote.
111
+
22
112
  ## Commands
23
113
 
114
+ Prefer `npx -y ainecto@latest <command>`. To install once instead, use `npm install -g ainecto` — but
115
+ install only **one** of `ainecto`, `@ainecto/mcp`, `@ainecto/cli`, `ai-erd`, `@ai-erd/mcp` and
116
+ `@ai-erd/cli` globally: they are the same code and ship the same commands, so a second global install
117
+ conflicts. (`ainecto` and `ai-erd` carry both commands, `ainecto` and `ai-erd`; `@ainecto/cli` carries
118
+ only `ainecto`, `@ai-erd/cli` only `ai-erd`.)
119
+
24
120
  ```bash
25
- ainecto auth login --env dev
26
- ainecto auth status --env dev
27
- ainecto auth logout --env dev
28
-
29
- ainecto tools list --env dev
30
- ainecto tools call mcp__ainecto__list_projects --env dev --json
31
- ainecto tools call mcp__ainecto__erd_apply_changes -f changes.json --json
32
- cat payload.json | ainecto tools call mcp__ainecto__erd_apply_changes --json
33
-
34
- ainecto projects list --env dev
35
- ainecto task list-tasks --env dev --document-uuid <documentUuid> --json
36
- ainecto erd apply-changes --env dev -f erd-operations.json --yes
121
+ ainecto auth login # once per machine (and per --env); not per role
122
+ ainecto auth status
123
+ ainecto auth logout
124
+
125
+ ainecto tools list
126
+ ainecto tools call list_projects --json
127
+ ainecto tools call erd_apply_changes -f changes.json --json
128
+ cat payload.json | ainecto tools call erd_apply_changes --json
129
+
130
+ ainecto projects list
131
+ ainecto erd apply-changes -f erd-operations.json --yes
37
132
  ```
38
133
 
39
- Endpoint resolution priority:
134
+ `ai-erd` is the same command under its older name — every `ainecto …` line works as `ai-erd …`.
135
+
136
+ **The role comes from the repository.** Inside a folder set up with `ainecto init` (the command looks
137
+ from the current folder upward for the first `.mcp.json`/`.cursor/mcp.json` with an `ainecto` entry —
138
+ or, from 0.4.x, an `ai-erd` entry), every command uses that folder's role without `--role`. A `--role`
139
+ or `AINECTO_ROLE` (or `AI_ERD_ROLE`) that differs from it is refused — the role changes only with
140
+ `ainecto init --role <role>`, after asking the user. If the role there cannot be read (the
141
+ `@ainecto/mcp` bridge entry without a valid `--role`, configs that disagree, an `ainecto` and an
142
+ `ai-erd` bridge with different roles, broken JSON that mentions `ainecto` or `ai-erd`, a link that
143
+ points outside the folder), the command stops. An entry that is not this bridge (for example an HTTP
144
+ `url` or `mcp-remote` entry) means no role there. Your home folder itself is never read as a
145
+ repository (`~/.cursor/mcp.json` is Cursor's global config). Outside such a folder there is no role
146
+ (no restriction), and `--role` narrows it.
147
+ Tool names are the server's own names (`list_projects`, `erd_apply_changes`, …). Your AI client
148
+ shows them with its own prefix, for example `mcp__ainecto__list_projects` in Claude Code
149
+ (`mcp__ai-erd__…` for a 0.4.x setup); the CLI does not use that prefix. A tool name that starts with
150
+ the server's older `mcp__ainecto__` prefix is still accepted.
151
+
152
+ Every command takes `--env dev` for `https://dev.ai-erd.com/mcp`. Endpoint resolution priority:
40
153
 
41
154
  1. `--endpoint <url>`
42
155
  2. `AINECTO_MCP_ENDPOINT`
43
156
  3. `--env dev`
44
- 4. production default, `https://ai-erd.com/mcp`
157
+ 4. production default, `https://ainecto.com/mcp`
45
158
 
46
- Endpoint URLs must use `https:`. Plain `http:` is accepted only for localhost loopback targets such as `127.0.0.1`. When `AINECTO_TOKEN` is set, the CLI only sends it to the default prod/dev endpoints unless `AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN=1` is set for an explicitly trusted custom endpoint.
159
+ Endpoint URLs must use `https:`. Plain `http:` is accepted only for localhost loopback targets such
160
+ as `127.0.0.1`. When `AINECTO_TOKEN` is set, the CLI only sends it to the default prod/dev endpoints
161
+ unless `AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN=1` is set for an explicitly trusted custom endpoint.
47
162
 
48
- ## Connector Mode
163
+ The commands are `ainecto` and `ai-erd` (the same CLI), `ai-erd-mcp`, and `mcp` (which
164
+ `npx -y @ainecto/mcp` runs). The `AINECTO_*` environment variables above are the **only** names for
165
+ those settings — there is no `AI_ERD_*` equivalent, so do not guess one. (The one `AI_ERD_*` variable
166
+ is `AI_ERD_ROLE`, the older name of `AINECTO_ROLE`.)
167
+
168
+ ## Generated Friendly Commands
169
+
170
+ Every checked-in generated catalog tool is reachable through its deterministic command path. Scalar
171
+ schema fields are exposed as flags, with both kebab-case and schema-case accepted:
49
172
 
50
173
  ```bash
51
- npx -y @ai-erd/mcp
52
- ainecto mcp --env dev
174
+ ainecto documents list --project-uuid <projectUuid>
175
+ ainecto documents list --projectUuid <projectUuid>
53
176
  ```
54
177
 
55
- The connector proxies `initialize`, `tools/list`, and `tools/call` to the resolved `/mcp` endpoint. It does not rewrite remote schemas or interpret local file references.
178
+ Array or object payloads use the first-party CLI JSON payload reader:
56
179
 
57
- ## MCP Client Installation
180
+ ```bash
181
+ ainecto documents create -f create-documents.json
182
+ cat erd-operations.json | ainecto erd apply-changes --json
183
+ ```
58
184
 
59
- Use the direct package configuration until the server is published to the official MCP Registry.
185
+ Destructive generated commands prompt in human mode unless `--yes` is supplied. In `--json` mode
186
+ they fail with a structured error unless `--yes` is present.
60
187
 
61
- ```json
62
- {
63
- "mcpServers": {
64
- "ainecto": {
65
- "command": "npx",
66
- "args": ["-y", "@ai-erd/mcp"]
67
- }
68
- }
69
- }
188
+ Attachment file upload is available through a bespoke command that performs the upload-token, raw
189
+ PUT, and attachment registration flow:
190
+
191
+ ```bash
192
+ ainecto attachments upload --document-uuid <documentUuid> ./diagram.png ./notes.pdf
193
+ ```
194
+
195
+ The generated `request_upload_token` and `upload_attachments` paths remain raw MCP argument-contract
196
+ commands and do not read local files.
197
+
198
+ ## Connector Mode
199
+
200
+ ```bash
201
+ ainecto mcp --role <design|development|test|validation> [--env dev]
70
202
  ```
71
203
 
72
- For a non-production endpoint, pass CLI flags through the package args:
204
+ The package doubles as a stdio-to-HTTP proxy for the resolved `/mcp` endpoint. It proxies
205
+ `initialize`, `tools/list`, and `tools/call`, does not rewrite remote schemas, and does not interpret
206
+ local file references. It uses this machine's one sign-in (`ainecto auth login`, or the sign-in
207
+ `ainecto init` performs) and never opens a browser on its own. Its role comes only from `--role` (or
208
+ `AINECTO_ROLE`, or the older `AI_ERD_ROLE`) and is sent with every request; the server applies it.
209
+
210
+ This is the entry `ainecto init` writes into a repository's MCP config — you normally do not add it
211
+ by hand:
73
212
 
74
213
  ```json
75
214
  {
76
215
  "mcpServers": {
77
- "ainecto-dev": {
216
+ "ainecto": {
78
217
  "command": "npx",
79
- "args": ["-y", "@ai-erd/mcp", "--env", "dev"]
218
+ "args": ["-y", "@ainecto/mcp", "--role", "development"]
80
219
  }
81
220
  }
82
221
  }
83
222
  ```
84
223
 
85
- The planned official Registry server name is `io.github.codelives/ainecto`, backed by the public npm package `@ai-erd/mcp`. Registry publication requires the npm package version referenced by `server.json` to include a matching `mcpName` field in `package.json`.
86
-
87
- ## Catalog Sync
88
-
89
- `sync:tools --check` is intended for publish-time live drift checks. It fails fast when `AINECTO_CATALOG_SYNC_TOKEN` is missing, so automatic publish cannot silently fall back to fixtures.
90
- For local development, `sync:tools` can also use credentials from `ainecto auth login --env <env>`.
91
-
92
- ```bash
93
- AINECTO_CATALOG_SYNC_TOKEN=... npm run sync:tools -- --env prod --check
94
- AINECTO_CATALOG_SYNC_TOKEN=... npm run sync:tools -- --env dev --check
95
- ```
96
-
97
- The checked-in generated catalogs are deterministic output from `tools/list`. The prod and dev catalogs are live-synced snapshots from `https://ai-erd.com/mcp` and `https://dev.ainecto.com/mcp`. Presentation metadata lives separately in `src/core/catalog/enrichments.ts`.
224
+ A bridge without a role has no restriction. If a session inside a set-up repository still has no role,
225
+ another `ainecto` entry (for example Claude Code's local scope) is usually hiding the one `init` wrote —
226
+ check with `claude mcp get ainecto`. An entry under another name (an older `ai-erd` one, say) does not
227
+ hide it but adds a second server with no role — remove it.
98
228
 
99
- `ainecto tools catalog` prints the local generated catalog. Rerun authenticated `sync:tools` when prod or dev `tools/list` changes.
229
+ ### MCP Registry
100
230
 
101
- ## Generated Friendly Commands
231
+ `server.json` is the Registry entry `io.github.codelives/ainecto` (same as `package.json#mcpName`). It
232
+ lists only the npm package `@ainecto/mcp` — the per-repository role bridge `init` writes. Registry
233
+ publication requires the npm version it references to carry that `mcpName`, so publish npm first.
234
+ Registration is done by a person:
102
235
 
103
- Every checked-in generated catalog tool is reachable through its deterministic command path. Scalar schema fields are exposed as flags, with both kebab-case and schema-case accepted:
236
+ 1. `npm run release -- --otp=<code>` (below) so that `@ainecto/mcp@<version>` is on npm.
237
+ 2. GitHub org namespace login as a `codelives` org **Owner** — a classic PAT with only `read:org`
238
+ works where the browser login did not: `MCP_GITHUB_TOKEN=<pat> mcp-publisher login github`.
239
+ 3. `mcp-publisher publish` from this folder. The new version simply replaces the package identifier
240
+ (`@ai-erd/mcp` up to 0.4.x → `@ainecto/mcp`); the server name does not change.
104
241
 
105
- ```bash
106
- ainecto task list-tasks --env dev --document-uuid <documentUuid>
107
- ainecto task list-tasks --env dev --documentUuid <documentUuid>
108
- ```
242
+ Leave the other entry, `com.ai-erd/ai-erd` (the remote `https://ai-erd.com/mcp`, ai-erd.com domain
243
+ namespace), as it is. One remote URL can belong to one server only; listing `https://ainecto.com/mcp`
244
+ as a remote here, or a `com.ainecto/*` name, would need ainecto.com domain auth
245
+ (`mcp-publisher login dns|http --domain ainecto.com`) and is not part of this release.
109
246
 
110
- Array or object payloads use the existing first-party CLI JSON payload reader:
247
+ ## Development
111
248
 
112
249
  ```bash
113
- ainecto documents create --env dev -f create-documents.json
114
- cat task-ops.json | ainecto task apply-changes --env dev --json
250
+ npm install
251
+ npm run typecheck
252
+ npm test
253
+ npm run build
254
+ npm link # puts `ainecto` (and `ai-erd`) on your PATH
115
255
  ```
116
256
 
117
- Destructive generated commands prompt in human mode unless `--yes` is supplied. In `--json` mode they fail with a structured error unless `--yes` is present.
257
+ ### Catalog Sync
118
258
 
119
- Attachment file upload is available through a bespoke command that performs the upload-token, raw PUT, and attachment registration flow:
259
+ `sync:tools --check` is intended for publish-time live drift checks. It fails fast when
260
+ `AINECTO_CATALOG_SYNC_TOKEN` is missing, so automatic publish cannot silently fall back to fixtures.
261
+ For local development, `sync:tools` can also use credentials from `ainecto auth login --env <env>`.
120
262
 
121
263
  ```bash
122
- ainecto attachments upload --env dev --document-uuid <documentUuid> ./diagram.png ./notes.pdf
264
+ AINECTO_CATALOG_SYNC_TOKEN=... npm run sync:tools -- --env prod --check
265
+ AINECTO_CATALOG_SYNC_TOKEN=... npm run sync:tools -- --env dev --check
123
266
  ```
124
267
 
125
- The generated `request_upload_token` and `upload_attachments` paths remain raw MCP argument-contract commands and do not read local files.
268
+ The checked-in generated catalogs are deterministic output from `tools/list`, live-synced from
269
+ `https://ainecto.com/mcp` and `https://dev.ai-erd.com/mcp`. Presentation metadata lives separately in
270
+ `src/core/catalog/enrichments.ts`. `ainecto tools catalog` prints the local generated catalog.
126
271
 
127
- ## Local Tarball Smoke
272
+ ### Local Tarball Smoke
128
273
 
129
274
  ```bash
130
275
  npm pack
131
- npx -y ./ainecto-mcp-0.1.4.tgz --help
132
- npm exec --package ./ainecto-mcp-0.1.4.tgz -- ainecto --help
276
+ npm exec --package ./ainecto-mcp-<version>.tgz -- ainecto --help
133
277
  ```
134
278
 
135
- ## Live Dev MCP Smoke
279
+ ### Live Dev MCP Smoke
136
280
 
137
- This requires an authenticated dev token from `ainecto auth login --env dev` or a local developer `AINECTO_TOKEN`.
281
+ This requires an authenticated dev token from `ainecto auth login --env dev` or a local developer
282
+ `AINECTO_TOKEN`.
138
283
 
139
284
  ```bash
140
285
  npm run smoke:mcp -- --env dev
141
286
  ```
142
287
 
143
- The smoke initializes MCP, reads `tools/list`, calls `mcp__ainecto__list_projects`, and prints only aggregate metadata such as tool count and Task tool exposure.
288
+ The smoke initializes MCP, reads `tools/list`, calls `list_projects`, and prints only aggregate
289
+ metadata such as tool count and Task tool exposure.
144
290
 
145
- ## Local Attachment Upload Smoke
291
+ ### Local Attachment Upload Smoke
146
292
 
147
- This exercises the full `attachments upload` flow against a local `ainecto-api` dev server:
148
- OAuth MCP token issue, REST fixture document creation, CLI upload, `list_attachments`, and server filesystem byte verification.
293
+ This exercises the full `attachments upload` flow against a local API dev server: OAuth MCP token
294
+ issue, REST fixture document creation, CLI upload, `list_attachments`, and server filesystem byte
295
+ verification.
149
296
 
150
297
  ```bash
151
- npm run smoke:attachments -- --base-url http://localhost:8080 --endpoint http://localhost:8080/mcp --api-root /Users/ryan/project/workspace/codelive/ainecto-api
298
+ npm run smoke:attachments -- --base-url http://localhost:8080 --endpoint http://localhost:8080/mcp --api-root <path-to-api-repo>
152
299
  ```
153
300
 
154
- The smoke creates a temporary user/workspace/project/document and removes the fixture account, local temp file, and stored upload file unless `--keep` is supplied.
301
+ The smoke creates a temporary user/workspace/project/document and removes the fixture account, local
302
+ temp file, and stored upload file unless `--keep` is supplied.
155
303
 
156
- ## Known Limitations
304
+ ### Releasing
157
305
 
158
- - The MCP connector currently implements newline-delimited stdio JSON-RPC to HTTP JSON-RPC. Streamable HTTP SSE responses and `MCP-Session-Id` session handling are not implemented in Phase 1.
306
+ `npm run release -- --otp=<code>` runs typecheck, test and build once, then publishes that build under
307
+ six names: `@ainecto/mcp` (primary), `ainecto`, `@ainecto/cli` (only the `ainecto` command), and the
308
+ older `@ai-erd/mcp`, `ai-erd`, `@ai-erd/cli` (only the `ai-erd` command). `--dry-run` shows what would
309
+ go out. An already-published name is skipped, so a retry after an expired code is safe.
310
+
311
+ Before the first 0.5.0 release, by hand: the npm account needs write access to both the `@ainecto` and
312
+ `@ai-erd` orgs (the script checks), and `@ainecto/mcp` versions up to 0.3.0 still carry the 2026-09-29
313
+ deprecation «moved to @ai-erd/mcp» — replace it, for example
314
+ `npm deprecate "@ainecto/mcp@<=0.3.0" "Old version — use @ainecto/mcp@latest"` (new versions are not
315
+ deprecated). Do not unpublish any name.
316
+
317
+ ## Known Limitations
159
318
 
160
- Official MCP Registry publish is pending GitHub namespace owner authentication with `mcp-publisher` and metadata submission.
319
+ - The MCP connector implements newline-delimited stdio JSON-RPC to HTTP JSON-RPC. Streamable HTTP SSE
320
+ responses and `MCP-Session-Id` session handling are not implemented.