@cyanheads/hn-mcp-server 0.5.15 → 0.5.16
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/CLAUDE.md +29 -26
- package/README.md +3 -3
- package/changelog/0.5.x/0.5.16.md +29 -0
- package/changelog/template.md +7 -24
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +3 -2
- package/dist/config/server-config.js.map +1 -1
- package/package.json +12 -15
- package/server.json +3 -3
package/CLAUDE.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Developer Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** hn-mcp-server
|
|
4
|
-
**Version:** 0.5.
|
|
5
|
-
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.
|
|
6
|
-
**Engines:** Bun ≥1.
|
|
4
|
+
**Version:** 0.5.16
|
|
5
|
+
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.0`
|
|
6
|
+
**Engines:** Bun ≥1.4.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/server` 2.0.0
|
|
8
|
-
**Zod:** ^4.
|
|
8
|
+
**Zod:** ^4.6.1
|
|
9
9
|
|
|
10
10
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
|
11
11
|
|
|
@@ -37,6 +37,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
|
|
|
37
37
|
- **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
|
|
38
38
|
- **Need input the caller didn't supply?** `return ctx.requestInput(...)` and read `ctx.inputs` when the handler is re-entered. Never `await` for user input mid-handler.
|
|
39
39
|
- **Secrets in env vars only** — never hardcoded.
|
|
40
|
+
- **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.
|
|
40
41
|
- **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
|
|
41
42
|
|
|
42
43
|
---
|
|
@@ -129,7 +130,7 @@ Handlers receive a unified `ctx` object. Key properties:
|
|
|
129
130
|
|
|
130
131
|
| Property | Description |
|
|
131
132
|
|:---------|:------------|
|
|
132
|
-
| `ctx.log` | Request-scoped
|
|
133
|
+
| `ctx.log` | Request-scoped logger — `.debug()`, `.info()`, `.notice()`, `.warning()`, `.error()`. Auto-correlates requestId, traceId, tenantId. Dual-sink: Pino **and** `notifications/message` to the client, so treat it as client-visible. |
|
|
133
134
|
| `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |
|
|
134
135
|
| `ctx.requestInput` | Suspend and ask the caller for more input — `return ctx.requestInput({ inputRequests: { key: inputRequired.elicit({ message, requestedSchema }) } })`. Never returns; the handler is re-entered with the answers. Always present. |
|
|
135
136
|
| `ctx.inputs` | Reader over a retried request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped`. Empty on the first round. |
|
|
@@ -145,7 +146,7 @@ Handlers receive a unified `ctx` object. Key properties:
|
|
|
145
146
|
|
|
146
147
|
Handlers throw — the framework catches, classifies, and formats.
|
|
147
148
|
|
|
148
|
-
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required
|
|
149
|
+
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reason')` as the throw's data to put it on the wire (`data.recovery.hint`, mirrored into `content[]` text); override with an explicit `{ recovery: { hint: '...' } }` when dynamic runtime context matters. Baseline codes (`InternalError`, `ServiceUnavailable`, `Timeout`, `ValidationError`, `SerializationError`, `RequestCancelled`) bubble freely and don't need declaring.
|
|
149
150
|
|
|
150
151
|
```ts
|
|
151
152
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
@@ -222,9 +223,9 @@ src/
|
|
|
222
223
|
|
|
223
224
|
## Skills
|
|
224
225
|
|
|
225
|
-
Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
|
|
226
|
+
Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. The directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand these development skills to every agent that installs it. Keep `skills/` free for skills meant for those agents.
|
|
226
227
|
|
|
227
|
-
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent).
|
|
228
|
+
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
|
|
228
229
|
|
|
229
230
|
Available skills:
|
|
230
231
|
|
|
@@ -233,7 +234,7 @@ Available skills:
|
|
|
233
234
|
| `setup` | Post-init project orientation |
|
|
234
235
|
| `design-mcp-server` | Design tool surface, resources, and services for a new server |
|
|
235
236
|
| `add-tool` | Scaffold a new tool definition |
|
|
236
|
-
| `add-app-tool` | Scaffold an MCP App tool + UI resource
|
|
237
|
+
| `add-app-tool` | Scaffold an MCP App tool + paired UI resource |
|
|
237
238
|
| `add-resource` | Scaffold a new resource definition |
|
|
238
239
|
| `add-prompt` | Scaffold a new prompt definition |
|
|
239
240
|
| `add-service` | Scaffold a new service integration |
|
|
@@ -243,27 +244,28 @@ Available skills:
|
|
|
243
244
|
| `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
|
|
244
245
|
| `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
|
|
245
246
|
| `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
246
|
-
| `git-wrapup` | Land working-tree changes as a
|
|
247
|
-
| `release-
|
|
247
|
+
| `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |
|
|
248
|
+
| `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixup commits autosquashed into the stack, PR body kept in sync. Release PR mode only |
|
|
249
|
+
| `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
|
|
248
250
|
| `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
|
|
249
251
|
| `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
|
|
250
|
-
| `
|
|
252
|
+
| `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
|
|
253
|
+
| `report-issue-local` | File a bug or feature request against this server's own repo via `gh` CLI |
|
|
254
|
+
| `techniques` | Catalog of response/data-shaping techniques — overflow handling, payload shaping, retrieval patterns |
|
|
251
255
|
| `api-auth` | Auth modes, scopes, JWT/OAuth |
|
|
252
256
|
| `api-canvas` | DataCanvas: register tabular data, run SQL, export, plus the `spillover()` helper for big result sets — Tier 3 opt-in |
|
|
253
257
|
| `api-config` | AppConfig, parseConfig, env vars |
|
|
254
258
|
| `api-context` | Context interface, RequestContext, logger, state, multi-round-trip input |
|
|
255
259
|
| `api-errors` | McpError, JsonRpcErrorCode, error patterns |
|
|
256
260
|
| `api-linter` | Definition linter rule catalog — invoked by `bun run lint:mcp` and `devcheck` |
|
|
257
|
-
| `api-mirror` | MirrorService: persistent self-refreshing local
|
|
261
|
+
| `api-mirror` | MirrorService: persistent self-refreshing local mirror (embedded SQLite + FTS5) of a bulk upstream dataset — Tier 3 opt-in |
|
|
258
262
|
| `api-services` | LLM, Speech, Graph services |
|
|
259
263
|
| `api-testing` | createMockContext, test patterns |
|
|
260
264
|
| `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
|
|
261
265
|
| `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
|
|
262
266
|
| `api-workers` | Cloudflare Workers runtime |
|
|
263
|
-
| `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
|
|
264
|
-
| `report-issue-local` | File a bug or feature request against this server's own repo via `gh` CLI |
|
|
265
267
|
|
|
266
|
-
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
268
|
+
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `framework-skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
267
269
|
|
|
268
270
|
When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
|
|
269
271
|
|
|
@@ -282,13 +284,14 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
282
284
|
| `bun run tree` | Generate directory structure doc |
|
|
283
285
|
| `bun run format` | Auto-fix formatting (safe fixes only) |
|
|
284
286
|
| `bun run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |
|
|
285
|
-
| `bun run list-skills` | Print
|
|
287
|
+
| `bun run list-skills` | Print the skill registry |
|
|
286
288
|
| `bun run lint:mcp` | Validate MCP tool/resource definitions (rule catalog: `api-linter` skill) |
|
|
287
|
-
| `bun run lint:packaging` |
|
|
289
|
+
| `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity, MCPB `user_config` wiring, plugin manifests (run by devcheck) |
|
|
288
290
|
| `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
|
|
289
291
|
| `bun run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |
|
|
290
292
|
| `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
|
|
291
|
-
| `bun run audit:
|
|
293
|
+
| `bun run audit:fix` | `bun audit fix` — upgrade vulnerable packages to the lowest safe version within existing ranges (`--dry-run` previews, `--latest` rewrites ranges). First response when `devcheck` flags a transitive advisory; then `bun update <name>`, then `bun dedupe` |
|
|
294
|
+
| `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after `audit:fix`, `bun update <name>`, and `bun dedupe` — re-resolves every ranged dep (the framework pin included) and rewrites the lockfile as `lockfileVersion: 2` |
|
|
292
295
|
| `bun run test` | Run tests (Vitest — use `bun run test`, not `bun test`) |
|
|
293
296
|
| `bun run test:coverage` | Run the full Vitest suite with Istanbul coverage |
|
|
294
297
|
| `bun run start:stdio` | Production mode (stdio) |
|
|
@@ -298,11 +301,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
298
301
|
|
|
299
302
|
## Bundling
|
|
300
303
|
|
|
301
|
-
`bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP deployments are unaffected.
|
|
304
|
+
`bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP deployments are unaffected.
|
|
302
305
|
|
|
303
|
-
**Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
|
|
306
|
+
**Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match, that every `user_config` option is wired into `mcp_config.env` as `"X": "${user_config.X}"` (the host substitutes nothing else — `"${X}"` reaches the server as that literal string), and that an optional string option carries `"default": ""`.
|
|
304
307
|
|
|
305
|
-
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
|
|
308
|
+
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `framework-skills/polish-docs-meta/references/readme.md`.
|
|
306
309
|
|
|
307
310
|
---
|
|
308
311
|
|
|
@@ -327,7 +330,7 @@ security: false # optional — true ONLY for a source
|
|
|
327
330
|
|
|
328
331
|
`agent-notes` is an optional free-form field for maintenance agents processing the release downstream. Content there won't appear in the rendered CHANGELOG — it's consumed by agents running the `maintenance` skill. Use it for adoption instructions that don't fit the human-facing sections: new files to create, fields to populate, one-time migration steps. Omit entirely when there's nothing to say.
|
|
329
332
|
|
|
330
|
-
**Section order
|
|
333
|
+
**Section order:** the Keep a Changelog sequence — Added, Changed, Deprecated, Removed, Fixed, Security — then `Dependencies` last. Include only sections with entries — don't ship empty headers.
|
|
331
334
|
|
|
332
335
|
**Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `changelog/template.md` for the full format reference.
|
|
333
336
|
|
|
@@ -377,7 +380,7 @@ mcp-publisher publish
|
|
|
377
380
|
- [ ] Tests cover at least one sparse payload case per tool that wraps upstream items
|
|
378
381
|
- [ ] Tests use `createMockContext({ errors: tool.errors })` when the test exercises `ctx.fail`
|
|
379
382
|
- [ ] Registered in `createApp()` tools array
|
|
380
|
-
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` =
|
|
381
|
-
- [ ] `.codex-plugin/mcp.json` updated — server name key
|
|
382
|
-
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry
|
|
383
|
+
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = the unscoped repo name (never the npm scope — `lint:packaging` enforces this); `interface.shortDescription` from `package.json` description
|
|
384
|
+
- [ ] `.codex-plugin/mcp.json` updated — server name key is the unscoped repo name; every user-supplied variable (API key, contact email, instance URL) is listed in `env_vars` so Codex forwards it from the user's environment. Never write `"KEY": ""` into `env` — an empty value replaces the user's exported key and is read as unset
|
|
385
|
+
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `author`, `repository`, `license`, `keywords` from `package.json`; inline `mcpServers` entry keyed by the unscoped repo name. Every user-supplied variable is declared under `userConfig` (`type`, `title`, `description`; `sensitive: true` for keys and tokens; `required: true` or `default: ""`) and referenced from `env` as `"KEY": "${user_config.<option>}"` — mirror the `user_config` block in `manifest.json`. Never write `"KEY": ""` into `env`
|
|
383
386
|
- [ ] `bun run devcheck` passes
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/hn-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/hn-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -171,7 +171,7 @@ Or with Docker:
|
|
|
171
171
|
|
|
172
172
|
### Prerequisites
|
|
173
173
|
|
|
174
|
-
- [Bun v1.
|
|
174
|
+
- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js >= 24)
|
|
175
175
|
|
|
176
176
|
### Installation
|
|
177
177
|
|
|
@@ -239,7 +239,7 @@ See [`CLAUDE.md`](./CLAUDE.md) for development guidelines and architectural rule
|
|
|
239
239
|
|
|
240
240
|
## Contributing
|
|
241
241
|
|
|
242
|
-
Issues
|
|
242
|
+
Issues are welcome. Run checks before submitting:
|
|
243
243
|
|
|
244
244
|
```sh
|
|
245
245
|
bun run devcheck
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Adopted mcp-ts-core ^0.13.0 (blank/unsubstituted env vars now read as unset, dev skills moved to framework-skills/) plus a matching HN_CONCURRENCY_LIMIT fix and routine dependency bumps"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.5.16 — 2026-09-13
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **Development skills moved from `skills/` to `framework-skills/`** ([cyanheads/mcp-ts-core#428](https://github.com/cyanheads/mcp-ts-core/issues/428)) — installing this server's `.claude-plugin`/`.codex-plugin` no longer hands these authoring skills to every agent that installs it.
|
|
12
|
+
- A rejected tool call's error now also carries `structuredContent.error` (code `-32602`) alongside the existing `Invalid arguments for tool …` text ([cyanheads/mcp-ts-core#377](https://github.com/cyanheads/mcp-ts-core/issues/377)).
|
|
13
|
+
- `manifest.json`'s `mcp_config.env` now references `${user_config.HN_CONCURRENCY_LIMIT}` / `${user_config.MCP_LOG_LEVEL}`, the form MCPB hosts substitute.
|
|
14
|
+
- A trailing slash on `MCP_PUBLIC_URL` no longer doubles in the HTTP landing page and `/.well-known/mcp.json` links, and the landing page's curl snippet now sends a handshake `initialize` accepts ([cyanheads/mcp-ts-core#395](https://github.com/cyanheads/mcp-ts-core/issues/395)).
|
|
15
|
+
- Minor/internal: `engines.bun` floor raised to `>=1.4.0`; new `audit:fix` script (`bun audit fix`); the `fast-uri`/`qs` `overrides` block removed now that the framework's `@modelcontextprotocol/ext-apps` dependency no longer pulls `@modelcontextprotocol/sdk` 1.x; GitHub issue forms gained assignee/secondary-label guidance and a security-advisory contact link; `.claude-plugin/plugin.json` gained `$schema` and `keywords`.
|
|
16
|
+
|
|
17
|
+
## Fixed
|
|
18
|
+
|
|
19
|
+
- **`HN_CONCURRENCY_LIMIT` now reads a blank value or an unsubstituted `${user_config.HN_CONCURRENCY_LIMIT}` placeholder as unset**, falling back to the default of 10, via mcp-ts-core's `parseEnvConfig` ([cyanheads/mcp-ts-core#427](https://github.com/cyanheads/mcp-ts-core/issues/427)). Previously an empty value failed validation. Validation errors now name `HN_CONCURRENCY_LIMIT`.
|
|
20
|
+
|
|
21
|
+
## Dependencies
|
|
22
|
+
|
|
23
|
+
- `@cyanheads/mcp-ts-core` `^0.12.5` → `^0.13.0`
|
|
24
|
+
- `zod` `^4.5.4` → `^4.6.1`
|
|
25
|
+
- `vitest` / `@vitest/coverage-istanbul` `^4.1.11` → `^5.0.0`
|
|
26
|
+
- `@biomejs/biome` `^2.5.11` → `^2.5.13`
|
|
27
|
+
- `@types/node` `^26.4.0` → `^26.5.1`
|
|
28
|
+
- `ignore` `^7.0.8` → `^7.0.9`
|
|
29
|
+
- `tsc-alias` `^1.9.3` → `^1.9.4`
|
package/changelog/template.md
CHANGED
|
@@ -117,30 +117,13 @@ security: false
|
|
|
117
117
|
in that unrelated item's metadata.
|
|
118
118
|
|
|
119
119
|
TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
|
|
120
|
-
via `gh release create --notes-from-tag`.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
Dependency bumps: ← section header
|
|
128
|
-
← blank line
|
|
129
|
-
- `@cyanheads/mcp-ts-core` ^0.9.1 → ^0.9.6 ← bullet
|
|
130
|
-
← blank line
|
|
131
|
-
Changed: ← only sections with entries
|
|
132
|
-
← blank line
|
|
133
|
-
- `format()` output includes `query` in text mode
|
|
134
|
-
← blank line
|
|
135
|
-
Added:
|
|
136
|
-
← blank line
|
|
137
|
-
- `manifest.json` scaffolded for MCPB bundle support
|
|
138
|
-
- Install badges (Claude Desktop, Cursor, VS Code)
|
|
139
|
-
← blank line
|
|
140
|
-
<N> tests pass; `bun run devcheck` clean. ← footer
|
|
141
|
-
|
|
142
|
-
Never a flat comma-separated string. Always structured markdown with
|
|
143
|
-
sections. The tag must scan well as a rendered GitHub Release page.
|
|
120
|
+
via `gh release create --notes-from-tag`. It is a condensed digest of this
|
|
121
|
+
entry, never a copy, and its format is owned by the `release-and-publish`
|
|
122
|
+
skill (step 4, "Create the annotated tag"): the entry's `summary:` as the
|
|
123
|
+
theme line without the version, flat headline bullets — no Keep-a-Changelog
|
|
124
|
+
section headers, no gates line — at most one deps line, issue backlinks,
|
|
125
|
+
and the changelog link last. In release-PR mode the `git-wrapup` skill
|
|
126
|
+
authors that digest as the PR body's `## Changes` and the tag copies it.
|
|
144
127
|
-->
|
|
145
128
|
|
|
146
129
|
## Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,wBAAgB,eAAe;;EAK9B"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module config/server-config
|
|
4
4
|
*/
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { parseEnvConfig } from '@cyanheads/mcp-ts-core/config';
|
|
6
7
|
const ServerConfigSchema = z.object({
|
|
7
8
|
concurrencyLimit: z.coerce
|
|
8
9
|
.number()
|
|
@@ -14,8 +15,8 @@ const ServerConfigSchema = z.object({
|
|
|
14
15
|
});
|
|
15
16
|
let _config;
|
|
16
17
|
export function getServerConfig() {
|
|
17
|
-
_config ??= ServerConfigSchema
|
|
18
|
-
concurrencyLimit:
|
|
18
|
+
_config ??= parseEnvConfig(ServerConfigSchema, {
|
|
19
|
+
concurrencyLimit: 'HN_CONCURRENCY_LIMIT',
|
|
19
20
|
});
|
|
20
21
|
return _config;
|
|
21
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,MAAM;SACvB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,sDAAsD,CAAC;CACpE,CAAC,CAAC;AAEH,IAAI,OAAuD,CAAC;AAE5D,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,cAAc,CAAC,kBAAkB,EAAE;QAC7C,gBAAgB,EAAE,sBAAsB;KACzC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/hn-mcp-server",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.16",
|
|
4
4
|
"description": "Browse Hacker News feeds, threads, and user profiles with full-text search via MCP. STDIO or Streamable HTTP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"lint:mcp": "bun run scripts/lint-mcp.ts",
|
|
30
30
|
"lint:packaging": "bun run scripts/lint-packaging.ts",
|
|
31
31
|
"bundle": "bun run build && npx -y @anthropic-ai/mcpb pack . dist/hn-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/hn-mcp-server.mcpb",
|
|
32
|
+
"audit:fix": "bun audit fix",
|
|
32
33
|
"audit:refresh": "rm -f bun.lock && bun install && bun audit",
|
|
33
34
|
"changelog:build": "bun run scripts/build-changelog.ts",
|
|
34
35
|
"changelog:check": "bun run scripts/build-changelog.ts --check",
|
|
@@ -75,31 +76,27 @@
|
|
|
75
76
|
}
|
|
76
77
|
],
|
|
77
78
|
"engines": {
|
|
78
|
-
"
|
|
79
|
-
"
|
|
79
|
+
"bun": ">=1.4.0",
|
|
80
|
+
"node": ">=24.0.0"
|
|
80
81
|
},
|
|
81
82
|
"packageManager": "bun@1.4.0",
|
|
82
83
|
"publishConfig": {
|
|
83
84
|
"access": "public"
|
|
84
85
|
},
|
|
85
|
-
"overrides": {
|
|
86
|
-
"fast-uri": "^3.1.6",
|
|
87
|
-
"qs": "^6.16.0"
|
|
88
|
-
},
|
|
89
86
|
"dependencies": {
|
|
90
|
-
"@cyanheads/mcp-ts-core": "^0.
|
|
87
|
+
"@cyanheads/mcp-ts-core": "^0.13.0",
|
|
91
88
|
"pino-pretty": "^13.1.3",
|
|
92
|
-
"zod": "^4.
|
|
89
|
+
"zod": "^4.6.1"
|
|
93
90
|
},
|
|
94
91
|
"devDependencies": {
|
|
95
|
-
"@biomejs/biome": "^2.5.
|
|
92
|
+
"@biomejs/biome": "^2.5.13",
|
|
96
93
|
"@socketsecurity/bun-security-scanner": "^1.1.2",
|
|
97
|
-
"@types/node": "^26.
|
|
98
|
-
"@vitest/coverage-istanbul": "^
|
|
94
|
+
"@types/node": "^26.5.1",
|
|
95
|
+
"@vitest/coverage-istanbul": "^5.0.0",
|
|
99
96
|
"depcheck": "^1.4.7",
|
|
100
|
-
"ignore": "^7.0.
|
|
101
|
-
"tsc-alias": "^1.9.
|
|
97
|
+
"ignore": "^7.0.9",
|
|
98
|
+
"tsc-alias": "^1.9.4",
|
|
102
99
|
"typescript": "^7.0.2",
|
|
103
|
-
"vitest": "^
|
|
100
|
+
"vitest": "^5.0.0"
|
|
104
101
|
}
|
|
105
102
|
}
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/hn-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.5.
|
|
9
|
+
"version": "0.5.16",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/hn-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "0.5.
|
|
22
|
+
"version": "0.5.16",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
56
56
|
"identifier": "@cyanheads/hn-mcp-server",
|
|
57
57
|
"runtimeHint": "bun",
|
|
58
|
-
"version": "0.5.
|
|
58
|
+
"version": "0.5.16",
|
|
59
59
|
"packageArguments": [
|
|
60
60
|
{
|
|
61
61
|
"type": "positional",
|