sift-cli 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {sift_cli-1.0.0 → sift_cli-1.0.2}/PKG-INFO +35 -7
  2. {sift_cli-1.0.0 → sift_cli-1.0.2}/README.md +34 -6
  3. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/00-PLAN.md +1 -0
  4. sift_cli-1.0.2/notlar/28-KURULUM.md +92 -0
  5. {sift_cli-1.0.0 → sift_cli-1.0.2}/pyproject.toml +4 -1
  6. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/__init__.py +1 -1
  7. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/cli.py +26 -0
  8. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/server.py +5 -2
  9. sift_cli-1.0.2/tanitim/00-PLAN.md +146 -0
  10. sift_cli-1.0.2/tanitim/ARASTIRMA.md +139 -0
  11. sift_cli-1.0.2/tanitim/T1-SURUM-1-0-1.md +50 -0
  12. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/mutations.py +8 -1
  13. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_package.py +18 -0
  14. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_server.py +45 -1
  15. {sift_cli-1.0.0 → sift_cli-1.0.2}/.gitattributes +0 -0
  16. {sift_cli-1.0.0 → sift_cli-1.0.2}/.github/workflows/ci.yml +0 -0
  17. {sift_cli-1.0.0 → sift_cli-1.0.2}/.github/workflows/release.yml +0 -0
  18. {sift_cli-1.0.0 → sift_cli-1.0.2}/.gitignore +0 -0
  19. {sift_cli-1.0.0 → sift_cli-1.0.2}/LICENSE +0 -0
  20. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/01-YAKALAMA.md +0 -0
  21. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/02-MODEL-KOPRUSU.md +0 -0
  22. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/03-DAMITMA.md +0 -0
  23. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/04-GUVENLIK-AGI.md +0 -0
  24. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/05-DIL-BAGIMSIZLIGI.md +0 -0
  25. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/06-DOSYA-TASLAGI.md +0 -0
  26. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/07-MCP-SUNUCUSU.md +0 -0
  27. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/08-BUTCE-VE-OLCUM.md +0 -0
  28. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/09-ARKA-PLAN-KOMUTLARI.md +0 -0
  29. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/10-GIZLILIK.md +0 -0
  30. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/11-YAYIN.md +0 -0
  31. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/12-CAGIRANIN-SOZ-HAKKI.md +0 -0
  32. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/13-DOSYA-DAMITMA.md +0 -0
  33. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/14-ARAYAN-PEEK.md +0 -0
  34. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/15-COKLU-IS.md +0 -0
  35. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/16-HAFIZA.md +0 -0
  36. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/17-YOGUN-ARACLAR.md +0 -0
  37. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/18-KAPSAM.md +0 -0
  38. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/19-KALINTI-MUTASYON.md +0 -0
  39. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/20-KAYIT-BIRIMI.md +0 -0
  40. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/21-SAKLAMA.md +0 -0
  41. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/22-YANIT-ONBELLEGI.md +0 -0
  42. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/23-OLCUM-BIRIMI.md +0 -0
  43. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/24-ANAHTAR.md +0 -0
  44. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/25-TEKLIF.md +0 -0
  45. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/26-BEKLEMEK.md +0 -0
  46. {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/27-WINDOWS.md +0 -0
  47. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/answers.py +0 -0
  48. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/background.py +0 -0
  49. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/capture.py +0 -0
  50. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/digest.py +0 -0
  51. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/distill.py +0 -0
  52. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/fallback.py +0 -0
  53. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/hook.py +0 -0
  54. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/lines.py +0 -0
  55. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/many.py +0 -0
  56. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/memory.py +0 -0
  57. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/model.py +0 -0
  58. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/outline.py +0 -0
  59. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/peek.py +0 -0
  60. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/privacy.py +0 -0
  61. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/records.py +0 -0
  62. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/store.py +0 -0
  63. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/tools.py +0 -0
  64. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/view.py +0 -0
  65. {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/watch.py +0 -0
  66. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/budget.py +0 -0
  67. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/conftest.py +0 -0
  68. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/README.md +0 -0
  69. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ansi-progress.json +0 -0
  70. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ansi-progress.txt +0 -0
  71. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cargo-de.json +0 -0
  72. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cargo-de.txt +0 -0
  73. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cmake-vi.json +0 -0
  74. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cmake-vi.txt +0 -0
  75. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cobol-mainframe.json +0 -0
  76. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cobol-mainframe.txt +0 -0
  77. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/docker-ar.json +0 -0
  78. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/docker-ar.txt +0 -0
  79. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/dotnet-fr.json +0 -0
  80. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/dotnet-fr.txt +0 -0
  81. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ffmpeg-fa.json +0 -0
  82. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ffmpeg-fa.txt +0 -0
  83. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gcc-ru.json +0 -0
  84. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gcc-ru.txt +0 -0
  85. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/git-quiet.json +0 -0
  86. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/git-quiet.txt +0 -0
  87. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gotest-zh.json +0 -0
  88. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gotest-zh.txt +0 -0
  89. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gradle-ko.json +0 -0
  90. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gradle-ko.txt +0 -0
  91. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/journalctl-it.json +0 -0
  92. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/journalctl-it.txt +0 -0
  93. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/kubectl-hi.json +0 -0
  94. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/kubectl-hi.txt +0 -0
  95. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/latex-pl.json +0 -0
  96. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/latex-pl.txt +0 -0
  97. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/maven-tr.json +0 -0
  98. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/maven-tr.txt +0 -0
  99. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/mix-he.json +0 -0
  100. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/mix-he.txt +0 -0
  101. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/psql-es.json +0 -0
  102. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/psql-es.txt +0 -0
  103. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/pytest-en.json +0 -0
  104. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/pytest-en.txt +0 -0
  105. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/rspec-id.json +0 -0
  106. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/rspec-id.txt +0 -0
  107. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/terraform-pt.json +0 -0
  108. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/terraform-pt.txt +0 -0
  109. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/vite-ja.json +0 -0
  110. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/vite-ja.txt +0 -0
  111. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/zig-sw.json +0 -0
  112. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/zig-sw.txt +0 -0
  113. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/clojure-rapor.json +0 -0
  114. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/clojure-rapor.txt +0 -0
  115. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/cpp-baslik.json +0 -0
  116. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/cpp-baslik.txt +0 -0
  117. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/elixir-onbellek.json +0 -0
  118. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/elixir-onbellek.txt +0 -0
  119. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/go-kuyruk.json +0 -0
  120. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/go-kuyruk.txt +0 -0
  121. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/haskell-ayristirici.json +0 -0
  122. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/haskell-ayristirici.txt +0 -0
  123. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/hcl-altyapi.json +0 -0
  124. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/hcl-altyapi.txt +0 -0
  125. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/java-depo.json +0 -0
  126. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/java-depo.txt +0 -0
  127. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/makefile-yapi.json +0 -0
  128. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/makefile-yapi.txt +0 -0
  129. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/python-akis.json +0 -0
  130. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/python-akis.txt +0 -0
  131. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/qqzz-uydurma.json +0 -0
  132. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/qqzz-uydurma.txt +0 -0
  133. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/ruby-fatura.json +0 -0
  134. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/ruby-fatura.txt +0 -0
  135. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/rust-matris.json +0 -0
  136. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/rust-matris.txt +0 -0
  137. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/shell-dagitim.json +0 -0
  138. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/shell-dagitim.txt +0 -0
  139. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/sql-sema.json +0 -0
  140. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/sql-sema.txt +0 -0
  141. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus_reader.py +0 -0
  142. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/languages.py +0 -0
  143. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/outlines.py +0 -0
  144. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_answers.py +0 -0
  145. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_background.py +0 -0
  146. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_capture.py +0 -0
  147. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_cli.py +0 -0
  148. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_digest.py +0 -0
  149. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_distill.py +0 -0
  150. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_fallback.py +0 -0
  151. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_gc.py +0 -0
  152. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_hook.py +0 -0
  153. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_hook_setup.py +0 -0
  154. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_kaynak.py +0 -0
  155. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_korpus.py +0 -0
  156. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_lines.py +0 -0
  157. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_many.py +0 -0
  158. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_model.py +0 -0
  159. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_outline.py +0 -0
  160. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_privacy.py +0 -0
  161. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_records.py +0 -0
  162. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_setup.py +0 -0
  163. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_tokens.py +0 -0
  164. {sift_cli-1.0.0 → sift_cli-1.0.2}/test/wire.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sift-cli
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Runs your command, then gives the model only the lines that matter.
5
5
  Project-URL: Homepage, https://github.com/slymnysr/sift
6
6
  Author: slmnys
@@ -20,6 +20,8 @@ Description-Content-Type: text/markdown
20
20
 
21
21
  # sift
22
22
 
23
+ <!-- mcp-name: io.github.slymnysr/sift -->
24
+
23
25
  Runs your command, then gives the model only the lines that matter.
24
26
 
25
27
  A test suite prints 4,000 lines and eleven of them are the failure. A build
@@ -180,6 +182,7 @@ sift outline PATH what a file declares, without its bodies
180
182
  sift digest PATH... what is in files somebody else produced
181
183
  sift peek HANDLE|PATH [FIRST] [LAST]
182
184
  sift hook answer one shell-command event on stdin
185
+ sift mcp speak the protocol on stdin, for a client
183
186
  sift tools which dense tools this machine has
184
187
  sift tool NAME [ARGS...] run one of them, distilled
185
188
  sift memory [TERM] what has been run here before, and how it went
@@ -243,16 +246,25 @@ result is re-sent on every turn that follows it, so a build log kept out of a
243
246
  transcript goes on staying out of it.
244
247
 
245
248
  ```bash
246
- pip install "sift-cli[mcp]"
247
- export SIFT_API_KEY=nvapi-... # yours; see Installing
248
- claude mcp add sift -- sift-mcp
249
+ uv tool install "sift-cli[mcp]" # or pipx; see Installing
250
+ claude mcp add --scope user sift -- sift-mcp
249
251
  ```
250
252
 
253
+ The key is read from `~/.config/nvidia/api_key`, so it does not have to be in
254
+ the environment and does not have to be pasted anywhere. `--scope user` puts the
255
+ server in every project rather than the one you happen to be in.
256
+
257
+ Then **restart the client**. MCP servers are connected when a session starts, so
258
+ the session you ran that command in will not see this one.
259
+
251
260
  Without a key the server starts and every tool that would need a model declines
252
261
  with an explanation, so the agent falls back to its own shell rather than being
253
262
  handed a worse answer it cannot tell apart from a good one.
254
263
 
255
- Any client that speaks stdio will do the command is `sift-mcp`. It offers
264
+ Any client that speaks stdio will do. The command is `sift-mcp`, and `sift mcp`
265
+ starts the same server — one word for a client that would rather run the package
266
+ by its own name (`uvx --from "sift-cli[mcp]" sift-cli mcp`, which is what the MCP
267
+ registry entry says). It offers
256
268
  `run`, `follow`, `outline`, `digest`, `digest_many`, `tool` and `peek`. `list`
257
269
  and `stats` are deliberately not offered: they would hand a model every command lately run on this machine,
258
270
  including the ones it never asked about, and the person at a terminal already
@@ -265,10 +277,26 @@ the lines or none could be reached.
265
277
  ## Installing
266
278
 
267
279
  ```bash
268
- pip install sift-cli # the command line, no dependencies at all
269
- pip install "sift-cli[mcp]" # and the MCP server
280
+ uv tool install sift-cli # the command line, no dependencies at all
281
+ uv tool install "sift-cli[mcp]" # and the MCP server
270
282
  ```
271
283
 
284
+ `pipx install` does the same thing. Either puts `sift` and `sift-mcp` on your
285
+ PATH in an environment of their own, which is what you want for a command-line
286
+ tool: nothing here belongs in the Python you build with.
287
+
288
+ Plain `pip install sift-cli` works inside a virtualenv you have already
289
+ activated. It does **not** work against the system Python on Debian, Ubuntu, or
290
+ WSL — those ship a `EXTERNALLY-MANAGED` marker and pip refuses, by design:
291
+
292
+ ```
293
+ error: externally-managed-environment
294
+ × This environment is externally managed
295
+ ```
296
+
297
+ That refusal is right and the answer is not `--break-system-packages`. Use `uv
298
+ tool` or `pipx`.
299
+
272
300
  The package is `sift-cli` and the commands are `sift` and `sift-mcp`. The names
273
301
  differ because `sift-mcp` on PyPI belongs to somebody else's project — an
274
302
  unrelated MCP server about authorising agent actions. Nothing here is theirs and
@@ -1,5 +1,7 @@
1
1
  # sift
2
2
 
3
+ <!-- mcp-name: io.github.slymnysr/sift -->
4
+
3
5
  Runs your command, then gives the model only the lines that matter.
4
6
 
5
7
  A test suite prints 4,000 lines and eleven of them are the failure. A build
@@ -160,6 +162,7 @@ sift outline PATH what a file declares, without its bodies
160
162
  sift digest PATH... what is in files somebody else produced
161
163
  sift peek HANDLE|PATH [FIRST] [LAST]
162
164
  sift hook answer one shell-command event on stdin
165
+ sift mcp speak the protocol on stdin, for a client
163
166
  sift tools which dense tools this machine has
164
167
  sift tool NAME [ARGS...] run one of them, distilled
165
168
  sift memory [TERM] what has been run here before, and how it went
@@ -223,16 +226,25 @@ result is re-sent on every turn that follows it, so a build log kept out of a
223
226
  transcript goes on staying out of it.
224
227
 
225
228
  ```bash
226
- pip install "sift-cli[mcp]"
227
- export SIFT_API_KEY=nvapi-... # yours; see Installing
228
- claude mcp add sift -- sift-mcp
229
+ uv tool install "sift-cli[mcp]" # or pipx; see Installing
230
+ claude mcp add --scope user sift -- sift-mcp
229
231
  ```
230
232
 
233
+ The key is read from `~/.config/nvidia/api_key`, so it does not have to be in
234
+ the environment and does not have to be pasted anywhere. `--scope user` puts the
235
+ server in every project rather than the one you happen to be in.
236
+
237
+ Then **restart the client**. MCP servers are connected when a session starts, so
238
+ the session you ran that command in will not see this one.
239
+
231
240
  Without a key the server starts and every tool that would need a model declines
232
241
  with an explanation, so the agent falls back to its own shell rather than being
233
242
  handed a worse answer it cannot tell apart from a good one.
234
243
 
235
- Any client that speaks stdio will do the command is `sift-mcp`. It offers
244
+ Any client that speaks stdio will do. The command is `sift-mcp`, and `sift mcp`
245
+ starts the same server — one word for a client that would rather run the package
246
+ by its own name (`uvx --from "sift-cli[mcp]" sift-cli mcp`, which is what the MCP
247
+ registry entry says). It offers
236
248
  `run`, `follow`, `outline`, `digest`, `digest_many`, `tool` and `peek`. `list`
237
249
  and `stats` are deliberately not offered: they would hand a model every command lately run on this machine,
238
250
  including the ones it never asked about, and the person at a terminal already
@@ -245,10 +257,26 @@ the lines or none could be reached.
245
257
  ## Installing
246
258
 
247
259
  ```bash
248
- pip install sift-cli # the command line, no dependencies at all
249
- pip install "sift-cli[mcp]" # and the MCP server
260
+ uv tool install sift-cli # the command line, no dependencies at all
261
+ uv tool install "sift-cli[mcp]" # and the MCP server
250
262
  ```
251
263
 
264
+ `pipx install` does the same thing. Either puts `sift` and `sift-mcp` on your
265
+ PATH in an environment of their own, which is what you want for a command-line
266
+ tool: nothing here belongs in the Python you build with.
267
+
268
+ Plain `pip install sift-cli` works inside a virtualenv you have already
269
+ activated. It does **not** work against the system Python on Debian, Ubuntu, or
270
+ WSL — those ship a `EXTERNALLY-MANAGED` marker and pip refuses, by design:
271
+
272
+ ```
273
+ error: externally-managed-environment
274
+ × This environment is externally managed
275
+ ```
276
+
277
+ That refusal is right and the answer is not `--break-system-packages`. Use `uv
278
+ tool` or `pipx`.
279
+
252
280
  The package is `sift-cli` and the commands are `sift` and `sift-mcp`. The names
253
281
  differ because `sift-mcp` on PyPI belongs to somebody else's project — an
254
282
  unrelated MCP server about authorising agent actions. Nothing here is theirs and
@@ -76,6 +76,7 @@ sonraki faza geçilmez.
76
76
  | 25 | Teklif | en çok kazandıran parça kendini tanıtsın; başkasının ayar dosyasına güvenle yazsın | bitti — [25-TEKLIF.md](25-TEKLIF.md) |
77
77
  | 26 | Beklemek | cevap vermeyecek basamağı beklemeyi bırak; merdiveni ölçüme göre kur | bitti — [26-BEKLEMEK.md](26-BEKLEMEK.md) |
78
78
  | 27 | Windows | CI'ın gösterdiği iki gerçek hata: `alive()` süreç öldürüyordu, izolasyon `~`'ı bulamıyordu | bitti — [27-WINDOWS.md](27-WINDOWS.md) |
79
+ | 28 | Kurulum | yabancının izlediği yol sınandı; `pip install` Debian/WSL'de reddediliyor | bitti — [28-KURULUM.md](28-KURULUM.md) |
79
80
 
80
81
  ## Ek fazlar — neden sonradan çıktılar
81
82
 
@@ -0,0 +1,92 @@
1
+ # 28 — Kurulum: bir yabancının izlediği yol
2
+
3
+ **Nereden çıktı:** Kullanıcı "dışarıdan biriymişim gibi kur" dedi. Ben de
4
+ hafızamdaki bilgiyi kullanmadan, yalnız **yayınlanmış belgelere** bakarak
5
+ kurdum. Amaç bir rol yapmak değildi; sınanan şey şuydu: *yayınladığımız
6
+ belgeler, bir yabancının doğru kurması için yeterli mi?*
7
+
8
+ Cevap: neredeyse. Bir yerde takılıyordu.
9
+
10
+ ## Bulunan hata: `pip install` bu makinelerde çalışmıyor
11
+
12
+ README şunu diyordu:
13
+
14
+ ```bash
15
+ pip install "sift-cli[mcp]"
16
+ ```
17
+
18
+ Debian, Ubuntu ve WSL'de bu komut **başarısız olur**. O sistemler sistem
19
+ Python'una bir işaret koyar:
20
+
21
+ ```
22
+ /usr/lib/python3.12/EXTERNALLY-MANAGED
23
+ ```
24
+
25
+ ve `pip` PEP 668 gereği reddeder:
26
+
27
+ ```
28
+ error: externally-managed-environment
29
+ × This environment is externally managed
30
+ ```
31
+
32
+ Bu ret **doğrudur** — sistem paket yöneticisinin kurduğu Python'a pip ile
33
+ yazmak dağıtımı bozar. Yanlış olan, README'nin çalışmayan bir komut vermesiydi.
34
+
35
+ Ve cevap `--break-system-packages` değil. Bir komut satırı aracı zaten kendi
36
+ ortamında olmalı: `uv tool install` ya da `pipx install`. İkisi de `sift` ve
37
+ `sift-mcp`'yi PATH'e koyar, hiçbir şeye bulaşmadan.
38
+
39
+ README düzeltildi.
40
+
41
+ ## Kodda da aynı cümle var — ve bekliyor
42
+
43
+ `src/sift/server.py`, `mcp` eklentisi olmadan çalıştırılınca şunu basıyor:
44
+
45
+ ```
46
+ sift-mcp: the server half needs one more package.
47
+
48
+ pip install "sift-cli[mcp]"
49
+ ```
50
+
51
+ **Aynı hata, aynı sebep.** Bir Ubuntu kullanıcısı bu mesajı okuyup komutu
52
+ çalıştırırsa yine reddedilir — ve bu sefer aracın kendi ağzından yanlış bir
53
+ tavsiye almış olur, ki README'den daha kötüdür.
54
+
55
+ **Neden hemen düzeltilmedi:** README GitHub'da anında güncellenir; koddaki
56
+ mesaj **paketin içinde ships**, yani düzeltmek yeni bir PyPI sürümü gerektirir
57
+ (`1.0.1`, yeni tag, yeni yayın). Bu yüzden bekleyen iş olarak buraya yazıldı.
58
+
59
+ **Bir sonraki sürümde yapılacak:**
60
+
61
+ - `src/sift/server.py` → `NO_MCP` mesajındaki `pip install "sift-cli[mcp]"`
62
+ satırı `uv tool install "sift-cli[mcp]"` olacak, ve altına *"or `pipx`; plain
63
+ `pip` is refused by Debian/Ubuntu/WSL"* notu düşülecek
64
+ - `test/test_server.py` → `test_and_the_test_above_would_have_noticed` o dizgeyi
65
+ arıyor, birlikte güncellenecek
66
+ - `test/mutations.py` → aynı dizgeyi çapa olarak kullanan mutasyon var
67
+
68
+ Üçü aynı cümleye bağlı; biri değişirse üçü de değişmeli.
69
+
70
+ **Yapıldı — 9 Eylül 2026, sürüm 1.0.1** (`tanitim/T1-SURUM-1-0-1.md`).
71
+
72
+ ## Kurulumun geri kalanı çalıştı
73
+
74
+ | adım | sonuç |
75
+ |---|---|
76
+ | `uv tool install "sift-cli[mcp]"` | `sift` ve `sift-mcp` PATH'te |
77
+ | Anahtar (`~/.config/nvidia/api_key`) | Kendiliğinden bulundu |
78
+ | `claude mcp add --scope user sift -- sift-mcp` | `✔ Connected` |
79
+ | İstemci gibi konuşma | 7 araç listelendi, 120 satır → 6 satır |
80
+
81
+ ## İki not, ikisi de kullanıcı deneyimi hakkında
82
+
83
+ **PyPI sayfası okunamıyor.** Bir asistan `pypi.org/project/sift-cli/` adresini
84
+ çekmeye çalışınca JavaScript hatası alıyor. İkinci hamle README'nin ham hâli
85
+ oluyor ve o çalışıyor. Yani **README, PyPI açıklaması değil, gerçek giriş
86
+ kapısı** — orada eksik olan hiçbir yerde telafi edilmiyor.
87
+
88
+ **Döngüyü asistan kapatamıyor.** İki adım insan gerektiriyor: NVIDIA anahtarını
89
+ almak (tarayıcıda kayıt, OAuth akışı yok) ve istemciyi yeniden başlatmak (MCP
90
+ sunucuları yalnız oturum açılışında bağlanır). Kurulumun tamamı otomatikleşemez,
91
+ ve bu bir kusur değil — ama tanıtımda bunun yazılması gerekir, yoksa "iki
92
+ komutla kurulur" diyen her metin yanlış olur.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sift-cli"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "Runs your command, then gives the model only the lines that matter."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -30,6 +30,9 @@ mcp = ["mcp>=2"]
30
30
  [project.scripts]
31
31
  sift = "sift.cli:main"
32
32
  sift-mcp = "sift.server:main"
33
+ # The package name, spelled as a command, because that is the only name a
34
+ # registry entry can carry: `uvx <package>` is how a client starts one.
35
+ sift-cli = "sift.cli:main"
33
36
 
34
37
  [project.urls]
35
38
  Homepage = "https://github.com/slymnysr/sift"
@@ -15,4 +15,4 @@ reply that makes no sense -- each of these falls back to rules that need none of
15
15
  them. A tool that drops output to save context has cost more than it saved.
16
16
  """
17
17
 
18
- __version__ = "1.0.0"
18
+ __version__ = "1.0.2"
@@ -73,6 +73,7 @@ USAGE = """sift -- run a command, keep every byte, show the lines that matter
73
73
  sift hook answer one shell-command event on stdin
74
74
  sift hook --install [--yes] route the client's own shell here too
75
75
  sift hook --uninstall and take it back out
76
+ sift mcp speak the protocol on stdin, for a client
76
77
  sift tools which dense tools this machine has
77
78
  sift tool NAME [ARGS...] run one of them, distilled
78
79
  sift memory [TERM] [--here]
@@ -161,6 +162,8 @@ def main(argv: list[str] | None = None) -> int:
161
162
  return _list(rest)
162
163
  if word == "hook":
163
164
  return _hook(rest)
165
+ if word == "mcp":
166
+ return _mcp(rest)
164
167
  if word == "tools":
165
168
  return _tools()
166
169
  if word == "tool":
@@ -573,6 +576,29 @@ def _hook(args: list[str]) -> int:
573
576
  return 0
574
577
 
575
578
 
579
+ def _mcp(args: list[str]) -> int:
580
+ """Speak the protocol on stdin -- the same server `sift-mcp` starts.
581
+
582
+ Two names for one server looks like waste until you try to write down how a
583
+ stranger's client should start it. What a registry entry can name is the
584
+ package, and the package is `sift-cli`; what `uvx` runs is a command of that
585
+ same name. So `uvx --from "sift-cli[mcp]" sift-cli mcp` is a line anyone can
586
+ build from the entry alone, and it needs this word to exist.
587
+
588
+ The import is here rather than at the top because the whole point of the
589
+ extra is that the command line works without it. Somebody who never
590
+ installed `mcp` gets the sentence `sift.server` raises, not a traceback.
591
+ """
592
+ if args:
593
+ print(f"sift: mcp takes no arguments\n\n{USAGE}", file=sys.stderr)
594
+ return 2
595
+
596
+ from sift.server import main as serve
597
+
598
+ serve()
599
+ return 0
600
+
601
+
576
602
  def _tools() -> int:
577
603
  """What each of them replaces, and whether this machine has it.
578
604
 
@@ -29,14 +29,17 @@ import time
29
29
  try:
30
30
  from mcp.server.mcpserver import MCPServer
31
31
  except ImportError as exc:
32
- # A sentence, not a stack. `pip install sift-cli` brings nothing with it on
32
+ # A sentence, not a stack. Installing `sift-cli` brings nothing with it on
33
33
  # purpose -- somebody who wants the command line should not be made to carry
34
34
  # a protocol library for it -- so arriving here is an ordinary thing to do
35
35
  # wrong, and the client that started this shows whatever comes out of it.
36
36
  raise SystemExit(
37
37
  "sift-mcp: the server half needs one more package.\n"
38
38
  "\n"
39
- ' pip install "sift-cli[mcp]"\n'
39
+ ' uv tool install "sift-cli[mcp]"\n'
40
+ "\n"
41
+ "(or pipx. Plain `pip` is refused by Debian, Ubuntu and WSL, which\n"
42
+ "protect the system Python -- and they are right to.)\n"
40
43
  "\n"
41
44
  "The command line (`sift`) is already installed and works without it."
42
45
  ) from exc
@@ -0,0 +1,146 @@
1
+ # İŞ 1 — Popülerlik planı
2
+
3
+ ## Sorun, olduğu gibi
4
+
5
+ `sift-cli` 8 Eylül 2026'da yayınlandı. Bugün itibarıyla:
6
+
7
+ | kanal | durum |
8
+ |---|---|
9
+ | Modelin eğitim verisi | Paket bir günlük. **Hiçbir model bilmiyor, bilemez** |
10
+ | GitHub | **0 yıldız, 0 topic** |
11
+ | PyPI | Yayında, ama adıyla aranmadıkça bulunmaz |
12
+ | Resmî MCP kayıt defteri | **Kayıtlı değil** |
13
+ | Dizinler (mcp.so, Glama, PulseMCP, Smithery) | Hiçbirinde yok |
14
+ | awesome-mcp-servers | Yok |
15
+
16
+ **Keşfedilebilirlik sıfır.** Bu bir kod sorunu değil; kod çalışıyor, 639 test
17
+ yeşil, üç platformda CI geçiyor. Sorun dağıtım.
18
+
19
+ ## Ölçüt
20
+
21
+ Bu işin başarısı yıldız sayısıyla değil, **bir yabancının sift'e ulaşabileceği
22
+ yolların sayısıyla** ölçülür. Bugün sıfır. Hedef: bir asistanın "bağlam israfı"
23
+ sorununu duyduğunda sift'i **bulabileceği** en az beş bağımsız yol.
24
+
25
+ Yıldız ve indirme sayısı sonuç, hedef değil. Onları takip edeceğiz ama
26
+ kovalamayacağız.
27
+
28
+ ## Fazlar
29
+
30
+ Her faz kendi başına bitmiş sayılır ve doğrulanabilir bir çıktısı vardır.
31
+
32
+ | # | Faz | Ne biter | Durum |
33
+ |---|-----|----------|---|
34
+ | T1 | Sürüm 1.0.1 | Kayıt defterinin şart koştuğu `mcp-name` işareti + bekleyen kod düzeltmesi, PyPI'da | bekliyor |
35
+ | T2 | Resmî kayıt defteri | `server.json`, `registry.modelcontextprotocol.io`'da yayında | bekliyor |
36
+ | T3 | GitHub keşfedilebilirliği | topics, açıklama, sürüm notu | bekliyor |
37
+ | T4 | Dizinler | mcp.so, PulseMCP, Glama, Smithery | bekliyor |
38
+ | T5 | awesome-mcp-servers | PR açık | bekliyor |
39
+ | T6 | README konumlandırma | Problem, insanların aradığı kelimelerle anılıyor | bekliyor |
40
+ | T7 | Sürekli araştırma | `ARASTIRMA.md` güncel, yeni kanallar izleniyor | sürekli |
41
+
42
+ ---
43
+
44
+ ## T1 — Sürüm 1.0.1
45
+
46
+ **Neden ilk:** Resmî kayıt defteri PyPI sahipliğini **paketin README'sinden**
47
+ doğruluyor. Aranan dize:
48
+
49
+ ```
50
+ mcp-name: io.github.slymnysr/sift
51
+ ```
52
+
53
+ HTML yorumu içinde olabilir, ama **yayınlanmış pakette bulunmak zorunda.**
54
+ 1.0.0'da yok. Yani T2 T1'siz yapılamaz.
55
+
56
+ Aynı sürümde bekleyen bir düzeltme daha var (`notlar/28-KURULUM.md`):
57
+ `server.py`'deki eksik-eklenti mesajı hâlâ `pip install "sift-cli[mcp]"` diyor
58
+ ve o komut Debian/Ubuntu/WSL'de reddediliyor.
59
+
60
+ **Yapılacaklar**
61
+ - README'ye `mcp-name` işareti
62
+ - `server.py` → `NO_MCP` mesajı `uv tool install`'a
63
+ - `test_server.py` ve `mutations.py` aynı dizgeye bağlı, birlikte güncellenecek
64
+ - `pyproject.toml` sürüm 1.0.1
65
+ - Tag `v1.0.1`, CI yeşil, PyPI'da
66
+
67
+ **Bitti sayılır:** PyPI'daki 1.0.1 açıklamasında `mcp-name` dizesi görünüyor.
68
+
69
+ ## T2 — Resmî MCP kayıt defteri
70
+
71
+ **Neden en önemlisi:** İstemciler oradan okuyor. Bir modelin sift'i "bilmesinin"
72
+ gerçekçi tek yolu bu — eğitim verisine giremeyecek kadar yeni, ama kayıt defteri
73
+ canlı sorgulanıyor.
74
+
75
+ **Yapılacaklar**
76
+ - `server.json`: ad `io.github.slymnysr/sift`, PyPI paketi `sift-cli`, taşıma
77
+ `stdio`, `runtimeHint` olarak `uvx`
78
+ - `mcp-publisher` ile giriş: **`github-oidc`** tercih edilir — GitHub Action
79
+ içinden, interaktif tarayıcı akışı olmadan. Alternatif: `login github`
80
+ - Yayınla, `registry.modelcontextprotocol.io` üzerinden doğrula
81
+
82
+ **Bitti sayılır:** Kayıt defteri API'si `io.github.slymnysr/sift`'i döndürüyor.
83
+
84
+ ## T3 — GitHub keşfedilebilirliği
85
+
86
+ Beş dakikalık iş, aramada büyük fark.
87
+
88
+ - **Topics**: `mcp`, `mcp-server`, `claude`, `claude-code`, `llm`,
89
+ `context-management`, `cli`, `python`, `token-optimization`
90
+ - Depo açıklaması ve website alanı (PyPI bağlantısı)
91
+ - `v1.0.1` için GitHub Release notu — tag var ama release sayfası yok
92
+
93
+ **Bitti sayılır:** `gh repo view` topics'i döndürüyor, Releases sayfası dolu.
94
+
95
+ ## T4 — Dizinler
96
+
97
+ Dördü de üçüncü taraf, hepsi ayrı gönderim:
98
+
99
+ | dizin | yol | not |
100
+ |---|---|---|
101
+ | mcp.so | Submit düğmesi ya da GitHub issue | ~20.000 sunucu, en büyük toplayıcı |
102
+ | PulseMCP | Gezinti çubuğunda Submit | Haftalık ziyaretçi sayısı gösteriyor |
103
+ | Glama | Form, elle inceleniyor | ~37.000 sunucu izliyor, metakayıt |
104
+ | Smithery | CLI/hosted | MCP'nin Docker Hub'ı sayılıyor |
105
+
106
+ Bunların çoğu ekosistemi **tarıyor** ve sahiplik talep etmene izin veriyor —
107
+ yani T2 bittiğinde bazıları kendiliğinden görünebilir. Yine de elle göndermek
108
+ bekleme süresini kısaltır.
109
+
110
+ **Bitti sayılır:** Dördünde de gönderim yapıldı, kabul edilenler kayıtlı.
111
+
112
+ ## T5 — awesome-mcp-servers
113
+
114
+ `punkpeye/awesome-mcp-servers` — PR ile eklenir. Şart: README, açık açıklama,
115
+ çalışan kurulum talimatı. Üçü de var.
116
+
117
+ **Bitti sayılır:** PR açık ve bağlantısı kayıtlı.
118
+
119
+ ## T6 — README konumlandırma
120
+
121
+ Şu an README "Runs your command, then gives the model only the lines that
122
+ matter." diye başlıyor — doğru ama **kimsenin aramadığı** bir cümle.
123
+
124
+ İnsanların aradığı: *MCP token waste*, *tool output floods context*, *reduce
125
+ Claude context usage*, *agent context window full*, *MCP token optimization*.
126
+
127
+ Bu kelimeler README'de geçmiyor. Geçmeli — ama **abartmadan ve ölçümle**:
128
+ elimizde 404 satır → 7 satır, %97,6 daha az token, 0 uydurma satır gibi
129
+ gerçek sayılar var. Pazarlama dili değil, ölçüm dili.
130
+
131
+ **Bitti sayılır:** README'nin ilk ekranı problemi arama terimleriyle adlandırıyor
132
+ ve ölçülmüş bir sayı gösteriyor.
133
+
134
+ ## T7 — Sürekli araştırma
135
+
136
+ `ARASTIRMA.md` bu işin hafızası. Her yeni kanal, her ret, her ölçüm oraya
137
+ yazılır. Amaç: altı ay sonra "bunu denemiş miydik" sorusunun cevabı olsun.
138
+
139
+ ---
140
+
141
+ ## Bu planın kuralı
142
+
143
+ **Hiçbir fazda abartı yok.** sift'in ölçülmüş sayıları var; onları söylemek
144
+ yeterli. Olmayan bir şeyi iddia etmek — "en iyi", "devrim niteliğinde", uydurma
145
+ kıyaslar — hem yanlış hem de bu projenin bütün duruşuna aykırı: araç, kaybedecek
146
+ bir şeyi olmadığı için güvenilir. Tanıtımı da öyle olmalı.
@@ -0,0 +1,139 @@
1
+ # Araştırma özeti — MCP ekosisteminde keşfedilebilirlik
2
+
3
+ Bu dosya İŞ 1'in hafızası. Her yeni bulgu, her ret, her ölçüm buraya yazılır.
4
+ Amacı altı ay sonra "bunu denemiş miydik" sorusunu cevaplamak.
5
+
6
+ **Son güncelleme:** 9 Eylül 2026
7
+
8
+ ---
9
+
10
+ ## 1. Resmî MCP kayıt defteri
11
+
12
+ **Adres:** `registry.modelcontextprotocol.io` — Eylül 2025'te önizlemede
13
+ başladı, hâlâ önizleme (kırılgan değişiklik ve veri sıfırlaması olabilir).
14
+
15
+ **Neden en önemli kanal:** İstemciler buradan okuyor ve **canlı sorgulanıyor.**
16
+ Bir modelin eğitim verisine giremeyecek kadar yeni bir paketin bulunabilmesinin
17
+ tek gerçekçi yolu bu.
18
+
19
+ ### Yayınlama mekaniği
20
+
21
+ `mcp-publisher` adlı CLI ile. Komutlar: `init`, `login`, `publish`, `status`,
22
+ `validate`, `logout`.
23
+
24
+ **Kimlik doğrulama sağlayıcıları:**
25
+
26
+ | sağlayıcı | ne için |
27
+ |---|---|
28
+ | `github` | Etkileşimli OAuth (tarayıcı) |
29
+ | **`github-oidc`** | **CI/CD — GitHub Actions içinden, tarayıcısız** |
30
+ | `dns` / `http` | Alan adı doğrulama (kendi alan adın varsa) |
31
+ | `none` | Yalnız yerel test |
32
+
33
+ `github-oidc` bizim için doğru olan: yayın CI'dan yapılabilir, elle adım kalmaz.
34
+
35
+ ### İsim alanı
36
+
37
+ `io.github.<kullanıcı>/<ad>` — GitHub hesabıyla kanıtlanıyor. Bizimki:
38
+ **`io.github.slymnysr/sift`**
39
+
40
+ Alan adı isim alanı (`com.example/...`) DNS TXT kaydı ya da HTTPS uç noktası
41
+ istiyor; bizim alan adımız yok, GitHub isim alanı yeterli.
42
+
43
+ ### PyPI sahiplik doğrulaması — kritik
44
+
45
+ Kayıt defteri, PyPI paketinin **README'sinde** (PyPI'da açıklama olarak
46
+ görünen metin) şu dizeyi arıyor:
47
+
48
+ ```
49
+ mcp-name: io.github.slymnysr/sift
50
+ ```
51
+
52
+ HTML yorumu içinde gizlenebilir:
53
+
54
+ ```markdown
55
+ <!-- mcp-name: io.github.slymnysr/sift -->
56
+ ```
57
+
58
+ **Sonucu:** README paketin içinde yayınlandığı için, bu işaret olmadan
59
+ yayınlanmış bir sürüm doğrulanamaz. **1.0.0'da yok → yeni sürüm şart.**
60
+
61
+ > Not: crates.io HTML yorumlarını siliyor, orada görünür metin gerekiyor.
62
+ > PyPI ve NuGet yorumu koruyor. Bizde sorun yok.
63
+
64
+ ### Diğer kısıtlar
65
+
66
+ - Yalnız güvenilen kayıtlar: PyPI için **yalnız `pypi.org`**
67
+ - `_meta` içinde yalnız `io.modelcontextprotocol.registry/publisher-provided`
68
+ anahtarı korunuyor, 4 KB sınırı
69
+ - Şema: `https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json`
70
+
71
+ ---
72
+
73
+ ## 2. Üçüncü taraf dizinler
74
+
75
+ Dördü de ayrı gönderim ister; çoğu ekosistemi **tarıyor** ve sonradan sahiplik
76
+ talep etmene izin veriyor.
77
+
78
+ | dizin | ölçek | gönderim |
79
+ |---|---|---|
80
+ | **Glama** (`glama.ai/mcp`) | ~37.000 sunucu (2026 ortası) | Form, elle inceleme. Metakayıt — Anthropic, GitHub, PulseMCP, Microsoft besliyor |
81
+ | **mcp.so** | ~20.000 sunucu | Sitedeki Submit ya da GitHub issue |
82
+ | **Smithery** (`smithery.ai`) | 7.000+ | "MCP'nin Docker Hub'ı"; yerel CLI kurulumu ya da barındırılan uzak sunucu |
83
+ | **PulseMCP** | — | Gezinti çubuğunda Submit. **Haftalık ziyaretçi sayısı gösteriyor** — tek yerde bulunan bir veri |
84
+
85
+ PulseMCP'nin ziyaretçi sayacı bizim için ayrıca değerli: tanıtımın işe yarayıp
86
+ yaramadığını ölçebileceğimiz nadir bir dış gösterge.
87
+
88
+ ---
89
+
90
+ ## 3. awesome-mcp-servers
91
+
92
+ `punkpeye/awesome-mcp-servers` — GitHub'da PR ile eklenir.
93
+
94
+ **Şartlar:** README, açık bir açıklama, çalışan kurulum talimatı. Üçü de bizde
95
+ var (kurulum talimatı 28. fazda düzeltildi).
96
+
97
+ ---
98
+
99
+ ## 4. Henüz araştırılmamış / açık sorular
100
+
101
+ - **Reddit `r/ClaudeAI`, `r/mcp`** — norm ne, kendi projesini paylaşmak hoş
102
+ karşılanıyor mu, hangi biçimde
103
+ - **Hacker News** — "Show HN" eşiği; erken paylaşım bir kez yakılan bir kart
104
+ - **dev.to / Medium yazısı** — ölçüm tablosu iyi bir yazı konusu olabilir:
105
+ "aynı işi sift'li ve sift'siz ölçtük"
106
+ - **MCP istemcileri** — Claude Code dışında hangi istemciler kayıt defterinden
107
+ okuyor (Cursor, Windsurf, Zed, Cline?) ve ayrı gönderim istiyorlar mı
108
+ - **GitHub Release** sayfasının keşfedilebilirliğe etkisi
109
+ - **PyPI sayfasının okunamaması** — `pypi.org/project/sift-cli/` JavaScript
110
+ hatası veriyor, bir asistan çekmeye çalışınca boş dönüyor. README ham hâli
111
+ çalışıyor. Bu, PyPI açıklamasının bir asistan için işe yaramadığı anlamına
112
+ gelebilir — doğrulanmalı
113
+
114
+ ---
115
+
116
+ ## 5. Ölçüm — bugünün taban çizgisi
117
+
118
+ | gösterge | 9 Eylül 2026 |
119
+ |---|---|
120
+ | GitHub yıldız | 0 |
121
+ | GitHub topics | 0 |
122
+ | PyPI sürüm | 1.0.0 |
123
+ | PyPI indirme | (ölçülmedi) |
124
+ | Kayıt defteri | kayıtlı değil |
125
+ | Dizin | 0/4 |
126
+
127
+ Sonraki ölçümler buraya eklenecek.
128
+
129
+ ---
130
+
131
+ ## Kaynaklar
132
+
133
+ - [Introducing the MCP Registry — MCP Blog](https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/)
134
+ - [modelcontextprotocol/registry (GitHub)](https://github.com/modelcontextprotocol/registry)
135
+ - [MCP Registry — Package Types](https://modelcontextprotocol.io/registry/package-types)
136
+ - [Official Registry server.json Requirements](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/server-json/official-registry-requirements.md)
137
+ - [How to list your MCP server — Tallyfy](https://tallyfy.com/how-to-list-mcp-server-registry-smithery-glama-pulsemcp/)
138
+ - [Best MCP Registries in 2026 — TrueFoundry](https://www.truefoundry.com/blog/best-mcp-registries)
139
+ - [MCP Server Directories — DYNO Mapper](https://dynomapper.com/blog/ai/mcp-server-directories/)