onetool-mcp 1.0.0b1__py3-none-any.whl → 1.0.0rc2__py3-none-any.whl

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 (81) hide show
  1. onetool/cli.py +63 -4
  2. onetool_mcp-1.0.0rc2.dist-info/METADATA +266 -0
  3. onetool_mcp-1.0.0rc2.dist-info/RECORD +129 -0
  4. {onetool_mcp-1.0.0b1.dist-info → onetool_mcp-1.0.0rc2.dist-info}/licenses/LICENSE.txt +1 -1
  5. {onetool_mcp-1.0.0b1.dist-info → onetool_mcp-1.0.0rc2.dist-info}/licenses/NOTICE.txt +54 -64
  6. ot/__main__.py +6 -6
  7. ot/config/__init__.py +48 -46
  8. ot/config/global_templates/__init__.py +2 -2
  9. ot/config/{defaults → global_templates}/diagram-templates/api-flow.mmd +33 -33
  10. ot/config/{defaults → global_templates}/diagram-templates/c4-context.puml +30 -30
  11. ot/config/{defaults → global_templates}/diagram-templates/class-diagram.mmd +87 -87
  12. ot/config/{defaults → global_templates}/diagram-templates/feature-mindmap.mmd +70 -70
  13. ot/config/{defaults → global_templates}/diagram-templates/microservices.d2 +81 -81
  14. ot/config/{defaults → global_templates}/diagram-templates/project-gantt.mmd +37 -37
  15. ot/config/{defaults → global_templates}/diagram-templates/state-machine.mmd +42 -42
  16. ot/config/global_templates/diagram.yaml +167 -0
  17. ot/config/global_templates/onetool.yaml +3 -1
  18. ot/config/{defaults → global_templates}/prompts.yaml +102 -97
  19. ot/config/global_templates/security.yaml +31 -0
  20. ot/config/global_templates/servers.yaml +93 -12
  21. ot/config/global_templates/snippets.yaml +5 -26
  22. ot/config/{defaults → global_templates}/tool_templates/__init__.py +7 -7
  23. ot/config/loader.py +221 -105
  24. ot/config/mcp.py +5 -1
  25. ot/config/secrets.py +192 -190
  26. ot/decorators.py +116 -116
  27. ot/executor/__init__.py +35 -35
  28. ot/executor/base.py +16 -16
  29. ot/executor/fence_processor.py +83 -83
  30. ot/executor/linter.py +142 -142
  31. ot/executor/pep723.py +288 -288
  32. ot/executor/runner.py +20 -6
  33. ot/executor/simple.py +163 -163
  34. ot/executor/validator.py +603 -164
  35. ot/http_client.py +145 -145
  36. ot/logging/__init__.py +37 -37
  37. ot/logging/entry.py +213 -213
  38. ot/logging/format.py +191 -188
  39. ot/logging/span.py +349 -349
  40. ot/meta.py +236 -14
  41. ot/paths.py +32 -49
  42. ot/prompts.py +218 -218
  43. ot/proxy/manager.py +14 -2
  44. ot/registry/__init__.py +189 -189
  45. ot/registry/parser.py +269 -269
  46. ot/server.py +330 -315
  47. ot/shortcuts/__init__.py +15 -15
  48. ot/shortcuts/aliases.py +87 -87
  49. ot/shortcuts/snippets.py +258 -258
  50. ot/stats/__init__.py +35 -35
  51. ot/stats/html.py +2 -2
  52. ot/stats/reader.py +354 -354
  53. ot/stats/timing.py +57 -57
  54. ot/support.py +63 -63
  55. ot/tools.py +1 -1
  56. ot/utils/batch.py +161 -161
  57. ot/utils/cache.py +120 -120
  58. ot/utils/exceptions.py +23 -23
  59. ot/utils/factory.py +178 -179
  60. ot/utils/format.py +65 -65
  61. ot/utils/http.py +202 -202
  62. ot/utils/platform.py +45 -45
  63. ot/utils/truncate.py +69 -69
  64. ot_tools/__init__.py +4 -4
  65. ot_tools/_convert/__init__.py +12 -12
  66. ot_tools/_convert/pdf.py +254 -254
  67. ot_tools/diagram.yaml +167 -167
  68. ot_tools/scaffold.py +2 -2
  69. ot_tools/transform.py +124 -19
  70. ot_tools/web_fetch.py +94 -43
  71. onetool_mcp-1.0.0b1.dist-info/METADATA +0 -163
  72. onetool_mcp-1.0.0b1.dist-info/RECORD +0 -132
  73. ot/config/defaults/bench.yaml +0 -4
  74. ot/config/defaults/onetool.yaml +0 -25
  75. ot/config/defaults/servers.yaml +0 -7
  76. ot/config/defaults/snippets.yaml +0 -4
  77. ot_tools/firecrawl.py +0 -732
  78. {onetool_mcp-1.0.0b1.dist-info → onetool_mcp-1.0.0rc2.dist-info}/WHEEL +0 -0
  79. {onetool_mcp-1.0.0b1.dist-info → onetool_mcp-1.0.0rc2.dist-info}/entry_points.txt +0 -0
  80. /ot/config/{defaults → global_templates}/tool_templates/extension.py +0 -0
  81. /ot/config/{defaults → global_templates}/tool_templates/isolated.py +0 -0
