dotagent-web-research 1.2.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.
Files changed (127) hide show
  1. dotagent_web_research-1.2.0/LICENSE +21 -0
  2. dotagent_web_research-1.2.0/MANIFEST.in +7 -0
  3. dotagent_web_research-1.2.0/PKG-INFO +330 -0
  4. dotagent_web_research-1.2.0/README.md +281 -0
  5. dotagent_web_research-1.2.0/benchmarks/search_relevance_queries.json +81 -0
  6. dotagent_web_research-1.2.0/benchmarks/web_search_relevance.json +647 -0
  7. dotagent_web_research-1.2.0/benchmarks/web_search_relevance_integration.json +649 -0
  8. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/PKG-INFO +330 -0
  9. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/SOURCES.txt +125 -0
  10. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/dependency_links.txt +1 -0
  11. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/entry_points.txt +3 -0
  12. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/requires.txt +30 -0
  13. dotagent_web_research-1.2.0/dotagent_web_research.egg-info/top_level.txt +1 -0
  14. dotagent_web_research-1.2.0/pyproject.toml +123 -0
  15. dotagent_web_research-1.2.0/setup.cfg +4 -0
  16. dotagent_web_research-1.2.0/tests/conftest.py +17 -0
  17. dotagent_web_research-1.2.0/tests/fixtures/ddg_lite_python_asyncio_tutorial.html +785 -0
  18. dotagent_web_research-1.2.0/tests/fixtures/ranking_of_recorded_queries.json +72 -0
  19. dotagent_web_research-1.2.0/tests/fixtures/yahoo_python_asyncio_tutorial.html +84 -0
  20. dotagent_web_research-1.2.0/tests/test_api.py +208 -0
  21. dotagent_web_research-1.2.0/tests/test_config.py +72 -0
  22. dotagent_web_research-1.2.0/tests/test_duckduckgo_lite.py +226 -0
  23. dotagent_web_research-1.2.0/tests/test_duckduckgo_search.py +118 -0
  24. dotagent_web_research-1.2.0/tests/test_google_search.py +265 -0
  25. dotagent_web_research-1.2.0/tests/test_local_env.py +78 -0
  26. dotagent_web_research-1.2.0/tests/test_mcp_server.py +128 -0
  27. dotagent_web_research-1.2.0/tests/test_mcp_tool_text.py +49 -0
  28. dotagent_web_research-1.2.0/tests/test_mcp_version.py +144 -0
  29. dotagent_web_research-1.2.0/tests/test_network_safety.py +59 -0
  30. dotagent_web_research-1.2.0/tests/test_packaging.py +150 -0
  31. dotagent_web_research-1.2.0/tests/test_redis_cache.py +220 -0
  32. dotagent_web_research-1.2.0/tests/test_research_agent.py +646 -0
  33. dotagent_web_research-1.2.0/tests/test_scrapers.py +296 -0
  34. dotagent_web_research-1.2.0/tests/test_web_api.py +353 -0
  35. dotagent_web_research-1.2.0/tests/test_web_archive_fallback.py +415 -0
  36. dotagent_web_research-1.2.0/tests/test_web_archive_transport.py +375 -0
  37. dotagent_web_research-1.2.0/tests/test_web_browser.py +33 -0
  38. dotagent_web_research-1.2.0/tests/test_web_cache_timings.py +76 -0
  39. dotagent_web_research-1.2.0/tests/test_web_crawl.py +248 -0
  40. dotagent_web_research-1.2.0/tests/test_web_crawl_persistence.py +361 -0
  41. dotagent_web_research-1.2.0/tests/test_web_crawl_schemes.py +135 -0
  42. dotagent_web_research-1.2.0/tests/test_web_crawl_sitemap.py +199 -0
  43. dotagent_web_research-1.2.0/tests/test_web_discovery.py +789 -0
  44. dotagent_web_research-1.2.0/tests/test_web_dns_errors.py +102 -0
  45. dotagent_web_research-1.2.0/tests/test_web_extract_fields.py +194 -0
  46. dotagent_web_research-1.2.0/tests/test_web_extract_limits.py +146 -0
  47. dotagent_web_research-1.2.0/tests/test_web_extract_paging.py +197 -0
  48. dotagent_web_research-1.2.0/tests/test_web_fetcher.py +289 -0
  49. dotagent_web_research-1.2.0/tests/test_web_interstitial.py +291 -0
  50. dotagent_web_research-1.2.0/tests/test_web_output_hygiene.py +177 -0
  51. dotagent_web_research-1.2.0/tests/test_web_page_cache.py +369 -0
  52. dotagent_web_research-1.2.0/tests/test_web_pdf.py +268 -0
  53. dotagent_web_research-1.2.0/tests/test_web_primitives.py +323 -0
  54. dotagent_web_research-1.2.0/tests/test_web_scrape_batch.py +377 -0
  55. dotagent_web_research-1.2.0/tests/test_web_scrape_limits.py +63 -0
  56. dotagent_web_research-1.2.0/tests/test_web_scrape_links.py +159 -0
  57. dotagent_web_research-1.2.0/tests/test_web_scrape_metadata.py +61 -0
  58. dotagent_web_research-1.2.0/tests/test_web_search_angles.py +160 -0
  59. dotagent_web_research-1.2.0/tests/test_web_search_chain.py +278 -0
  60. dotagent_web_research-1.2.0/tests/test_web_search_cut.py +146 -0
  61. dotagent_web_research-1.2.0/tests/test_web_search_dates.py +204 -0
  62. dotagent_web_research-1.2.0/tests/test_web_search_floor.py +249 -0
  63. dotagent_web_research-1.2.0/tests/test_web_search_honesty.py +159 -0
  64. dotagent_web_research-1.2.0/tests/test_web_search_parameters.py +500 -0
  65. dotagent_web_research-1.2.0/tests/test_web_search_read.py +298 -0
  66. dotagent_web_research-1.2.0/tests/test_web_search_relevance.py +93 -0
  67. dotagent_web_research-1.2.0/tests/test_web_search_resilience.py +394 -0
  68. dotagent_web_research-1.2.0/tests/test_web_search_sources.py +317 -0
  69. dotagent_web_research-1.2.0/tests/test_web_service.py +476 -0
  70. dotagent_web_research-1.2.0/tests/test_web_sitemap_xml.py +60 -0
  71. dotagent_web_research-1.2.0/tests/test_web_source_types.py +98 -0
  72. dotagent_web_research-1.2.0/tests/test_web_xml_warning.py +84 -0
  73. dotagent_web_research-1.2.0/tests/test_yahoo_search.py +374 -0
  74. dotagent_web_research-1.2.0/web_scraper/__init__.py +4 -0
  75. dotagent_web_research-1.2.0/web_scraper/ai_agent.py +203 -0
  76. dotagent_web_research-1.2.0/web_scraper/api.py +1549 -0
  77. dotagent_web_research-1.2.0/web_scraper/api_models.py +773 -0
  78. dotagent_web_research-1.2.0/web_scraper/api_runtime.py +460 -0
  79. dotagent_web_research-1.2.0/web_scraper/async_scrapers.py +392 -0
  80. dotagent_web_research-1.2.0/web_scraper/cli.py +408 -0
  81. dotagent_web_research-1.2.0/web_scraper/config.py +444 -0
  82. dotagent_web_research-1.2.0/web_scraper/content_safety.py +189 -0
  83. dotagent_web_research-1.2.0/web_scraper/duckduckgo_search.py +455 -0
  84. dotagent_web_research-1.2.0/web_scraper/google_search.py +891 -0
  85. dotagent_web_research-1.2.0/web_scraper/local_env.py +22 -0
  86. dotagent_web_research-1.2.0/web_scraper/mcp_server.py +611 -0
  87. dotagent_web_research-1.2.0/web_scraper/network_safety.py +110 -0
  88. dotagent_web_research-1.2.0/web_scraper/playwright_scrapers.py +350 -0
  89. dotagent_web_research-1.2.0/web_scraper/redis_cache.py +215 -0
  90. dotagent_web_research-1.2.0/web_scraper/research/__init__.py +11 -0
  91. dotagent_web_research-1.2.0/web_scraper/research/agent.py +2484 -0
  92. dotagent_web_research-1.2.0/web_scraper/research/citation_verifier.py +236 -0
  93. dotagent_web_research-1.2.0/web_scraper/research/constants.py +373 -0
  94. dotagent_web_research-1.2.0/web_scraper/research/llm_client.py +136 -0
  95. dotagent_web_research-1.2.0/web_scraper/research/models.py +40 -0
  96. dotagent_web_research-1.2.0/web_scraper/research/profile_collectors.py +464 -0
  97. dotagent_web_research-1.2.0/web_scraper/research/prompts.py +771 -0
  98. dotagent_web_research-1.2.0/web_scraper/research/ranking.py +395 -0
  99. dotagent_web_research-1.2.0/web_scraper/research/retry_utils.py +86 -0
  100. dotagent_web_research-1.2.0/web_scraper/research/text_utils.py +326 -0
  101. dotagent_web_research-1.2.0/web_scraper/research/url_utils.py +155 -0
  102. dotagent_web_research-1.2.0/web_scraper/research_agent.py +13 -0
  103. dotagent_web_research-1.2.0/web_scraper/scrapers.py +464 -0
  104. dotagent_web_research-1.2.0/web_scraper/stealth.py +112 -0
  105. dotagent_web_research-1.2.0/web_scraper/web_tools/__init__.py +5 -0
  106. dotagent_web_research-1.2.0/web_scraper/web_tools/archive_fetcher.py +183 -0
  107. dotagent_web_research-1.2.0/web_scraper/web_tools/browser.py +353 -0
  108. dotagent_web_research-1.2.0/web_scraper/web_tools/budget.py +237 -0
  109. dotagent_web_research-1.2.0/web_scraper/web_tools/content.py +770 -0
  110. dotagent_web_research-1.2.0/web_scraper/web_tools/crawl.py +669 -0
  111. dotagent_web_research-1.2.0/web_scraper/web_tools/crawl_store.py +180 -0
  112. dotagent_web_research-1.2.0/web_scraper/web_tools/discovery.py +1294 -0
  113. dotagent_web_research-1.2.0/web_scraper/web_tools/errors.py +63 -0
  114. dotagent_web_research-1.2.0/web_scraper/web_tools/fetcher.py +407 -0
  115. dotagent_web_research-1.2.0/web_scraper/web_tools/fields.py +534 -0
  116. dotagent_web_research-1.2.0/web_scraper/web_tools/metrics.py +72 -0
  117. dotagent_web_research-1.2.0/web_scraper/web_tools/pagecache.py +102 -0
  118. dotagent_web_research-1.2.0/web_scraper/web_tools/pdf.py +164 -0
  119. dotagent_web_research-1.2.0/web_scraper/web_tools/providers.py +71 -0
  120. dotagent_web_research-1.2.0/web_scraper/web_tools/relevance.py +93 -0
  121. dotagent_web_research-1.2.0/web_scraper/web_tools/robots.py +71 -0
  122. dotagent_web_research-1.2.0/web_scraper/web_tools/search.py +321 -0
  123. dotagent_web_research-1.2.0/web_scraper/web_tools/service.py +2050 -0
  124. dotagent_web_research-1.2.0/web_scraper/web_tools/settings.py +366 -0
  125. dotagent_web_research-1.2.0/web_scraper/web_tools/sources.py +388 -0
  126. dotagent_web_research-1.2.0/web_scraper/web_tools/urls.py +219 -0
  127. dotagent_web_research-1.2.0/web_scraper/yahoo_search.py +189 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Senol Dogan
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.
@@ -0,0 +1,7 @@
1
+ include LICENSE README.md
2
+ # The tests an sdist carries need what they read: their fixtures, the queries of the relevance
3
+ # benchmark and the two runs recorded of them.
4
+ graft tests
5
+ include benchmarks/search_relevance_queries.json benchmarks/web_search_relevance.json
6
+ include benchmarks/web_search_relevance_integration.json
7
+ global-exclude __pycache__ *.py[cod] .DS_Store
@@ -0,0 +1,330 @@
1
+ Metadata-Version: 2.4
2
+ Name: dotagent-web-research
3
+ Version: 1.2.0
4
+ Summary: MCP server for web search and reading (search, scrape, map, extract, crawl) that Dot, an always-on agent for macOS, uses
5
+ Author-email: Senol Dogan <senoldogan@users.noreply.github.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/senoldogann/web-research-stack
8
+ Project-URL: Repository, https://github.com/senoldogann/web-research-stack.git
9
+ Project-URL: Issues, https://github.com/senoldogann/web-research-stack/issues
10
+ Project-URL: Documentation, https://github.com/senoldogann/web-research-stack/tree/main/docs
11
+ Keywords: mcp,model-context-protocol,web-search,web-scraping,crawler,dot,agent
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Requires-Python: >=3.9
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: httpx>=0.26.0
23
+ Requires-Dist: curl_cffi>=0.7.3
24
+ Requires-Dist: beautifulsoup4>=4.12.0
25
+ Requires-Dist: lxml>=4.9.0
26
+ Requires-Dist: defusedxml>=0.7.1
27
+ Requires-Dist: fastapi>=0.109.0
28
+ Requires-Dist: uvicorn[standard]>=0.27.0
29
+ Requires-Dist: pydantic>=2.5.0
30
+ Requires-Dist: python-dotenv>=1.1.0
31
+ Requires-Dist: click>=8.1.0
32
+ Requires-Dist: tqdm>=4.66.0
33
+ Requires-Dist: pypdf>=5.1.0
34
+ Provides-Extra: dev
35
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
36
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
37
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
38
+ Requires-Dist: httpx>=0.26.0; extra == "dev"
39
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
40
+ Requires-Dist: redis[hiredis]>=5.0.0; extra == "dev"
41
+ Provides-Extra: playwright
42
+ Requires-Dist: playwright>=1.40.0; extra == "playwright"
43
+ Requires-Dist: playwright-stealth>=1.0.6; extra == "playwright"
44
+ Provides-Extra: camoufox
45
+ Requires-Dist: camoufox[geoip]>=0.4.0; extra == "camoufox"
46
+ Provides-Extra: redis
47
+ Requires-Dist: redis[hiredis]>=5.0.0; extra == "redis"
48
+ Dynamic: license-file
49
+
50
+ # Web Research Stack / Web Araştırma Yığını
51
+
52
+ <div align="center">
53
+ https://github.com/senoldogann/web-research-stack/raw/main/GITHUB-video.mp4
54
+ <br/>
55
+ <em>2-Minute Demonstration / 2 Dakikalık Tanıtım Videosu</em>
56
+ </div>
57
+
58
+ [English](#english) | [Türkçe](#türkçe)
59
+
60
+ ---
61
+
62
+ ## English
63
+
64
+ ### Overview
65
+
66
+ **Web Scraper** is a powerful, production-ready web scraping and research tool with full-stack capabilities. It combines a Python FastAPI backend with a modern React Next.js frontend, featuring LLM-powered research capabilities with citation support.
67
+
68
+ ### Install
69
+
70
+ The MCP server for web search and reading that Dot, the always-on agent for macOS, uses ships as a Python package, `dotagent-web-research` (the import package is `web_scraper`):
71
+
72
+ ```bash
73
+ pip install dotagent-web-research
74
+ # or, as a command of its own
75
+ uv tool install dotagent-web-research
76
+ ```
77
+
78
+ It installs two commands: `web-research-mcp`, the MCP server over stdio (tools `web_search`, `web_scrape`, `web_map`, `web_extract`, `web_crawl_start`, `web_crawl_status`, `web_crawl_results`, `web_crawl_cancel`), and `web-scraper`, the CLI and REST server described below. The headless-browser fallbacks are extras: `pip install "dotagent-web-research[camoufox]"` or `"[playwright]"`.
79
+
80
+ **How Dot uses it.** Dot's package depends on this one, so a fresh Dot install brings it. Dot starts `web-research-mcp` as one of its MCP servers (named `web-research`) and its tools reach the agent as `mcp__web-research__web_search`, `mcp__web-research__web_scrape` and so on. In Dot's `config.toml` it is one table; [docs/web-tools.md](docs/web-tools.md) has it and the settings (`WEB_TOOLS_*`) the server reads.
81
+
82
+ ```toml
83
+ [[mcp]]
84
+ name = "web-research"
85
+ command = "web-research-mcp"
86
+ ```
87
+
88
+ ### Features
89
+
90
+ - **Dual Interface**: CLI commands and REST API
91
+ - **Local Web Research Tools**: HTTP-first multi-angle search with field-weighted BM25, weighted angle consensus, freshness filters, caching and provider cooldown, plus scrape, map, background crawl, and structured extract, exposed over REST and a Dot-ready stdio MCP server (headless-only browser fallback)
92
+ - **LLM Research Tool**: AI-powered web research with citations
93
+ - **Async Architecture**: High-performance concurrent scraping
94
+ - **Production Ready**: Docker, monitoring (Prometheus/Grafana), rate limiting, circuit breaker
95
+ - **Security First**: SSRF protection, input validation, security headers
96
+ - **Multi-language UI**: English and Turkish language support
97
+ - **Streaming Support**: Real-time research progress via Server-Sent Events (SSE)
98
+ - **Code Block Preservation**: Scraper preserves code blocks from source pages with syntax highlighting
99
+ - **Internationalized Status Messages**: Research progress messages adapt to query language (TR/EN)
100
+ - **Resilient JSON Parsing**: 3-stage recovery for LLM synthesis output (strict → repair → retry)
101
+
102
+ ### Tech Stack
103
+
104
+ | Component | Technology |
105
+ |-----------|-------------|
106
+ | Backend | Python 3.9+, FastAPI, asyncio |
107
+ | Frontend | React 19, Next.js 15, TypeScript, Tailwind CSS |
108
+ | Database | SQLite (history & caching) |
109
+ | HTTP Client | httpx, curl_cffi |
110
+ | HTML Parsing | BeautifulSoup4, lxml |
111
+ | AI/ML | Ollama, OpenAI API compatible |
112
+
113
+ ### Quick Start
114
+
115
+ ```bash
116
+ # Clone the repository
117
+ git clone https://github.com/senoldogann/web-research-stack.git
118
+ cd web-research-stack
119
+
120
+ # Install dependencies
121
+ pip install -e .
122
+
123
+ # Start the API server
124
+ web-scraper serve
125
+
126
+ # Or use Docker
127
+ docker compose up --build
128
+ ```
129
+
130
+ ### Google search stays off your screen
131
+
132
+ Google no longer serves results to plain HTTP clients, and headless Chrome is caught within one request. A headed Chrome gets the real page, so the searcher starts Chrome itself, **minimises its window over CDP before the first search**, and keeps one browser and one tab for the process: ~2 s to start (a brief flash of a small window), then 0.4–1 s per search. If Chrome is missing or refused, **Camoufox** — a patched headless Firefox — takes over.
133
+
134
+ ```bash
135
+ pip install -e ".[playwright]" # the Chrome path
136
+ pip install -e ".[camoufox]" && python -m camoufox fetch # the headless fallback
137
+ ```
138
+
139
+ - `GOOGLE_ALLOW_VISIBLE_BROWSER=true` — leave the Chrome window on screen (debugging).
140
+ - `GOOGLE_USE_PLAYWRIGHT=false` — skip Google entirely and rely on DuckDuckGo.
141
+
142
+ ### API Endpoints
143
+
144
+ | Endpoint | Method | Description |
145
+ |----------|--------|-------------|
146
+ | `/` | GET | API information |
147
+ | `/health` | GET | Health check |
148
+ | `/api/v1/metrics` | GET | Prometheus metrics |
149
+ | `/api/v1/tools` | GET | Tool manifest for LLM |
150
+ | `/api/v1/scrape` | POST | Scrape a single URL |
151
+ | `/api/v1/scrape/batch` | POST | Batch scrape multiple URLs |
152
+ | `/api/v1/tools/web-research` | POST | Run AI-powered research |
153
+ | `/api/v1/tools/web-research/stream` | POST | Stream research progress |
154
+ | `/api/v1/web/search` | POST | Discover URLs with a search adapter |
155
+ | `/api/v1/web/scrape` | POST | Scrape one page to Markdown, metadata, and links |
156
+ | `/api/v1/web/map` | POST | List URLs from sitemaps and page links |
157
+ | `/api/v1/web/extract` | POST | Extract structured fields with provenance |
158
+ | `/api/v1/web/crawl` | POST | Start a background crawl and return its job id |
159
+ | `/api/v1/web/crawl/{job_id}` | GET | Crawl progress and counters |
160
+ | `/api/v1/web/crawl/{job_id}/results` | GET | Paginated crawl results |
161
+ | `/api/v1/web/crawl/{job_id}/cancel` | POST | Cancel a queued or in-flight crawl |
162
+ | `/api/v1/web/stats` | GET | Web tool latency, cache, and browser state |
163
+ | `/api/v1/research` | POST | Legacy research endpoint |
164
+ | `/api/v1/research/stream` | POST | Legacy streaming research |
165
+
166
+ ### Example: Research Request
167
+
168
+ ```bash
169
+ curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
170
+ -H "Content-Type: application/json" \
171
+ -H "X-API-Key: your-api-key" \
172
+ -d '{
173
+ "query": "Latest developments in AI",
174
+ "max_sources": 5,
175
+ "deep_mode": false,
176
+ "provider": "ollama"
177
+ }'
178
+ ```
179
+
180
+ ### Documentation
181
+
182
+ - [Installation Guide](./docs/installation-tr.md#installation-guide)
183
+ - [User Guide](./docs/user-guide.md#english)
184
+ - [API Documentation](./docs/api.md#english)
185
+ - [LLM Integration](./docs/llm-tool-integration.md)
186
+ - [Local Web Tools](./docs/web-tools.md)
187
+ - [Production Deployment](./docs/production-deployment.md)
188
+
189
+ ### License
190
+
191
+ MIT License
192
+
193
+ ---
194
+
195
+ ## Türkçe
196
+
197
+ ### Genel Bakış
198
+
199
+ **Web Scraper**, güçlü ve üretim ortamına hazır bir web kazıma ve araştırma aracıdır. Python FastAPI backend ile modern React Next.js frontend'i birleştirir, alıntılı LLM destekli araştırma özelliklerine sahiptir.
200
+
201
+ ### Kurulum
202
+
203
+ Dot'un (macOS için her zaman açık ajan) kullandığı web arama ve okuma MCP sunucusu bir Python paketi olarak gelir: `dotagent-web-research` (içe aktarılan paket `web_scraper`):
204
+
205
+ ```bash
206
+ pip install dotagent-web-research
207
+ # veya kendi başına bir komut olarak
208
+ uv tool install dotagent-web-research
209
+ ```
210
+
211
+ İki komut kurar: stdio üzerinden MCP sunucusu `web-research-mcp` ve aşağıda anlatılan CLI ile REST sunucusu `web-scraper`. Headless tarayıcı yedekleri ek pakettir: `pip install "dotagent-web-research[camoufox]"` veya `"[playwright]"`.
212
+
213
+ **Dot bunu nasıl kullanır.** Dot'un paketi buna bağlıdır; yeni bir Dot kurulumu bunu da getirir. Dot `web-research-mcp`'yi MCP sunucularından biri olarak (`web-research` adıyla) başlatır; araçlar ajana `mcp__web-research__web_search`, `mcp__web-research__web_scrape` gibi görünür. Ayrıntı ve ayarlar için [docs/web-tools.md](docs/web-tools.md).
214
+
215
+ ### Özellikler
216
+
217
+ - **Çift Arayüz**: CLI komutları ve REST API
218
+ - **Yerel Web Araştırma Araçları**: Alan ağırlıklı BM25, ağırlıklı açı uzlaşması, güncellik filtreleri, önbellek ve sağlayıcı soğuması içeren çok açılı HTTP öncelikli arama; kazıma, haritalama, arka plan taraması ve yapılandırılmış çıkarım; REST ve Dot'a hazır stdio MCP sunucusu (yalnızca headless tarayıcı yedeği)
219
+ - **LLM Araştırma Aracı**: Alıntılı AI destekli web araştırması
220
+ - **Asenkron Mimari**: Yüksek performanslı eşzamanlı kazıma
221
+ - **Üretim Hazır**: Docker, izleme (Prometheus/Grafana), hız sınırlama, circuit breaker
222
+ - **Güvenlik Öncelikli**: SSRF koruması, giriş doğrulama, güvenlik başlıkları
223
+ - **Çok Dilli UI**: İngilizce ve Türkçe dil desteği
224
+ - **Yayın Akışı**: Sunucu Tarafından Gönderilen Olaylar (SSE) ile gerçek zamanlı araştırma ilerlemesi
225
+ - **Kod Bloğu Koruma**: Kaynak sayfalardan kod blokları söz dizimi vurgulamasıyla korunur
226
+ - **Uluslararasılaştırılmış Durum Mesajları**: Araştırma ilerleme mesajları sorgu diline göre uyarlanır (TR/EN)
227
+ - **Dayanıklı JSON Ayrıştırma**: LLM sentez çıktısı için 3 aşamalı kurtarma (katı → onarım → yeniden deneme)
228
+
229
+ ### Teknoloji Yığını
230
+
231
+ | Bileşen | Teknoloji |
232
+ |---------|-----------|
233
+ | Backend | Python 3.9+, FastAPI, asyncio |
234
+ | Frontend | React 19, Next.js 15, TypeScript, Tailwind CSS |
235
+ | Veritabanı | SQLite (geçmiş ve önbellek) |
236
+ | HTTP İstemcisi | httpx, curl_cffi |
237
+ | HTML Ayrıştırma | BeautifulSoup4, lxml |
238
+ | AI/ML | Ollama, OpenAI API uyumlu |
239
+
240
+ ### Hızlı Başlangıç
241
+
242
+ ```bash
243
+ # Depoyu klonla
244
+ git clone https://github.com/senoldogann/web-research-stack.git
245
+ cd web-research-stack
246
+
247
+ # Bağımlılıkları yükle
248
+ pip install -e .
249
+
250
+ # API sunucusunu başlat
251
+ web-scraper serve
252
+
253
+ # Veya Docker kullan
254
+ docker compose up --build
255
+ ```
256
+
257
+ ### Google araması ekranda görünmez
258
+
259
+ Google artık düz HTTP istemcilerine sonuç döndürmüyor ve headless Chrome tek istekte yakalanıyor. Başlı (headed) Chrome gerçek sayfayı alıyor; bu yüzden arayıcı Chrome'u kendisi başlatıp **penceresini ilk aramadan önce CDP ile küçültüyor** ve süreç boyunca tek tarayıcı + tek sekme kullanıyor: başlatma ~2 sn (küçük bir pencere kısa süre görünür), sonrası arama başına 0,4–1 sn. Chrome yoksa ya da reddederse **Camoufox** — yamalı, headless Firefox — devralıyor.
260
+
261
+ ```bash
262
+ pip install -e ".[playwright]" # Chrome yolu
263
+ pip install -e ".[camoufox]" && python -m camoufox fetch # görünmez yedek
264
+ ```
265
+
266
+ - `GOOGLE_ALLOW_VISIBLE_BROWSER=true` — Chrome penceresi ekranda kalsın (hata ayıklama).
267
+ - `GOOGLE_USE_PLAYWRIGHT=false` — Google'ı tamamen atla, DuckDuckGo kullan.
268
+
269
+ ### API Uç Noktaları
270
+
271
+ | Uç Nokta | Metod | Açıklama |
272
+ |----------|-------|----------|
273
+ | `/` | GET | API bilgileri |
274
+ | `/health` | GET | Sağlık kontrolü |
275
+ | `/api/v1/metrics` | GET | Prometheus metrikleri |
276
+ | `/api/v1/tools` | GET | LLM için araç manifestosu |
277
+ | `/api/v1/scrape` | POST | Tek URL kazıma |
278
+ | `/api/v1/scrape/batch` | POST | Toplu URL kazıma |
279
+ | `/api/v1/tools/web-research` | POST | AI destekli araştırma |
280
+ | `/api/v1/tools/web-research/stream` | POST | Araştırma ilerlemesi yayını |
281
+ | `/api/v1/web/search` | POST | Arama adaptörüyle URL keşfi |
282
+ | `/api/v1/web/scrape` | POST | Tek sayfayı Markdown, üst veri ve bağlantılara dönüştür |
283
+ | `/api/v1/web/map` | POST | Site haritaları ve sayfa bağlantılarından URL listele |
284
+ | `/api/v1/web/extract` | POST | Kaynak bilgisiyle yapılandırılmış alan çıkar |
285
+ | `/api/v1/web/crawl` | POST | Arka plan taraması başlat, iş kimliğini hemen döndür |
286
+ | `/api/v1/web/crawl/{job_id}` | GET | Tarama ilerlemesi ve sayaçları |
287
+ | `/api/v1/web/crawl/{job_id}/results` | GET | Sayfalanmış tarama sonuçları |
288
+ | `/api/v1/web/crawl/{job_id}/cancel` | POST | Sıradaki veya sürmekte olan taramayı iptal et |
289
+ | `/api/v1/web/stats` | GET | Web aracı gecikmesi, önbellek ve tarayıcı durumu |
290
+ | `/api/v1/research` | POST | Eski araştırma uç noktası |
291
+ | `/api/v1/research/stream` | POST | Eski yayın akışı araştırması |
292
+
293
+ ### Örnek: Araştırma İsteği
294
+
295
+ ```bash
296
+ curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
297
+ -H "Content-Type: application/json" \
298
+ -H "X-API-Key: sizin-api-anahtariniz" \
299
+ -d '{
300
+ "query": "Yapay zeka son gelişmeler",
301
+ "max_sources": 5,
302
+ "deep_mode": false,
303
+ "provider": "ollama"
304
+ }'
305
+ ```
306
+
307
+ ### Dokümantasyon
308
+
309
+ - [Kurulum Rehberi](./docs/installation-tr.md#kurulum-rehberi)
310
+ - [Kullanım Kılavuzu](./docs/user-guide.md#türkçe)
311
+ - [API Dokümantasyonu](./docs/api.md#türkçe)
312
+ - [LLM Entegrasyonu](./docs/llm-tool-integration.md)
313
+ - [Yerel Web Araçları](./docs/web-tools.md)
314
+ - [Üretim Dağıtımı](./docs/production-deployment.md)
315
+
316
+ ### Lisans
317
+
318
+ MIT Lisansı
319
+
320
+ ---
321
+
322
+ ## Contributing / Katkıda Bulunma
323
+
324
+ Contributions are welcome! Please read our [Contributing Guide](./CONTRIBUTING.md).
325
+
326
+ Katkılarınızı bekliyoruz! Lütfen [Katkı Rehberimizi](./CONTRIBUTING.md) okuyun.
327
+
328
+ ---
329
+
330
+ &copy; 2026 Senol Dogan. MIT License.
@@ -0,0 +1,281 @@
1
+ # Web Research Stack / Web Araştırma Yığını
2
+
3
+ <div align="center">
4
+ https://github.com/senoldogann/web-research-stack/raw/main/GITHUB-video.mp4
5
+ <br/>
6
+ <em>2-Minute Demonstration / 2 Dakikalık Tanıtım Videosu</em>
7
+ </div>
8
+
9
+ [English](#english) | [Türkçe](#türkçe)
10
+
11
+ ---
12
+
13
+ ## English
14
+
15
+ ### Overview
16
+
17
+ **Web Scraper** is a powerful, production-ready web scraping and research tool with full-stack capabilities. It combines a Python FastAPI backend with a modern React Next.js frontend, featuring LLM-powered research capabilities with citation support.
18
+
19
+ ### Install
20
+
21
+ The MCP server for web search and reading that Dot, the always-on agent for macOS, uses ships as a Python package, `dotagent-web-research` (the import package is `web_scraper`):
22
+
23
+ ```bash
24
+ pip install dotagent-web-research
25
+ # or, as a command of its own
26
+ uv tool install dotagent-web-research
27
+ ```
28
+
29
+ It installs two commands: `web-research-mcp`, the MCP server over stdio (tools `web_search`, `web_scrape`, `web_map`, `web_extract`, `web_crawl_start`, `web_crawl_status`, `web_crawl_results`, `web_crawl_cancel`), and `web-scraper`, the CLI and REST server described below. The headless-browser fallbacks are extras: `pip install "dotagent-web-research[camoufox]"` or `"[playwright]"`.
30
+
31
+ **How Dot uses it.** Dot's package depends on this one, so a fresh Dot install brings it. Dot starts `web-research-mcp` as one of its MCP servers (named `web-research`) and its tools reach the agent as `mcp__web-research__web_search`, `mcp__web-research__web_scrape` and so on. In Dot's `config.toml` it is one table; [docs/web-tools.md](docs/web-tools.md) has it and the settings (`WEB_TOOLS_*`) the server reads.
32
+
33
+ ```toml
34
+ [[mcp]]
35
+ name = "web-research"
36
+ command = "web-research-mcp"
37
+ ```
38
+
39
+ ### Features
40
+
41
+ - **Dual Interface**: CLI commands and REST API
42
+ - **Local Web Research Tools**: HTTP-first multi-angle search with field-weighted BM25, weighted angle consensus, freshness filters, caching and provider cooldown, plus scrape, map, background crawl, and structured extract, exposed over REST and a Dot-ready stdio MCP server (headless-only browser fallback)
43
+ - **LLM Research Tool**: AI-powered web research with citations
44
+ - **Async Architecture**: High-performance concurrent scraping
45
+ - **Production Ready**: Docker, monitoring (Prometheus/Grafana), rate limiting, circuit breaker
46
+ - **Security First**: SSRF protection, input validation, security headers
47
+ - **Multi-language UI**: English and Turkish language support
48
+ - **Streaming Support**: Real-time research progress via Server-Sent Events (SSE)
49
+ - **Code Block Preservation**: Scraper preserves code blocks from source pages with syntax highlighting
50
+ - **Internationalized Status Messages**: Research progress messages adapt to query language (TR/EN)
51
+ - **Resilient JSON Parsing**: 3-stage recovery for LLM synthesis output (strict → repair → retry)
52
+
53
+ ### Tech Stack
54
+
55
+ | Component | Technology |
56
+ |-----------|-------------|
57
+ | Backend | Python 3.9+, FastAPI, asyncio |
58
+ | Frontend | React 19, Next.js 15, TypeScript, Tailwind CSS |
59
+ | Database | SQLite (history & caching) |
60
+ | HTTP Client | httpx, curl_cffi |
61
+ | HTML Parsing | BeautifulSoup4, lxml |
62
+ | AI/ML | Ollama, OpenAI API compatible |
63
+
64
+ ### Quick Start
65
+
66
+ ```bash
67
+ # Clone the repository
68
+ git clone https://github.com/senoldogann/web-research-stack.git
69
+ cd web-research-stack
70
+
71
+ # Install dependencies
72
+ pip install -e .
73
+
74
+ # Start the API server
75
+ web-scraper serve
76
+
77
+ # Or use Docker
78
+ docker compose up --build
79
+ ```
80
+
81
+ ### Google search stays off your screen
82
+
83
+ Google no longer serves results to plain HTTP clients, and headless Chrome is caught within one request. A headed Chrome gets the real page, so the searcher starts Chrome itself, **minimises its window over CDP before the first search**, and keeps one browser and one tab for the process: ~2 s to start (a brief flash of a small window), then 0.4–1 s per search. If Chrome is missing or refused, **Camoufox** — a patched headless Firefox — takes over.
84
+
85
+ ```bash
86
+ pip install -e ".[playwright]" # the Chrome path
87
+ pip install -e ".[camoufox]" && python -m camoufox fetch # the headless fallback
88
+ ```
89
+
90
+ - `GOOGLE_ALLOW_VISIBLE_BROWSER=true` — leave the Chrome window on screen (debugging).
91
+ - `GOOGLE_USE_PLAYWRIGHT=false` — skip Google entirely and rely on DuckDuckGo.
92
+
93
+ ### API Endpoints
94
+
95
+ | Endpoint | Method | Description |
96
+ |----------|--------|-------------|
97
+ | `/` | GET | API information |
98
+ | `/health` | GET | Health check |
99
+ | `/api/v1/metrics` | GET | Prometheus metrics |
100
+ | `/api/v1/tools` | GET | Tool manifest for LLM |
101
+ | `/api/v1/scrape` | POST | Scrape a single URL |
102
+ | `/api/v1/scrape/batch` | POST | Batch scrape multiple URLs |
103
+ | `/api/v1/tools/web-research` | POST | Run AI-powered research |
104
+ | `/api/v1/tools/web-research/stream` | POST | Stream research progress |
105
+ | `/api/v1/web/search` | POST | Discover URLs with a search adapter |
106
+ | `/api/v1/web/scrape` | POST | Scrape one page to Markdown, metadata, and links |
107
+ | `/api/v1/web/map` | POST | List URLs from sitemaps and page links |
108
+ | `/api/v1/web/extract` | POST | Extract structured fields with provenance |
109
+ | `/api/v1/web/crawl` | POST | Start a background crawl and return its job id |
110
+ | `/api/v1/web/crawl/{job_id}` | GET | Crawl progress and counters |
111
+ | `/api/v1/web/crawl/{job_id}/results` | GET | Paginated crawl results |
112
+ | `/api/v1/web/crawl/{job_id}/cancel` | POST | Cancel a queued or in-flight crawl |
113
+ | `/api/v1/web/stats` | GET | Web tool latency, cache, and browser state |
114
+ | `/api/v1/research` | POST | Legacy research endpoint |
115
+ | `/api/v1/research/stream` | POST | Legacy streaming research |
116
+
117
+ ### Example: Research Request
118
+
119
+ ```bash
120
+ curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
121
+ -H "Content-Type: application/json" \
122
+ -H "X-API-Key: your-api-key" \
123
+ -d '{
124
+ "query": "Latest developments in AI",
125
+ "max_sources": 5,
126
+ "deep_mode": false,
127
+ "provider": "ollama"
128
+ }'
129
+ ```
130
+
131
+ ### Documentation
132
+
133
+ - [Installation Guide](./docs/installation-tr.md#installation-guide)
134
+ - [User Guide](./docs/user-guide.md#english)
135
+ - [API Documentation](./docs/api.md#english)
136
+ - [LLM Integration](./docs/llm-tool-integration.md)
137
+ - [Local Web Tools](./docs/web-tools.md)
138
+ - [Production Deployment](./docs/production-deployment.md)
139
+
140
+ ### License
141
+
142
+ MIT License
143
+
144
+ ---
145
+
146
+ ## Türkçe
147
+
148
+ ### Genel Bakış
149
+
150
+ **Web Scraper**, güçlü ve üretim ortamına hazır bir web kazıma ve araştırma aracıdır. Python FastAPI backend ile modern React Next.js frontend'i birleştirir, alıntılı LLM destekli araştırma özelliklerine sahiptir.
151
+
152
+ ### Kurulum
153
+
154
+ Dot'un (macOS için her zaman açık ajan) kullandığı web arama ve okuma MCP sunucusu bir Python paketi olarak gelir: `dotagent-web-research` (içe aktarılan paket `web_scraper`):
155
+
156
+ ```bash
157
+ pip install dotagent-web-research
158
+ # veya kendi başına bir komut olarak
159
+ uv tool install dotagent-web-research
160
+ ```
161
+
162
+ İki komut kurar: stdio üzerinden MCP sunucusu `web-research-mcp` ve aşağıda anlatılan CLI ile REST sunucusu `web-scraper`. Headless tarayıcı yedekleri ek pakettir: `pip install "dotagent-web-research[camoufox]"` veya `"[playwright]"`.
163
+
164
+ **Dot bunu nasıl kullanır.** Dot'un paketi buna bağlıdır; yeni bir Dot kurulumu bunu da getirir. Dot `web-research-mcp`'yi MCP sunucularından biri olarak (`web-research` adıyla) başlatır; araçlar ajana `mcp__web-research__web_search`, `mcp__web-research__web_scrape` gibi görünür. Ayrıntı ve ayarlar için [docs/web-tools.md](docs/web-tools.md).
165
+
166
+ ### Özellikler
167
+
168
+ - **Çift Arayüz**: CLI komutları ve REST API
169
+ - **Yerel Web Araştırma Araçları**: Alan ağırlıklı BM25, ağırlıklı açı uzlaşması, güncellik filtreleri, önbellek ve sağlayıcı soğuması içeren çok açılı HTTP öncelikli arama; kazıma, haritalama, arka plan taraması ve yapılandırılmış çıkarım; REST ve Dot'a hazır stdio MCP sunucusu (yalnızca headless tarayıcı yedeği)
170
+ - **LLM Araştırma Aracı**: Alıntılı AI destekli web araştırması
171
+ - **Asenkron Mimari**: Yüksek performanslı eşzamanlı kazıma
172
+ - **Üretim Hazır**: Docker, izleme (Prometheus/Grafana), hız sınırlama, circuit breaker
173
+ - **Güvenlik Öncelikli**: SSRF koruması, giriş doğrulama, güvenlik başlıkları
174
+ - **Çok Dilli UI**: İngilizce ve Türkçe dil desteği
175
+ - **Yayın Akışı**: Sunucu Tarafından Gönderilen Olaylar (SSE) ile gerçek zamanlı araştırma ilerlemesi
176
+ - **Kod Bloğu Koruma**: Kaynak sayfalardan kod blokları söz dizimi vurgulamasıyla korunur
177
+ - **Uluslararasılaştırılmış Durum Mesajları**: Araştırma ilerleme mesajları sorgu diline göre uyarlanır (TR/EN)
178
+ - **Dayanıklı JSON Ayrıştırma**: LLM sentez çıktısı için 3 aşamalı kurtarma (katı → onarım → yeniden deneme)
179
+
180
+ ### Teknoloji Yığını
181
+
182
+ | Bileşen | Teknoloji |
183
+ |---------|-----------|
184
+ | Backend | Python 3.9+, FastAPI, asyncio |
185
+ | Frontend | React 19, Next.js 15, TypeScript, Tailwind CSS |
186
+ | Veritabanı | SQLite (geçmiş ve önbellek) |
187
+ | HTTP İstemcisi | httpx, curl_cffi |
188
+ | HTML Ayrıştırma | BeautifulSoup4, lxml |
189
+ | AI/ML | Ollama, OpenAI API uyumlu |
190
+
191
+ ### Hızlı Başlangıç
192
+
193
+ ```bash
194
+ # Depoyu klonla
195
+ git clone https://github.com/senoldogann/web-research-stack.git
196
+ cd web-research-stack
197
+
198
+ # Bağımlılıkları yükle
199
+ pip install -e .
200
+
201
+ # API sunucusunu başlat
202
+ web-scraper serve
203
+
204
+ # Veya Docker kullan
205
+ docker compose up --build
206
+ ```
207
+
208
+ ### Google araması ekranda görünmez
209
+
210
+ Google artık düz HTTP istemcilerine sonuç döndürmüyor ve headless Chrome tek istekte yakalanıyor. Başlı (headed) Chrome gerçek sayfayı alıyor; bu yüzden arayıcı Chrome'u kendisi başlatıp **penceresini ilk aramadan önce CDP ile küçültüyor** ve süreç boyunca tek tarayıcı + tek sekme kullanıyor: başlatma ~2 sn (küçük bir pencere kısa süre görünür), sonrası arama başına 0,4–1 sn. Chrome yoksa ya da reddederse **Camoufox** — yamalı, headless Firefox — devralıyor.
211
+
212
+ ```bash
213
+ pip install -e ".[playwright]" # Chrome yolu
214
+ pip install -e ".[camoufox]" && python -m camoufox fetch # görünmez yedek
215
+ ```
216
+
217
+ - `GOOGLE_ALLOW_VISIBLE_BROWSER=true` — Chrome penceresi ekranda kalsın (hata ayıklama).
218
+ - `GOOGLE_USE_PLAYWRIGHT=false` — Google'ı tamamen atla, DuckDuckGo kullan.
219
+
220
+ ### API Uç Noktaları
221
+
222
+ | Uç Nokta | Metod | Açıklama |
223
+ |----------|-------|----------|
224
+ | `/` | GET | API bilgileri |
225
+ | `/health` | GET | Sağlık kontrolü |
226
+ | `/api/v1/metrics` | GET | Prometheus metrikleri |
227
+ | `/api/v1/tools` | GET | LLM için araç manifestosu |
228
+ | `/api/v1/scrape` | POST | Tek URL kazıma |
229
+ | `/api/v1/scrape/batch` | POST | Toplu URL kazıma |
230
+ | `/api/v1/tools/web-research` | POST | AI destekli araştırma |
231
+ | `/api/v1/tools/web-research/stream` | POST | Araştırma ilerlemesi yayını |
232
+ | `/api/v1/web/search` | POST | Arama adaptörüyle URL keşfi |
233
+ | `/api/v1/web/scrape` | POST | Tek sayfayı Markdown, üst veri ve bağlantılara dönüştür |
234
+ | `/api/v1/web/map` | POST | Site haritaları ve sayfa bağlantılarından URL listele |
235
+ | `/api/v1/web/extract` | POST | Kaynak bilgisiyle yapılandırılmış alan çıkar |
236
+ | `/api/v1/web/crawl` | POST | Arka plan taraması başlat, iş kimliğini hemen döndür |
237
+ | `/api/v1/web/crawl/{job_id}` | GET | Tarama ilerlemesi ve sayaçları |
238
+ | `/api/v1/web/crawl/{job_id}/results` | GET | Sayfalanmış tarama sonuçları |
239
+ | `/api/v1/web/crawl/{job_id}/cancel` | POST | Sıradaki veya sürmekte olan taramayı iptal et |
240
+ | `/api/v1/web/stats` | GET | Web aracı gecikmesi, önbellek ve tarayıcı durumu |
241
+ | `/api/v1/research` | POST | Eski araştırma uç noktası |
242
+ | `/api/v1/research/stream` | POST | Eski yayın akışı araştırması |
243
+
244
+ ### Örnek: Araştırma İsteği
245
+
246
+ ```bash
247
+ curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
248
+ -H "Content-Type: application/json" \
249
+ -H "X-API-Key: sizin-api-anahtariniz" \
250
+ -d '{
251
+ "query": "Yapay zeka son gelişmeler",
252
+ "max_sources": 5,
253
+ "deep_mode": false,
254
+ "provider": "ollama"
255
+ }'
256
+ ```
257
+
258
+ ### Dokümantasyon
259
+
260
+ - [Kurulum Rehberi](./docs/installation-tr.md#kurulum-rehberi)
261
+ - [Kullanım Kılavuzu](./docs/user-guide.md#türkçe)
262
+ - [API Dokümantasyonu](./docs/api.md#türkçe)
263
+ - [LLM Entegrasyonu](./docs/llm-tool-integration.md)
264
+ - [Yerel Web Araçları](./docs/web-tools.md)
265
+ - [Üretim Dağıtımı](./docs/production-deployment.md)
266
+
267
+ ### Lisans
268
+
269
+ MIT Lisansı
270
+
271
+ ---
272
+
273
+ ## Contributing / Katkıda Bulunma
274
+
275
+ Contributions are welcome! Please read our [Contributing Guide](./CONTRIBUTING.md).
276
+
277
+ Katkılarınızı bekliyoruz! Lütfen [Katkı Rehberimizi](./CONTRIBUTING.md) okuyun.
278
+
279
+ ---
280
+
281
+ &copy; 2026 Senol Dogan. MIT License.