@cyanheads/orcid-mcp-server 0.2.2 → 0.2.3

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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** orcid-mcp-server
4
- **Version:** 0.2.2
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.9.21`
4
+ **Version:** 0.2.3
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.6`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
8
  **Zod:** ^4.4.3
@@ -48,7 +48,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
48
48
  - **Logic throws, framework catches.** Tool/resource handlers are pure — throw on failure, no `try/catch`. Plain `Error` is fine; the framework catches, classifies, and formats. Use error factories (`notFound()`, `validationError()`, etc.) when the error code matters.
49
49
  - **Use `ctx.log`** for request-scoped logging. No `console` calls.
50
50
  - **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
51
- - **Check `ctx.elicit` / `ctx.sample`** for presence before calling.
51
+ - **Check `ctx.elicit`** for presence before calling.
52
52
  - **Secrets in env vars only** — never hardcoded.
53
53
  - **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.
54
54
 
@@ -166,8 +166,7 @@ Handlers receive a unified `ctx` object. Key properties:
166
166
  |:---------|:------------|
167
167
  | `ctx.log` | Request-scoped logger — `.debug()`, `.info()`, `.notice()`, `.warning()`, `.error()`. Auto-correlates requestId, traceId, tenantId. |
168
168
  | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |
169
- | `ctx.elicit` | Ask user for structured input. **Check for presence first:** `if (ctx.elicit) { ... }` |
170
- | `ctx.sample` | Request LLM completion from the client. **Check for presence first:** `if (ctx.sample) { ... }` |
169
+ | `ctx.elicit` | Ask user for structured input — form call `(message, schema)` or `.url(message, url)` for an external link. **Check for presence first:** `if (ctx.elicit) { ... }` |
171
170
  | `ctx.signal` | `AbortSignal` for cancellation. |
172
171
  | `ctx.progress` | Task progress (present when `task: true`) — `.setTotal(n)`, `.increment()`, `.update(message)`. |
173
172
  | `ctx.requestId` | Unique request ID. |
@@ -292,7 +291,9 @@ Available skills:
292
291
  | `api-testing` | createMockContext, test patterns |
293
292
  | `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
294
293
  | `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
294
+ | `api-mirror` | MirrorService: local SQLite index for large/slow upstream APIs |
295
295
  | `api-workers` | Cloudflare Workers runtime |
296
+ | `techniques` | Reusable response/data-shaping patterns (e.g. outline-on-overflow) |
296
297
 
297
298
  **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.
298
299
 
@@ -320,13 +321,13 @@ When you complete a skill's checklist, check the boxes and add a completion time
320
321
  | `npm run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |
321
322
  | `npm run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
322
323
  | `npm run release:github` | Create GitHub Release from the current annotated tag |