ot_tools/web_fetch.py CHANGED
@@ -118,16 +118,38 @@ def _format_error(
118
118
  return f"Error: {message}"
119
119
 
120
120
 
121
+ def _is_html_content_type(content_type: str | None) -> bool:
122
+ """Check if content type indicates HTML content."""
123
+ if not content_type:
124
+ return True # Assume HTML if no content type (legacy behavior)
125
+ ct_lower = content_type.lower().split(";")[0].strip()
126
+ return ct_lower in ("text/html", "application/xhtml+xml")
127
+
128
+
121
129
  @cache(ttl=300) # Cache fetched pages for 5 minutes
122
- def _fetch_url_cached(url: str, timeout: float) -> str | None:
123
- """Fetch URL with caching to avoid redundant requests."""
130
+ def _fetch_url_cached(url: str, timeout: float) -> tuple[str | None, str | None]:
131
+ """Fetch URL with caching to avoid redundant requests.
132
+
133
+ Returns:
134
+ Tuple of (content, content_type). Content is the decoded response,
135
+ content_type is the Content-Type header value.
136
+ """
124
137
  with LogSpan(span="web.download", url=url, timeout=timeout) as span:
125
138
  config = _create_config(timeout)
126
- result = trafilatura.fetch_url(url, config=config)
127
- span.add(success=result is not None)
128
- if result:
129
- span.add(responseLen=len(result))
130
- return result
139
+ response = trafilatura.fetch_response(
140
+ url, config=config, with_headers=True, decode=True
141
+ )
142
+ if response is None:
143
+ span.add(success=False)
144
+ return None, None
145
+ content = response.html
146
+ content_type = (
147
+ response.headers.get("content-type") if response.headers else None
148
+ )
149
+ span.add(success=content is not None, contentType=content_type)
150
+ if content:
151
+ span.add(responseLen=len(content))
152
+ return content, content_type
131
153
 
132
154
 
133
155
  def fetch(
@@ -153,6 +175,9 @@ def fetch(
153
175
  Uses trafilatura to extract the main content, filtering out navigation,
154
176
  ads, and boilerplate. Returns clean text optimized for LLM consumption.
155
177
 
178
+ For non-HTML content types (text/plain, application/json, text/xml, text/csv,
179
+ etc.), returns the raw content directly without extraction.
180
+
156
181
  Args:
157
182
  url: The URL to fetch
158
183
  output_format: Output format - "text", "markdown" (default), or "json"
@@ -208,9 +233,20 @@ def fetch(
208
233
 
209
234
  # Fetch the page (with optional caching)
210
235
  if use_cache:
211
- downloaded = _fetch_url_cached(url, timeout)
236
+ downloaded, content_type = _fetch_url_cached(url, timeout)
212
237
  else:
213
- downloaded = trafilatura.fetch_url(url, config=config)
238
+ response = trafilatura.fetch_response(
239
+ url, config=config, with_headers=True, decode=True
240
+ )
241
+ if response is None:
242
+ downloaded, content_type = None, None
243
+ else:
244
+ downloaded = response.html
245
+ content_type = (
246
+ response.headers.get("content-type")
247
+ if response.headers
248
+ else None
249
+ )
214
250
 
215
251
  if downloaded is None:
216
252
  s.add(error="fetch_failed")
@@ -218,38 +254,43 @@ def fetch(
218
254
  url, "fetch_failed", f"Failed to fetch URL: {url}", output_format
219
255
  )
220
256
 
221
- # Map output format to trafilatura format
222
- trafilatura_format: str = output_format
223
- if output_format == "text":
224
- trafilatura_format = "txt"
225
-
226
- # Extract content
227
- result = trafilatura.extract(
228
- downloaded,
229
- url=url,
230
- output_format=trafilatura_format,
231
- include_links=include_links,
232
- include_images=include_images,
233
- include_tables=include_tables,
234
- include_comments=include_comments,
235
- include_formatting=include_formatting,
236
- favor_precision=favor_precision,
237
- favor_recall=favor_recall,
238
- fast=fast,
239
- target_language=target_language,
240
- with_metadata=output_format == "json",
241
- config=config,
242
- )
243
-
244
- if result is None:
245
- s.add(error="no_content")
246
- return _format_error(
247
- url,
248
- "no_content",
249
- f"No content could be extracted from: {url}",
250
- output_format,
257
+ # For non-HTML content, return raw content directly (no extraction needed)
258
+ if not _is_html_content_type(content_type):
259
+ s.add(contentType=content_type, rawContent=True)
260
+ result = downloaded
261
+ else:
262
+ # Map output format to trafilatura format
263
+ trafilatura_format: str = output_format
264
+ if output_format == "text":
265
+ trafilatura_format = "txt"
266
+
267
+ # Extract content from HTML
268
+ result = trafilatura.extract(
269
+ downloaded,
270
+ url=url,
271
+ output_format=trafilatura_format,
272
+ include_links=include_links,
273
+ include_images=include_images,
274
+ include_tables=include_tables,
275
+ include_comments=include_comments,
276
+ include_formatting=include_formatting,
277
+ favor_precision=favor_precision,
278
+ favor_recall=favor_recall,
279
+ fast=fast,
280
+ target_language=target_language,
281
+ with_metadata=output_format == "json",
282
+ config=config,
251
283
  )
252
284
 
285
+ if result is None:
286
+ s.add(error="no_content")
287
+ return _format_error(
288
+ url,
289
+ "no_content",
290
+ f"No content could be extracted from: {url}",
291
+ output_format,
292
+ )
293
+
253
294
  # Wrap with metadata if requested (JSON only)
254
295
  if include_metadata and output_format == "json":
255
296
  try:
@@ -278,16 +319,24 @@ def fetch(
278
319
  except TimeoutError:
279
320
  s.add(error="timeout")
280
321
  return _format_error(
281
- url, "timeout", f"Timeout after {timeout}s fetching: {url}", output_format
322
+ url,
323
+ "timeout",
324
+ f"Timeout after {timeout}s fetching: {url}",
325
+ output_format,
282
326
  )
283
327
  except ConnectionError as e:
284
328
  s.add(error="connection_failed")
285
329
  return _format_error(
286
- url, "connection_failed", f"Connection failed for {url}: {e}", output_format
330
+ url,
331
+ "connection_failed",
332
+ f"Connection failed for {url}: {e}",
333
+ output_format,
287
334
  )
288
335
  except Exception as e:
289
336
  s.add(error=str(e))
290
- return _format_error(url, "error", f"Error fetching {url}: {e}", output_format)
337
+ return _format_error(
338
+ url, "error", f"Error fetching {url}: {e}", output_format
339
+ )
291
340
 
292
341
 
293
342
  def fetch_batch(
@@ -356,7 +405,9 @@ def fetch_batch(
356
405
 
357
406
  normalized = normalize_items(urls)
358
407
 
359
- with LogSpan(span="web.batch", urlCount=len(normalized), output_format=output_format) as s:
408
+ with LogSpan(
409
+ span="web.batch", urlCount=len(normalized), output_format=output_format
410
+ ) as s:
360
411
 
361
412
  def _fetch_one(url: str, label: str) -> tuple[str, str]:
362
413
  """Fetch a single URL and return (label, result)."""
@@ -1,163 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: onetool-mcp
3
- Version: 1.0.0b1
4
- Summary: One MCP, unlimited tools.
5
- Project-URL: Homepage, https://github.com/beycom/onetool
6
- Project-URL: Repository, https://github.com/beycom/onetool
7
- Project-URL: Documentation, https://onetool.beycom.online
8
- Project-URL: Issues, https://github.com/beycom/onetool/issues
9
- Author-email: Gavin Las <beycom99@gmail.com>
10
- License: GPL-3.0
11
- License-File: LICENSE.txt
12
- License-File: NOTICE.txt
13
- Keywords: agents,code-execution,context-rot,llm,mcp,mcp-server,model-context-protocol,token-efficiency,tools
14
- Classifier: Development Status :: 4 - Beta
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
17
- Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Programming Language :: Python :: 3.12
20
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
- Classifier: Typing :: Typed
22
- Requires-Python: >=3.11
23
- Requires-Dist: aiofiles>=25.1.0
24
- Requires-Dist: docstring-parser>=0.17
25
- Requires-Dist: duckdb>=1.4.3
26
- Requires-Dist: fastmcp>=2.14.4
27
- Requires-Dist: firecrawl>=4.13.4
28
- Requires-Dist: google-genai>=1.60.0
29
- Requires-Dist: httpx>=0.28.1
30
- Requires-Dist: jinja2>=3.1.6
31
- Requires-Dist: loguru>=0.7.3
32
- Requires-Dist: mcp>=1.26.0
33
- Requires-Dist: openai>=2.15.0
34
- Requires-Dist: openpyxl>=3.1.5
35
- Requires-Dist: pillow>=12.1.0
36
- Requires-Dist: pydantic-settings>=2.12.0
37
- Requires-Dist: pydantic>=2.12.5
38
- Requires-Dist: pymupdf>=1.26.7
39
- Requires-Dist: python-docx>=1.2.0
40
- Requires-Dist: python-pptx>=1.0.2
41
- Requires-Dist: pyyaml>=6.0.3
42
- Requires-Dist: questionary>=2.1.1
43
- Requires-Dist: rich>=14.3.1
44
- Requires-Dist: sqlalchemy>=2.0.46
45
- Requires-Dist: trafilatura>=2.0.0
46
- Requires-Dist: typer>=0.21.1
47
- Provides-Extra: file
48
- Requires-Dist: send2trash>=2.1.0; extra == 'file'
49
- Description-Content-Type: text/markdown
50
-
51
- <p align="center">
52
- <img src="docs/assets/onetool-logo.png" alt="OneTool" width="400">
53
- </p>
54
-
55
- <p align="center">
56
- <em>One tool to rule them all, one tool to find them, one tool to bring them all, and in the development bind them.</em>
57
- </p>
58
-
59
- <p align="center">
60
- <a href="https://pypi.org/project/onetool-mcp/"><img alt="PyPI" src="https://img.shields.io/pypi/v/onetool-mcp"></a>
61
- <a href="https://github.com/beycom/onetool-mcp/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/badge/license-GPLv3-blue"></a>
62
- <a href="https://www.python.org/"><img alt="Python" src="https://img.shields.io/badge/python-3.11%2B-blue"></a>
63
- </p>
64
-
65
- > **v1.0.0 Pre-Release** - API stable, actively tested.
66
-
67
- OneTool is a local-first MCP server that exposes a single `run` tool for code execution, giving your AI assistant access to unlimited capabilities through one interface.
68
-
69
- ## The Problem
70
-
71
- Connect 5 MCP servers and you've burned 55K tokens before the conversation starts. Connect 10+ and you're at 100K tokens. Your AI gets worse as you add more tools - that's not a bug, it's how context windows work.
72
-
73
- ## The Solution
74
-
75
- **98.7% fewer tokens. Same accuracy. 10x lower cost.**
76
-
77
- Instead of loading 50 separate tool schemas, you write Python directly:
78
-
79
- ```python
80
- __ot brave.search(query="AI trends 2026")
81
- ```
82
-
83
- No JSON schema parsing. No tool selection loops. No hoping the model guesses correctly. You write explicit code to call APIs - deterministic, visible, no hidden magic.
84
-
85
- Based on [Anthropic's research](https://www.anthropic.com/engineering/code-execution-with-mcp), which found token usage dropped from 150,000 to 2,000 when presenting tools as code APIs.
86
-
87
- ## Core Capabilities
88
-
89
- - **30-second setup** - Install with uv or pip
90
- - **Drop-in extensibility** - Add a Python file, get a new pack
91
- - **AST security** - All code validated before execution
92
- - **Benchmark harness** - Test LLM + MCP combinations with `bench`
93
-
94
- ## Batteries Included with 100+ Tools
95
-
96
- See [Tool Reference](docs/tool-reference.md) for the complete list of packs and tools.
97
-
98
- ## Installation
99
-
100
- ```bash
101
- uv tool install onetool-mcp
102
- ```
103
-
104
- Or with pip: `pip install onetool-mcp`
105
-
106
- **With optional dependencies** (for convert, excel, code search):
107
-
108
- ```bash
109
- uv tool install onetool-mcp \
110
- --with pymupdf --with python-docx --with python-pptx \
111
- --with openpyxl --with Pillow --with duckdb --with openai
112
- ```
113
-
114
- Add to Claude Code (`~/.claude/settings.json`):
115
-
116
- ```json
117
- {
118
- "mcpServers": {
119
- "onetool": {
120
- "command": "onetool"
121
- }
122
- }
123
- }
124
- ```
125
-
126
- ## Extending
127
-
128
- Drop a Python file, get a pack. No registration, no config:
129
-
130
- ```python
131
- # tools/mytool.py
132
- pack = "mytool"
133
-
134
- def search(*, query: str) -> str:
135
- """Search for something."""
136
- return f"Results for: {query}"
137
- ```
138
-
139
- ## Why this approach
140
-
141
- LLMs write Python instead of parsing JSON schemas. You see what's being called. 2K tokens instead of 150K. Adding your own packs is just dropping in a file.
142
-
143
- ## Documentation
144
-
145
- - [Why OneTool](docs/intro/index.md) - The problem and our solution
146
- - [Getting Started](docs/getting-started/quickstart.md) - 2-minute setup
147
- - [Tools Reference](docs/reference/tools/index.md) - All built-in tools
148
- - [Extending](docs/extending/index.md) - Create your own tools
149
-
150
- ## References
151
-
152
- - [Code Execution with MCP](https://www.anthropic.com/engineering/code-execution-with-mcp) - Anthropic Engineering
153
- - [Context Rot](https://research.trychroma.com/context-rot) - Chroma Research
154
-
155
- ## Licensing
156
-
157
- **GPLv3** - Will transition to **MIT** at v2.0. Contribute via PRs to help us get there.
158
-
159
- ## Support
160
-
161
- If you use or like this project, please consider buying me a coffee:
162
-
163
- [![Ko-fi](https://img.shields.io/badge/Ko--fi-Buy%20me%20a%20coffee-ff5e5b?logo=ko-fi)](https://ko-fi.com/beycom)
@@ -1,132 +0,0 @@
1
- bench/__init__.py,sha256=y388vnV0atWMmhJA4RzbIGGHrWNifzidcXkIgjSQR2Q,133
2
- bench/cli.py,sha256=8QjzxnTkMFvJ-c_bQ0YZkr-MtN9sdZDau_Vo62DFSTQ,1664
3
- bench/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- bench/reporter.py,sha256=peV3xaDiasQR5UAMCC1oRDuOWG_IAMC6HqQ8XjdXgC8,23602
5
- bench/run.py,sha256=9s1z_Q4vEE5rdct9aKOpo2A6JLLl8vD0bwQ-jAWB2Ec,16456
6
- bench/secrets.py,sha256=ho1susoPnJbmdhhMubhdCueQnybMm2ykBapR_nkpTZ0,2676
7
- bench/utils.py,sha256=Kr3ZHb9cBFaM1HRNBFCUH3JKHk4-fNAiBpr2I95eR0c,386
8
- bench/harness/__init__.py,sha256=e9qbt4m_7I6j1wlLd_HCI2kQSXNs_vdluFpOLULD25A,1511
9
- bench/harness/client.py,sha256=qBW1Y49QFEt-NElybRKu1bA1YbuXKv2cPYr58hCSLjw,25303
10
- bench/harness/config.py,sha256=k6jqvQeumS91ka_QBV8pXtpwQUZhgutbbNiL5n68gxI,12581
11
- bench/harness/csv_writer.py,sha256=iwy3ixo9KlzoXmJVAYTHYt2Nm8s5vQsxVAaykgsvHEY,3305
12
- bench/harness/evaluate.py,sha256=Mv6I63aBXwEZHoarUOYu3UIG3-rRcInLtBULlqcqeDk,17262
13
- bench/harness/metrics.py,sha256=5Zy0x3IG-CeXUk-nxGm8-w2YCds1B2oxNGQMKNkgjGE,9690
14
- bench/harness/runner.py,sha256=Gx9_IXVBhmogaWCf5e-YNuuyDNeJVJpSPKtbp7PyxaI,38332
15
- onetool/__init__.py,sha256=NH91OBFDKBASlyorvmrLjckwXblgcToPkdqtZOIya7o,110
16
- onetool/cli.py,sha256=9TR0BMcUw05O2yt0kcS-3MrCfWPbxavVCtNpsIscxtg,12159
17
- onetool/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- ot/__init__.py,sha256=WI1BaMpZr1Xag5DLy8710K19v4EEiU0plLsgbCWWgz0,983
19
- ot/__main__.py,sha256=Lj60MDYULRpq5qUSW2zQF-7eaG7R90v_vB_vl1dv2Fg,123
20
- ot/_cli.py,sha256=cJ6mazEkl1cseHTUmtPFrsJfjZZ5IFkfFqh0c5s7xuY,2700
21
- ot/_tui.py,sha256=fbF_iwK58EBPhxWmEEQozneHlSRr7MRop7aRugVQ688,1437
22
- ot/decorators.py,sha256=8VRje2gT-9C3cpSITKkOSadZF6MBusbqTlRvkafqbAs,3223
23
- ot/http_client.py,sha256=lwmAISFK9qGwMvWVX4mltZcttt2NUVKaxEnadYzuYy8,4163
24
- ot/meta.py,sha256=cEaI-3Aul2OcSteY9g7XOheXDswwPo577IqIrFF-qeM,50052
25
- ot/paths.py,sha256=0R13bHR-8TYBVcMNIepY7O0LXy5xlIZ-1-KRZCJRpJA,14410
26
- ot/prompts.py,sha256=UdFjOhdhVtgFGJnNWL-I7Mv_KtVBA5Dc9MAG8cwPCOI,6593
27
- ot/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- ot/server.py,sha256=YzVeXrm7wml623CZFTQSFJFyMlL0oD_hKHWN1h_vOJA,9603
29
- ot/support.py,sha256=u6OQonVDktmQyMxm8GGPSzWmwTuts6a8vNmSjRpuBuU,1639
30
- ot/tools.py,sha256=MeZx-5sXJ8go7tn_yqs-QYAbhzve-QliL7ZMVO6ilxU,3591
31
- ot/config/__init__.py,sha256=xa0QbmATFJb01EXZi5kD5j4BgEcfEZZMt2AdKRihxis,1054
32
- ot/config/dynamic.py,sha256=alaJUnDL2KRIWeCNN-garmPmJ3qFoOirkwh0hSFcMuc,3711
33
- ot/config/loader.py,sha256=sWjvaaXraQVs45HFGxMrC6P21LPQ2qtbSdBus67JC4U,36016
34
- ot/config/mcp.py,sha256=iQdDrc3o8UpmW9T-IeMGu_Qyl1lw1lS2vjoTamW4J5k,5072
35
- ot/config/secrets.py,sha256=zrQZZwRNgnoxyC84WtJgtkcPY7AnB1J22kFDjKI-mxg,6009
36
- ot/config/tool_config.py,sha256=BisTtEj9Ws8NnWxvSbW9kskkygO8F-RO4Mgm9KIuPm0,3651
37
- ot/config/defaults/bench.yaml,sha256=roIxVP2QqksP3DS01_DsU87DjyHbQKKjPSVm4h6Lijc,114
38
- ot/config/defaults/onetool.yaml,sha256=XZRfMsuF91vu9-Z1Ogp51bC5EN3lILtACr6StClirN8,750
39
- ot/config/defaults/prompts.yaml,sha256=1viP1ELp3uq7U9-xrhlkgNrWWqB5gXtZ-NSOT3zShao,4443
40
- ot/config/defaults/servers.yaml,sha256=YmrNEhfESEmWTBjK5BTohXw-E1R7SYhJn7RwzRDS-RQ,216
41
- ot/config/defaults/snippets.yaml,sha256=G7cGnHrX_jUYQqQJi5vPqB4_FaYMdpGDXiFA3ykuK1A,107
42
- ot/config/defaults/diagram-templates/api-flow.mmd,sha256=YizXla-1o85KyUJqMoT2rOJqFa6wUqhZNf8ZnZtvjyI,696
43
- ot/config/defaults/diagram-templates/c4-context.puml,sha256=v6KPHcZ2Q_0QY9h80oLTb_xzJUB1Qq5XyeuzNckVh9c,916
44
- ot/config/defaults/diagram-templates/class-diagram.mmd,sha256=T1VfDg6UK-tKxgT3qZF45JOlMiCdl4Nsa3tmrQhoaLU,1717
45
- ot/config/defaults/diagram-templates/feature-mindmap.mmd,sha256=mjpih6ehYH5Z8cMquAN7U-8BR8UshC7ggeMOkDQWaF8,1357
46
- ot/config/defaults/diagram-templates/microservices.d2,sha256=vzW_HJs0-XiOzOjxLZngcqZzjnJGdgPwutqgkXVyaZw,1448
47
- ot/config/defaults/diagram-templates/project-gantt.mmd,sha256=TNNHDund_OaUM_G1ByGJAPIz95TLBPgtuNMB8rEYu5s,1277
48
- ot/config/defaults/diagram-templates/state-machine.mmd,sha256=fO36UWr0inb979kyHB1PnLx7RYLzOWd4_ZCBXNmRdDw,971
49
- ot/config/defaults/tool_templates/__init__.py,sha256=RwRpiQf_iQ5S7uGsfWM92cE8JN_Y1KDqaPfo24h-A5w,214
50
- ot/config/defaults/tool_templates/extension.py,sha256=VfHxAjiIZ2BdbFMWEkdxGZT4OUxSAUb9ng9p-HH2lCM,1371
51
- ot/config/defaults/tool_templates/isolated.py,sha256=aTl7_hG1ALHCGqyHMPjKa6fNBXoTBPjsLtbFgq76LAg,1556
52
- ot/config/global_templates/__init__.py,sha256=aHmytPELRNraAZf2cMf5c9-4yZQUd5m5Z9wg0-dMRKY,109
53
- ot/config/global_templates/bench-secrets-template.yaml,sha256=srZcnOM8Af2gQTpmo7g16sE9-zj0Tlguv54V-WE3hCs,224
54
- ot/config/global_templates/bench.yaml,sha256=h2Ac5-unilwx5TPvDsp02y4I0WiPI7y9CyRh7FIBuL8,223
55
- ot/config/global_templates/onetool.yaml,sha256=hj22T9SkiX5qNao8DisLmV950nAILvUFMX-HoHhVJdI,813
56
- ot/config/global_templates/secrets-template.yaml,sha256=sUb2uExdrx_07bH2UVKtp-tqCSpcW-PenH_UFDxPF2k,1541
57
- ot/config/global_templates/servers.yaml,sha256=tDDYHNovK7WuANaH3YepXwhNl9ky35GpAszWKNPmZyw,657
58
- ot/config/global_templates/snippets.yaml,sha256=r92kjjs21C0gVGsEl7NpnvcjPbmtA1bsPeU8YfoOjs8,9762
59
- ot/executor/__init__.py,sha256=JGGWInQwvhV1ttr7seATxHbsoL3jwTAUeT0GfeG-56M,836
60
- ot/executor/base.py,sha256=Z_Sm0Jyf77ffduJG7IS5UCDRX9JquQ6pWm3ek8lEl4o,317
61
- ot/executor/fence_processor.py,sha256=4GQ0MccQmsuRVSWHRtpv4X1jvL8c2P68gYxjnZl_yj8,2744
62
- ot/executor/linter.py,sha256=oxXvd-HtWPxHkqUT3d1713xMN5MpxWjuKFQWTLH458U,3704
63
- ot/executor/pack_proxy.py,sha256=S0d3VsHaXvoraoJdgySAkk4Jc_ExzjGkPbKeCDstUEc,8793
64
- ot/executor/param_resolver.py,sha256=lQR73bB_aJ1zgXGiI_JmzOiCeUYnW-jiEPHRdquSY00,4361
65
- ot/executor/pep723.py,sha256=j53wwEtUDWqNe0DMRq0usbySnWEUUeCe4Gd0pMf7qyA,8474
66
- ot/executor/result_store.py,sha256=BwTd4Gk0JPVmysGB0bC1vtc3M-5q4ZMsfkBle7e-jRE,11104
67
- ot/executor/runner.py,sha256=Xr-V9k07T773-IN5NJFJmoEH78sj2e3ONsYR5UU4DS0,16432
68
- ot/executor/simple.py,sha256=Ps181W5FfHOp7CkxF2m5kCe6YZz0qlp4sXSxsysSK6Q,5029
69
- ot/executor/tool_loader.py,sha256=vdu5pAL1NvGGu1H7tE3lqBafzWHWP3MfFXMZgzgFyIw,13377
70
- ot/executor/validator.py,sha256=i7xS5EvHVjFFlwX2NKPQJQUK-75gp-XzVGQXs6UCuMY,14241
71
- ot/executor/worker_pool.py,sha256=HJOu3P9E5MKgBZsddmeElctPUhF5kwx5Hfd9IezwJo8,12635
72
- ot/executor/worker_proxy.py,sha256=NUxOI2VZFkNbH5IMulvokHEe5cZQtViOSpb4DEHBf4I,5651
73
- ot/logging/__init__.py,sha256=cEvgp-lB9SNgwIWBoATp0dXroBaaBt4SxYri6AHiBgY,943
74
- ot/logging/config.py,sha256=PwvQDzcfrcDiUBJhRLyCc07GaMHzn9hu6rFq5wFQCyo,9919
75
- ot/logging/entry.py,sha256=9kaR2DuxJFUrNUZl6z0IXSjmCmxJS970v8uNykc8L0s,6169
76
- ot/logging/format.py,sha256=MMpdrvGJqnW2lFOClfhZyzm36rIU7MAq6BUaXOhjFn8,5388
77
- ot/logging/span.py,sha256=cP2t06AGMWaqFCXRbKyZX0W7gyYyjvIQfFijupLd2ik,11373
78
- ot/proxy/__init__.py,sha256=N4shk9gsZ76BBe8tUftXL83ELB42zlbTXtF05lTUqUc,435
79
- ot/proxy/manager.py,sha256=ZhivveB9MthYv5oeI_vj61uYxkN82wMAPzPOdjTaGkg,13442
80
- ot/registry/__init__.py,sha256=VAvn1JAL8dZrsTh_Y7NilIrLo9blbhWt38TN-FcTapM,5149
81
- ot/registry/models.py,sha256=Z-lsRRN3pDyL2nUalZA9QoD1IG_e7aSPUoE6TvRspCk,2160
82
- ot/registry/parser.py,sha256=NXLFXYIMjFfEb4ztTLZqz4GxYZw-uEWAdxDuMMT_iVI,8416
83
- ot/registry/registry.py,sha256=HFPPIGWop2szXRQeQeFs5axK4iS17dEOHV8qf9Jm5nE,13458
84
- ot/shortcuts/__init__.py,sha256=n-yQvYHoEIg-7Ydm_P7bA86AJk5iq9o38pLiAj_zGGY,461
85
- ot/shortcuts/aliases.py,sha256=0oCgkvTQcPS2TqNYa6uGwLYunA8-1L-FfrHCVynZ4-Q,2705
86
- ot/shortcuts/snippets.py,sha256=rCbyFdQ4_1HY4AhxeLRMUfDXDcVN3FZpEUp_8ACRIiY,7956
87
- ot/stats/__init__.py,sha256=5IP7bkfeXZm_B-WS9kNnQDCoggwF0Mit3dFtBe5CvKU,933
88
- ot/stats/html.py,sha256=vlMCxfyjm6gipNyPYP5O8Nicmhq8tsP0l6Ifpc1-dnY,9079
89
- ot/stats/jsonl_writer.py,sha256=ym-Wfy0gv90M59ipCQsxapTKNQBO28btKDe6kgFdxck,8169
90
- ot/stats/reader.py,sha256=zKNegWFSbEBekBDmbgzVTv1Lj3UckRZKkiGkfqPN3XY,11883
91
- ot/stats/timing.py,sha256=ZAzigZwmAdyRKdUBjtkIuAi_KJXyrsygwSxm0_NM7aE,1500
92
- ot/utils/__init__.py,sha256=k54kcSGmKl8zrnKXw9svCyXej7FrVZvshMSK1f_6de4,2108
93
- ot/utils/batch.py,sha256=0oi0wx2kn0XlbB03Utn9lJho_Fmdomasl1_F5AauSdU,4939
94
- ot/utils/cache.py,sha256=s3z7R_xv-hWxB_q76L7eFPbwnc_KFYRoZllnRloQswg,3506
95
- ot/utils/deps.py,sha256=5U_bnAEfd_Ivt9ZZitn9emt8T7Ehm99_xb1_okbURfA,11654
96
- ot/utils/exceptions.py,sha256=_kYtWpnxkBPF2TXkXksPeX2MfJLrCJ2VU-1CckPjZoU,613
97
- ot/utils/factory.py,sha256=UhKV6Wa2FOZHh4SKWmfeps1ThboS0rQnBUL38-eMljE,5106
98
- ot/utils/format.py,sha256=4bUvYnsUD9Wz2czPsSoxQOIqxrFIlx-n3Y5HdtZpfxc,2065
99
- ot/utils/http.py,sha256=IaRTxn--2TJYGpAquywsuHm_xJQxOcMvtFDfuaJUJIU,5653
100
- ot/utils/platform.py,sha256=dBnxrLN-H2W0onc_LM9BML5WXmKahdpdkW2pVdauup4,1512
101
- ot/utils/sanitize.py,sha256=5zDKpDwE6oo-74Bwv-yhovOJ6zk03vO2-gsCiEDA2kk,3815
102
- ot/utils/truncate.py,sha256=03ObrMxElh3CM5lhwThA00oLgPzzFSOPR9Y8BmzAwis,1771
103
- ot_tools/__init__.py,sha256=uUxp9V0E1lqzeT3wOx10JHzAFu3esn7M6FJrwBn_8Z0,95
104
- ot_tools/brave_search.py,sha256=JPVR_S2J1NLL7ad4AudIkgMsvnqggibjZ5FRXPt5ZA0,17746
105
- ot_tools/code_search.py,sha256=P3-oReY7n_3nrlEiYzFv5ompcU-cuVRTeEK4fSQKuew,25191
106
- ot_tools/context7.py,sha256=sn75QMEeOeSQSYZeVwT4UjYEXo3QXa8KC61mwIUix3U,16088
107
- ot_tools/convert.py,sha256=mCmDFLWgLiEJhYyd6Ex9s7qfyPOWj7FKaqtIFKG_Ig4,20488
108
- ot_tools/db.py,sha256=RH_OOUJYqYVw14O8QYGB9QKg9IGNPQAM33HDa71D3v4,13142
109
- ot_tools/diagram.py,sha256=tGNyd3PYdpi3Qs7Gs8pbcZVWMBVmyNbJG_wxiZ8682M,50478
110
- ot_tools/diagram.yaml,sha256=Q4twP0rH-1zPWFbgBhl_RZbUg5dkmldX5E6Lp49Ugp4,5439
111
- ot_tools/excel.py,sha256=yZGgKzDzPvZAE7b9vjC25FY7lJkw7PCBFMYOGcU1UyE,43067
112
- ot_tools/file.py,sha256=9o_A1m7GCxpnIKIwAiahvGaQrfxXcfkVQicPH1_ztW0,46689
113
- ot_tools/firecrawl.py,sha256=PtWtiKSUGl0VUdZfMhfHOmQSJ__UN2xcJ-BBuVaXmgo,23433
114
- ot_tools/grounding_search.py,sha256=ak0wZzBQMPR5VYVrATOIzldZj_n8UxYeCxrmpTZrykA,20182
115
- ot_tools/package.py,sha256=5MtsPW9ieolQAnaw60Yb4TyODSlowW56HAZj-j_QSkU,19148
116
- ot_tools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- ot_tools/ripgrep.py,sha256=_dKHo5TTlYlzoRQV8-7kFw3yuYk7I5r_9FYJvnGFECc,17105
118
- ot_tools/scaffold.py,sha256=92pjn0kqncK-2XrzEUn058HRkp1iJpAvWInaCKVdbGI,17374
119
- ot_tools/transform.py,sha256=IQ6bBZ4mDS7c-8FzpUSQB1EwseYgq3kVGr5LFxLBcwA,6747
120
- ot_tools/web_fetch.py,sha256=l9taGigHIW8QMaFRObjQuoUNdv9MzYMIyZgtdaTO3DA,13483
121
- ot_tools/_convert/__init__.py,sha256=Cwo87GiP8JUWpGFSpbkCEyt_q4PUKauFpbqzyOIFOy0,465
122
- ot_tools/_convert/excel.py,sha256=mVCgolocTKd7ZCpVd2hANaYnhJrneNtGYEZafrCeYqE,8679
123
- ot_tools/_convert/pdf.py,sha256=6ATY_8NGrc5877Hhw-z5Gxo4Nxsw7MBhVLaHwAmvBXE,7323
124
- ot_tools/_convert/powerpoint.py,sha256=M8lwkTV7x4wafR7eXrVojCBKgcXVxO1tT-Z2Ml5wwxo,7855
125
- ot_tools/_convert/utils.py,sha256=AfId8ulTx_kKq0zVbhvuY3KGXqQjEk8Y7o8BXjP8WgA,10192
126
- ot_tools/_convert/word.py,sha256=XfjqQRhEYS_433LprmF6vqyosytXVdNWzsCXo42WNcA,8710
127
- onetool_mcp-1.0.0b1.dist-info/METADATA,sha256=S4eE3OnUcKTZpd8MK0COy_vlI9kzMV1ZrCatCbQ1E0w,5584
128
- onetool_mcp-1.0.0b1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
129
- onetool_mcp-1.0.0b1.dist-info/entry_points.txt,sha256=UUr3FvhGxnRdyJSxRG5YeqCGUi8nQ3oMCoueM35sF04,66
130
- onetool_mcp-1.0.0b1.dist-info/licenses/LICENSE.txt,sha256=EAAF-2Agl1ewXnFl4KFpREq8Jh1YFRiogyBIzfGyImM,35561
131
- onetool_mcp-1.0.0b1.dist-info/licenses/NOTICE.txt,sha256=GTNDiQ3_2O_AcngYY3t41ZQ7S_E7r0EcflmdZGjGFxM,2470
132
- onetool_mcp-1.0.0b1.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- # Benchmark Harness configuration
2
- # Run benchmarks to test OneTool performance and tool behavior
3
-
4
- log_level: INFO
@@ -1,25 +0,0 @@
1
- # OneTool Bundled Defaults
2
- # Minimal working config - inherited by global and project configs.
3
- # User customization goes in ~/.onetool/onetool.yaml
4
-
5
- version: 1
6
-
7
- # Include external config files (merged left-to-right)
8
- include:
9
- - prompts.yaml # Tool instructions for LLM
10
- - snippets.yaml # Snippet workflows
11
- - servers.yaml # External MCP servers
12
- # Diagram defaults: src/ot_tools/diagram.yaml (sidecar pattern)
13
-
14
- log_level: INFO
15
-
16
- # Transform tool (LLM for code generation)
17
- transform:
18
- model: google/gemini-3-flash-preview
19
- base_url: https://openrouter.ai/api/v1
20
-
21
- # Security configuration
22
- security:
23
- # Output sanitization for prompt injection protection
24
- sanitize:
25
- enabled: true # Enables __sanitize__ magic variable
@@ -1,7 +0,0 @@
1
- # OneTool Shared Server Definitions
2
- # Load via: include: [servers.yaml] (falls back to bundled)
3
- #
4
- # These are common MCP server configurations that can be included
5
- # in project-specific onetool.yaml files.
6
-
7
- servers:
@@ -1,4 +0,0 @@
1
- # OneTool Default Snippets Library
2
- # Load via: include: [snippets.yaml] (falls back to bundled)
3
-
4
- snippets: