# OmniRoute MCP Server Documentation (ខ្មែរ) 🌐 **Languages:** 🇺🇸 [English](../../../../frameworks/MCP-SERVER.md) · 🇪🇹 [am](../../../am/docs/frameworks/MCP-SERVER.md) · 🇸🇦 [ar](../../../ar/docs/frameworks/MCP-SERVER.md) · 🇦🇿 [az](../../../az/docs/frameworks/MCP-SERVER.md) · 🇧🇬 [bg](../../../bg/docs/frameworks/MCP-SERVER.md) · 🇧🇩 [bn](../../../bn/docs/frameworks/MCP-SERVER.md) · 🇧🇦 [bs](../../../bs/docs/frameworks/MCP-SERVER.md) · 🇨🇿 [cs](../../../cs/docs/frameworks/MCP-SERVER.md) · 🇩🇰 [da](../../../da/docs/frameworks/MCP-SERVER.md) · 🇩🇪 [de](../../../de/docs/frameworks/MCP-SERVER.md) · 🇬🇷 [el](../../../el/docs/frameworks/MCP-SERVER.md) · 🇪🇸 [es](../../../es/docs/frameworks/MCP-SERVER.md) · 🇪🇪 [et](../../../et/docs/frameworks/MCP-SERVER.md) · 🇮🇷 [fa](../../../fa/docs/frameworks/MCP-SERVER.md) · 🇫🇮 [fi](../../../fi/docs/frameworks/MCP-SERVER.md) · 🇫🇷 [fr](../../../fr/docs/frameworks/MCP-SERVER.md) · 🇮🇪 [ga](../../../ga/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [gu](../../../gu/docs/frameworks/MCP-SERVER.md) · 🇳🇬 [ha](../../../ha/docs/frameworks/MCP-SERVER.md) · 🇮🇱 [he](../../../he/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [hi](../../../hi/docs/frameworks/MCP-SERVER.md) · 🇭🇷 [hr](../../../hr/docs/frameworks/MCP-SERVER.md) · 🇭🇺 [hu](../../../hu/docs/frameworks/MCP-SERVER.md) · 🇦🇲 [hy](../../../hy/docs/frameworks/MCP-SERVER.md) · 🇮🇩 [id](../../../id/docs/frameworks/MCP-SERVER.md) · 🇳🇬 [ig](../../../ig/docs/frameworks/MCP-SERVER.md) · 🇮🇹 [it](../../../it/docs/frameworks/MCP-SERVER.md) · 🇯🇵 [ja](../../../ja/docs/frameworks/MCP-SERVER.md) · 🇬🇪 [ka](../../../ka/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [kn](../../../kn/docs/frameworks/MCP-SERVER.md) · 🇰🇷 [ko](../../../ko/docs/frameworks/MCP-SERVER.md) · 🇱🇹 [lt](../../../lt/docs/frameworks/MCP-SERVER.md) · 🇱🇻 [lv](../../../lv/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [ml](../../../ml/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [mr](../../../mr/docs/frameworks/MCP-SERVER.md) · 🇲🇾 [ms](../../../ms/docs/frameworks/MCP-SERVER.md) · 🇲🇹 [mt](../../../mt/docs/frameworks/MCP-SERVER.md) · 🇲🇲 [my](../../../my/docs/frameworks/MCP-SERVER.md) · 🇳🇵 [ne](../../../ne/docs/frameworks/MCP-SERVER.md) · 🇳🇱 [nl](../../../nl/docs/frameworks/MCP-SERVER.md) · 🇳🇴 [no](../../../no/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [or](../../../or/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [pa](../../../pa/docs/frameworks/MCP-SERVER.md) · 🇵🇭 [phi](../../../phi/docs/frameworks/MCP-SERVER.md) · 🇵🇱 [pl](../../../pl/docs/frameworks/MCP-SERVER.md) · 🇵🇹 [pt](../../../pt/docs/frameworks/MCP-SERVER.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/frameworks/MCP-SERVER.md) · 🇷🇴 [ro](../../../ro/docs/frameworks/MCP-SERVER.md) · 🇷🇺 [ru](../../../ru/docs/frameworks/MCP-SERVER.md) · 🇱🇰 [si](../../../si/docs/frameworks/MCP-SERVER.md) · 🇸🇰 [sk](../../../sk/docs/frameworks/MCP-SERVER.md) · 🇸🇮 [sl](../../../sl/docs/frameworks/MCP-SERVER.md) · 🇷🇸 [sr](../../../sr/docs/frameworks/MCP-SERVER.md) · 🇸🇪 [sv](../../../sv/docs/frameworks/MCP-SERVER.md) · 🇰🇪 [sw](../../../sw/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [ta](../../../ta/docs/frameworks/MCP-SERVER.md) · 🇮🇳 [te](../../../te/docs/frameworks/MCP-SERVER.md) · 🇹🇭 [th](../../../th/docs/frameworks/MCP-SERVER.md) · 🇹🇷 [tr](../../../tr/docs/frameworks/MCP-SERVER.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/frameworks/MCP-SERVER.md) · 🇵🇰 [ur](../../../ur/docs/frameworks/MCP-SERVER.md) · 🇺🇿 [uz](../../../uz/docs/frameworks/MCP-SERVER.md) · 🇻🇳 [vi](../../../vi/docs/frameworks/MCP-SERVER.md) · 🇳🇬 [yo](../../../yo/docs/frameworks/MCP-SERVER.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/frameworks/MCP-SERVER.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/frameworks/MCP-SERVER.md) --- > ម៉ូដែលពិធីការបរិបទម៉ាស៊ីនមេដែលមានឧបករណ៍ចំនួន 110 នៅក្នុងការកំណត់ផ្លូវ, ឃ្លាំងសម្ងាត់, ការបង្ហាប់, អង្គចងចាំ, ជំនាញ, ប្រូកស៊ី, អាង, រ៉ាដា, និងប្រតិបត្តិការប្រភពបរិបទ។ > > ប្រភពនៃការពិត: `open-sse/mcp-server/server.ts` គណនា **ឧបករណ៍ប្លែកៗចំនួន 110** ជាមួយ `countUniqueMcpTools()`: 45 និយមន័យ Canonical (រួមទាំងឧបករណ៍វដ្តជីវិត CCR ទាំងប្រាំមួយ, ក្រុមជំនាញភ្នាក់ងារ, `omniroute_radar_catalog`, និង `omniroute_x_search`), បូកនឹងអង្គចងចាំ (3), ជំនាញ (4), ជំនាញ GitHub (3), អាង (6), Gamification (8), កម្មវិធីជំនួយ (8), Notion (6), Obsidian (22), Corpus ក្នុងស្រុក (3), និងឧបករណ៍បង្ហាប់ RTK-តែប៉ុណ្ណោះពីរ។ ## ការដំឡើង OmniRoute MCP ត្រូវបានបង្កើតឡើង។ ចាប់ផ្តើមវាជាមួយ: ```bash omniroute --mcp ``` ឬតាមរយៈការដឹកជញ្ជូន open-sse: ```bash # ការដឹកជញ្ជូនស្ទ្រីម HTTP (ច្រក 20130) omniroute --dev # MCP ចាប់ផ្តើមដោយស្វ័យប្រវត្តិនៅលើ /mcp endpoint ``` ការដឹកជញ្ជូន HTTP (`sse` / `streamable-http`, បម្រើក្នុងដំណើរការដោយម៉ាស៊ីនមេផ្ទាំងគ្រប់គ្រង) ត្រូវបាន បិទតាមលំនាំដើម ហើយពីមុនអាចបិទបើកបានតែពីទំព័រ `/dashboard/mcp` ប៉ុណ្ណោះ។ ចាប់ពី v3.8.51 CLI មានភាពស្មើគ្នា: ```bash omniroute mcp status # អាចប្រើបាន/អនឡាញ, ការដឹកជញ្ជូន, ចំនួនឧបករណ៍ omniroute mcp enable [--transport stdio|sse|streamable-http] omniroute mcp disable omniroute mcp restart # កំណត់ឡើងវិញនូវវគ្គ sse/streamable-http សកម្ម ``` `mcp enable`/`mcp disable` PATCH ការកំណត់ `mcpEnabled` (និងជាជម្រើស `mcpTransport`) ដូចគ្នា ដែលផ្ទាំងគ្រប់គ្រងបិទបើកតាមរយៈ `/api/settings`។ `mcp restart` ហៅ `POST /api/mcp/restart`: វាបិទ វគ្គ `sse`/`streamable-http` សកម្ម ដូច្នេះសំណើបន្ទាប់ចាប់ផ្តើមឡើងវិញដោយស្អាត, ត្រឡប់ `409` ប្រសិនបើ MCP ត្រូវបានបិទ, និង `501` សម្រាប់ការដឹកជញ្ជូន `stdio` (អតិថិជន stdio គ្រប់គ្រង ដំណើរការរងរបស់ពួកគេផ្ទាល់ — មិនមានការគ្រប់គ្រងក្នុងដំណើរការដើម្បីចាប់ផ្តើមឡើងវិញទេ)។ ## ការដឹកជញ្ជូន ម៉ាស៊ីនមេ MCP បង្ហាញការដឹកជញ្ជូនចំនួនបី ដែលទាំងអស់ត្រូវបានគាំទ្រដោយរោងចក្រ `createMcpServer()` ដូចគ្នា: | ការដឹកជញ្ជូន | កន្លែង | ពេលណាត្រូវប្រើ | | :---------------- | :--------------------------------------------- | :---------------------------------------------------- | | `stdio` | `open-sse/mcp-server/server.ts` | ការរួមបញ្ចូល IDE (Claude Desktop, Cursor, etc.) | | `sse` | `POST/GET /api/mcp/sse` តាមរយៈ `httpTransport` | អតិថិជន Browser/agent ដែលត្រូវការស្ទ្រីមព្រឹត្តិការណ៍ | | `streamable-http` | `POST/GET/DELETE /api/mcp/stream` | អតិថិជន HTTP ច្រើនវគ្គ (`mcp-session-id` header) | ការដឹកជញ្ជូន HTTP សកម្ម (`sse` ឬ `streamable-http`) ត្រូវបានជ្រើសរើសដោយការកំណត់ `mcpTransport`។ ការប្តូរការដឹកជញ្ជូនបិទវគ្គដែលមានស្រាប់នៅលើការដឹកជញ្ជូនផ្សេងទៀត។ ### ការចូលប្រើពីចម្ងាយ (ការរំលងវិសាលភាពគ្រប់គ្រង) `/api/mcp/*` ស្ថិតនៅក្នុងកម្រិត LOCAL_ONLY (`src/server/authz/routeGuard.ts`) — តាមលំនាំដើម មានតែម៉ាស៊ីន loopback (`localhost`, `127.0.0.1`, `::1`) ប៉ុណ្ណោះដែលអាចទៅដល់វាបាន។ ចាប់តាំងពី v3.8.2 អតិថិជនដែលមិនមែនជា loopback អាចភ្ជាប់បាន ប្រសិនបើពួកគេបង្ហាញ `Authorization: Bearer ` ដែលគន្លឹះនោះមានវិសាលភាព `manage`។ នេះគឺជាមធ្យោបាយតែមួយគត់ដើម្បីទៅដល់ម៉ាស៊ីនមេ MCP ពីចម្ងាយតាមរយៈផ្លូវរូងក្រោមដី, ប្រូកស៊ីបញ្ច្រាស, ឬឈ្មោះម៉ាស៊ីនសាធារណៈ។ ```bash # ផ្តល់វិសាលភាពគ្រប់គ្រង: បើកទំព័រ API Keys របស់ផ្ទាំងគ្រប់គ្រង ហើយបិទបើក # "Management Access" នៅលើគន្លឹះ, ឬ POST scopes:["manage"] នៅពេលបង្កើត។ # បន្ទាប់មកភ្ជាប់ពីអតិថិជន MCP ពីចម្ងាយ: curl -i \ -H "Host: your-public-host.example" \ -H "Authorization: Bearer sk-…" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"my-client","version":"0"}}}' \ https://your-public-host.example/api/mcp/stream ``` គន្លឹះដែលមិនមែនជាការគ្រប់គ្រង (ឬគ្មាន Bearer) ត្រឡប់ `403 LOCAL_ONLY`។ បុព្វបទបងប្អូន `/api/cli-tools/runtime/*` មិនអាចរំលងបានដោយចេតនា — សូមមើល [Route Guard Tiers — Manage-scope carve-out](../security/ROUTE_GUARD_TIERS.md#manage-scope-carve-out)។ ## ការកំណត់រចនាសម្ព័ន្ធ IDE សូមមើល [ការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនភ្ញៀវ MCP](../guides/SETUP_GUIDE.md#mcp-client-configuration) សម្រាប់ Claude Desktop, Cursor, Cline, និងការដំឡើងម៉ាស៊ីនភ្ញៀវ MCP ដែលត្រូវគ្នា។ --- ## ឧបករណ៍សំខាន់ៗ (14) — ដំណាក់កាលទី 1 | Tool | Scopes | Description | | :------------------------------ | :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | | `omniroute_get_health` | `read:health` | រយៈពេលដំណើរការ, អង្គចងចាំ, ឧបករណ៍បំបែកសៀគ្វី, កម្រិតកំណត់អត្រា, ស្ថិតិឃ្លាំងសម្ងាត់ | | `omniroute_list_combos` | `read:combos` | បន្សំដែលបានកំណត់រចនាសម្ព័ន្ធទាំងអស់ជាមួយនឹងយុទ្ធសាស្ត្រ (ម៉ែត្រស្រេចចិត្ត) | | `omniroute_get_combo_metrics` | `read:combos` | ម៉ែត្រដំណើរការសម្រាប់បន្សំជាក់លាក់មួយ | | `omniroute_switch_combo` | `write:combos` | ធ្វើឱ្យសកម្ម ឬអសកម្មបន្សំមួយ | | `omniroute_create_combo` | `write:combos` | បង្កើតបន្សំដែលបានផ្ទៀងផ្ទាត់តាមរយៈ API បន្សំដែលមានស្រាប់ | | `omniroute_check_quota` | `read:quota` | កូតាដែលបានប្រើ/សរុប, ភាគរយដែលនៅសល់, ពេលវេលាកំណត់ឡើងវិញ, សុខភាពថូខឹន | | `omniroute_route_request` | `execute:completions` | ផ្ញើការបញ្ចប់ការជជែកតាមរយៈការកំណត់ផ្លូវ OmniRoute | | `omniroute_cost_report` | `read:usage` | របាយការណ៍ចំណាយតាមរយៈពេល (វគ្គ/ថ្ងៃ/សប្តាហ៍/ខែ) | | `omniroute_list_models_catalog` | `read:models` | កាតាឡុកម៉ូដែលពេញលេញជាមួយនឹងសមត្ថភាព, ស្ថានភាព, តម្លៃ | | `omniroute_radar_catalog` | `read:radar` | កាតាឡុក Radar ដែលបានចុះហត្ថលេខាក្នុងស្រុក; តម្រងអ្នកផ្តល់សេវា/គ្រួសារស្រេចចិត្ត | | `omniroute_tool_search` | `read:tools` | ស្វែងរកឧបករណ៍ពីកាតាឡុក MCP ដែលបានចុះឈ្មោះ | | `omniroute_web_search` | `execute:search` | ស្វែងរកគេហទំព័រតាមរយៈអ្នកផ្តល់សេវាស្វែងរកដែលបានកំណត់រចនាសម្ព័ន្ធ។ មិនមែន X/Twitter ទេ។ | | `omniroute_x_search` | `execute:search` | ស្វែងរក X តាមរយៈ xAI/SuperGrok, ឬជ្រើសរើស `xquik-search` សម្រាប់លទ្ធផល Xquik API។ តម្រូវឱ្យមានព័ត៌មានសម្ងាត់សម្រាប់ផ្នែកខាងក្រោយដែលបានជ្រើសរើស។ | | `omniroute_web_fetch` | `execute:search` | ទាញយកមាតិកាគេហទំព័រតាមរយៈអ្នកផ្តល់សេវាទាញយកដែលបានកំណត់រចនាសម្ព័ន្ធ | ## ឧបករណ៍កម្រិតខ្ពស់ (11) — ដំណាក់កាលទី 2 | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :--------------------------------- | :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | | `omniroute_simulate_route` | `read:health`, `read:combos` | ការក្លែងធ្វើផ្លូវរត់ស្ងួត (dry-run) ជាមួយនឹង fallback tree | | `omniroute_set_budget_guard` | `write:budget` | ថវិកាសម្រាប់វគ្គ (session) ជាមួយនឹងសកម្មភាពបន្ថយ/ទប់ស្កាត់/ជូនដំណឹង | | `omniroute_set_routing_strategy` | `write:combos` | ធ្វើបច្ចុប្បន្នភាពយុទ្ធសាស្ត្រ combo នៅពេលដំណើរការ (priority/weighted/auto/etc.) | | `omniroute_set_resilience_profile` | `write:resilience` | អនុវត្តការកំណត់ជាមុន (preset) នៃភាពធន់ `aggressive` / `balanced` / `conservative` | | `omniroute_test_combo` | `execute:completions`, `read:combos` | ការធ្វើតេស្តផ្ទាល់នៃ provider នីមួយៗនៅក្នុង combo ដោយប្រើការហៅ upstream ពិតប្រាកដ | | `omniroute_get_provider_metrics` | `read:health` | Metric តាម provider ជាមួយនឹង p50/p95/p99 latency និងស្ថានភាព circuit breaker | | `omniroute_best_combo_for_task` | `read:combos`, `read:health` | ណែនាំ combo តាមប្រភេទកិច្ចការ ជាមួយនឹងដែនកំណត់ថវិកា/latency | | `omniroute_explain_route` | `read:health`, `read:usage` | ពន្យល់ពីមូលហេតុដែលសំណើត្រូវបានបញ្ជូនទៅ provider (កត្តាពិន្ទុ + fallbacks) | | `omniroute_get_session_snapshot` | `read:usage` | រូបថតពេញលេញនៃវគ្គ (session): តម្លៃ, tokens, models/providers កំពូល, កំហុស, budget guard | | `omniroute_db_health_check` | `read:health`, `write:resilience` | ធ្វើរោគវិនិច្ឆ័យ (និងជួសជុលដោយស្វ័យប្រវត្តិប្រសិនបើអាច) ការផ្លាស់ប្តូរ database ដូចជា combo refs ដែលខូច / orphan rows | | `omniroute_sync_pricing` | `pricing:write` | ធ្វើសមកាលកម្មទិន្នន័យតម្លៃពីប្រភពខាងក្រៅ (LiteLLM); គាំទ្រ `dryRun` | ## ឧបករណ៍ Cache (2) | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :---------------------- | :------------ | :-------------------------------------------------- | | `omniroute_cache_stats` | `read:cache` | Semantic cache, prompt-cache, និង idempotency stats | | `omniroute_cache_flush` | `write:cache` | Flush cache ជាសកល ឬតាម signature/model | ## ឧបករណ៍បង្រួម (13) | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :---------------------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `omniroute_compression_status` | `read:compression` | ការកំណត់ការបង្រួម, សេចក្តីសង្ខេបការវិភាគ, និង cache-aware stats (រួមបញ្ចូល metadata `analytics.mcpDescriptionCompression`) | | `omniroute_compression_configure` | `write:compression` | កំណត់រចនាសម្ព័ន្ធរបៀបបង្រួម, កម្រិតកំណត់, សមាមាត្រគោលដៅ, ការរក្សា system-prompt, ការបិទ/បើកការបង្រួមការពិពណ៌នា MCP | | `omniroute_set_compression_engine` | `write:compression` | ជ្រើសរើស engine សកម្ម (off/caveman/rtk/stacked) និងកម្រិត Caveman/RTK | | `omniroute_list_compression_combos` | `read:compression` | រាយបញ្ជី compression combos ដែលមានឈ្មោះ និង engine pipelines របស់ពួកគេ | | `omniroute_compression_combo_stats` | `read:compression` | ការវិភាគដែលបានដាក់ជាក្រុមតាម compression combo និង engine | | `omniroute_ccr_store` | `write:compression` | រក្សាទុកមាតិកាដែលដាច់ដោយឡែកពីអ្នកហៅ (caller-isolated) នៅក្នុងឃ្លាំង CCR ក្នុងអង្គចងចាំដែលមានកំណត់ (bounded in-memory) ហើយប្រគល់ marker បូកនឹង reference `ccr://` | | `omniroute_ccr_retrieve` | `read:compression` | ទាញយកមាតិកា CCR ទាំងស្រុង ឬជាមួយនឹងរបៀប head, tail, lines, grep, និង stats | | `omniroute_ccr_inspect` | `read:compression` | ត្រួតពិនិត្យ metadata CCR ដែលជាកម្មសិទ្ធិរបស់អ្នកហៅ (caller-owned) ដោយមិនប្រគល់មាតិកា | | `omniroute_ccr_list` | `read:compression` | រាយបញ្ជី metadata ដែលបានបែងចែកទំព័រ (paginated) សម្រាប់ caller-owned CCR blocks | | `omniroute_ccr_delete` | `write:compression` | លុប caller-owned CCR block | | `omniroute_ccr_stats` | `read:compression` | រាយការណ៍ការប្រើប្រាស់អង្គចងចាំតាម caller (caller-scoped), lifecycle counters, និងដែនកំណត់ឃ្លាំង | | `omniroute_rtk_discover` | `read:compression` | ស្វែងរកសំឡេងរំខានដែលកើតឡើងដដែលៗនៅក្នុង opt-in RTK output samples | | `omniroute_rtk_learn` | `read:compression` | បង្កើត RTK filter draft ដែលអាចពិនិត្យបានពី opt-in samples | ធាតុ CCR គឺស្ថិតនៅក្នុងអង្គចងចាំតែប៉ុណ្ណោះ ហើយបាត់ទៅវិញនៅពេលចាប់ផ្តើមឡើងវិញ។ block នីមួយៗត្រូវបានកំណត់ត្រឹម 2 MiB, principal នីមួយៗត្រឹម 16 MiB, និងឃ្លាំងសកលត្រឹម 64 MiB។ ធាតុមាន TTL លំនាំដើម 24 ម៉ោង (អតិបរមាប្រាំពីរថ្ងៃ)។ ការទាញយក MCP ពេញលេញត្រូវបានកំណត់ត្រឹម 256 KiB; blocks ដែលធំជាងនេះនៅតែអាចប្រើបានតាមរយៈរបៀប ranged និង grep។ ការផ្ទុក, ការទាញយក, ការរាយបញ្ជី, ការត្រួតពិនិត្យ, ការលុប, និង stats ត្រូវបានញែកដាច់ដោយឡែកដោយ API-key principal ដែលបានផ្ទៀងផ្ទាត់។ កំណត់ត្រា Audit មាន hashes និង metadata ទំហំ មិនមែនមាតិកាឡើយ។ `omniroute_compression_status` រាយការណ៍ពីការបង្ហាប់ការពិពណ៌នា MCP ដោយឡែកពីគ្នានៅក្រោម `analytics.mcpDescriptionCompression`។ តម្លៃទាំងនោះគឺជាការប៉ាន់ស្មានទំហំទិន្នន័យមេតាសម្រាប់ ការពិពណ៌នា MCP ដែលអាចរាយបញ្ជីបាន (`tools`, `prompts`, `resources`, និង `resourceTemplates`); ពួកវាមិនមែនជាបង្កាន់ដៃប្រើប្រាស់របស់អ្នកផ្តល់សេវាទេ ហើយត្រូវបានសម្គាល់ដោយ `source: "mcp_metadata_estimate"`។ ### តម្រងដើមឈើភាពងាយស្រួលប្រើ MCP (MCP Accessibility Tree Filter) (v3.8.0) ក្រៅពីឧបករណ៍បង្ហាប់ខាងលើ OmniRoute រួមបញ្ចូលតម្រងក្រោយការប្រតិបត្តិដែល បង្ហាប់**លទ្ធផលឧបករណ៍**នៃឧបករណ៍រុករក/ភាពងាយស្រួលប្រើ MCP មុនពេលពួកវាត្រូវបានបញ្ជូនត្រឡប់ទៅ ភ្នាក់ងារវិញ។ តម្រងនេះមិនមែនជាឧបករណ៍ដោយខ្លួនឯងទេ — វាដំណើរការដោយតម្លាភាពលើលទ្ធផលឧបករណ៍ណាមួយ ដែលមានអត្ថបទដើមឈើភាពងាយស្រួលប្រើ ឬរូបថតអេក្រង់កម្មវិធីរុករកលម្អិត (≥2000 តួអក្សរ)។ ឥរិយាបថសំខាន់ៗ៖ - បង្រួមបន្ទាត់បងប្អូនដែលកើតឡើងដដែលៗជាប់គ្នា ≥30 ទៅជាសេចក្តីសង្ខេបផ្នែកក្បាល + កន្ទុយ - រក្សាទុក `[ref=eXX]` anchors ដែលតម្រូវដោយ Playwright/computer-use - កាត់ផ្តាច់អត្ថបទធំពេក (>50,000 តួអក្សរ) ជាមួយនឹងការណែនាំអំពីការរុករក - ការសន្សំដែលរំពឹងទុក៖ **60–80%** លើទិន្នន័យរូបថតអេក្រង់កម្មវិធីរុករក ការកំណត់រចនាសម្ព័ន្ធ៖ `compression.mcpAccessibility` នៅក្នុងការកំណត់សកល (migration 056)។ ការអនុវត្ត៖ `open-sse/services/compression/engines/mcpAccessibility/`។ ឯកសារពេញលេញ៖ [ម៉ាស៊ីនបង្ហាប់ — តម្រងដើមឈើភាពងាយស្រួលប្រើ MCP](../compression/COMPRESSION_ENGINES.md#mcp-accessibility-tree-filter)។ សូមមើល [ម៉ាស៊ីនបង្ហាប់](../compression/COMPRESSION_ENGINES.md) និង [ការបង្ហាប់ RTK](../compression/RTK_COMPRESSION.md) សម្រាប់ គំរូការបង្ហាប់ពេលដំណើរការនៅពីក្រោយឧបករណ៍ទាំងនេះ។ ## ឧបករណ៍ 1Proxy (3) | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :-------------------------- | :------------- | :--------------------------------------------------------------------------------------- | | `omniroute_oneproxy_fetch` | `read:proxies` | ទាញយកប្រូកស៊ីឥតគិតថ្លៃពីទីផ្សារ 1proxy (តម្រងពិធីការ/ប្រទេស/គុណភាព/ដែនកំណត់) | | `omniroute_oneproxy_rotate` | `read:proxies` | ទទួលបានប្រូកស៊ីបន្ទាប់ដែលអាចប្រើបានតាមយុទ្ធសាស្ត្រ (`random` / `quality` / `sequential`) | | `omniroute_oneproxy_stats` | `read:proxies` | ស្ថិតិ Pool, ស្ថានភាពធ្វើសមកាលកម្ម, ការចែកចាយតាមពិធីការ និងប្រទេស | ## ឧបករណ៍ Memory (3) កំណត់នៅក្នុង `open-sse/mcp-server/tools/memoryTools.ts`។ ការផ្ទៀងផ្ទាត់/វិសាលភាពត្រូវបានអនុវត្តតាមរយៈបំពង់បង្ហូរវិសាលភាព MCP ស្តង់ដារ។ | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :------------------------ | :------------- | :--------------------------------------------------------------------------- | | `omniroute_memory_search` | `read:memory` | ស្វែងរក memories តាមសំណួរ / ប្រភេទ / API key ជាមួយនឹងការអនុវត្តថវិកា token | | `omniroute_memory_add` | `write:memory` | បន្ថែមធាតុ memory ថ្មី (`factual` / `episodic` / `procedural` / `semantic`) | | `omniroute_memory_clear` | `write:memory` | សម្អាត memories សម្រាប់ API key ដោយអាចតម្រងតាមប្រភេទ ឬ `olderThan` timestamp | ## ឧបករណ៍ Skill (4) កំណត់នៅក្នុង `open-sse/mcp-server/tools/skillTools.ts`។ គាំទ្រដោយ `src/lib/skills/registry` + `src/lib/skills/executor`។ | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :---------------------------- | :--------------- | :------------------------------------------------------------------------------------------- | | `omniroute_skills_list` | `read:skills` | រាយបញ្ជី skills ដែលបានចុះឈ្មោះជាមួយនឹងការតម្រងជាជម្រើសតាម API key, ឈ្មោះ, ឬស្ថានភាពដែលបានបើក | | `omniroute_skills_enable` | `write:skills` | បើក ឬបិទ skill ជាក់លាក់មួយតាម ID | | `omniroute_skills_execute` | `execute:skills` | ប្រតិបត្តិ skill ជាមួយនឹងការបញ្ចូលដែលបានផ្ដល់ និងប្រគល់កំណត់ត្រាប្រតិបត្តិមកវិញ | | `omniroute_skills_executions` | `read:skills` | រាយបញ្ជីប្រវត្តិប្រតិបត្តិ skill ថ្មីៗ | ## ប្រភពបរិបទ Notion (6) កំណត់នៅក្នុង `open-sse/mcp-server/tools/notionTools.ts`។ Token ត្រូវបានរក្សាទុកក្នុងតារាង `key_value` តាមរយៈ `src/lib/db/notion.ts`។ REST client នៅក្នុង `src/lib/notion/api.ts`។ Settings API នៅក្នុង `src/app/api/settings/notion/route.ts`។ Dashboard UI នៅក្នុង `src/app/(dashboard)/dashboard/endpoint/components/NotionSourceCard.tsx`។ កំណត់រចនាសម្ព័ន្ធ token ការរួមបញ្ចូល Notion របស់អ្នកពីផ្ទាំង **Context Sources** នៅក្នុងផ្ទាំងគ្រប់គ្រង Endpoint ឬតាមរយៈ REST API៖ ```bash # Set token curl -X POST http://localhost:20128/api/settings/notion \ -H "Content-Type: application/json" \ -d '{"token": "ntn_..."}' # Check status curl http://localhost:20128/api/settings/notion # Disconnect curl -X DELETE http://localhost:20128/api/settings/notion ``` | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា | | :--------------------------- | :------------- | :-------------------------------------------------------------------- | | `notion_search` | `read:notion` | ស្វែងរកអត្ថបទពេញលេញនៅទូទាំងទំព័រ និងមូលដ្ឋានទិន្នន័យទាំងអស់ | | `notion_get_page` | `read:notion` | ទទួលបានទំព័រមួយតាម ID ជាមួយនឹងលក្ខណសម្បត្តិរបស់វា | | `notion_list_block_children` | `read:notion` | រាយបញ្ជី child blocks នៃទំព័រ ឬ block មួយ | | `notion_query_database` | `read:notion` | Query មូលដ្ឋានទិន្នន័យមួយជាមួយនឹងតម្រង, ការតម្រៀប, និង pagination | | `notion_get_database` | `read:notion` | ទទួលបាន schema មូលដ្ឋានទិន្នន័យតាម ID | | `notion_append_blocks` | `write:notion` | បន្ថែម children blocks ទៅ parent block មួយ (អតិបរមា 100 ក្នុងមួយសំណើ) | ## ឧបករណ៍កាតាឡុកជំនាញភ្នាក់ងារ (3) បានកំណត់នៅក្នុង `open-sse/mcp-server/tools/agentSkillTools.ts`។ គាំទ្រដោយ `src/lib/agentSkills/catalog`។ ឧបករណ៍ទាំងនេះបង្ហាញកាតាឡុកឯកសារជំនាញភ្នាក់ងារ 45 ធាតុទៅកាន់ម៉ាស៊ីនភ្ញៀវ MCP និងភ្នាក់ងារខាងក្រៅ។ វិសាលភាព៖ `read:catalog`។ | ឧបករណ៍ | វិសាលភាព | ការពិពណ៌នា The following table lists the tools available in the MCP tool catalog. | Tool | Scopes | Description | | :-------------------------------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------- | | `omniroute_agent_skills_list` | `read:catalog` | រាយបញ្ជីជំនាញភ្នាក់ងារទាំង 45 ជាមួយនឹងតម្រង `category` (api\|cli) និង `area` ស្រេចចិត្ត; ត្រឡប់ metadata + coverage | | `omniroute_agent_skills_get` | `read:catalog` | ទទួលបាន metadata ពេញលេញ + ខ្លឹមសារ SKILL.md សម្រាប់ជំនាញតែមួយដោយ `id` តាមលំដាប់លំដោយ | | `omniroute_agent_skills_coverage` | `read:catalog` | ស្ថិតិគ្របដណ្តប់៖ តើជំនាញ API 23, CLI 21 និង config 1 មានឯកសារ SKILL.md ប៉ុន្មាននៅលើប្រព័ន្ធឯកសារធៀបនឹងចំនួនសរុបក្នុងកាតាឡុក | សូមមើល [AGENT-SKILLS.md](./AGENT-SKILLS.md) សម្រាប់កាតាឡុកពេញលេញ និងរបៀបដែលភ្នាក់ងារខាងក្រៅប្រើប្រាស់វា។ ## ក្របខ័ណ្ឌពាក់ព័ន្ធ (v3.8.0) បញ្ជីឧបករណ៍ MCP ខាងលើ (ឧបករណ៍ប្លែកៗចំនួន 110 ដែលបានគណនាដោយ `countUniqueMcpTools()`) ត្រូវបានកំណត់ដោយចេតនា ចំពោះប្រតិបត្តិការកំណត់ផ្លូវ/ឃ្លាំងសម្ងាត់/ការបង្ហាប់/អង្គចងចាំ/ជំនាញ/ប្រូកស៊ី/ប្រភពបរិបទនៅពេលដំណើរការ។ ក្របខ័ណ្ឌជាប់គ្នាពីរ ត្រូវបានដឹកជញ្ជូនរួមជាមួយម៉ាស៊ីនមេ MCP ក្នុង v3.8.0 ហើយត្រូវបានចងក្រងជាឯកសារដោយឡែកពីគ្នា៖ ### ភ្នាក់ងារ Cloud ភ្នាក់ងារ Cloud គឺជាភ្នាក់ងារសរសេរកូដ AI (codex-cloud, cursor-cloud, devin, jules) ដែលដំណើរការក្រៅដំណើរការ ដែលត្រូវបានភ្ជាប់ទៅ OmniRoute តាមរយៈគំរូការតភ្ជាប់ដូចគ្នាដែលប្រើសម្រាប់អ្នកផ្តល់ LLM។ ពួកវាត្រូវបានបង្ហាញតាមរយៈ ផ្ទៃ REST ផ្ទាល់ខ្លួនរបស់ពួកគេ (`/api/v1/agents/*`) ហើយ **មិនមែន** ជាផ្នែកនៃកាតាឡុកឧបករណ៍ MCP ទេ។ — ការហៅភ្នាក់ងារ Cloud មិនប្រើប្រាស់វិសាលភាព MCP ទេ។ - ការអនុវត្ត៖ `src/lib/cloudAgent/` (`registry.ts`, `agents/codex.ts`, `agents/cursor.ts`, `agents/devin.ts`, `agents/jules.ts`)។ - វដ្តជីវិត៖ `createTask`, `getStatus`, `approvePlan`, `sendMessage`, `listSources`។ - ឯកសារ៖ [docs/frameworks/CLOUD_AGENT.md](./CLOUD_AGENT.md)។ ### Guardrails Guardrails គឺជាតម្រងមុន/ក្រោយការប្រតិបត្តិ (vision-bridge, pii-masker, prompt-injection) ដែលត្រូវបានអនុវត្តនៅក្នុងបំពង់បង្ហូរជជែក។ ពួកវាដំណើរការមុនពេលស្រទាប់ឧបករណ៍/ផ្លូវ MCP ត្រូវបានទៅដល់ ហើយបញ្ចេញការរំលោភបំពានដែលមានរចនាសម្ព័ន្ធទៅកាន់បំពង់បង្ហូរការត្រួតពិនិត្យ; ពួកវាមិនត្រូវបានហៅជាឧបករណ៍ MCP ទេ។ - ការអនុវត្ត៖ `src/lib/guardrails/`។ - ឯកសារ៖ [docs/security/GUARDRAILS.md](../security/GUARDRAILS.md)។ នៅពេលដោះស្រាយកំហុសការហៅ MCP ដែលហាក់ដូចជាត្រូវបានរារាំង សូមពិនិត្យមើលកំណត់ហេតុត្រួតពិនិត្យ MCP (ធាតុ `scope_denied:*`) និងកំណត់ហេតុត្រួតពិនិត្យ guardrails — សំណើអាចត្រូវបានបដិសេធដោយ guardrail **មុន** វាទៅដល់ស្រទាប់អនុវត្តវិសាលភាព MCP ។ --- ## ចំណុចបញ្ចប់ REST API | ចំណុចបញ្ចប់ | វិធីសាស្ត្រ | ការពិពណ៌នា | ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ | | :--------------------- | :-------------------- | :----------------------------------------------------------------------------------------------------- | :--------------------------- | | `/api/mcp/status` | `GET` | ស្ថានភាពម៉ាស៊ីនមេ៖ heartbeat, ស្ថានភាពការដឹកជញ្ជូន HTTP, សេចក្តីសង្ខេបសកម្មភាពត្រួតពិនិត្យ | ការគ្រប់គ្រង (session/admin) | | `/api/mcp/tools` | `GET` | កាតាឡុកឧបករណ៍ (ឈ្មោះ, ការពិពណ៌នា, វិសាលភាព, ដំណាក់កាល, ចំណុចបញ្ចប់ប្រភព) | ការគ្រប់គ្រង | | `/api/mcp/sse` | `GET` / `POST` | ចំណុចបញ្ចប់ការដឹកជញ្ជូន SSE (ត្រូវបានការពារដោយ `mcpEnabled` + `mcpTransport === "sse"`) | គន្លឹះ API + វិសាលភាព | | `/api/mcp/stream` | `POST`/`GET`/`DELETE` | ការដឹកជញ្ជូន HTTP ដែលអាចស្ទ្រីមបាន (ប្រើបឋមកថា `mcp-session-id`; `DELETE` បញ្ចប់វគ្គ) | គន្លឹះ API + វិសាលភាព | | `/api/mcp/audit` | `GET` | ធាតុកំណត់ហេតុត្រួតពិនិត្យពី `mcp_tool_audit` (តម្រង៖ `limit`, `offset`, `tool`, `success`, `apiKeyId`) | ការគ្រប់គ្រង | | `/api/mcp/audit/stats` | `GET` | ស្ថិតិត្រួតពិនិត្យដែលបានប្រមូលផ្តុំ (`totalCalls`, `successRate`, `avgDurationMs`, ឧបករណ៍កំពូល) | ការគ្រប់គ្រង | ឯកសារប្រភព៖ `src/app/api/mcp/{status,tools,sse,stream,audit,audit/stats}/route.ts`។ ទាំង SSE និង Streamable HTTP transports ត្រូវបានរារាំងរហូតដល់ម៉ាស៊ីនមេ MCP ត្រូវបានបើកនៅក្នុង Settings (`mcpEnabled`) ហើយ `mcpTransport` ដែលសមស្របត្រូវបានជ្រើសរើស។ ប្រសិនបើ transport ខុសត្រូវបានកំណត់រចនាសម្ព័ន្ធ ផ្លូវនឹងត្រឡប់ HTTP 400 ជាមួយនឹងការណែនាំដើម្បីប្តូរការកំណត់។ --- ## ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ & វិសាលភាព ការហៅឧបករណ៍ MCP អានខ្សែអក្សរវិសាលភាពពីអ្នកហៅ។ ការត្រួតពិនិត្យនោះគឺជាលំហឈ្មោះឯករាជ្យមួយក្នុងចំណោមបី។ ការឆ្លងកាត់ពីកម្មវិធីត្រួតពិនិត្យមួយ មិនមែនជាការឆ្លងកាត់ពីកម្មវិធីផ្សេងទៀតទេ។ ច្បាប់មាននៅ [លំហឈ្មោះវិសាលភាពទាំងបី](#three-scope-namespaces)។ កាតាឡុកឧបករណ៍មាននៅ [វិសាលភាពឧបករណ៍ MCP](#mcp-tool-scopes)។ ### លំហឈ្មោះវិសាលភាពទាំងបី `manage` នៅលើ API key, `read:compression` នៅលើឧបករណ៍ MCP និង `read` នៅលើ access token `oma_live_…` គឺជាសិទ្ធិផ្តល់ឱ្យបីផ្សេងគ្នា។ អ្នកហៅដែលផ្ញើ access token `read` ទៅកាន់ route គ្រប់គ្រងដែលកែប្រែទិន្នន័យ នឹងទទួលបាន HTTP 403 `Access token scope 'read' is insufficient; 'write' required.` លំដាប់នោះគឺ `scopeSatisfies`។ វាមិនពិនិត្យមើលតារាង MCP ទេ ហើយកម្មវិធីផ្គូផ្គង MCP ក៏មិនពិនិត្យមើលវាដែរ។ | លំហឈ្មោះ | ព័ត៌មានបញ្ជាក់អត្តសញ្ញាណ | កម្មវិធីត្រួតពិនិត្យ | ការឆ្លងកាត់អនុញ្ញាតឱ្យ | | :------------------- | :--------------------------------------------------------------------------- | :------------------------- | :------------------------------------------------------------- | | ការគ្រប់គ្រង API-key | `api_keys.scopes` | `hasManageScope` | Management REST សម្រាប់ Bearer key នោះ | | API-key បន្ថែម | អារេដូចគ្នា និងខ្សែអក្សរដែលត្រូវគ្នាពិតប្រាកដមួយ | helper ដែលមានឈ្មោះខាងក្រោម | សមត្ថភាពតែមួយនោះប៉ុណ្ណោះ | | វិសាលភាពឧបករណ៍ MCP | អារេដូចគ្នា បើមិនដូច្នោះទេ MCP `_meta` បើមិនដូច្នោះទេ `OMNIROUTE_MCP_SCOPES` | `scopeMatches` | ឧបករណ៍នោះ នៅពេលការអនុវត្តបង្ខំត្រូវបានបើក | | Access token | `oma_live_…` | `scopeSatisfies` | route គ្រប់គ្រងដែល method និង path របស់វាតម្រូវឱ្យមានលំដាប់នោះ | ការបង្កើតព័ត៌មានបញ្ជាក់អត្តសញ្ញាណនីមួយៗត្រូវបានរៀបរាប់ក្នុង [ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណសម្រាប់ការគ្រប់គ្រង](../guides/MANAGEMENT-AUTH.md)។ #### វិសាលភាព API-key អារេ `api_keys.scopes` មួយផ្តល់ទិន្នន័យឱ្យការងារពីរ។ ពួកវាប្រើ function ផ្សេងគ្នា។ **Management REST។** `manage` និង `admin` គឺជាសមាជិកនៃ `MANAGEMENT_API_KEY_SCOPES` (`src/shared/constants/managementScopes.ts`)។ `hasManageScope` គឺជាអ្វីដែលផ្តល់សិទ្ធិឱ្យ route គ្រប់គ្រងសម្រាប់ key នោះ។ `admin` មានសមត្ថភាពគ្រប់គ្រងនៅលើ route ទាំងនោះ។ ពាក្យ `admin` នៅទីនេះមិនមែនជា លំដាប់ access-token ទេ ហើយវាមិនពង្រីកទៅជាវិសាលភាពឧបករណ៍ MCP ទេ។ **ខ្សែអក្សរបន្ថែម។** ខ្សែអក្សរនីមួយៗជាការធ្វើតេស្តសមាជិកភាពដែលត្រូវគ្នាពិតប្រាកដ ហើយខ្សែអក្សរនីមួយៗនៅតែ ស្ថិតនៅក្រៅ `MANAGEMENT_API_KEY_SCOPES`។ | វិសាលភាព | ការឆ្លងកាត់អនុញ្ញាតឱ្យ | | :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `mcp:connect` | តែការលើកលែង LOCAL_ONLY សម្រាប់ `/api/mcp/` ដែលមិនមែនជា loopback ប៉ុណ្ណោះ (`hasMcpConnectOrManageScope`)។ key ដែលមាន `manage` ឬ `admin` នៅតែឆ្លងកាត់ការលើកលែងនោះ។ | | `self:usage` | `GET /api/v1/me/status` សម្រាប់ key នេះ (`src/app/api/v1/me/status/route.ts`)។ `POST /api/keys` បន្ថែមវិសាលភាពនេះនៅពេលបង្កើត (`normalizeSelfServiceScopesForCreate`)។ | | `self:account-quota` | កូតាគណនី upstream នៅក្នុង payload ស្ថានភាពនោះ (`src/lib/usage/apiKeySelfService.ts`)។ route ស្ថានភាពនៅតែតម្រូវឱ្យមាន `self:usage`។ | | `policy:bypass-provider-quota` | ការហៅ inference របស់ key នេះរំលងគោលការណ៍ provider-quota (`hasProviderQuotaBypassScope` ក្នុង `src/sse/handlers/chat.ts`)។ | #### ការផ្គូផ្គង កាតាឡុកគឺជាតារាងក្រោម [វិសាលភាពឧបករណ៍ MCP](#mcp-tool-scopes)។ កុំ ចាត់ទុក `MCP_SCOPE_LIST` ក្នុង `src/shared/constants/mcpScopes.ts` ជាកាតាឡុកនោះ៖ វាគឺជាសំណុំរង typed ដើម។ ឧបករណ៍ដែលបន្ថែមនៅពេលក្រោយប្រកាសវិសាលភាពបន្ថែមនៅក្បែរវា (`read:notion`, `read:skills`, `read:local-corpus` និងវិសាលភាពផ្សេងទៀតក្នុងតារាង)។ `evaluateToolScopes` ក្នុង `open-sse/mcp-server/scopeEnforcement.ts` អនុញ្ញាតការហៅ នៅពេលវិសាលភាពដែលត្រូវការទាំងអស់ផ្គូផ្គងនឹងវិសាលភាពដែលបានផ្តល់ឱ្យណាមួយ៖ - `*` ផ្គូផ្គងនឹងវិសាលភាពដែលត្រូវការទាំងអស់។ - វិសាលភាពដែលបានផ្តល់ឱ្យដែលបញ្ចប់ដោយ `*` ផ្គូផ្គងនឹងវិសាលភាពដែលត្រូវការដែលចាប់ផ្តើមដោយ បុព្វបទនៅមុនសញ្ញាផ្កាយ។ `read:*` ផ្គូផ្គងនឹង `read:compression`។ - វិសាលភាពដែលបានផ្តល់ឱ្យផ្សេងទៀតទាំងអស់ ផ្គូផ្គងតែខ្សែអក្សរដែលត្រូវការដូចគ្នាបេះបិទប៉ុណ្ណោះ។ key ដែលវិសាលភាពរបស់វាគឺ `["manage"]` មិនឆ្លងកាត់ `scopeMatches` សម្រាប់ `read:compression` ទេ។ ការហៅដូចគ្នាក៏មិនឆ្លងកាត់សម្រាប់ `admin`, `mcp:connect`, `read` និង `write` ដែរ នៅពេលខ្សែអក្សរទាំងនោះ ជាខ្សែអក្សរដែលបានផ្តល់ឱ្យតែមួយគត់។ មិនមានឋានានុក្រមរវាងវិសាលភាពឧបករណ៍ MCP ទេ ក្រៅពី `*` នៅខាងចុង។ ការអនុវត្តបង្ខំត្រូវបានបិទ លុះត្រាតែ `OMNIROUTE_MCP_ENFORCE_SCOPES=true` (តម្លៃលំនាំដើម `false`)។ ខណៈពេលវាត្រូវបានបិទ `evaluateToolScopes` អនុញ្ញាតការហៅ និងរំលង កាតាឡុក។ ខណៈពេលវាត្រូវបានបើក HTTP ប្រើ `api_keys.scopes` របស់ Bearer key ជា `authInfo` (សូមមើល [ការចងវិសាលភាព HTTP តាម key](#per-key-http-scope-binding-7895))។ នៅពេលគ្មានវិសាលភាព key ត្រូវបានដោះស្រាយ សំណុំដែលបានផ្តល់ឱ្យនឹងបន្តទៅ MCP `_meta` បន្ទាប់មក `OMNIROUTE_MCP_SCOPES`។ #### វិសាលភាព Access-token token `oma_live_…` (`src/lib/accessTokens/scopes.ts`) មាន `read`, `write` ឬ `admin`។ `scopeSatisfies` គឺជាលំដាប់៖ `admin` គ្របដណ្តប់ `write` និង `read` ហើយ `write` គ្របដណ្តប់ `read`។ វិសាលភាពដែលមិនស្គាល់មិនគ្របដណ្តប់អ្វីទាំងអស់។ `evaluateAccessTokenAuth` (`src/server/authz/accessTokenAuth.ts`) ប្រៀបធៀបលំដាប់នោះ ជាមួយ `inferRequiredScope` (`src/server/authz/accessScopes.ts`)៖ - `GET`, `HEAD` និង `OPTIONS` តម្រូវឱ្យមាន `read`។ - method ផ្សេងទៀតទាំងអស់តម្រូវឱ្យមាន `write`។ - path ក្នុង `ADMIN_SCOPE_PREFIXES` តម្រូវឱ្យមាន `admin` សម្រាប់គ្រប់ method។ `/api/mcp` ស្ថិតក្នុងបញ្ជីនោះ ដូច្នេះ access token `write` នៅតែមិនអាចហៅផ្ទៃ HTTP របស់ MCP បាន។ - path ក្នុង `ADMIN_MUTATION_PREFIXES` តម្រូវឱ្យមាន `admin` តែសម្រាប់ mutation ប៉ុណ្ណោះ។ - path ក្នុង `ADMIN_MUTATION_EXACT_PATHS` (`/api/settings`, `/api/settings/require-login`) តម្រូវឱ្យមាន `admin` តែសម្រាប់ mutation ប៉ុណ្ណោះ និងតែចំពោះ path ពិតប្រាកដនោះ — sub-route `/api/settings/*` ផ្សេងទៀតនៅតែរក្សា `write`។ `PATCH /api/keys/{id}` គឺជាប្រតិបត្តិការកែប្រែ ហើយមិនស្ថិតនៅក្នុងបញ្ជី admin ទាំងនោះទេ ដូច្នេះ token ដែលមាន scope `read` នឹងទទួលបាន 403 `Access token scope 'read' is insufficient; 'write' required.` Access token ដែលមាន scope `write` ឬ `admin` អាចបំពេញលក្ខខណ្ឌសម្រាប់ route នោះ។ dashboard JWT, loopback CLI machine-id token និង API key ដែលមាន scope `manage` ឬ `admin` ប្រើសាខាផ្សេងទៀត ហើយមិនត្រូវបានកម្រិតដោយលំដាប់នេះទេ។ Access token ដែលឆ្លងកាត់ `scopeSatisfies` សម្រាប់ `/api/mcp` គ្រាន់តែបានឆ្លងកាត់ច្រកត្រួតពិនិត្យការគ្រប់គ្រងប៉ុណ្ណោះ។ ការហៅ tool នៅតែដំណើរការ `scopeMatches` ដើម្បីផ្ទៀងផ្ទាត់ជាមួយ scope របស់ API key។ លំដាប់របស់ access token មិនមែនជា input សម្រាប់ `scopeMatches` ទេ។ ### Scope របស់ MCP tool ការអនុវត្ត scope ត្រូវបានគ្រប់គ្រងជាកណ្តាលនៅក្នុង `open-sse/mcp-server/scopeEnforcement.ts`។ tool នីមួយៗតម្រូវឱ្យមាន scope ជាក់លាក់៖ | វិសាលភាព | ឧបករណ៍ | | :-------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `read:health` | `get_health`, `get_provider_metrics`, `simulate_route`, `explain_route`, `best_combo_for_task`, `db_health_check` | | `read:combos` | `list_combos`, `get_combo_metrics`, `simulate_route`, `best_combo_for_task`, `test_combo` | | `write:combos` | `switch_combo`, `set_routing_strategy` | | `read:quota` | `check_quota` | | `read:usage` | `cost_report`, `get_session_snapshot`, `explain_route` | | `read:models` | `list_models_catalog` | | `execute:completions` | `route_request`, `test_combo` | | `execute:search` | `web_search`, `x_search`, `web_fetch` | | `write:budget` | `set_budget_guard` | | `write:resilience` | `set_resilience_profile`, `db_health_check` | | `pricing:write` | `sync_pricing` | | `read:cache` | `cache_stats` | | `write:cache` | `cache_flush` | | `read:compression` | `compression_status`, `list_compression_combos`, `compression_combo_stats` | | `write:compression` | `compression_configure`, `set_compression_engine` | | `read:proxies` | `oneproxy_fetch`, `oneproxy_rotate`, `oneproxy_stats` | | `read:notion` | `notion_search`, `notion_get_page`, `notion_list_block_children`, `notion_query_database`, `notion_get_database` | | `write:notion` | `notion_append_blocks` | | `read:memory` | `memory_search` | | `write:memory` | `memory_add`, `memory_clear` | | `read:skills` | `skills_list`, `skills_executions` | | `write:skills` | `skills_enable` | | `execute:skills` | `skills_execute` | | `read:catalog` | `agent_skills_list`, `agent_skills_get`, `agent_skills_coverage` | | `read:tools` | `omniroute_tool_search` | | `read:radar` | `omniroute_radar_catalog` | | `read:gamification` | `gamification_profile`, `gamification_rank`, `gamification_leaderboard`, `gamification_badges`, `gamification_servers`, `gamification_anomalies` | | `write:gamification` | `gamification_invite`, `gamification_transfer` | | `read:plugins` | `plugin_list`, `plugin_executions` | | `write:plugins` | `plugin_scan`, `plugin_install`, `plugin_uninstall`, `plugin_activate`, `plugin_deactivate`, `plugin_configure` | | `read:obsidian` | ឧបករណ៍អាន 13 — `obsidian_list_vault`, `obsidian_read_note`, `obsidian_search_simple`, `obsidian_search_structured`, `obsidian_get_periodic_note`, `obsidian_sync_status`, … | | `write:obsidian` | ឧបករណ៍សរសេរ 9 — `obsidian_write_note`, `obsidian_append_note`, `obsidian_patch_note`, `obsidian_move_note`, `obsidian_delete_note`, `obsidian_sync_trigger`, … | | `read:local-corpus` | `local_corpus_search`, `local_corpus_read`, `local_corpus_status` | វិសាលភាពជំនួសដោយតួអក្សរជំនួសត្រូវបានគាំទ្រ៖ `read:*` ផ្តល់វិសាលភាពអានទាំងអស់ ហើយ `*` ផ្តល់សិទ្ធិចូលប្រើពេញលេញ។ ### `mcp:connect` — សមត្ថភាពផ្លូវដែលមានវិសាលភាពចង្អៀត (#7895) ការចូលទៅកាន់ដំណឹកជញ្ជូន HTTP/SSE MCP (`/api/mcp/*`) ពីអាសយដ្ឋានដែលមិនមែនជា loopback តម្រូវឱ្យមាន ការលើកលែង LOCAL_ONLY សម្រាប់ `/api/mcp/` (សូមមើល `docs/security/ROUTE_GUARD_TIERS.md`)។ កន្លងមក ការលើកលែងនោះទទួលយកតែ API key ដែលមានវិសាលភាព `manage`/`admin` ពេញលេញប៉ុណ្ណោះ — ដែលទូលំទូលាយពេកសម្រាប់ អ្នកហៅដែលគ្រាន់តែត្រូវការទំនាក់ទំនងជាមួយ MCP។ ឥឡូវនេះ `src/shared/constants/managementScopes.ts` នាំចេញ `MCP_CONNECT_SCOPE = "mcp:connect"`៖ ជាវិសាលភាពបន្ថែមដែលមានកម្រិតចង្អៀត (អនុវត្តតាមគំរូដូច `SELF_USAGE_SCOPE`) ដែលអនុញ្ញាតតែការរំលង `/api/mcp/` នៅក្នុង `src/server/authz/policies/management.ts` ប៉ុណ្ណោះ — វាមិនផ្តល់សិទ្ធិចូលប្រើផ្លូវគ្រប់គ្រងផ្សេងទៀតទេ ហើយត្រូវបានដកចេញពី `MANAGEMENT_API_KEY_SCOPES` ដោយចេតនា។ Key ដែលមាន `manage`/`admin` នៅតែអាចឆ្លងកាត់ការលើកលែងនេះដូចដើម។ `mcp:connect` គឺជាជម្រើសដែលមានសិទ្ធិទាបជាង សម្រាប់ អ្នកហៅ MCP ពីចម្ងាយតែប៉ុណ្ណោះ ដែលត្រូវបានផ្ទៀងផ្ទាត់តាមរយៈ `hasMcpConnectOrManageScope()`។ ### ការចងវិសាលភាព HTTP តាម key នីមួយៗ (#7895) តាមរយៈ HTTP/SSE ឥឡូវនេះ `open-sse/mcp-server/httpTransport.ts` ដោះស្រាយ `api_keys.scopes` ពិតប្រាកដរបស់អ្នកហៅ តាមរយៈ `resolveMcpCallerAuthInfo()` (`open-sse/mcp-server/httpAuthContext.ts`) ហើយបញ្ជូនវាទៅ `transport.handleRequest(req, { authInfo })` របស់ MCP SDK ដូច្នេះ `extra.authInfo.scopes` ដែលទៅដល់ការហៅឧបករណ៍នីមួយៗ ឆ្លុះបញ្ចាំងពីវិសាលភាពផ្ទាល់ខ្លួនរបស់ Bearer key។ `resolveCallerScopeContext()` របស់ `scopeEnforcement.ts` បានផ្តល់អាទិភាពដល់ `authInfo` រួចហើយ លើស `_meta` និងជម្រើសបម្រុង env `OMNIROUTE_MCP_SCOPES` — ការផ្លាស់ប្តូរនេះគ្រាន់តែបំពេញប្រភពទីមួយ ដែលមានអាទិភាពខ្ពស់បំផុតនោះ ដែលពីមុនមិនត្រូវបានផ្តល់ទិន្នន័យតាម HTTP។ នៅពេលគ្មាន API key ដែលអាចដោះស្រាយបាន (គ្មាន header ឬ key មិនត្រឹមត្រូវ) `authInfo` នៅតែជា `undefined` ហើយការដោះស្រាយនឹងបន្តទៅកាន់ ខ្សែសង្វាក់ `meta`/env ដែលមានស្រាប់ដោយមិនផ្លាស់ប្តូរ។ stdio មិនមានអត្តសញ្ញាណតាមអ្នកហៅនីមួយៗទេ (សូមមើល `mcpCallerIdentity.ts`) ហើយមិនរងផលប៉ះពាល់ឡើយ — វានៅតែប្រើខ្សែសង្វាក់ជម្រើសបម្រុង `_meta`/env ដដែល។ **ការអនុវត្តបង្ខំត្រូវបានបើកសម្រាប់អ្នកហៅ HTTP/SSE ដែលមានវិសាលភាពចង្អៀត ដោយមិនគិតពី `OMNIROUTE_MCP_ENFORCE_SCOPES` ឡើយ។** ការកំណត់លំនាំដើមរបស់ `OMNIROUTE_MCP_ENFORCE_SCOPES` ជា `false` មានសុវត្ថិភាពតែ សម្រាប់លំហូរ local/stdio ដែលមានប្រតិបត្តិករតែម្នាក់ប៉ុណ្ណោះ ដែលក្នុងនោះមិនមានអត្តសញ្ញាណតាមអ្នកហៅនីមួយៗសម្រាប់កំណត់វិសាលភាពទេ។ `open-sse/mcp-server/server.ts::withScopeEnforcement()` បើកការអនុវត្តវិសាលភាពតាមឧបករណ៍នីមួយៗ ដោយគ្មានលក្ខខណ្ឌ (`shouldForceScopeEnforcement()` នៅក្នុង `scopeEnforcement.ts`) នៅពេលណាដែល `resolveCallerScopeContext()` ដោះស្រាយបាន `source === "authInfo"` (មានន័យថា ជា header HTTP Authorization ពិតប្រាកដតាម key នីមួយៗ សម្រាប់តែ HTTP/SSE) ហើយ key នោះមិនមានវិសាលភាព `manage`/`admin` ពេញលេញ។ វាបិទចន្លោះប្រហោងដែល key ដែលមានតែ វិសាលភាពរំលងចង្អៀត `mcp:connect` — ដែលបានពិពណ៌នាខាងលើថា មិនអនុញ្ញាតអ្វីក្រៅពី ការលើកលែង LOCAL_ONLY សម្រាប់ `/api/mcp/` — បើមិនដូច្នោះទេ អាចហៅឧបករណ៍ MCP ទាំងអស់បាន នៅពេលប្រតិបត្តិករ បើកសិទ្ធិចូលប្រើ MCP ពីចម្ងាយ/មិនមែន loopback ដោយសារតែ `OMNIROUTE_MCP_ENFORCE_SCOPES` ត្រូវបានចែកចាយ ដោយមានតម្លៃលំនាំដើមជា `false`។ Key ដែលមាន `manage`/`admin` ពេញលេញតាម HTTP និងអ្នកហៅ stdio/local ទាំងអស់ នៅតែរក្សា ឥរិយាបថដែលត្រូវបានគ្រប់គ្រងដោយ `OMNIROUTE_MCP_ENFORCE_SCOPES` ដូចដែលមានស្រាប់ ដោយមិនផ្លាស់ប្តូរ។ --- ## អថេរបរិស្ថាន | អថេរ | លំនាំដើម | គោលបំណង | | :-------------------------------------- | :---------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_BASE_URL` | `http://localhost:20128` | URL មូលដ្ឋានដែលម៉ាស៊ីនមេ MCP ប្រើនៅពេលហៅ API ផ្ទៃក្នុងរបស់ OmniRoute | | `OMNIROUTE_API_KEY` | (ទទេ) | សោ API ដែលត្រូវបានបញ្ជូនបន្តជា `Authorization: Bearer` ទៅកាន់ការហៅ API ផ្ទៃក្នុង | | `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` (មានតែ `"true"` ប៉ុណ្ណោះដែលបើកវា) | នៅពេលបើក scope ដែលបាត់នឹងបដិសេធការហៅឧបករណ៍ ហើយកត់ត្រា `scope_denied:` ក្នុងកំណត់ហេតុសវនកម្ម។ ការអនុវត្តក៏ត្រូវបានបង្ខំឱ្យបើកដោយមិនគិតពីទង់នេះផងដែរ សម្រាប់អ្នកហៅ HTTP/SSE ណាមួយដែលត្រូវបានកំណត់ពីបឋមកថា Authorization តាមសោនីមួយៗ (`source === "authInfo"`) ដែលមិនមាន scope `manage`/`admin` ពេញលេញ — ឧទាហរណ៍ សោដែលមានតែ scope ឆ្លងកាត់ដ៏ចង្អៀត `mcp:connect` — ដូច្នេះលំនាំដើមនេះមានសុវត្ថិភាពសម្រាប់តែលំហូរ local/stdio ដែលមានប្រតិបត្តិករតែម្នាក់ប៉ុណ្ណោះ មិនមែនសម្រាប់ការចូលប្រើពីចម្ងាយដែលមិនមែនជា loopback ឡើយ | | `OMNIROUTE_MCP_SCOPES` | (ទទេ) | បញ្ជីអនុញ្ញាតនៃ scope ដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានចាត់ទុកថា "មាន" តាមលំនាំដើម (ប្រើនៅពេលអ្នកហៅមិនផ្តល់ scope របស់ខ្លួន) | | `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | (មិនបានកំណត់ = បើក) | នៅពេលកំណត់ជា `0/false/off/no` វាបិទការបង្ហាប់សេចក្ដីពិពណ៌នា MCP នៅពេលចុះឈ្មោះ | | `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | (មិនបានកំណត់ = បើក) | ឈ្មោះជំនួសសម្រាប់ការបិទបើកដូចគ្នាខាងលើ | | `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | ថវិកាពេលវេលាបោះបង់សម្រាប់ការអានគ្រប់គ្រងផ្ទៃក្នុង (សុខភាព ភាពធន់ បន្សំ កូតា ការប្រើប្រាស់) | | `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | ថវិកាពេលវេលាបោះបង់សម្រាប់ដំណាក់កាលដែលរង់ចាំអ្នកផ្តល់សេវា (`route_request`, `web_search`, `web_fetch`) | | `MCP_TOOL_DENY` | (មិនបានកំណត់ = គ្មានតម្រង) | ឈ្មោះឧបករណ៍ដែលបំបែកដោយសញ្ញាក្បៀស ដើម្បីដកចេញពី `tools/list` (ការកាត់បន្ថយចំនួនប្រភេទឧបករណ៍ — សូមមើលខាងក្រោម) | | `MCP_TOOL_ALLOW` | (មិនបានកំណត់ = គ្មានតម្រង) | ឈ្មោះឧបករណ៍ដែលបំបែកដោយសញ្ញាក្បៀស ដើម្បីរក្សាទុកតែឧបករណ៍ទាំងនោះប៉ុណ្ណោះ (របៀបបញ្ជីអនុញ្ញាត — សូមមើលខាងក្រោម) | | `DATA_DIR` | `~/.omniroute` | ឯកសារ heartbeat ត្រូវបានសរសេរទៅកាន់ `${DATA_DIR}/runtime/mcp-heartbeat.json` | --- ## ការបង្ហាប់ការពិពណ៌នា ការចុះបញ្ជីឧបករណ៍ MCP, ប្រអប់បញ្ចូល និងធនធានអាចបង្ហាប់ការពិពណ៌នានៅពេលចុះឈ្មោះ/បញ្ជី ដើម្បីកាត់បន្ថយទំហំទិន្នន័យមេតាដែលបង្ហាញដល់អតិថិជន (ហើយដូច្នេះកាត់បន្ថយថ្លៃដើមបរិបទប្រអប់បញ្ចូល)។ ការអនុវត្តមាននៅក្នុង `open-sse/mcp-server/descriptionCompressor.ts` ហើយត្រូវបានភ្ជាប់ទៅម៉ាស៊ីនមេ MCP តាមរយៈ `compressMcpRegistryMetadata` នៅក្នុង `createMcpServer()`។ - ការបង្ហាប់ដំណើរការលើអត្ថបទពិពណ៌នាដោយប្រើសំណុំច្បាប់ Caveman (`getRulesForContext("all", "full")`) ជាមួយនឹងការទាញយកប្លុកដែលបានរក្សាទុក (code spans, fenced blocks, etc.) ដូច្នេះមាតិការចនាសម្ព័ន្ធមិនត្រូវបានផ្លាស់ប្តូរទេ។ - បិទបើកតាមការដាក់ពង្រាយនីមួយៗតាមរយៈតម្លៃ `compression.mcpDescriptionCompressionEnabled` នៅក្នុងតារាងការកំណត់ `key_value` (លំនាំដើម: បើក) — បង្ហាញនៅក្នុង UI ជា **Analytics → MCP description compression**។ - បិទបើកទូទាំងដំណើរការតាមរយៈ `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS=false` ឬ `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION=false`។ - ស្ថិតិពេលវេលាពិតត្រូវបានបង្ហាញតាមរយៈ `omniroute_compression_status` ក្រោម `analytics.mcpDescriptionCompression` និងដាក់ស្លាក `source: "mcp_metadata_estimate"` ដើម្បីបែងចែកពីបង្កាន់ដៃប្រើប្រាស់របស់អ្នកផ្តល់សេវាពិតប្រាកដ។ --- ## ការកាត់បន្ថយចំនួនឧបករណ៍ (F4.3) ការបង្រួមការពិពណ៌នាធ្វើឱ្យទិន្នន័យមេតារបស់ឧបករណ៍នីមួយៗរួមតូច; **ការកាត់បន្ថយចំនួនឧបករណ៍** ទៅមុខមួយជំហានទៀតដោយកាត់បន្ថយ _ចំនួន_ ឧបករណ៍ដែលត្រូវបានប្រកាសសរុប។ ការផ្សព្វផ្សាយឧបករណ៍តិចជាងមុននៅក្នុង manifest `tools/list` កាត់បន្ថយថ្លៃដើម token ក្នុងមួយសំណើដែលម៉ូដែលរបស់ client ចំណាយសម្រាប់កាតាឡុកឧបករណ៍ (ការបង្រួម "layer 5")។ ការអនុវត្តគឺជា filter សុទ្ធសាធ គ្មានស្ថានភាព នៅក្នុង `open-sse/mcp-server/toolCardinality.ts` (`reduceToolManifest`) ដែលត្រូវបានភ្ជាប់ទៅក្នុង registration loop នៅក្នុង `createMcpServer()` (`open-sse/mcp-server/server.ts`)។ **ជ្រើសរើសចូល, បិទតាមលំនាំដើម។** filter ដំណើរការតែនៅពេលដែលអថេរបរិស្ថានមួយក្នុងចំណោមពីរត្រូវបានកំណត់ប៉ុណ្ណោះ។ ប្រសិនបើគ្មានកំណត់ទេ ឧបករណ៍ទាំង ១១០ នឹងត្រូវបានប្រកាសដោយមិនផ្លាស់ប្តូរ។ | អថេរ | របៀប | | :--------------- | :--------------------------------------------------------------------------------------------------------------------------- | | `MCP_TOOL_DENY` | បញ្ជីខ្មៅ — ឈ្មោះឧបករណ៍ដែលបំបែកដោយសញ្ញាក្បៀស ដែលតែងតែត្រូវបានទម្លាក់ចេញពី `tools/list` | | `MCP_TOOL_ALLOW` | បញ្ជីអនុញ្ញាត — ឈ្មោះឧបករណ៍ដែលបំបែកដោយសញ្ញាក្បៀស; មានតែឧបករណ៍ទាំងនេះប៉ុណ្ណោះដែលនៅសល់ ឧបករណ៍ផ្សេងទៀតទាំងអស់ត្រូវបានទម្លាក់ចោល | `deny` មានអាទិភាពលើ `allow`។ ឈ្មោះត្រូវបានបំបែកដោយសញ្ញាក្បៀស កាត់តម្រឹម ហើយធាតុទទេត្រូវបានមិនអើពើ។ ឧទាហរណ៍៖ ```bash # Drop two tools from the catalog MCP_TOOL_DENY="omniroute_get_health,omniroute_list_combos" omniroute --mcp # Announce only the routing + quota tools (allow-list mode) MCP_TOOL_ALLOW="omniroute_route_request,omniroute_check_quota" omniroute --mcp ``` **របៀបដែលឧបករណ៍ដែលបានត្រងត្រូវបានដកចេញ៖** ការចុះឈ្មោះតែងតែជោគជ័យ; ឧបករណ៍ដែល profile បដិសេធត្រូវបាន `.disable()` នៅលើ MCP SDK handle ដូច្នេះវាមិនដែលបង្ហាញនៅក្នុង `tools/list` ទេ ប៉ុន្តែការតភ្ជាប់នៅតែដដែល (បើក/បិទស្អាត គ្មានការចុះឈ្មោះឡើងវិញ)។ profile parser គឺ `readMcpToolProfileFromEnv(process.env)` ដែលប្រគល់ `null` មកវិញ (គ្មានការត្រង) នៅពេលដែលអថេរទាំងពីរទទេរ។ ទម្រង់ `ToolProfile` ដែលសម្បូរបែបជាងនៅពីក្រោយ `reduceToolManifest` ក៏គាំទ្រការត្រង scope-intersection (`allowScopes` ជាមួយនឹងការផ្គូផ្គង wildcard រចនាប័ទ្ម `read:*`) និងដែនកំណត់ `maxTools` ដែលអាចកំណត់បាន ប៉ុន្តែមុខងារទាំងពីរនេះត្រូវការ manifest ពេញលេញនៅពេលចុះឈ្មោះ ហើយ **មិន** ត្រូវបានបង្ហាញតាមរយៈអថេរបរិស្ថាននៅថ្ងៃនេះទេ (hook កម្រិត `tools/list` គឺជាការតាមដានដែលបានកត់ត្រា)។ `estimateManifestTokens()` អាចប្រើបានដើម្បីប្រៀបធៀបថ្លៃដើម token របស់ manifest មុន និងក្រោយការកាត់បន្ថយ។ --- ## ចង្វាក់បេះដូងពេលដំណើរការ stdio transport រក្សាទុកស្ថានភាពដំណើរការទៅ `${DATA_DIR}/runtime/mcp-heartbeat.json` រៀងរាល់ 5 វិនាទី។ dashboard (`/api/mcp/status`) អានឯកសារនេះបូកនឹង PID liveness ដើម្បីកំណត់ `online`។ HTTP transports រាយការណ៍ស្ថានភាពពី `getMcpHttpStatus()` ក្នុងដំណើរការជំនួសវិញ (គ្មានការសរសេរឯកសារ)។ snapshot នៃចង្វាក់បេះដូងមាន៖ ```json { "pid": 12345, "startedAt": "2026-05-13T12:34:56.000Z", "lastHeartbeatAt": "2026-05-13T12:35:01.000Z", "version": "1.8.1", "transport": "stdio", "scopesEnforced": false, "allowedScopes": [], "toolCount": 110 } ``` --- ## ការកត់ត្រាការត្រួតពិនិត្យ រាល់ការហៅឧបករណ៍នីមួយៗត្រូវបានកត់ត្រាទៅក្នុងតារាង SQLite `mcp_tool_audit` ដោយ `open-sse/mcp-server/audit.ts`៖ - ឈ្មោះឧបករណ៍, អាគុយម៉ង់ (hashed/truncated តាម `auditLevel` របស់ឧបករណ៍), លទ្ធផល - រយៈពេលគិតជា ms, ទង់ជោគជ័យ/បរាជ័យ, សារកំហុស (នៅពេលចាំបាច់) - API key hash, ពេលវេលា - ការបដិសេធ scope ត្រូវបានកត់ត្រាជា `scope_denied:` ជាមួយនឹងបញ្ជី scope ដែលបាត់។ ប្រើ dashboard ឬ REST endpoint `/api/mcp/audit` និង `/api/mcp/audit/stats` ដើម្បីត្រួតពិនិត្យការហៅថ្មីៗ។ --- ## ឯកសារ | ឯកសារ | គោលបំណង | | :----------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | | `open-sse/mcp-server/server.ts` | រោងចក្រម៉ាស៊ីនមេ MCP, ចំណុចចូល stdio, ការចុះឈ្មោះឧបករណ៍ដែលមានវិសាលភាព | | `open-sse/mcp-server/httpTransport.ts` | ការដឹកជញ្ជូន SSE + Streamable HTTP (ការគ្រប់គ្រងវគ្គ) | | `open-sse/mcp-server/scopeEnforcement.ts` | ការវាយតម្លៃវិសាលភាពឧបករណ៍ និងការដោះស្រាយអ្នកហៅ | | `open-sse/mcp-server/audit.ts` | ការកត់ត្រាការត្រួតពិនិត្យការហៅឧបករណ៍ (`mcp_tool_audit`) | | `open-sse/mcp-server/runtimeHeartbeat.ts` | អ្នកសរសេរបេះដូង stdio (`mcp-heartbeat.json`) | | `open-sse/mcp-server/descriptionCompressor.ts` | ការបង្ហាប់ការពិពណ៌នាសម្រាប់បញ្ជីឈ្មោះឧបករណ៍ / ប្រអប់បញ្ចូល / ធនធាន | | `open-sse/mcp-server/schemas/tools.ts` | Zod schemas + បញ្ជីឈ្មោះឧបករណ៍ (`MCP_TOOLS`, 45 entries) | | `open-sse/mcp-server/tools/advancedTools.ts` | អ្នកគ្រប់គ្រងឧបករណ៍ Phase 2 + cache + 1proxy | | `open-sse/mcp-server/tools/compressionTools.ts` | អ្នកគ្រប់គ្រងឧបករណ៍បង្ហាប់ | | `open-sse/mcp-server/tools/memoryTools.ts` | និយមន័យឧបករណ៍អង្គចងចាំ (ឧបករណ៍ 3) | | `open-sse/mcp-server/tools/skillTools.ts` | និយមន័យឧបករណ៍ជំនាញ (ឧបករណ៍ 4) | | `open-sse/mcp-server/tools/notionTools.ts` | និយមន័យឧបករណ៍ប្រភពបរិបទ Notion (ឧបករណ៍ 6) | | `open-sse/mcp-server/tools/gamificationTools.ts` | និយមន័យឧបករណ៍ Gamification (ឧបករណ៍ 8) | | `open-sse/mcp-server/tools/pluginTools.ts` | ឧបករណ៍ចុះឈ្មោះ និងគ្រប់គ្រងកម្មវិធីជំនួយ (ឧបករណ៍ 8) | | `src/app/api/mcp/status/route.ts` | ចំណុចបញ្ចប់ `/api/mcp/status` | | `src/app/api/mcp/tools/route.ts` | ចំណុចបញ្ចប់ `/api/mcp/tools` | | `src/app/api/mcp/sse/route.ts` | ផ្លូវដឹកជញ្ជូន SSE `/api/mcp/sse` | | `src/app/api/mcp/stream/route.ts` | ផ្លូវដឹកជញ្ជូន Streamable HTTP `/api/mcp/stream` | | `src/app/api/mcp/audit/route.ts` | សំណួរកំណត់ហេតុត្រួតពិនិត្យ `/api/mcp/audit` | | `src/app/api/mcp/audit/stats/route.ts` | ម៉ែត្រត្រួតពិនិត្យរួមបញ្ចូលគ្នា `/api/mcp/audit/stats` | | `src/lib/notion/api.ts` | កម្មវិធីអតិថិជន Notion REST API (ការប៉ុនប៉ងឡើងវិញ, ពេលវេលាផុតកំណត់, ចំណាត់ថ្នាក់កំហុស) | | `src/lib/db/notion.ts` | ការរក្សាទុកថូខឹន Notion (តារាង `key_value`) | | `src/app/api/settings/notion/route.ts` | API ការកំណត់ Notion (GET/POST/DELETE) | | `src/app/(dashboard)/dashboard/endpoint/components/NotionSourceCard.tsx` | UI គ្រប់គ្រងថូខឹន Notion | | `tests/unit/notion-api.test.ts` | ការធ្វើតេស្តកម្មវិធីអតិថិជន Notion API (7) | | `tests/unit/notion-tools.test.ts` | ការធ្វើតេស្តការអនុវត្តវិសាលភាពឧបករណ៍ Notion (10) | | `tests/unit/db/notion.test.mjs` | ការធ្វើតេស្តម៉ូឌុល Notion DB (3) |