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.
- {sift_cli-1.0.0 → sift_cli-1.0.2}/PKG-INFO +35 -7
- {sift_cli-1.0.0 → sift_cli-1.0.2}/README.md +34 -6
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/00-PLAN.md +1 -0
- sift_cli-1.0.2/notlar/28-KURULUM.md +92 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/pyproject.toml +4 -1
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/__init__.py +1 -1
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/cli.py +26 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/server.py +5 -2
- sift_cli-1.0.2/tanitim/00-PLAN.md +146 -0
- sift_cli-1.0.2/tanitim/ARASTIRMA.md +139 -0
- sift_cli-1.0.2/tanitim/T1-SURUM-1-0-1.md +50 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/mutations.py +8 -1
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_package.py +18 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_server.py +45 -1
- {sift_cli-1.0.0 → sift_cli-1.0.2}/.gitattributes +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/.github/workflows/ci.yml +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/.github/workflows/release.yml +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/.gitignore +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/LICENSE +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/01-YAKALAMA.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/02-MODEL-KOPRUSU.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/03-DAMITMA.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/04-GUVENLIK-AGI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/05-DIL-BAGIMSIZLIGI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/06-DOSYA-TASLAGI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/07-MCP-SUNUCUSU.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/08-BUTCE-VE-OLCUM.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/09-ARKA-PLAN-KOMUTLARI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/10-GIZLILIK.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/11-YAYIN.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/12-CAGIRANIN-SOZ-HAKKI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/13-DOSYA-DAMITMA.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/14-ARAYAN-PEEK.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/15-COKLU-IS.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/16-HAFIZA.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/17-YOGUN-ARACLAR.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/18-KAPSAM.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/19-KALINTI-MUTASYON.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/20-KAYIT-BIRIMI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/21-SAKLAMA.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/22-YANIT-ONBELLEGI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/23-OLCUM-BIRIMI.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/24-ANAHTAR.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/25-TEKLIF.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/26-BEKLEMEK.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/notlar/27-WINDOWS.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/answers.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/background.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/capture.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/digest.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/distill.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/fallback.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/hook.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/lines.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/many.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/memory.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/model.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/outline.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/peek.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/privacy.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/records.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/store.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/tools.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/view.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/src/sift/watch.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/budget.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/conftest.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/README.md +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ansi-progress.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ansi-progress.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cargo-de.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cargo-de.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cmake-vi.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cmake-vi.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cobol-mainframe.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/cobol-mainframe.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/docker-ar.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/docker-ar.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/dotnet-fr.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/dotnet-fr.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ffmpeg-fa.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/ffmpeg-fa.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gcc-ru.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gcc-ru.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/git-quiet.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/git-quiet.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gotest-zh.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gotest-zh.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gradle-ko.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/gradle-ko.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/journalctl-it.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/journalctl-it.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/kubectl-hi.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/kubectl-hi.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/latex-pl.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/latex-pl.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/maven-tr.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/maven-tr.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/mix-he.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/mix-he.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/psql-es.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/psql-es.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/pytest-en.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/pytest-en.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/rspec-id.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/rspec-id.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/terraform-pt.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/terraform-pt.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/vite-ja.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/vite-ja.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/zig-sw.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus/zig-sw.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/clojure-rapor.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/clojure-rapor.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/cpp-baslik.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/cpp-baslik.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/elixir-onbellek.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/elixir-onbellek.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/go-kuyruk.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/go-kuyruk.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/haskell-ayristirici.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/haskell-ayristirici.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/hcl-altyapi.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/hcl-altyapi.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/java-depo.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/java-depo.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/makefile-yapi.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/makefile-yapi.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/python-akis.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/python-akis.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/qqzz-uydurma.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/qqzz-uydurma.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/ruby-fatura.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/ruby-fatura.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/rust-matris.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/rust-matris.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/shell-dagitim.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/shell-dagitim.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/sql-sema.json +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus-kaynak/sql-sema.txt +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/korpus_reader.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/languages.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/outlines.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_answers.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_background.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_capture.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_cli.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_digest.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_distill.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_fallback.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_gc.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_hook.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_hook_setup.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_kaynak.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_korpus.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_lines.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_many.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_model.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_outline.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_privacy.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_records.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_setup.py +0 -0
- {sift_cli-1.0.0 → sift_cli-1.0.2}/test/test_tokens.py +0 -0
- {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.
|
|
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
|
-
|
|
247
|
-
|
|
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
|
|
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
|
-
|
|
269
|
-
|
|
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
|
-
|
|
227
|
-
|
|
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
|
|
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
|
-
|
|
249
|
-
|
|
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.
|
|
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"
|
|
@@ -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. `
|
|
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
|
-
'
|
|
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/)
|