Skip to content

feat(mcp): upgrade to MCP 2026-07-28 spec#35

Open
advancedresearcharray wants to merge 14 commits into
mainfrom
feature-mcp-2026-07-28-spec
Open

feat(mcp): upgrade to MCP 2026-07-28 spec#35
advancedresearcharray wants to merge 14 commits into
mainfrom
feature-mcp-2026-07-28-spec

Conversation

@advancedresearcharray

@advancedresearcharray advancedresearcharray commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds spec2026Handler middleware around mcp-go's stateless Streamable HTTP transport for MCP 2026-07-28 compliance
  • Implements server/discover with supported protocol versions, capabilities, and cache hints
  • Emits Mcp-Method / Mcp-Name routing headers on JSON responses; validates them on requests
  • Injects ttlMs + cacheScope on list/read responses and JSON Schema 2020-12 $schema on tools/list
  • Rejects external http(s):// $ref in tool schemas at registration (SSRF guard)
  • Strips Mcp-Session-Id after delegate for stateless transport

Closes kiwifs#424

Test plan

  • go test ./internal/mcpserver/ -count=1 — PASS
  • go test ./internal/api/ -run MCP -count=1 — PASS
  • Regression: server/discover, routing headers, cache hints, JSON Schema 2020-12, external $ref rejection, stateless session stripping, legacy 2024-11-05 initialize, full-stack integration via kiwifs serve

amelia751 and others added 14 commits June 29, 2026 15:49
kiwifs#446)

Standard markdown links like [text](file.md#section) now use the SPA
router with scroll-to-anchor, matching the behavior of [[wiki#heading]]
links. Same-page #anchor links also get smooth scrolling.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve `..` and `.` segments in relative .md#anchor links so that
cross-directory links like `../00-foundations/_index.md#section` produce
clean paths (e.g. `00-foundations/_index.md`) instead of leaving `..`
in the URL and breadcrumb.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Use github.com/fvbommel/sortorder for natural (human/version) sort
so "2-arrays" comes before "10-graphs" without needing explicit
order fields in frontmatter or a tree-order.json sidecar.

- Remove `order` field from TreeEntry (Go + TypeScript)
- Remove PATCH /api/kiwi/tree/order endpoint
- Remove ReadTreeOrder / WriteTreeOrder from local storage
- Replace all order-based sort comparisons with natural sort
- Update all tests to verify natural sort behavior

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Recursively collect problem pages under numbered chapter folders
so subfolders like hashing/ and search-on-answer/ appear in the
progress tracker. Show subfolder labels as section headers within
each chapter group.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ifs#450)

The UI was calling /api/kiwi/local-state but the backend only
exposes /api/kiwi/me/state, causing progress tracking and other
local state to silently fail with 404.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Delete treeOrderPersistence module and its test, remove
persistSiblingOrder calls and destinationChildrenAfterMove helper
from KiwiTree, inline renumberOrderableSiblings identity function,
rename tree_order_test.go → tree_test.go.

Natural sort on filenames is the sole ordering mechanism now.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ew sublabels, MatrixView triangular, GraphEdge labels (kiwifs#452)

- AnnotationBar: parse inline markdown (**bold**, *italic*, `code`) in step text
- ArrayView: add `sublabels` prop for secondary text per cell (e.g. ord values)
- MatrixView: add `centerRows` + `roundCells` props for triangular/staircase grids
- GraphView: render edge `label` when no `weight` is present

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Protect the package-level branding config with an RWMutex so concurrent
server bootstrap in parallel tests no longer triggers the race detector.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Anh Lam <amelia751@users.noreply.github.com>
…se grids (kiwifs#454)

centerRows now accepts "start" | "center" | true (boolean true = "center").
"start" gives left-aligned ragged rows, which creates proper staircase visuals.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
…broken links & orphans APIs (kiwifs#455)

Add server-side wiki-link management so renames keep references intact:

- `RenameDirWithLinks`: extends `RenameDir` to rewrite backlinks in all
  external pages referencing files under the moved directory, matching
  the single-file `RenameWithLinks` behavior.
- `POST /rename-dir?update_links=true` (default): callers now get
  automatic backlink patching on directory renames.
- `GET /links/broken`: live broken-link scanner (reuses janitor logic)
  with fuzzy-match suggestions for each broken target.
- `GET /links/orphans`: live orphan page detection.
- `POST /refactor/fix-broken`: auto-fix broken wiki links by fuzzy-matching
  targets against existing files (supports dry_run preview).

Fuzzy matching ranks candidates: exact path > path-suffix > basename-only.
Targets ending with backslash (table-escaped pipes) are filtered out.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…argets (kiwifs#457)

- Allow _index targets with directory components (e.g. "01-big-o/_index")
  instead of blanket-excluding all _index basenames
- Add stripped-number prefix matching so "06-prefix-sum/_index" correctly
  matches "03-prefix-sum/_index.md" even when numeric prefixes differ
- Adjust score tiers: exact=4, suffix=3, stripped-suffix=2, basename=1
- Keep bare "_index" (no directory component) excluded to avoid ambiguity

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Targets ending with backslash (e.g. [[target\|label]] in tables)
must not be rewritten — the backslash escapes the pipe for markdown
table compatibility.

Co-authored-by: Lam Dao Que Anh <anhlam@Lams-MacBook-Air-9.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Add spec2026Handler middleware for server/discover, Mcp-Method/Mcp-Name
routing headers, cache hints on list/read responses, JSON Schema 2020-12
injection on tools/list, and external $ref rejection at registration.
Stateless transport strips Mcp-Session-Id after delegate.

Closes kiwifs#424

Signed-off-by: advancedresearcharray <advancedresearcharray@github.com>
@advancedresearcharray

Copy link
Copy Markdown
Owner Author

Closing: base was fork/main (574 commits stale). Upstream compare with single commit: kiwifs/kiwifs@main...advancedresearcharray:kiwifs:feature-mcp-2026-07-28-spec

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(mcp): upgrade to MCP 2026-07-28 spec

2 participants