Repository navigation
feat(mcp): generate a search index and serve it from ports and adapters - #128
Open
oto-macenauer-absa wants to merge 1 commit into
Open
oto-macenauer-absa wants to merge 1 commit into
oto-macenauer-absa wants to merge 1 commit into
Conversation
Build step 3b extracts every page's untrusted HTML into bounded text (mcp/build/) and writes dist/_mcp/search-index.json, kept out of the image's web root by .dockerignore. mcp/search-index/schema.ts is the file format, the only code build and runtime share. The runtime domain sits behind DocumentRepository and SearchBackend ports with a KnowledgeBase facade; adapters/memory/ implements both over the search index (stemmed lexical ranking, title boost, compound split, fuzzy match). A future backend such as OpenSearch is a new adapter pair that must pass tests/support/backend-contract.js. TypeScript limited to erasable syntax so Node runs it as-is; linted by tsc, ESLint strictTypeChecked and Prettier (npm run lint, new CI job), with an import boundary keeping build-time code out of the runtime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 21, 2026
oto-macenauer-absa
added this pull request to stack #130
October 21, 2026 15:40
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
First layer of the MCP server stack (#117): the search index the build generates and the search engine that serves it. No server yet, and nothing is exposed.
Stack: this PR ← #129 (MCP runtime) ← #119 (deployment and docs).
Changes
mcp/search-index/schema.ts: the search index file format andvalidateSearchIndex(). It is the only code that build and runtime share.mcp/build/, build time only:extract.tsturns untrusted page HTML into bounded, markdown-like text with parse5;index-builder.tsbuilds the deterministic index.scripts/build-mcp.js: new build step 3b, which writesdist/_mcp/search-index.json. It is listed in.dockerignore, so it never reaches the nginx web root.mcp/src/, the domain behind ports and adapters:ports.ts: theDocumentRepositoryandSearchBackendports (async; cursors are opaque and owned by the adapter);knowledge-base.ts: theKnowledgeBasefacade;adapters/memory/: the in-memory adapters (stemmed term frequency, title boost, compound split, fuzzy match);compose.ts: wires the adapters to the facade.A future backend such as AWS OpenSearch is a new adapter pair.
TypeScript that Node runs as-is:
mcp/tsconfig.jsonallows only syntax Node can erase.Lint tooling: ESLint strictTypeChecked, Prettier, an import boundary that keeps build-time code out of the runtime,
npm run lint, and a CI lint job.scripts/build-vite.js: public assets are copied rather than hardlinked, which keeps the CI artifact archiver reliable.Tests (
npm run test:mcp):Verification
npm run lint: greennpm audit --omit=dev --audit-level=high: greennpm test: all passednpm run test:mcp: all passednpx playwright test --config=playwright.config.ci.js: all passednpm run test:container: all passedPart of #117
🤖 Generated with Claude Code