Repository navigation
feat: expose authenticated MCP Global Ask #270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
seonghobae
merged 140 commits into
feat/event-lineage-node-keeps-gnb-focus-v2170
from
agent/authenticated-mcp-global-ask
Aug 21, 2026
Merged
Changes from 33 commits
Commits
Show all changes
140 commits
Select commit
Hold shift + click to select a range
ce4663c
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae 03a1167
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae d25eeda
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae 0aaf992
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae 3e5bfca
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae 8966294
ci: repair analysis-run DAG cutoff context
seonghobae cad7327
feat: focus Keyman after GNB Event Lineage names it next (v2.19.0)
seonghobae 7c28bc1
feat: expose authenticated MCP Global Ask
seonghobae 50c67f3
chore: trigger verified MCP lock refresh
seonghobae 9254d6f
ci: verify MCP lock on pull request
seonghobae 5df719b
fix: fail closed on uncited Global Ask answers
seonghobae e03bd42
fix: use the MCP v2 Context generic contract
seonghobae 61d8bb2
test: reject uncited MCP Global Ask answers
seonghobae 8bcf538
fix: fail closed on malformed issuer JWKS
seonghobae e428e46
test: cover malformed issuer JWKS key sets
seonghobae 7211a5e
fix: mark Global Ask as closed-world evidence access
seonghobae 62f7802
test: cover closed-world metadata and Host validation
seonghobae c6b75ce
ci: run every MCP regression during lock refresh
seonghobae 69b8ee5
fix: use supported conduct mode for evidence chat
seonghobae a2e6e8f
test: lock supported conduct chat contract
seonghobae 0b7ee33
docs: align MCP operation with conduct verification
seonghobae 0b4bfc5
feat(mcp): add external Global Ask claim verification
seonghobae 6537dd7
ci: verify lock and supported conduct contract once
seonghobae 6615ac3
test(mcp): cover external Global Ask verification
seonghobae d2dac29
feat(mcp): expose separate external corroboration
seonghobae 2edaf6e
docs: record conduct and citation trust fixes
seonghobae 656d118
test(mcp): expose external verification separately
seonghobae fd0b146
docs: record supported conduct orchestration decision
seonghobae 6926311
fix(mcp): make external verification explicit and privacy-bounded
seonghobae 5468e5b
fix(mcp): require explicit opt-in for open-web verification
seonghobae a9cc99b
test(mcp): require explicit web-verification opt-in
seonghobae 3685b5a
fix(mcp): require cited web evidence for verification verdicts
seonghobae adf591d
test(mcp): lock external verification evidence contract
seonghobae 138d402
docs(mcp): ground external claim verification
seonghobae da8b857
docs(mcp): remove chat-only citation marker
seonghobae 517949b
docs(mcp): record opt-in external claim verification
seonghobae 0267dee
test(mcp): prove web verification is opt-in
seonghobae 0dd0d95
test(mcp): execute opt-in boundary asynchronously
seonghobae 0bd3012
fix(mcp): accept only whole structured verification responses
seonghobae d32f241
fix(mcp): harden explicit external verification boundary
seonghobae e42e74d
ci: implement multimodal MCP Global Ask
seonghobae 8ed5015
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae 3990fc9
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae f9b86fc
docs: assign Calendar focus ADR a unique number
seonghobae 609b61d
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae a5831c0
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae 73887c9
fix: preserve Event Lineage focus after related loads
seonghobae cbdcc6f
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae 1eeac6b
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae b5caf7c
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae 36ef783
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae 29c9732
test: keep customer master router specific
seonghobae 1c37126
test(red): reproduce stale post detail navigation
seonghobae b39fd35
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae 48461d0
merge: restack onto feat/ask-agent-open-focus-event-lineage-v2160
seonghobae bd08c68
merge: restack onto feat/event-lineage-node-keeps-gnb-focus-v2170
seonghobae c910478
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae 85db4e1
fix: reject impossible Weekly VOC dates
seonghobae 8daa419
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae 156a507
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae 5267614
fix: keep Calendar scroll with Event Lineage
seonghobae dc00316
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae 15c82c7
test: keep customer master router specific
seonghobae 8fb0fea
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae 7f36683
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae a731551
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae 4d6494d
fix: ignore stale post detail responses
seonghobae a7f3c12
merge: restack onto latest feat/event-lineage-node-keeps-gnb-focus-v2170
seonghobae 3cf8305
test: install the async pytest runtime
seonghobae a6937b4
fix(mcp): enforce transport security before OAuth
seonghobae a2f1b57
test(mcp): bind pre-auth transport security
seonghobae 35ccc77
docs: record the pre-auth MCP transport boundary
seonghobae 812be55
build: lock MCP runtime and conduct contract
github-actions[bot] fd3ed26
fix(ci): remove stale MCP architecture rewrite
seonghobae 178f355
fix(mcp): delegate post context to orchestrator auto mode
seonghobae 362a6fe
build: lock MCP runtime
github-actions[bot] 2df52bd
fix(config): prefer home gateway credentials
seonghobae d789c30
merge: restack onto latest feat/event-lineage-node-keeps-gnb-focus-v2170
seonghobae 8bbc2ed
chore: restack Keyman focus on current Event Lineage head
seonghobae 5e3e241
chore: reconcile remote Keyman restack with verified tree
seonghobae 251efe1
chore: restack Keyman focus on current Event Lineage head
seonghobae 4506f26
fix: align static SQL contract with safe composition
seonghobae b333958
chore: restack Keyman focus on current Event Lineage head
seonghobae 7d881db
chore: restack Keyman focus on final Event Lineage
seonghobae 4ff6fa2
chore: restack Keyman focus on final Event Lineage
seonghobae 387427e
chore: restack Keyman focus on final Event Lineage
seonghobae afe8c2d
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 0229c4b
test: align embedded image accessibility expectation
seonghobae dc15a23
Merge commit '85013814fd65114c5a75d04297f04e342129b8d1' of https://gi…
seonghobae 86c5f88
fix: avoid keyman ADR number collision
seonghobae 306718f
docs: give authenticated MCP ADR a unique number
seonghobae 55eb838
docs: remove duplicate authenticated MCP ADR number
seonghobae 884fed2
Merge commit '55eb8385de2877ce7ba38b0ba4fbfa798aa21c51' of https://gi…
seonghobae 733c697
fix: isolate gateway tests and reject weak relation hits
seonghobae 95f19d0
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae eb4594d
docs: assign unique ADR number to Valkey events
seonghobae 74c2234
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae e44f1a6
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae a005e7e
Merge current event-lineage base into GNB lineage
seonghobae 284879a
feat: expose lineage timeline and cited images in MCP Ask
seonghobae 60b44c4
merge: propagate current protected Event Lineage base
seonghobae 75cdf43
merge: propagate current Event Lineage branch head
seonghobae a3fdaa9
merge: propagate current protected main
seonghobae 26a6d9c
merge: propagate current semantic-source Event Lineage base
seonghobae 10aced6
fix: harden authenticated MCP evidence paths
seonghobae 0e311a6
test(mcp): require live media authorization
seonghobae 3e73cae
fix(mcp): reauthorize cited media at read time
seonghobae 210cd25
fix(mcp): pass live account identity to media query
seonghobae 3a24c6b
test(keycloak): require live MCP audience reconciliation
seonghobae 0fbbd42
feat(keycloak): reconcile persistent MCP audience mapper
seonghobae 2c6fb8f
feat(keycloak): gate MCP on audience reconciliation
seonghobae f08dadd
docs(adr): preserve live Global Ask authorization
seonghobae bba02ff
docs(mcp): document live media and audience reconciliation
seonghobae 9a2f949
docs(changelog): record live MCP authorization fixes
seonghobae 432d9e9
docs(doctoring): trace Keycloak and live media boundaries
seonghobae 7f7676f
test: align MCP media index with raster filtering
seonghobae 661704b
Merge remote-tracking branch 'origin/agent/authenticated-mcp-global-a…
seonghobae c58aef8
test(chat): require SQL-level source visibility
seonghobae 98bd90b
ci: repair MCP source visibility boundary
seonghobae fa68e99
ci: expose source-visibility repair to PR checks
seonghobae 4508a1d
fix(auth): filter chat sources before body load
seonghobae 0d9e863
test(auth): prove bodies load only after ABAC
seonghobae e8e383a
ci: remove completed source-visibility repair workflow
seonghobae 4a76186
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae b34050d
merge: restack authenticated MCP on buyer navigation
seonghobae 9f87e64
merge: sync authenticated ask branch with main
seonghobae eb83c9c
merge: preserve concurrent buyer navigation restack
seonghobae 1881a3c
chore: normalize MCP import ordering
seonghobae bbbe734
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae e14cb9f
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 5a67017
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae e1c31db
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 259b3b0
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 0beb110
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 515bb0b
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae 8a6a1b6
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae c8b7445
fix: remove self-modifying repair artifacts
seonghobae 4d74f77
Merge remote-tracking branch 'origin/feat/gnb-event-lineage-focus-key…
seonghobae 79687c9
fix: serialize MCP-boundary provider calls
seonghobae c0fcdb6
fix: keep malformed timeline dates sortable
seonghobae File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,101 @@ | ||
| name: Refresh MCP dependency lock once | ||
|
|
||
| on: | ||
| push: | ||
| paths: | ||
| - pyproject.toml | ||
| - .github/workflows/mcp-lock-refresh.yml | ||
| pull_request: | ||
| types: [opened, synchronize, reopened] | ||
| paths: | ||
| - pyproject.toml | ||
| - uv.lock | ||
| - backend/app/mcp_*.py | ||
| - backend/app/global_ask.py | ||
| - backend/app/global_ask_verification.py | ||
| - lineageweave/post_chat.py | ||
| - tests/test_mcp_*.py | ||
| - tests/test_global_ask_external_verification.py | ||
| - tests/test_post_chat_*.py | ||
| - .github/workflows/mcp-lock-refresh.yml | ||
|
|
||
| concurrency: | ||
| group: mcp-lock-refresh-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| permissions: | ||
| contents: write | ||
|
|
||
| jobs: | ||
| refresh-lock: | ||
| if: >- | ||
| github.actor != 'github-actions[bot]' && | ||
| github.repository_owner == 'ContextualWisdomLab' && | ||
| (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout feature branch | ||
| uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # actions/checkout@v7 | ||
| with: | ||
| ref: ${{ github.head_ref || github.ref_name }} | ||
| fetch-depth: 0 | ||
| persist-credentials: true | ||
|
|
||
| - name: Set up Python | ||
| uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # actions/setup-python@v6 | ||
| with: | ||
| python-version: "3.12" | ||
|
|
||
| - name: Set up locked dependency manager | ||
| uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 | ||
| with: | ||
| version: "0.11.28" | ||
| enable-cache: false | ||
|
|
||
| - name: Resolve only the declared dependency change | ||
| run: uv lock | ||
|
|
||
| - name: Remove the superseded verify-mode architecture caveat | ||
| run: | | ||
| python - <<'PY' | ||
| from pathlib import Path | ||
|
|
||
| path = Path("ARCHITECTURE.md") | ||
| text = path.read_text(encoding="utf-8") | ||
| start_marker = "> **Known local-test-environment limitation:**" | ||
| end_marker = "unaffected.\n" | ||
| assert text.count(start_marker) == 1, "expected one stale verify-mode architecture block" | ||
| start = text.index(start_marker) | ||
| end = text.index(end_marker, start) + len(end_marker) | ||
| replacement = ( | ||
| "> **Contextual-orchestrator contract:** Post Ask and MCP Global Ask use the\n" | ||
| "> currently supported `mode=\"conduct\"` path for verified multi-step\n" | ||
| "> reasoning. Model-based verification requires fast-mlsirm in the same\n" | ||
| "> contextual-orchestrator runtime and fails closed when that dependency or\n" | ||
| "> its contract is unavailable. LineageWeave never falls back to a direct\n" | ||
| "> provider or the rejected legacy `verify` mode.\n" | ||
| ) | ||
| path.write_text(text[:start] + replacement + text[end:], encoding="utf-8") | ||
| PY | ||
|
|
||
| - name: Verify the frozen backend environment and MCP regressions | ||
| run: | | ||
| uv sync --frozen --extra dev --extra backend | ||
| uv run --frozen python -m pytest -q \ | ||
| tests/test_mcp_*.py \ | ||
| tests/test_global_ask_external_verification.py \ | ||
| tests/test_post_chat_*.py | ||
|
|
||
| - name: Commit the regenerated lock and architecture contract | ||
| env: | ||
| TARGET_BRANCH: ${{ github.head_ref || github.ref_name }} | ||
| run: | | ||
| git config user.name "github-actions[bot]" | ||
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | ||
| git add uv.lock ARCHITECTURE.md | ||
| if git diff --cached --quiet; then | ||
| echo "lock and architecture already match the product contract" | ||
| exit 0 | ||
| fi | ||
| git commit -m "build: lock MCP runtime and conduct contract" | ||
| git push origin "HEAD:${TARGET_BRANCH}" | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| # 2.13.0 — Authenticated MCP Global Ask | ||
|
|
||
| ## Added | ||
|
|
||
| - Dedicated Streamable HTTP MCP resource server for Codex and other MCP clients. | ||
| - Read-only, idempotent `global_ask` tool over authorized source-post and | ||
| Event-Lineage evidence, with bounded retrieval and citation identities. | ||
| - Explicit `verify_external=true` open-web verification lane: Searxng retrieves | ||
| bounded public evidence and contextual-orchestrator classifies the internal | ||
| answer as `supported`, `refuted`, or `insufficient_evidence` using only those | ||
| retrieved passages. | ||
| - External verification returns separately cited public evidence URLs; those | ||
| URLs never become LineageWeave posts or internal source authority. | ||
| - Codex bearer-token configuration and production OAuth deployment guidance. | ||
|
|
||
| ## Changed | ||
|
|
||
| - Post Ask and MCP Global Ask use contextual-orchestrator's supported | ||
| `mode="conduct"` workflow instead of the rejected legacy `mode="verify"` | ||
| request. | ||
| - `global_ask` advertises `open_world_hint=true` because callers can explicitly | ||
| opt into Searxng web verification; the default remains `verify_external=false`. | ||
| - The evidence-chat timeout is 300 seconds so high-reasoning orchestration is | ||
| finite but not cut off by the previous 60-second default. | ||
|
|
||
| ## Security | ||
|
|
||
| - Exact MCP audience, issuer, expiry, and mandatory JWKS `kid` validation with | ||
| one bounded JWKS refresh for issuer key rotation. | ||
| - Malformed issuer JWKS key collections fail closed as service-unavailable | ||
| instead of escaping as an untyped error. | ||
| - Existing database-backed `post_read`, affiliation, and public-or-corporate | ||
| ABAC checks apply to every retrieved internal source. | ||
| - MCP DNS-rebinding Host/Origin validation is enabled; inbound tokens are never | ||
| forwarded to contextual-orchestrator. | ||
| - An internal answer with no citation inside the authorized source bundle is | ||
| rejected instead of returning unsupported prose. | ||
| - Open-web verification never runs without explicit caller opt-in, and the | ||
| private internal answer body is never used as the Searxng search query. | ||
| - External snippets are treated as untrusted data. `supported` and `refuted` | ||
| require at least one valid cited HTTP(S) evidence URL; otherwise the verdict | ||
| is downgraded to `insufficient_evidence`. |
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.