5 Commits

Author SHA1 Message Date
test0r 248bef5503 lmcp: 1.1.0 -> 1.1.1 (bug fix: empty inputSchema.properties)
Tracks upstream lmcp v1.1.1 (commit 9707f7a). Single-bug-fix
release: lmcp:tool() now normalises empty inputSchema.properties
by dropping the key, so Zod-strict MCP clients don't reject
tools/list with "expected: record, received: array".

Discovered live on a hertz-tools deployment where two custom
no-arg tools tripped the check and caused Claude Code to mark
the endpoint as disconnected.

New tarball sha256:
  80c2e815aa61a2d3baab051c51cd247bdefa9dd03d72c4867b99c49b6eae9cb9

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 22:47:21 +00:00
marfrit 8a49ac6061 Merge pull request 'lmcp: 1.0.0~rc1 -> 1.1.0 (concurrent dispatch + cancellation + windows sync)' (#23) from claude-noether/marfrit-packages:noether/lmcp-1.1.0 into main
Reviewed-on: marfrit/marfrit-packages#23
2026-05-17 20:22:30 +00:00
test0r 4764f5f37f lmcp: 1.0.0~rc1 -> 1.1.0
Tracks upstream lmcp v1.1.0 (commit 7e62f71). Closes 3 upstream
issues: #11 (progress + cancellation), #18 (windows MSI sync), #20
(concurrent handler dispatch).

Arch:
  pkgver=1.1.0 (no pre-release suffix this time).
  _tag back-translation kept so future rc bumps just need pkgver=X.Y.Z_rcN.

Debian:
  PKGVER=1.1.0 (no ~ suffix).
  Changelog entry summarises the three closed issues + the zero-
  handler-source-changes invariant.

New tarball sha256:
  d758a9504389528cb8940ea81bc8cf47afad8c01166aef3484ac4f5752445532

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 19:44:26 +00:00
marfrit dcb1da2f59 Merge pull request 'lmcp: 0.5.4 -> 1.0.0-rc1 (full MCP 2025-06-18 surface)' (#22) from claude-noether/marfrit-packages:noether/lmcp-1.0.0-rc1 into main 2026-05-17 17:42:16 +00:00
test0r 238c5cee7e lmcp: 0.5.4 -> 1.0.0-rc1 (full MCP 2025-06-18 surface)
Bumps both arch and debian packaging to track upstream v1.0.0-rc1
(commit deb73d1).

Arch (arch/lmcp/PKGBUILD):
  pkgver=1.0.0_rc1 (Arch convention: '_' substitutes for '-' in pre-
  release tags). _tag back-translates for the source URL.

Debian (debian/lmcp/build-deb.sh + changelog):
  PKGVER=1.0.0~rc1 (Debian convention: '~' sorts before the release).
  UPSTREAM_TAG=v1.0.0-rc1 drives the archive URL.

New tarball sha256: 81f9222264371735c196664382460261ef60a259348766bbd6fd2f49ea9d1e7e

What's in 1.0.0-rc1 (full release notes in upstream commit):
  - 14 issues closed
  - new MCP primitives: Resources, Prompts, Completion, Logging,
    Sampling, Roots, fetch, web_search
  - protocol: cursor pagination, structuredContent, _meta, tool
    annotations, protocolVersion bump to 2025-06-18
  - transports: stdio (LMCP_TRANSPORT=stdio), full Streamable HTTP
    rewrite with sessions, persistent SSE, server-initiated requests
  - json.lua: UTF-16 surrogate pairs + empty_object sentinel
  - backwards-compatible with every existing sessionless-POST client

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 17:18:18 +00:00
3 changed files with 69 additions and 6 deletions
+6 -3
View File
@@ -3,15 +3,18 @@
# Source of truth: git.reauktion.de/marfrit/lmcp
pkgname=lmcp
pkgver=0.5.4
pkgver=1.1.1
pkgrel=1
pkgdesc="Lightweight MCP (Model Context Protocol) server in pure Lua"
arch=('any')
url="https://git.reauktion.de/marfrit/lmcp"
license=('MIT')
depends=('lua' 'lua-socket')
source=("${pkgname}-${pkgver}.tar.gz::https://git.reauktion.de/marfrit/lmcp/archive/v${pkgver}.tar.gz")
sha256sums=('af72b8c1d88255456b75d2c53cd5c451a8923417e5498ef31858539397e09caf')
# The _tag back-translation handles both clean releases (no '_') and
# pre-release pkgvers (e.g. 1.2.0_rc1 → v1.2.0-rc1).
_tag="v${pkgver//_/-}"
source=("${pkgname}-${pkgver}.tar.gz::https://git.reauktion.de/marfrit/lmcp/archive/${_tag}.tar.gz")
sha256sums=('80c2e815aa61a2d3baab051c51cd247bdefa9dd03d72c4867b99c49b6eae9cb9')
package() {
cd "${pkgname}"
+4 -3
View File
@@ -7,9 +7,10 @@
# package (Architecture: all, depends on lua + lua-socket).
set -euo pipefail
PKGVER=0.5.4
PKGVER=1.1.1
UPSTREAM_TAG=v1.1.1
PKGREL=1
LMCP_TARBALL_SHA256=af72b8c1d88255456b75d2c53cd5c451a8923417e5498ef31858539397e09caf
LMCP_TARBALL_SHA256=80c2e815aa61a2d3baab051c51cd247bdefa9dd03d72c4867b99c49b6eae9cb9
HERE=$(dirname "$(readlink -f "$0")")
# Reproducible build: pin all file mtimes + ar member timestamps to a fixed
@@ -22,7 +23,7 @@ work=$(mktemp -d)
trap "rm -rf $work" EXIT
cd "$work"
curl -sSLfo lmcp.tar.gz "https://git.reauktion.de/marfrit/lmcp/archive/v${PKGVER}.tar.gz"
curl -sSLfo lmcp.tar.gz "https://git.reauktion.de/marfrit/lmcp/archive/${UPSTREAM_TAG}.tar.gz"
echo "$LMCP_TARBALL_SHA256 lmcp.tar.gz" | sha256sum -c
tar xzf lmcp.tar.gz
+59
View File
@@ -1,3 +1,62 @@
lmcp (1.1.1-1) bookworm trixie; urgency=medium
* Bug fix: omit empty inputSchema.properties at tool registration.
The json.lua empty-table-as-array gotcha (same one that bit
`ping` in v1.0.0-rc1) was re-surfacing on tool inputSchemas
declared with `properties = {}` — spec-strict MCP clients (Zod)
rejected the tools/list with "expected: record, received: array".
lmcp:tool() now normalises empty properties tables by dropping
the key entirely (JSON Schema permits omitting `properties` on
`type:object`, meaning "any object — no constraints").
Discovered live on a hertz-tools deployment where two custom
no-arg tools (lxc_list, network_status) tripped the Zod check
and caused Claude Code to mark the entire MCP endpoint as
disconnected.
-- Markus Fritsche <mfritsche@reauktion.de> Mon, 18 May 2026 00:55:00 +0000
lmcp (1.1.0-1) bookworm trixie; urgency=medium
* Concurrent handler dispatch (closes #20): tool handlers run in
cooperative coroutines. server.lua:run()'s sleep_ms yields to
the event loop instead of blocking. Slow shell commands no
longer serialise other requests — fast ping during a slow
`sleep N` returns in ~10ms (was ~N seconds).
* Progress + cancellation notifications (closes #11): tool
handler ctx gains progress(p, total?, message?) and cancelled().
Client→server notifications/cancelled flips a flag the running
handler sees within ~420ms (poll interval capped when ctx
present). Cancelled requests get a JSON-RPC -32800 error
response (spec wording is "SHOULD NOT respond" but the practical
UX wins; see upstream issue for the FD-inheritance trade-off).
* Windows MSI build sync (closes #18): windows/sync.sh script
refreshes windows/pkg/{lmcp,server,json}.lua from root before
WiX is invoked. Closes the drift trap that left the MSI ~6
months behind master in April 2026.
* Zero handler source-code changes; all existing tools (shell,
fetch, web_search, hub remote_*) benefit from concurrency and
auto-cancellation transparently via the run() helper.
-- Markus Fritsche <mfritsche@reauktion.de> Sun, 17 May 2026 19:45:00 +0000
lmcp (1.0.0~rc1-1) bookworm trixie; urgency=medium
* Full MCP 2025-06-18 surface (release candidate). Closes 14
upstream issues. New primitives: Resources, Prompts, Completion,
Logging, Sampling, Roots, fetch, web_search. Protocol: cursor
pagination, structuredContent, _meta passthrough, tool annotations
(readOnlyHint/destructiveHint/idempotentHint/openWorldHint).
Transports: stdio (LMCP_TRANSPORT=stdio) for Claude Desktop / IDE
clients; full Streamable HTTP rewrite with select()-based event
loop, sessions (Mcp-Session-Id), persistent SSE, server-initiated
requests, heartbeat, DELETE.
* json.lua: UTF-16 surrogate-pair combination + json.empty_object
sentinel for spec-correct {} emission (fixes ping's result:[]
bug).
* Backwards compatible with all existing sessionless-POST clients.
-- Markus Fritsche <mfritsche@reauktion.de> Sun, 17 May 2026 17:25:00 +0000
lmcp (0.5.4-1) bookworm trixie; urgency=medium
* Ship examples/lmcp.service systemd unit template alongside the