Commit Graph
14 Commits
Author SHA1 Message Date
jcabillot dd41603a0b Merge pull request 'fix: serve MCP over Streamable HTTP instead of legacy SSE' (#58) from fix/streamable-http-transport into main
Main Release / build (push) Canceled after 0s
Main Release / tag (push) Canceled after 0s
Main Release / integration-test (push) Canceled after 1m8s
Main Release / hadolint (push) Canceled after 1m12s
Main Release / test (push) Canceled after 1m10s
Docker Build and Push / test (push) Successful in 2m14s
Renovate / renovate (push) Successful in 1m32s
Docker Build and Push / integration-test (push) Failing after 11m3s
Docker Build and Push / build (push) Skipped
Reviewed-on: #58
2026-10-17 17:42:33 -04:00
Sagent 3b575bbf83 fix(indexer): restore module-level embedding/batch constants
PR Checks / hadolint (pull_request) Successful in 12s
Docker Build and Push / test (pull_request) Successful in 2m17s
Docker Build and Push / integration-test (pull_request) Successful in 2m38s
PR Checks / pytest (pull_request) Successful in 2m19s
Docker Build and Push / build (pull_request) Successful in 2m39s
PR Checks / build-test (pull_request) Successful in 3m5s
The "make indexer importable without env" refactor (e32806a, merged via PR
#52 on 2026-10-09) removed EMBEDDING_MODEL_NAME, BATCH_SIZE and
EMBEDDING_BATCH_SIZE from the module scope while main() kept referencing
them, so every indexer run died before reaching Qdrant:

    File "/app/src/indexer.py", line 264, in main
        print(f"Loading embedding model: {EMBEDDING_MODEL_NAME}...")
    NameError: name 'EMBEDDING_MODEL_NAME' is not defined

CI never caught it because no test executes main(). Both *-indexer cronjobs
have been failing (BackoffLimitExceeded) since 2026-10-16, i.e. the first
run after the image pin moved to v0.0.22-latest.

- restore the three constants with their pre-refactor defaults
- cover them in tests/test_indexer.py and cross-check that the indexer
  embeds with the same model as server.py (vectors must stay comparable)
- add a ruff F821 gate to the unit job so undefined names fail CI

Fixes mcp-maildir-cabilloteu-indexer and mcp-maildir-gmail-indexer.
2026-10-17 21:04:34 +00:00
Sagent bc3deb8676 fix: serve MCP over Streamable HTTP instead of legacy SSE
PR Checks / hadolint (pull_request) Successful in 40s
PR Checks / build-test (pull_request) Successful in 3m19s
PR Checks / pytest (pull_request) Successful in 2m47s
Docker Build and Push / test (pull_request) Successful in 3m1s
Docker Build and Push / integration-test (pull_request) Successful in 3m24s
Docker Build and Push / build (pull_request) Successful in 3m4s
Current MCP clients (OpenCode, Claude, ...) only speak Streamable HTTP: they
POST JSON-RPC to the configured URL, so a legacy SSE endpoint answers
405 Method Not Allowed and not a single tool can be reached.

Run FastMCP's http_app (build_app()) under uvicorn instead of mcp.run(sse):
the MCP endpoint is now /mcp, and the custom GET /health route keeps serving
the Kubernetes probes.

Add transport tests asserting /mcp and /health are exposed and /sse is gone.
2026-10-17 20:45:26 +00:00
OpenCode Cabillot 679d72288f test: fix collection name mismatch — env wiring centralized in conftest
PR Checks / hadolint (pull_request) Successful in 18s
PR Checks / pytest (pull_request) Successful in 1m59s
Docker Build and Push / test (pull_request) Successful in 2m7s
Docker Build and Push / integration-test (pull_request) Successful in 2m14s
PR Checks / build-test (pull_request) Successful in 2m28s
Docker Build and Push / build (pull_request) Successful in 1m50s
Root cause of the CI 404s: test modules mutated os.environ at import time
(test_server.py set COLLECTION_NAME='test', test_integration.py
'test_mcp_maildir'). With pytest's alphabetical import order,
server.COLLECTION_NAME froze at whichever value was set when server was
first imported, while the fixture read os.environ at runtime — often a
different name (log proof: fixture created 'test', server queried
'test_mcp_maildir' → 404 on all 6 tests).

conftest.py now sets QDRANT_URL/COLLECTION_NAME/EMBEDDING_MODEL_NAME once,
before any test module import; env mutation removed from test files.
Unit suite still green (43 passed, 6 deselected).
2026-10-09 12:42:21 +00:00
OpenCode Cabillot ef8fe35da7 test: introspect http client base_url safely
PR Checks / hadolint (pull_request) Successful in 23s
PR Checks / build-test (pull_request) Successful in 34s
Docker Build and Push / test (pull_request) Successful in 2m17s
Docker Build and Push / integration-test (pull_request) Failing after 2m25s
Docker Build and Push / build (pull_request) Skipped
PR Checks / pytest (pull_request) Successful in 1m50s
2026-10-09 12:35:55 +00:00
OpenCode Cabillot 6997326b81 test: fix fixture debug attribute (QdrantClient has no rest_uri)
PR Checks / hadolint (pull_request) Successful in 17s
Docker Build and Push / test (pull_request) Successful in 2m2s
Docker Build and Push / integration-test (pull_request) Failing after 2m4s
Docker Build and Push / build (pull_request) Skipped
PR Checks / pytest (pull_request) Successful in 1m48s
PR Checks / build-test (pull_request) Successful in 2m24s
2026-10-09 12:27:53 +00:00
OpenCode Cabillot a597ecf6a2 test: instrument qdrant_setup fixture (log url + collections before/after create)
PR Checks / hadolint (pull_request) Successful in 18s
Docker Build and Push / test (pull_request) Successful in 2m32s
Docker Build and Push / integration-test (pull_request) Failing after 2m26s
Docker Build and Push / build (pull_request) Skipped
PR Checks / pytest (pull_request) Successful in 2m0s
PR Checks / build-test (pull_request) Successful in 2m33s
2026-10-09 12:21:45 +00:00
OpenCode Cabillot 9417e577a9 test: mark integration suite with pytest.mark.integration
PR Checks / hadolint (pull_request) Successful in 32s
Docker Build and Push / test (pull_request) Successful in 3m40s
Docker Build and Push / integration-test (pull_request) Failing after 4m20s
Docker Build and Push / build (pull_request) Skipped
PR Checks / pytest (pull_request) Successful in 3m29s
PR Checks / build-test (pull_request) Successful in 4m38s
Required for -m 'not integration' to actually deselect them (pytest.ini
addopts) and for 'pytest -m integration' in the nightly CI job.
2026-10-09 00:20:35 +00:00
OpenCode Cabillot b9e22766c0 test: cover build_filter (participant should-clause, date ranges, combination) 2026-10-09 00:16:58 +00:00
OpenCode Cabillot e32806aab9 test: add indexer unit tests + integration marker; make indexer importable without env
- pytest.ini: 'integration' marker, deselected by default; the integration
  suite requires a live Qdrant and will only run in the nightly CI job.
- src/indexer.py: move env validation from import time into _validate_config()
  called by main() — the module can now be imported without MAILDIR_PATH /
  QDRANT_URL / COLLECTION_NAME set, enabling unit tests.
- tests/test_indexer.py: 27 new unit tests, no network and no model:
  decode_mime_words (encoded-words utf-8/iso-8859-1, mixed), extract_text_from_html
  (tags, scripts), normalize_email_address, parse_email_message with real
  EmailMessage objects (plain bodies, attachments detected and excluded from
  body, HTML alternative, unknown charset fallback via raw bytes message,
  encoded attachment filename), get_recent_keys against a real tmp_path
  Maildir (fresh mtime selected, old mtime excluded, colon-suffix keys).
  mailbox.Maildir(create=True) does not create cur/new/tmp on Python 3.11 —
  the test helper pre-creates them.
2026-10-09 00:16:10 +00:00
cloudix_mcp_server 30ac4ae9ca fix: correct integration test assertions for semantic search
Docker Build and Push / test (pull_request) Successful in 14s
Docker Build and Push / integration-test (pull_request) Successful in 1m44s
Docker Build and Push / build (pull_request) Successful in 1m12s
- test_search_by_content: format_search_result() does not include
  body_text, so check for the expected message_id instead.
- test_search_no_results: vector cosine similarity always returns
  nearest neighbors; use a date filter far in the future to
  guarantee zero results instead.
2026-06-12 08:25:52 -04:00
Sagent 07e7de2811 chore: add integration tests with real Qdrant instance
Docker Build and Push / test (pull_request) Successful in 13s
Docker Build and Push / integration-test (pull_request) Failing after 8s
Docker Build and Push / build (pull_request) Has been skipped
- Integration tests for search_emails and read_email against live Qdrant
- Indexes 3 test emails, tests search by content/participant/date
- CI: new 'integration-test' job with qdrant service, runs before build
- Unit test job ignores integration test file
2026-06-11 12:30:59 +00:00
Sagent 78ce84f4ff fix: set QDRANT_URL/COLLECTION_NAME env vars for test import
Docker Build and Push / test (pull_request) Successful in 1m30s
Docker Build and Push / build (pull_request) Successful in 1m11s
2026-06-11 12:24:46 +00:00
Sagent 1700877918 chore: add unit tests for pure functions + CI test job
Docker Build and Push / test (pull_request) Failing after 1m35s
Docker Build and Push / build (pull_request) Has been skipped
- Unit tests for normalize_email_address, payload_matches_participant,
  format_search_result (9 test cases across 3 test classes)
- New 'test' job in CI workflow (runs before build)
- pytest.ini for pythonpath config
2026-06-11 12:18:20 +00:00