Skip to content

Claude/mcp codekeeper webapp ldnzsg - #3179

Merged
amirbiron merged 12 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg
Jul 19, 2026
Merged

Claude/mcp codekeeper webapp ldnzsg#3179
amirbiron merged 12 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg

Conversation

@amirbiron

@amirbiron amirbiron commented Jul 19, 2026

Copy link
Copy Markdown
Owner

תבנית Pull Request

✨ תיאור קצר

  • מה שיניתם ולמה? (2-3 משפטים)

📦 שינויים עיקריים

  • קוד (Backend)
  • בוט טלגרם
  • מסד נתונים/מיגרציות
  • תיעוד (docs/)
  • DevOps/CI/CD

פירוט נקודות (רשימת תבליטים):

🧪 בדיקות

  • איך בדקתם? מה עבר? מה נשאר?
  • Unit
  • Integration
  • Manual

🧪 בדיקות נדרשות ב‑PR

  • 🔍 Code Quality & Security
  • Unit Tests (3.11)
  • Unit Tests (3.12)

📝 סוג שינוי

  • feat: פיצ'ר חדש
  • fix: תיקון באג
  • docs: שינוי תיעוד בלבד
  • refactor: שינוי קוד ללא שינוי התנהגות
  • perf: שיפור ביצועים
  • chore/ci: תשתית/CI
  • breaking change: שינוי שובר תאימות

דוגמאות Conventional Commits

סוג דוגמה להודעה מתי להשתמש
feat feat: הוספת מסך הגדרות פיצ'ר חדש למשתמש
fix fix: תיקון קריסה בעת התחברות תיקון באג מול משתמשים/פרודקשן
chore chore: שדרוג Gradle ל-8.9 תחזוקה, כלי פיתוח, housekeeping
docs docs: עדכון README עם הוראות התקנה שינויי תיעוד בלבד
refactor refactor: חילוץ Repository ל-UseCases שינוי מבני ללא שינוי התנהגות
test test: הוספת בדיקות ל-LoginViewModel הוספת/עדכון בדיקות
build build: הוספת flavor staging ל-CI שינויים בבילד/תלויות/תצורה