323
- | `npm run bundle` | Build and pack as `.mcpb` for one-click Claude Desktop install |
324
+ | `npm run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
324
325
 
325
326
  ---
326
327
 
327
328
  ## Bundling
328
329
 
329
- `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
330
+ `npm 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 dependency-shipped agent docs (`node_modules/**` `skills/`, `.claude/`, `.agents/`, `SKILL.md`) that root-anchored `.mcpbignore` patterns cannot reach. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
330
331
 
331
332
  **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.
332
333
 
package/Dockerfile CHANGED
@@ -37,9 +37,12 @@ WORKDIR /usr/src/app
37
37
  ENV NODE_ENV=production
38
38
 
39
39
  # OCI image metadata (https://github.com/opencontainers/image-spec/blob/main/annotations.md)
40
+ ARG APP_VERSION
40
41
  LABEL org.opencontainers.image.title="orcid-mcp-server"
41
42
  LABEL org.opencontainers.image.description="Search and retrieve researcher profiles, works, affiliations, funding, and peer review records from the ORCID registry via MCP."
42
43
  LABEL org.opencontainers.image.licenses="Apache-2.0"
44
+ LABEL org.opencontainers.image.version="${APP_VERSION}"
45
+ LABEL org.opencontainers.image.source="https://github.com/cyanheads/orcid-mcp-server"
43
46
 
44
47
  # Copy dependency manifests
45
48
  COPY package.json bun.lock ./
@@ -94,5 +97,9 @@ ENV MCP_FORCE_CONSOLE_LOGGING="true"
94
97
  # Expose the port the server listens on
95
98
  EXPOSE ${MCP_HTTP_PORT}
96
99
 
100
+ # Health check — lightweight HTTP probe against the /healthz endpoint
101
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
102
+ CMD bun -e "fetch('http://localhost:' + (process.env.MCP_HTTP_PORT || '3010') + '/healthz').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))"
103
+
97
104
  # The command to start the server
98
105
  CMD ["bun", "run", "dist/index.js"]
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.2.2-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/orcid-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/orcid-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/orcid-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.2.3-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/orcid-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/orcid-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/orcid-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -0,0 +1,25 @@
1
+ ---
2
+ summary: "Adopt @cyanheads/mcp-ts-core 0.10.6; bundle cleaner strips dev deps and dependency-shipped agent docs; explicit createApp identity; Dockerfile healthcheck"
3
+ breaking: false
4
+ security: false
5
+ agent-notes: |
6
+ Framework bumped ^0.9.21 → ^0.10.6. New script: scripts/clean-mcpb.ts (wired into the bundle script). ctx.sample removed from the framework Context surface — CLAUDE.md updated. New skill: skills/techniques. lint-packaging and check-framework-antipatterns gained new rules from the framework sync.
7
+ ---
8
+
9
+ # 0.2.3 — 2026-06-12
10
+
11
+ ## Added
12
+
13
+ - **`createApp()` identity** — `src/index.ts` now passes explicit `name` and `title` of `orcid-mcp-server` instead of relying on package-name fallback (which surfaces the npm scope).
14
+ - **`scripts/clean-mcpb.ts`** — post-pack MCPB cleaner wired into the `bundle` script: runs `mcpb clean` (dev-dependency prune) then strips dependency-shipped agent-doc entries nested under `node_modules/` (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) that root-anchored `.mcpbignore` patterns cannot reach, and asserts none remain.
15
+ - **`Dockerfile`** — `HEALTHCHECK` probing `/healthz`, plus `org.opencontainers.image.version` (from a new `APP_VERSION` build arg) and `org.opencontainers.image.source` OCI labels.
16
+ - **`.mcpbignore`** — `/.agents/` and `/skills/` entries; all patterns root-anchored with a leading `/` so they exclude only repo-root dev dirs and never strip nested runtime paths like `node_modules/x/skills/`.
17
+ - **`lint-packaging.ts` rules** — bundle-content guards (root dev dir present at bundle root, unanchored `.mcpbignore` patterns, critical-runtime-path strip, post-bundle `node_modules/**` agent-doc entries) and an identity check (`createApp()` `name`/`title` and manifest `display_name` must equal the unscoped package name).
18
+ - **`check-framework-antipatterns.ts` rule** — flags `z.coerce.boolean()` on env flags (`Boolean("false")` is `true`, so the flag can't be disabled via env — use `z.stringbool()`); comment lines are skipped so docs naming the pattern don't trip it.
19
+
20
+ ## Changed
21
+
22
+ - **`@cyanheads/mcp-ts-core`** `^0.9.21` → `^0.10.6` — pulls framework deps `@modelcontextprotocol/ext-apps` `1.7.3` → `1.7.4` and `hono` `4.12.23` → `4.12.25`. `ctx.sample` is no longer part of the Context surface; `ctx.elicit` documentation updated to cover its form and `.url()` call forms.
23
+ - **`@biomejs/biome`** `^2.4.16` → `^2.5.0`
24
+ - **`@types/node`** `^25.9.1` → `^25.9.3`
25
+ - **Skills** — vendored skills re-synced to the framework version; new `techniques` skill added.
package/dist/index.js CHANGED
@@ -18,6 +18,8 @@ import { orcidResolveResearcher } from './mcp-server/tools/definitions/resolve-r
18
18
  import { orcidSearchResearchers } from './mcp-server/tools/definitions/search-researchers.tool.js';
19
19
  import { initOrcidService } from './services/orcid/orcid-service.js';
20
20
  await createApp({
21
+ name: 'orcid-mcp-server',
22
+ title: 'orcid-mcp-server',
21
23
  tools: [
22
24
  orcidGetProfile,
23
25
  orcidSearchResearchers,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mEAAmE,CAAC;AAC9G,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,yDAAyD,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+DAA+D,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,SAAS,CAAC;IACd,KAAK,EAAE;QACL,eAAe;QACf,sBAAsB;QACtB,aAAa;QACb,kBAAkB;QAClB,oBAAoB;QACpB,eAAe;QACf,mBAAmB;QACnB,yBAAyB;QACzB,sBAAsB;KACvB;IACD,SAAS,EAAE,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;IAC/D,OAAO,EAAE,EAAE;IACX,KAAK,CAAC,IAAI;QACR,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,YAAY,EACV,4iBAA4iB;IAC9iB,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;CAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mEAAmE,CAAC;AAC9G,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,yDAAyD,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+DAA+D,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,kBAAkB;IACzB,KAAK,EAAE;QACL,eAAe;QACf,sBAAsB;QACtB,aAAa;QACb,kBAAkB;QAClB,oBAAoB;QACpB,eAAe;QACf,mBAAmB;QACnB,yBAAyB;QACzB,sBAAsB;KACvB;IACD,SAAS,EAAE,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;IAC/D,OAAO,EAAE,EAAE;IACX,KAAK,CAAC,IAAI;QACR,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,YAAY,EACV,4iBAA4iB;IAC9iB,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;CAChC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/orcid-mcp-server",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "mcpName": "io.github.cyanheads/orcid-mcp-server",
5
5
  "description": "Search and retrieve researcher profiles, works, affiliations, funding, and peer review records from the ORCID registry via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
@@ -31,7 +31,7 @@
31
31
  "lint:mcp": "bun run scripts/lint-mcp.ts",
32
32
  "lint:packaging": "bun run scripts/lint-packaging.ts",
33
33
  "publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish",
34
- "bundle": "bun run build && npx -y @anthropic-ai/mcpb pack . dist/orcid-mcp-server.mcpb",
34
+ "bundle": "bun run build && npx -y @anthropic-ai/mcpb pack . dist/orcid-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/orcid-mcp-server.mcpb",
35
35
  "changelog:build": "bun run scripts/build-changelog.ts",
36
36
  "changelog:check": "bun run scripts/build-changelog.ts --check",
37
37
  "release:github": "bun run scripts/release-github.ts",
@@ -85,13 +85,13 @@
85
85
  "access": "public"
86
86
  },
87
87
  "dependencies": {
88
- "@cyanheads/mcp-ts-core": "^0.9.21",
88
+ "@cyanheads/mcp-ts-core": "^0.10.6",
89
89
  "pino-pretty": "^13.1.3",
90
90
  "zod": "^4.4.3"
91
91
  },
92
92
  "devDependencies": {
93
- "@biomejs/biome": "^2.4.16",
94
- "@types/node": "^25.9.1",
93
+ "@biomejs/biome": "^2.5.0",
94
+ "@types/node": "^25.9.3",
95
95
  "depcheck": "^1.4.7",
96
96
  "ignore": "^7.0.5",
97
97
  "tsc-alias": "^1.8.17",
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/cyanheads/orcid-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.2.2",
9
+ "version": "0.2.3",
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/orcid-mcp-server",
21
21
  "runtimeHint": "node",
22
- "version": "0.2.2",
22
+ "version": "0.2.3",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -48,7 +48,7 @@
48
48
  "registryBaseUrl": "https://registry.npmjs.org",
49
49
  "identifier": "@cyanheads/orcid-mcp-server",
50
50
  "runtimeHint": "node",
51
- "version": "0.2.2",
51
+ "version": "0.2.3",
52
52
  "packageArguments": [
53
53
  {
54
54
  "type": "positional",