net-sift 0.1.0__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.
- net_sift-0.1.0/.editorconfig +14 -0
- net_sift-0.1.0/.gitattributes +4 -0
- net_sift-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +30 -0
- net_sift-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- net_sift-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +18 -0
- net_sift-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +12 -0
- net_sift-0.1.0/.github/dependabot.yml +10 -0
- net_sift-0.1.0/.github/workflows/ci.yml +41 -0
- net_sift-0.1.0/.github/workflows/codeql.yml +23 -0
- net_sift-0.1.0/.github/workflows/release.yml +42 -0
- net_sift-0.1.0/.gitignore +24 -0
- net_sift-0.1.0/.pre-commit-config.yaml +15 -0
- net_sift-0.1.0/CHANGELOG.md +29 -0
- net_sift-0.1.0/CODE_OF_CONDUCT.md +34 -0
- net_sift-0.1.0/CONTRIBUTING.md +41 -0
- net_sift-0.1.0/LICENSE +21 -0
- net_sift-0.1.0/NOTICE +14 -0
- net_sift-0.1.0/PKG-INFO +228 -0
- net_sift-0.1.0/README.md +193 -0
- net_sift-0.1.0/SECURITY.md +23 -0
- net_sift-0.1.0/docs/architecture.md +47 -0
- net_sift-0.1.0/net_sift/__init__.py +3 -0
- net_sift-0.1.0/net_sift/access/__init__.py +2 -0
- net_sift-0.1.0/net_sift/access/opencli.py +320 -0
- net_sift-0.1.0/net_sift/cli.py +159 -0
- net_sift-0.1.0/net_sift/config.py +25 -0
- net_sift-0.1.0/net_sift/doctor.py +100 -0
- net_sift-0.1.0/net_sift/engine/__init__.py +1 -0
- net_sift-0.1.0/net_sift/engine/core.py +235 -0
- net_sift-0.1.0/net_sift/engine/ranking.py +261 -0
- net_sift-0.1.0/net_sift/engine/sources.py +470 -0
- net_sift-0.1.0/net_sift/guides/setup-opencli.md +49 -0
- net_sift-0.1.0/net_sift/guides/sources.md +39 -0
- net_sift-0.1.0/net_sift/mcp_server.py +109 -0
- net_sift-0.1.0/net_sift/py.typed +0 -0
- net_sift-0.1.0/net_sift/search.py +115 -0
- net_sift-0.1.0/net_sift/sessions.py +120 -0
- net_sift-0.1.0/net_sift/skill/SKILL.md +40 -0
- net_sift-0.1.0/net_sift/status.py +27 -0
- net_sift-0.1.0/pyproject.toml +70 -0
- net_sift-0.1.0/tests/__init__.py +0 -0
- net_sift-0.1.0/tests/test_cli_install.py +39 -0
- net_sift-0.1.0/tests/test_doctor.py +18 -0
- net_sift-0.1.0/tests/test_engine_core.py +57 -0
- net_sift-0.1.0/tests/test_opencli.py +55 -0
- net_sift-0.1.0/tests/test_ranking.py +25 -0
- net_sift-0.1.0/tests/test_sessions.py +38 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a problem with Net-Sift
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: what
|
|
7
|
+
attributes:
|
|
8
|
+
label: What happened
|
|
9
|
+
description: What you did and what went wrong.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: expected
|
|
14
|
+
attributes:
|
|
15
|
+
label: What you expected
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: doctor
|
|
20
|
+
attributes:
|
|
21
|
+
label: net-sift doctor output
|
|
22
|
+
description: Paste the output of `net-sift doctor`. Remove anything sensitive.
|
|
23
|
+
render: text
|
|
24
|
+
- type: input
|
|
25
|
+
id: version
|
|
26
|
+
attributes:
|
|
27
|
+
label: Version
|
|
28
|
+
description: Output of `net-sift --version`, plus OS and Python version.
|
|
29
|
+
validations:
|
|
30
|
+
required: true
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest an idea or a new source for Net-Sift
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: Problem
|
|
9
|
+
description: What are you trying to do that Net-Sift does not support yet?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposal
|
|
16
|
+
description: What should it do? For a new source, link its public API or access method.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this change and why. -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] `ruff check net_sift tests` passes
|
|
8
|
+
- [ ] `ruff format --check net_sift tests` passes
|
|
9
|
+
- [ ] `pytest` passes
|
|
10
|
+
- [ ] Tests added or updated for the change (no network in tests)
|
|
11
|
+
- [ ] `CHANGELOG.md` updated under "Unreleased"
|
|
12
|
+
- [ ] Change stays within scope: read-only research, no posting, no auth bypass
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
strategy:
|
|
20
|
+
fail-fast: false
|
|
21
|
+
matrix:
|
|
22
|
+
os: [ubuntu-latest]
|
|
23
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
24
|
+
include:
|
|
25
|
+
- os: macos-latest
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python-version }}
|
|
32
|
+
- name: Install
|
|
33
|
+
run: |
|
|
34
|
+
python -m pip install --upgrade pip
|
|
35
|
+
pip install -e ".[dev]"
|
|
36
|
+
- name: Lint
|
|
37
|
+
run: ruff check net_sift tests
|
|
38
|
+
- name: Format check
|
|
39
|
+
run: ruff format --check net_sift tests
|
|
40
|
+
- name: Test
|
|
41
|
+
run: pytest --cov=net_sift --cov-report=term-missing
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: CodeQL
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: "27 3 * * 1"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
security-events: write
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
analyze:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
- uses: github/codeql-action/init@v3
|
|
21
|
+
with:
|
|
22
|
+
languages: python
|
|
23
|
+
- uses: github/codeql-action/analyze@v3
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.12"
|
|
18
|
+
- name: Build
|
|
19
|
+
run: |
|
|
20
|
+
python -m pip install --upgrade pip build
|
|
21
|
+
python -m build
|
|
22
|
+
- name: Create release
|
|
23
|
+
uses: softprops/action-gh-release@v2
|
|
24
|
+
with:
|
|
25
|
+
files: dist/*
|
|
26
|
+
generate_release_notes: true
|
|
27
|
+
|
|
28
|
+
publish:
|
|
29
|
+
needs: build
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
environment: pypi
|
|
32
|
+
permissions:
|
|
33
|
+
id-token: write
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v4
|
|
36
|
+
- uses: actions/setup-python@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: "3.12"
|
|
39
|
+
- run: |
|
|
40
|
+
python -m pip install --upgrade pip build
|
|
41
|
+
python -m build
|
|
42
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
|
|
11
|
+
# net-sift runtime: search sessions are user data, never committed
|
|
12
|
+
.net-sift/
|
|
13
|
+
sessions/
|
|
14
|
+
|
|
15
|
+
# local env / secrets
|
|
16
|
+
.env
|
|
17
|
+
.env.*
|
|
18
|
+
!.env.example
|
|
19
|
+
|
|
20
|
+
# session handoffs (local memory, never committed)
|
|
21
|
+
.claude/handoffs/
|
|
22
|
+
|
|
23
|
+
# OS
|
|
24
|
+
.DS_Store
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.6.9
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
9
|
+
rev: v5.0.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: end-of-file-fixer
|
|
12
|
+
- id: trailing-whitespace
|
|
13
|
+
- id: check-yaml
|
|
14
|
+
- id: check-toml
|
|
15
|
+
- id: check-added-large-files
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format is based on
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres
|
|
5
|
+
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.1.0] - 2026-10-01
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Coverage-first search engine: keyless sources (Bluesky, Hacker News, GitHub,
|
|
14
|
+
arXiv, Polymarket, StockTwits, Mastodon, Habr, V2EX, Telegram, Sogou WeChat),
|
|
15
|
+
a window-bisecting gap-closing driver, per-source near-duplicate dedup, and
|
|
16
|
+
relevance ranking with head-entity grounding, CJK segmentation, a recency boost,
|
|
17
|
+
and engagement weighting.
|
|
18
|
+
- Walled-platform access (Twitter/X, Reddit, Instagram, Facebook, Bilibili,
|
|
19
|
+
Xiaohongshu) through the user's logged-in Chromium browser via OpenCLI, with
|
|
20
|
+
runtime adapter discovery.
|
|
21
|
+
- MCP server exposing `deep_search`, `resume`, `list_sessions`, `cleanup`,
|
|
22
|
+
`doctor`, `status`, and `fetch`, all context-lean.
|
|
23
|
+
- Session storage under `~/.net-sift/sessions/` with keep-or-delete confirmation.
|
|
24
|
+
- `net-sift` CLI: `install`, `serve`, `doctor`, `status`, `search`.
|
|
25
|
+
- Installer that registers the MCP server and status bar for Claude Code and Codex.
|
|
26
|
+
- Test suite, Ruff linting, and GitHub Actions CI.
|
|
27
|
+
|
|
28
|
+
[Unreleased]: https://github.com/ali-rajabpour/Net-Sift/compare/v0.1.0...HEAD
|
|
29
|
+
[0.1.0]: https://github.com/ali-rajabpour/Net-Sift/releases/tag/v0.1.0
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and maintainers pledge to make participation in this
|
|
6
|
+
project a harassment-free experience for everyone, regardless of age, body size,
|
|
7
|
+
visible or invisible disability, ethnicity, sex characteristics, gender identity
|
|
8
|
+
and expression, level of experience, education, socio-economic status,
|
|
9
|
+
nationality, personal appearance, race, religion, or sexual identity and
|
|
10
|
+
orientation.
|
|
11
|
+
|
|
12
|
+
## Our standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to a positive environment:
|
|
15
|
+
|
|
16
|
+
- Showing empathy and kindness toward other people
|
|
17
|
+
- Being respectful of differing opinions, viewpoints, and experiences
|
|
18
|
+
- Giving and gracefully accepting constructive feedback
|
|
19
|
+
- Accepting responsibility and apologizing to those affected by our mistakes
|
|
20
|
+
|
|
21
|
+
Unacceptable behavior includes harassment, insulting or derogatory comments,
|
|
22
|
+
public or private harassment, and publishing others' private information without
|
|
23
|
+
permission.
|
|
24
|
+
|
|
25
|
+
## Enforcement
|
|
26
|
+
|
|
27
|
+
Instances of abusive or unacceptable behavior may be reported to the maintainers
|
|
28
|
+
through a private GitHub security advisory or by contacting the repository owner.
|
|
29
|
+
All complaints will be reviewed and investigated promptly and fairly.
|
|
30
|
+
|
|
31
|
+
## Attribution
|
|
32
|
+
|
|
33
|
+
This Code of Conduct is adapted from the Contributor Covenant, version 2.1,
|
|
34
|
+
available at https://www.contributor-covenant.org/version/2/1/code_of_conduct/.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in Net-Sift.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/ali-rajabpour/Net-Sift.git
|
|
9
|
+
cd Net-Sift
|
|
10
|
+
python -m venv .venv && source .venv/bin/activate
|
|
11
|
+
pip install -e ".[dev]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Before you open a pull request
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
ruff check net_sift tests # lint
|
|
18
|
+
ruff format net_sift tests # format
|
|
19
|
+
pytest # tests
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- Keep the engine dependency-light. New third-party dependencies need a clear
|
|
23
|
+
reason.
|
|
24
|
+
- Add a test for any non-trivial logic. Tests must not hit the network; use
|
|
25
|
+
fixtures and temp paths.
|
|
26
|
+
- Each source is a callable `(query, since, until, budget) -> (records, ceiling)`.
|
|
27
|
+
Follow that contract and emit the record shape from `net_sift.engine.core.rec`.
|
|
28
|
+
- Update `CHANGELOG.md` under "Unreleased".
|
|
29
|
+
|
|
30
|
+
## Scope
|
|
31
|
+
|
|
32
|
+
Net-Sift fetches and ranks public content for research. It does not post, comment,
|
|
33
|
+
or perform any write action on any platform, and it does not bypass authentication.
|
|
34
|
+
Keep contributions within that scope.
|
|
35
|
+
|
|
36
|
+
## Adding a source
|
|
37
|
+
|
|
38
|
+
- Keyless source: add it to `net_sift/engine/sources.py` and register it in
|
|
39
|
+
`SOURCES`.
|
|
40
|
+
- Walled platform: it is reached through OpenCLI. If OpenCLI gains an adapter,
|
|
41
|
+
add the site to `WALLED_SITES` in `net_sift/access/opencli.py`.
|
net_sift-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ali Rajabpour
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
net_sift-0.1.0/NOTICE
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Net-Sift
|
|
2
|
+
Copyright (c) 2026 Ali Rajabpour
|
|
3
|
+
|
|
4
|
+
This product includes code adapted from Agent Reach
|
|
5
|
+
(https://github.com/Panniantong/Agent-Reach), licensed under the MIT License,
|
|
6
|
+
Copyright (c) Panniantong.
|
|
7
|
+
|
|
8
|
+
Portions adapted from Agent Reach:
|
|
9
|
+
- net_sift/access/opencli.py (OpenCLI real-browser backend probing)
|
|
10
|
+
- net_sift/doctor.py (source health-check scaffolding)
|
|
11
|
+
- net_sift/guides/*.md (per-platform setup guides)
|
|
12
|
+
|
|
13
|
+
OpenCLI itself (https://github.com/jackwener/opencli) is a separate project by
|
|
14
|
+
its own authors and is invoked as an external tool, not vendored here.
|
net_sift-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: net-sift
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Coverage-first social and web deep-search as an MCP server: exhaustive multi-source sweeps, smart ranking, and honest gap accounting, with walled platforms reached through your logged-in Chromium browser.
|
|
5
|
+
Project-URL: Homepage, https://github.com/ali-rajabpour/Net-Sift
|
|
6
|
+
Project-URL: Repository, https://github.com/ali-rajabpour/Net-Sift.git
|
|
7
|
+
Author: Ali Rajabpour
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
License-File: NOTICE
|
|
11
|
+
Keywords: deep-search,mcp,opencli,osint,research,social-search
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Information Technology
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Internet
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Requires-Dist: defusedxml>=0.7.1
|
|
28
|
+
Requires-Dist: mcp>=2.2.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# Net-Sift
|
|
37
|
+
|
|
38
|
+
Coverage-first social and web deep-search, delivered as an MCP server.
|
|
39
|
+
|
|
40
|
+
[](https://github.com/ali-rajabpour/Net-Sift/actions/workflows/ci.yml)
|
|
41
|
+
[](LICENSE)
|
|
42
|
+
[](https://www.python.org/)
|
|
43
|
+
[](https://github.com/astral-sh/ruff)
|
|
44
|
+
|
|
45
|
+
Net-Sift sweeps many sources for everything being said about a topic, ranks it,
|
|
46
|
+
removes duplicates, and reports what it could not reach. The gap report is part of
|
|
47
|
+
the answer, not an afterthought. Login-walled platforms are reached through your
|
|
48
|
+
own logged-in Chromium browser, so there is no cookie copying and no private-API
|
|
49
|
+
reverse engineering.
|
|
50
|
+
|
|
51
|
+
## Table of contents
|
|
52
|
+
|
|
53
|
+
- [Why Net-Sift](#why-net-sift)
|
|
54
|
+
- [Features](#features)
|
|
55
|
+
- [How it works](#how-it-works)
|
|
56
|
+
- [Install](#install)
|
|
57
|
+
- [Quickstart](#quickstart)
|
|
58
|
+
- [Walled platforms](#walled-platforms)
|
|
59
|
+
- [Sources](#sources)
|
|
60
|
+
- [MCP tools](#mcp-tools)
|
|
61
|
+
- [Configuration](#configuration)
|
|
62
|
+
- [Sessions and privacy](#sessions-and-privacy)
|
|
63
|
+
- [Development](#development)
|
|
64
|
+
- [Contributing](#contributing)
|
|
65
|
+
- [Security](#security)
|
|
66
|
+
- [License](#license)
|
|
67
|
+
- [Acknowledgements](#acknowledgements)
|
|
68
|
+
|
|
69
|
+
## Why Net-Sift
|
|
70
|
+
|
|
71
|
+
Most research tools return a handful of links or a synthesized answer. Net-Sift
|
|
72
|
+
returns a corpus with an explicit account of coverage: what was retrieved, what hit
|
|
73
|
+
a ceiling, and what was out of reach. It is built for topic surveys, sentiment
|
|
74
|
+
sweeps, competitor and discourse monitoring, and literature-style scans where a
|
|
75
|
+
single search would under-serve the answer.
|
|
76
|
+
|
|
77
|
+
## Features
|
|
78
|
+
|
|
79
|
+
- Many sources in one sweep, keyless by default (Bluesky, Hacker News, GitHub,
|
|
80
|
+
arXiv, Polymarket, StockTwits, Mastodon, and more).
|
|
81
|
+
- Walled platforms (Twitter/X, Reddit, Instagram, Facebook, Bilibili, Xiaohongshu)
|
|
82
|
+
through your logged-in Chromium browser via OpenCLI.
|
|
83
|
+
- Relevance ranking with head-entity grounding, CJK-aware tokenization, a recency
|
|
84
|
+
boost, and engagement weighting.
|
|
85
|
+
- A gap-closing driver that bisects the time window to recover tails a source
|
|
86
|
+
would otherwise hide.
|
|
87
|
+
- Per-source near-duplicate collapse, so repeats do not inflate the corpus while
|
|
88
|
+
cross-platform coverage is preserved.
|
|
89
|
+
- Context-lean by design: the agent receives summaries, coverage, gaps, and the
|
|
90
|
+
top results, never the raw corpus.
|
|
91
|
+
- Saved sessions you can continue later, deleted only on your confirmation.
|
|
92
|
+
|
|
93
|
+
## How it works
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
query
|
|
97
|
+
|
|
|
98
|
+
v
|
|
99
|
+
sources (keyless) access (walled, via OpenCLI + your browser)
|
|
100
|
+
\_________________ _________________/
|
|
101
|
+
\/
|
|
102
|
+
gap-closing driver (bisect on ceiling)
|
|
103
|
+
|
|
|
104
|
+
dedup + ranking
|
|
105
|
+
|
|
|
106
|
+
session on disk ---> summary + coverage + gaps ---> agent
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Keyless sources call public endpoints directly. Walled platforms are reached by
|
|
110
|
+
shelling to `opencli <site> <command>` against your logged-in browser. Results are
|
|
111
|
+
normalized to one record shape, deduplicated, ranked, and written to a session.
|
|
112
|
+
Only the summary returns to the caller.
|
|
113
|
+
|
|
114
|
+
## Install
|
|
115
|
+
|
|
116
|
+
Install from source (not yet on PyPI):
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
uv tool install git+https://github.com/ali-rajabpour/Net-Sift.git
|
|
120
|
+
# or: pipx install git+https://github.com/ali-rajabpour/Net-Sift.git
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Then register it with your clients:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
net-sift install # register the MCP + status bar, check deps, run doctor
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`net-sift install` registers the MCP server and a status bar with Claude Code and
|
|
130
|
+
Codex, checks for Node and OpenCLI, and runs the doctor. Restart your client
|
|
131
|
+
afterward so it picks up the server.
|
|
132
|
+
|
|
133
|
+
## Quickstart
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
net-sift doctor # what can be reached right now
|
|
137
|
+
net-sift search "topic" --platforms github,arxiv --max 50
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
In an MCP client, call `deep_search`:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
deep_search(query="post-quantum cryptography adoption", since="2026-01-01")
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
You get a summary with per-source counts, a coverage map, the gap list, the top
|
|
147
|
+
ranked items, and the corpus path.
|
|
148
|
+
|
|
149
|
+
## Walled platforms
|
|
150
|
+
|
|
151
|
+
Twitter/X, Reddit, Instagram, Facebook, Bilibili, and Xiaohongshu need a logged-in
|
|
152
|
+
Chromium browser and OpenCLI. See [net_sift/guides/setup-opencli.md](net_sift/guides/setup-opencli.md).
|
|
153
|
+
Short version:
|
|
154
|
+
|
|
155
|
+
1. Install Node 20.18.1+ and `@jackwener/opencli` (or OpenCLIApp).
|
|
156
|
+
2. Use a Chromium browser (Chrome, Edge, Brave, Arc, Comet, and so on) with the
|
|
157
|
+
OpenCLI Browser Bridge extension. Safari and Firefox cannot load it.
|
|
158
|
+
3. Log into the platforms you want in that browser.
|
|
159
|
+
4. Run `net-sift doctor` to confirm.
|
|
160
|
+
|
|
161
|
+
Desktop only. There is no headless or server path for walled platforms.
|
|
162
|
+
|
|
163
|
+
## Sources
|
|
164
|
+
|
|
165
|
+
Full table in [net_sift/guides/sources.md](net_sift/guides/sources.md). Keyless
|
|
166
|
+
sources are on by default; walled sources appear once OpenCLI is connected.
|
|
167
|
+
|
|
168
|
+
## MCP tools
|
|
169
|
+
|
|
170
|
+
| Tool | Purpose |
|
|
171
|
+
|------|---------|
|
|
172
|
+
| `deep_search` | run a sweep, return a summary and the corpus path |
|
|
173
|
+
| `resume` | continue an earlier search |
|
|
174
|
+
| `list_sessions` | list saved searches |
|
|
175
|
+
| `cleanup` | delete a saved search (after user confirmation) |
|
|
176
|
+
| `doctor` | what is reachable and how to connect walled platforms |
|
|
177
|
+
| `status` | compact connectivity snapshot |
|
|
178
|
+
| `fetch` | readable text for one page |
|
|
179
|
+
|
|
180
|
+
## Configuration
|
|
181
|
+
|
|
182
|
+
| Variable | Effect |
|
|
183
|
+
|----------|--------|
|
|
184
|
+
| `GITHUB_TOKEN` | higher GitHub Search API rate limit |
|
|
185
|
+
| `NET_SIFT_HOME` | session storage location (default `~/.net-sift`) |
|
|
186
|
+
| `NET_SIFT_OPENCLI_BIN` | path to the `opencli` binary if not on `PATH` |
|
|
187
|
+
|
|
188
|
+
All configuration is read from the environment. Net-Sift stores no credentials.
|
|
189
|
+
|
|
190
|
+
## Sessions and privacy
|
|
191
|
+
|
|
192
|
+
Each search is written to `~/.net-sift/sessions/<id>/` as `corpus.jsonl` and
|
|
193
|
+
`meta.json`. Nothing is sent anywhere. After a search, Net-Sift reminds you the
|
|
194
|
+
corpus is kept so you can `resume` it, and deletes it only when you call `cleanup`.
|
|
195
|
+
Walled platforms use your own browser session; Net-Sift never reads or copies your
|
|
196
|
+
cookies.
|
|
197
|
+
|
|
198
|
+
## Development
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
git clone https://github.com/ali-rajabpour/Net-Sift.git
|
|
202
|
+
cd Net-Sift
|
|
203
|
+
python -m venv .venv && source .venv/bin/activate
|
|
204
|
+
pip install -e ".[dev]"
|
|
205
|
+
ruff check net_sift tests && pytest
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
See [docs/architecture.md](docs/architecture.md) for the design.
|
|
209
|
+
|
|
210
|
+
## Contributing
|
|
211
|
+
|
|
212
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). Net-Sift is read-only research: it does not
|
|
213
|
+
post, comment, or bypass authentication, and contributions stay within that scope.
|
|
214
|
+
|
|
215
|
+
## Security
|
|
216
|
+
|
|
217
|
+
See [SECURITY.md](SECURITY.md). Report vulnerabilities privately through GitHub.
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT. See [LICENSE](LICENSE). This project includes code adapted from
|
|
222
|
+
[Agent Reach](https://github.com/Panniantong/Agent-Reach) (MIT); see [NOTICE](NOTICE).
|
|
223
|
+
|
|
224
|
+
## Acknowledgements
|
|
225
|
+
|
|
226
|
+
- [OpenCLI](https://github.com/jackwener/opencli) for logged-in browser access.
|
|
227
|
+
- [Agent Reach](https://github.com/Panniantong/Agent-Reach) for the onboarding and
|
|
228
|
+
doctor patterns.
|