✅ צ'קליסט

  • הקוד עוקב אחרי הסגנון (Black/isort/flake8/mypy)
  • בדיקות רצות ועוברות
  • תיעוד עודכן (README/Docs)
  • אם נוספו ג'ובים חדשים (Background Jobs) – וודא שהם רשומים ב-services/register_jobs.py (כולל Callback/Trigger להפעלה ידנית — למשל callback_name/trigger_func לפי המבנה) כדי שיופיעו בדשבורד
  • אם נוספו/שונו משתני סביבה – עודכן docs/environment-variables.rst וגם services/config_inspector_service.py
  • אם נוספו/השתנו טוקנים – עודכן גם docs/webapp/theming_and_css.rst + FEATURE_SUGGESTIONS/theme_matrix.md
  • אין סודות/מפתחות בקוד
  • אין מחיקות מסוכנות/פעולות על root (ראו .cursorrules)
  • הודעת הקומיט תואמת Conventional Commits (ע"פ הטבלה)
  • CHANGELOG עודכן אם נדרש
  • כל ה‑Required Checks לעיל ירוקים
  • צילום/וידאו UI מצורף אם רלוונטי

🧩 השפעות/סיכונים

  • השפעה אפשרית על פרודקשן, ביצועים, או אבטחה:

🔗 קישורים

🧯 סיכון / החזרה לאחור (Rollback)

  • תוכנית חזרה לאחור במקרה תקלה:

Summary by CodeRabbit

  • שיפורי אבטחה

    • נוספה הגנה מפני DNS rebinding בשירות MCP באמצעות הגדרת מארחים ומקורות מורשים.
    • ניתן להגדיר רשימות מארחים ומקורות באמצעות משתני סביבה, כולל תמיכה ב-wildcards.
  • תיעוד

    • עודכן תיעוד משתני הסביבה החדשים עבור אינטגרציית MCP.
    • הורחבו הוראות הפריסה והחיבור למסד הנתונים, כולל בדיקות תקינות והגדרות נדרשות.
  • תחזוקה

    • הפרויקט עודכן לשימוש ב-Python 3.11.

claude and others added 11 commits July 19, 2026 11:31
מסמך תכנון לחיבור Claude.ai לקבצי המשתמש ב-CodeKeeper דרך שרת MCP מרוחק.

- ממפה את הקיים: שכבת DB in-process (database/repository.py), אימות סשן
  (webapp/app.py:3204), וגשרי טוקנים קיימים (webapp_tokens/remember_tokens).
- מציע ארכיטקטורה: שירות MCP נפרד (ASGI) שניגש ישירות ל-database, מסונן user_id.
- אימות בשתי פאזות: PAT (MVP) → OAuth 2.1 מעל זהות טלגרם הקיימת.
- כלים: list_files/search_code/get_file/list_versions (+ save_file בהמשך).
- אבטחה: read-only כברירת מחדל, בידוד user_id מהטוקן, Smart Projection.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
מימוש פאזה 0 מהתוכנית: שרת MCP מרוחק (Streamable HTTP) קריאה-בלבד שחושף
את קבצי הקוד והאוספים של המשתמש ל-Claude Code/Desktop.

- mcp_server/: חבילת FastMCP עם 7 כלים (list_files, search_code, get_file,
  list_versions, list_collections, get_collection, get_collection_items).
  ניגש ישירות ל-database.db + CollectionsManager, מסונן user_id, מכבד את
  חוק ה-Smart Projection (בלי code ברשימות/חיפוש).
- אימות PAT: token_store.py מנהל טוקנים (hash בלבד) בקולקשן mcp_tokens;
  auth.py מאמת Bearer ומזריק user_id ל-request.state; ה-user_id נגזר תמיד
  מהטוקן, לעולם לא מקלט הלקוח. get_file בודק בעלות גם לפי file_id.
- scripts/mcp_issue_token.py: הנפקת טוקן ל-CLI/בדיקות.
- tests/test_mcp_*.py: 27 טסטים (fakes ידניים, בלי MongoDB אמיתי) —
  token store, בעלות/סריאליזציה, clamping, middleware, ורישום כלים.
- requirements/base.txt: mcp==1.28.1 (תואם לפינים הקיימים).
- מסמך התכנון עודכן לסטטוס "פאזה 0 מומשה" + README ל-mcp_server.

פאזות הבאות (בתכנון): פקודת בוט /connect_claude, OAuth 2.1 ל-Claude.ai, כתיבה.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
… docs

תיקוני סקירה (כל ההערות היו תקפות):
- backend.get_collection_items: הגנת עומק — מסנן שדות כבדים (code/content)
  מפריטי אוסף לפני החזרה, כדי שלא ידלפו גם אם CollectionsManager ישתנה.
- mcp_server/wiring.py: חילוץ resolve_mongo המשותף; הוסרו ההעתקים
  מ-app.py ומ-scripts/mcp_issue_token.py.
- auth.py: לוג לחריגה שנבלעה ב-verify (בלי הטוקן) לצורך אבחון בפרודקשן.
- Markdown: שפת code fence (text) לדיאגרמות ולבלוק ההרצה, ושורות ריקות
  לפני טבלאות (MD040/MD058) ב-README ובמסמך התכנון.
- טסט חדש: מוודא שפריטי אוסף מסוננים משדות כבדים.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
מוסיף פקודת בוט /connect_claude שמנפיקה למשתמש טוקן MCP אישי מתוך טלגרם
(במקום להריץ סקריפט CLI), ומחזירה פקודת חיבור מוכנה ל-Claude Code.

- main.py: connect_claude_command (מודול-לבל), רישום ב-setup_handlers,
  וכניסה ב-HELP_SECTIONS. אבטחה: מונפק בצ'אט פרטי בלבד (שלא ידלוף בקבוצה);
  fallback לטקסט אם פרסום HTML נכשל (לא לאבד את הטוקן).
- files_facade.issue_mcp_token: עוטף את MCPTokenStore (import עצל) כדי
  לשמור את החיווט במקום אחד ולא לגעת ב-PyMongo גולמי מה-handler.
- README + מסמך התכנון עודכנו: /connect_claude זמין, + ENV MCP_SERVER_URL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
…ecrets

מבהיר בדיוק אילו ENV שירות ה-MCP צריך: MONGODB_URL+DATABASE_NAME זהים לבוט/וובאפ
(אותו DB, אחרת הטוקן מ-/connect_claude לא יימצא), BOT_TOKEN רק כדי שה-config
המשותף ייטען, ולא צריך את סודות הוובאפ. MCP_SERVER_URL מוגדר על שירות הבוט.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
לפי תבנית ה-PR: תיעוד משתני הסביבה החדשים ששירות ה-MCP/הבוט משתמשים בהם.

- docs/environment-variables.rst: שתי שורות בטבלת התפעול (URL ציבורי + שם תצוגה).
- services/config_inspector_service.py: ConfigDefinition לשניהם תחת category="mcp",
  כדי שיופיעו ב-Config Inspector.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
Render defaulted the new native Python MCP service to 3.14, where greenlet
(pulled in by gevent) fails to compile — its C++ uses CPython frame internals
that changed in 3.14. The project targets 3.11 (Dockerfile python:3.11-slim; CI
runs 3.11/3.12), so pin the native runtime to a supported version.

- .python-version = 3.11 -> Render uses the latest 3.11 patch.
- No effect on CI (explicit python-version in workflows) or Docker services;
  services that set PYTHON_VERSION explicitly still win over this file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
מתקן כפילות שנוצרה במיזוג/squash: שורת פתיחה ישנה + פסקת ENV כפולה בסעיף הפריסה.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
השרת הפרוס החזיר HTTP 421 "Invalid Host header" — הגנת ה-DNS-rebinding המובנית
של ה-SDK מאשרת כברירת מחדל רק localhost, וחסמה את הדומיין האמיתי
(codekeeper-mcp.onrender.com). הטסטים המקומיים עברו כי הם על 127.0.0.1.

- server.py: transport_security עם enable_dns_rebinding_protection=False
  כברירת מחדל (שרת ציבורי מוגן-טוקן — ההגנה הזו נועדה לשרתי localhost).
  ניתן לנעול עם MCP_ALLOWED_HOSTS (CSV, תומך wildcard) + MCP_ALLOWED_ORIGINS.
- טסטים: ברירת מחדל כבויה + נעילה דרך ENV.
- תיעוד: MCP_ALLOWED_HOSTS/ORIGINS ב-environment-variables.rst + config_inspector.

אומת מקומית: בקשה עם Host מזויף codekeeper-mcp.onrender.com מחזירה 200 (לא 421).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e64c2eab-22a2-4a22-bdc8-1718b6020c6d

📥 Commits

Reviewing files that changed from the base of the PR and between 77d82ce and 703641d.

📒 Files selected for processing (6)
  • .python-version
  • docs/environment-variables.rst
  • mcp_server/README.md
  • mcp_server/server.py
  • services/config_inspector_service.py
  • tests/test_mcp_server_build.py

📝 Walkthrough

Walkthrough

העדכון מוסיף תצורת MCP מתועדת ומרוכזת, מגדיר אבטחת DNS-rebinding עבור השרת, מעדכן הנחיות פריסה, מוסיף בדיקות התנהגות ומגדיר Python 3.11.

Changes

תצורת ואבטחת MCP

Layer / File(s) Summary
חוזה תצורת MCP
.python-version, services/config_inspector_service.py, docs/environment-variables.rst, mcp_server/README.md
נוספו ארבעה משתני סביבה ל-MCP, עודכנו תיעוד והנחיות פריסה, וגרסת Python הוגדרה ל-3.11.
חיבור אבטחת הטרנספורט
mcp_server/server.py
build_mcp יוצר הגדרות TransportSecuritySettings מתוך רשימות hosts ו-origins ומעביר אותן ל-FastMCP.
בדיקות הגנת DNS-rebinding
tests/test_mcp_server_build.py
נבדקים מצב כבוי כברירת מחדל והפעלת ההגנה עם רשימת hosts הכוללת wildcards.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • amirbiron/CodeBot#3177: מוסיף את מימוש שרת MCP שעליו עדכון build_mcp הנוכחי מבוסס.

Poem

ארנב קטן קפץ לשרת,
עם hosts ו-origins בשורה מסודרת,
DNS-rebinding ננעל בשער,
MCP מתועד ונבדק היטב,
ו-Python 3.11 מכין את הדשא לאביב.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Description check ⚠️ Warning ה‑PR description הוא כמעט כולו תבנית ריקה ללא פירוט של What/Why/Tests או סימון שינויים נדרשים. מלאו את סעיפי What/Why/Tests, סמנו את סוגי השינוי והוסיפו פירוט על בדיקות, סיכונים, deploy ו־rollback.
Title check ❓ Inconclusive הכותרת מזכירה MCP/Claude/CodeKeeper, אבל היא לא ברורה מספיק ומכילה מחרוזת לא מוסברת. נסחו כותרת קצרה וברורה שמציינת את השינוי המרכזי, למשל: "Add remote MCP server for Claude Code".
✅ Passed checks (3 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/mcp-codekeeper-webapp-ldnzsg

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

🧯 Dangerous deletes guard report

Policy: see .cursorrules — dangerous deletions are blocked unless wrapped safely.

Summary:

  • Flagged findings (blocking): 0
    0
  • Excluded matches (not blocking): 15
  • Total matches (all files): 129

Flagged findings (file:line:snippet):
(none)

Excluded matches (by path pattern)
./webapp/static/js/md_preview.bundle.js.map:4:  "sourcesContent": ["// Markdown-it plugin to render GitHub-style task lists; see\n//\n// https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments\n// https://github.com/blog/1825-t … [truncated]
./README.md:842:find . -name "__pycache__" -exec rm -rf {} +
./Dockerfile:42:    rm -rf /var/lib/apt/lists/*
./Dockerfile:121:    rm -rf /var/lib/apt/lists/*
./node_modules/mermaid/dist/mermaid.min.js:1524:`,"getStyles"),c1e=RQe});var h1e={};dr(h1e,{diagram:()=>NQe});var NQe,f1e=N(()=>{"use strict";$ge();a1e();l1e();u1e();NQe={parser:Fge,db:n1e,renderer:o1e,styles:c1e}});var m1e,g1e=N(()=>{"use  … [truncated]
./node_modules/mermaid/dist/mermaid.min.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values fo … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.core/chunk-KS23V3DP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence  … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm/chunk-2M32CCKP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence d … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequen … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs:1:var r={name:"mermaid",version:"11.12.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graph … [truncated]
./node_modules/mermaid/dist/mermaid.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values for tr … [truncated]
./node_modules/katex/src/fonts/Makefile:139:	rm -rf pfa ff otf ttf woff woff2
./node_modules/katex/package.json:153:    "build": "rimraf dist/ && mkdirp dist && cp README.md dist && rollup -c --failAfterWarnings && webpack && node update-sri.js package dist/README.md",
./docs/Makefile:24:	rm -rf $(BUILDDIR)
./docs/DOCUMENTATION_GUIDE.md:453:rm -rf _build

@github-actions

Copy link
Copy Markdown

⏱️ Performance report

(No performance test durations collected. Mark tests with @pytest.mark.performance.)

@github-actions

Copy link
Copy Markdown

📖 Documentation Preview

The documentation has been built successfully!

To view locally:

  1. Download the artifacts
  2. Extract the zip file
  3. Open index.html in your browser

@codecov

codecov Bot commented Jul 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@amirbiron
amirbiron merged commit 0d84a9b into main Jul 19, 2026
24 of 25 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Jul 19, 2026
27 tasks
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.

2 participants