agent-tool-store 2.0.0__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.
- agent_tool_store-2.0.0.dist-info/METADATA +537 -0
- agent_tool_store-2.0.0.dist-info/RECORD +32 -0
- agent_tool_store-2.0.0.dist-info/WHEEL +4 -0
- agent_tool_store-2.0.0.dist-info/entry_points.txt +2 -0
- toolstore/__init__.py +43 -0
- toolstore/adapters.py +217 -0
- toolstore/cli.py +1813 -0
- toolstore/config_manager.py +195 -0
- toolstore/docker_pool.py +373 -0
- toolstore/exec_tools.py +261 -0
- toolstore/index_manager.py +244 -0
- toolstore/management/__init__.py +1 -0
- toolstore/management/api_helpers.py +157 -0
- toolstore/management/api_mcp.py +204 -0
- toolstore/management/api_skills.py +217 -0
- toolstore/management/server.py +713 -0
- toolstore/management/static/app.css +622 -0
- toolstore/management/static/app.js +903 -0
- toolstore/management/static/index.html +369 -0
- toolstore/management/static/tab_mcp.js +421 -0
- toolstore/mcp_client.py +301 -0
- toolstore/mcp_server.py +362 -0
- toolstore/native_tool.py +575 -0
- toolstore/remote_runner.py +269 -0
- toolstore/schema_converter.py +171 -0
- toolstore/schemas.py +150 -0
- toolstore/skill_discovery.py +287 -0
- toolstore/skill_manager.py +515 -0
- toolstore/toolset.py +283 -0
- toolstore/toolset_manager.py +375 -0
- toolstore/transport.py +369 -0
- toolstore/workflow.py +402 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agent-tool-store
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Universal tool platform for AI agents — 14+ toolsets, MCP, YAML workflows, provider adapters (OpenAI/Anthropic/LangChain)
|
|
5
|
+
Author: ToolStore Team
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: agent,ai,anthropic,function-calling,langchain,mcp,openai,tool,tool-use,workflow
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Requires-Dist: httpx>=0.25.0
|
|
19
|
+
Requires-Dist: pydantic>=2.5.0
|
|
20
|
+
Requires-Dist: pyyaml>=6.0
|
|
21
|
+
Requires-Dist: rich>=13.6.0
|
|
22
|
+
Requires-Dist: typer[all]>=0.9.0
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
title: AgentToolStore Registry
|
|
27
|
+
emoji: 🛠️
|
|
28
|
+
colorFrom: blue
|
|
29
|
+
colorTo: purple
|
|
30
|
+
sdk: docker
|
|
31
|
+
app_port: 7860
|
|
32
|
+
pinned: false
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
<p align="center">
|
|
36
|
+
<img src="https://img.shields.io/badge/toolsets-14-blue" alt="14 toolsets">
|
|
37
|
+
<img src="https://img.shields.io/badge/functions-46-brightgreen" alt="46 functions">
|
|
38
|
+
<img src="https://img.shields.io/badge/license-MIT-purple" alt="MIT">
|
|
39
|
+
<img src="https://img.shields.io/badge/package-toolstore-orange" alt="toolstore">
|
|
40
|
+
<img src="https://img.shields.io/badge/registry-live-brightgreen" alt="live">
|
|
41
|
+
</p>
|
|
42
|
+
|
|
43
|
+
# AgentToolStore
|
|
44
|
+
|
|
45
|
+
**A package index for agent tools.** PyPI for Python packages, npm for
|
|
46
|
+
JavaScript — ToolStore does the same for agent-callable toolsets. Agents
|
|
47
|
+
discover tools through a single `tool_store` function instead of wiring up
|
|
48
|
+
dozens of tools by hand.
|
|
49
|
+
|
|
50
|
+
→ **[Client SDK docs](client/README.md)** — installing, integrating into agents, CLI, MCP bridge, skills
|
|
51
|
+
→ **[Registry server docs](server/README.md)** — API endpoints, running locally, deploying on HF Spaces
|
|
52
|
+
|
|
53
|
+
> **Live registry:** [mrw33554432-agenttoolstore.hf.space](https://mrw33554432-agenttoolstore.hf.space)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## How it works
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
toolstore update ← downloads index.json from registry
|
|
61
|
+
│
|
|
62
|
+
▼
|
|
63
|
+
┌─────────────────────────┐
|
|
64
|
+
│ Local index cache │ ← search and info read from here (no network)
|
|
65
|
+
└─────────────────────────┘
|
|
66
|
+
│
|
|
67
|
+
▼
|
|
68
|
+
┌─────────────────────────┐
|
|
69
|
+
│ tool_store(execute) │ ← fetches code from registry on demand
|
|
70
|
+
│ → temp dir → import │ runs in-process, no Docker
|
|
71
|
+
│ → call function → JSON │
|
|
72
|
+
└─────────────────────────┘
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
1. **`toolstore update`** pulls the registry index and caches it locally
|
|
76
|
+
2. **`search` / `info`** read from the local cache — instant, no network
|
|
77
|
+
3. **`execute`** fetches code from the registry, installs deps explicitly,
|
|
78
|
+
runs in-process, returns JSON
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install toolstore
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Or from source:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/Mrw33554432/AgentToolStore.git
|
|
92
|
+
cd AgentToolStore/client
|
|
93
|
+
pip install -e .
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Requirements: Python ≥3.10, `httpx`, `pydantic`, `rich`, `typer`.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Adding to Your Agent
|
|
101
|
+
|
|
102
|
+
Add one tool definition and one handler. The agent discovers every published
|
|
103
|
+
toolset through a single `tool_store` call.
|
|
104
|
+
|
|
105
|
+
### How it fits into an agent loop
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
System prompt Tool call loop
|
|
109
|
+
───────────────────────────────── ─────────────────────────────────
|
|
110
|
+
"Tool store includes but not 1. Agent calls tool_store(search)
|
|
111
|
+
limited to: Echo Service, → discovers xlsx-toolkit
|
|
112
|
+
calculator, weather, ..."
|
|
113
|
+
2. Agent calls tool_store(info)
|
|
114
|
+
→ gets xlsx_read params + docs
|
|
115
|
+
|
|
116
|
+
3. Agent calls tool_store(execute)
|
|
117
|
+
→ runs xlsx_read, gets result
|
|
118
|
+
|
|
119
|
+
4. Agent calls tool_store(close)
|
|
120
|
+
→ frees context space
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 1. Tool definition
|
|
124
|
+
|
|
125
|
+
Register this in your agent's function-calling tool list:
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
TOOL_STORE_SCHEMA = {
|
|
129
|
+
"type": "function",
|
|
130
|
+
"function": {
|
|
131
|
+
"name": "tool_store",
|
|
132
|
+
"description": (
|
|
133
|
+
"A universal tool manager that lets you search, inspect, "
|
|
134
|
+
"and execute thousands of tools and local utilities."
|
|
135
|
+
),
|
|
136
|
+
"parameters": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"properties": {
|
|
139
|
+
"action": {
|
|
140
|
+
"type": "string",
|
|
141
|
+
"enum": ["search", "execute", "info", "close"],
|
|
142
|
+
"description": (
|
|
143
|
+
"The action to perform: 'search' finds tools "
|
|
144
|
+
"matching a query; 'execute' runs a tool; "
|
|
145
|
+
"'info' adds a tool to your context so you can "
|
|
146
|
+
"see its parameters; 'close' removes it."
|
|
147
|
+
),
|
|
148
|
+
},
|
|
149
|
+
"query": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "Search query string (for action='search')",
|
|
152
|
+
},
|
|
153
|
+
"tool_name": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": (
|
|
156
|
+
"Name of the tool to inspect, execute, or close "
|
|
157
|
+
"(required for action='info', 'execute', or 'close')"
|
|
158
|
+
),
|
|
159
|
+
},
|
|
160
|
+
"arguments": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"description": (
|
|
163
|
+
"Arguments for the tool execution "
|
|
164
|
+
"(required for action='execute')"
|
|
165
|
+
),
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
"required": ["action"],
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 2. Handler
|
|
175
|
+
|
|
176
|
+
Wire the native function into your tool-call router. The native function
|
|
177
|
+
handles `search`, `info`, and `execute` — add a small shim for `close`:
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from toolstore.native_tool import tool_store_tool
|
|
181
|
+
|
|
182
|
+
def handle_tool_store(action: str, **kwargs) -> str:
|
|
183
|
+
if action == "close":
|
|
184
|
+
return f"Closed tool '{kwargs.get('tool_name', '')}'."
|
|
185
|
+
return tool_store_tool(action=action, **kwargs)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 3. Secondary tools prompt
|
|
189
|
+
|
|
190
|
+
Most tools are `exposure: secondary` — too many to list in every system
|
|
191
|
+
message. Inject a compact listing into the system prompt instead. Call
|
|
192
|
+
`get_secondary_tool_names()` then `info` with `format="secondary"`:
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
from toolstore.native_tool import get_secondary_tool_names, tool_store_tool
|
|
196
|
+
|
|
197
|
+
names = get_secondary_tool_names()
|
|
198
|
+
listing = tool_store_tool(action="info", tool_names=names, format="secondary")
|
|
199
|
+
system_prompt += f"\n\n{listing}"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Produces:
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Tool store includes but is not limited to the following tools:
|
|
206
|
+
- Echo Service
|
|
207
|
+
- calculator
|
|
208
|
+
- weather
|
|
209
|
+
- skill:algorithmic-art
|
|
210
|
+
...
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
The agent sees names; when it needs a tool it calls `info` again (without
|
|
214
|
+
`format="secondary"`) for the full schema, then `execute`.
|
|
215
|
+
|
|
216
|
+
### 4. Agent conversation example
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
Agent: tool_store(action="search", query="read Excel files")
|
|
220
|
+
→ Found: xlsx-toolkit — Read, create, and manipulate Excel files
|
|
221
|
+
|
|
222
|
+
Agent: tool_store(action="info", tool_name="xlsx-toolkit")
|
|
223
|
+
→ Returns bindings for xlsx_read, xlsx_sheets, xlsx_to_csv, xlsx_create
|
|
224
|
+
with parameter types and docstrings for each
|
|
225
|
+
|
|
226
|
+
Agent: tool_store(action="execute", tool_name="xlsx-toolkit",
|
|
227
|
+
arguments={"function": "xlsx_read",
|
|
228
|
+
"filepath": "/workspace/report.xlsx"})
|
|
229
|
+
→ {"sheets": ["Sheet1"], "data": {"Sheet1": [[...], ...]}}
|
|
230
|
+
|
|
231
|
+
Agent: tool_store(action="close", tool_name="xlsx-toolkit")
|
|
232
|
+
→ Closed tool 'xlsx-toolkit'.
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 5. Execution model
|
|
236
|
+
|
|
237
|
+
| Property | Behaviour |
|
|
238
|
+
|----------|-----------|
|
|
239
|
+
| **Runtime** | In-process — no Docker, no sandbox |
|
|
240
|
+
| **Code origin** | Fetched from registry, cached after first download |
|
|
241
|
+
| **Dependencies** | Never auto-installed; agent gets a clear error listing what's needed |
|
|
242
|
+
| **Isolation** | Each toolset runs in its own temp directory |
|
|
243
|
+
| **Safety** | All code is visible in the registry; deps are explicit; agent decides what to install |
|
|
244
|
+
|
|
245
|
+
### 6. Local execution (no registry)
|
|
246
|
+
|
|
247
|
+
Skip the registry entirely and call toolsets from a local directory:
|
|
248
|
+
|
|
249
|
+
```python
|
|
250
|
+
from toolstore.exec_tools import _execute_toolset_local
|
|
251
|
+
|
|
252
|
+
result = _execute_toolset_local(
|
|
253
|
+
toolset_path="./toolsets/xlsx-toolkit",
|
|
254
|
+
function_name="xlsx_read",
|
|
255
|
+
filepath="/workspace/data.xlsx",
|
|
256
|
+
)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## CLI Usage
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# Pull the latest index from the registry
|
|
265
|
+
toolstore update
|
|
266
|
+
|
|
267
|
+
# Search for tools
|
|
268
|
+
toolstore search "spreadsheet"
|
|
269
|
+
|
|
270
|
+
# Inspect a toolset
|
|
271
|
+
toolstore info xlsx-toolkit
|
|
272
|
+
|
|
273
|
+
# Execute a function
|
|
274
|
+
toolstore use text-transform --function text_stats text="Hello world."
|
|
275
|
+
|
|
276
|
+
# Publish your own toolset
|
|
277
|
+
toolstore login --username <user> --password <pass>
|
|
278
|
+
toolstore toolset publish ./toolsets/my-toolkit
|
|
279
|
+
|
|
280
|
+
# Delete a toolset
|
|
281
|
+
toolstore delete my-toolkit
|
|
282
|
+
|
|
283
|
+
# Run ToolStore as an MCP server (stdio or SSE)
|
|
284
|
+
toolstore serve
|
|
285
|
+
|
|
286
|
+
# Export the tool_store schema for use with OpenAI / vLLM
|
|
287
|
+
toolstore export
|
|
288
|
+
|
|
289
|
+
# Manage skills
|
|
290
|
+
toolstore skill discover /path/to/skills
|
|
291
|
+
toolstore skill list-dirs
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Full command reference:
|
|
295
|
+
|
|
296
|
+
| Command | Description |
|
|
297
|
+
|---------|-------------|
|
|
298
|
+
| `update` | Pull the latest registry index and scan local MCP servers |
|
|
299
|
+
| `search` | Search for tools by name, description, or tags |
|
|
300
|
+
| `use` | Execute a tool function immediately |
|
|
301
|
+
| `info` | Show detailed schema and documentation for a tool |
|
|
302
|
+
| `login` | Authenticate with the registry to publish |
|
|
303
|
+
| `publish` | Publish a new tool or update an existing one |
|
|
304
|
+
| `delete` | Remove a tool from the registry |
|
|
305
|
+
| `export` | Export the meta-tool schema (OpenAI / vLLM formats) |
|
|
306
|
+
| `serve` | Run ToolStore as an MCP server (stdio or SSE) |
|
|
307
|
+
| `skill` | Manage Agent Skills (scan, discover, publish, …) |
|
|
308
|
+
| `toolset` | Manage toolsets (scan, list, publish, …) |
|
|
309
|
+
| `mcp-server` | Register and manage MCP servers |
|
|
310
|
+
| `docker` | Configure Docker execution permissions |
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Writing a Toolset
|
|
315
|
+
|
|
316
|
+
A toolset is a directory with two files:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
my-toolkit/
|
|
320
|
+
├── toolset.py # @tool functions (code bindings)
|
|
321
|
+
└── doc.md # human + agent guidance
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### toolset.py
|
|
325
|
+
|
|
326
|
+
Every function decorated with `@tool` becomes a callable binding. The decorator
|
|
327
|
+
auto-generates an OpenAI function-calling schema from type hints and docstrings:
|
|
328
|
+
|
|
329
|
+
```python
|
|
330
|
+
from toolstore.toolset import tool
|
|
331
|
+
|
|
332
|
+
@tool
|
|
333
|
+
def my_function(*, input: str, count: int = 1) -> dict:
|
|
334
|
+
"""Do something useful.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
input: The input text.
|
|
338
|
+
count: How many times to repeat.
|
|
339
|
+
"""
|
|
340
|
+
return {"result": input * count}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Rules:
|
|
344
|
+
- Use **keyword-only arguments** (`*,`)
|
|
345
|
+
- Annotate every parameter with a **type hint**
|
|
346
|
+
- Write a **Google-style docstring** with an `Args:` section
|
|
347
|
+
- Return a **JSON-serializable dict**
|
|
348
|
+
|
|
349
|
+
### Two kinds of toolsets
|
|
350
|
+
|
|
351
|
+
| Type | `toolset.py` | `doc.md` | Example |
|
|
352
|
+
|------|-------------|----------|---------|
|
|
353
|
+
| **Code** | Real `@tool` functions | Full docs | `xlsx-toolkit`, `file-verify` |
|
|
354
|
+
| **Doc-only** | Minimal empty module | Full guidance | `stuck-toolkit` |
|
|
355
|
+
|
|
356
|
+
Doc-only toolsets are valid — they carry skill content without code bindings.
|
|
357
|
+
No placeholder functions allowed. Code or nothing.
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Registry API
|
|
362
|
+
|
|
363
|
+
The registry is a FastAPI server backed by SQLite, hosted on Hugging Face
|
|
364
|
+
Spaces. All endpoints are public except auth and publish.
|
|
365
|
+
|
|
366
|
+
| Endpoint | Method | Auth | Description |
|
|
367
|
+
|----------|--------|------|-------------|
|
|
368
|
+
| `/` | GET | No | Browse page (HTML) — dark-themed cards showing all published toolsets |
|
|
369
|
+
| `/api` | GET | No | API root |
|
|
370
|
+
| `/health` | GET | No | Health check — database connectivity status |
|
|
371
|
+
| `/index.json` | GET | No | Full index — every toolset with metadata, bindings, and full source code |
|
|
372
|
+
| `/auth/register` | POST | No | Register a new user account |
|
|
373
|
+
| `/auth/token` | POST | No | Login — returns JWT access token (OAuth2 password flow) |
|
|
374
|
+
| `/publish` | POST | JWT | Publish a new toolset or update an existing one |
|
|
375
|
+
| `/tools/{name}` | DELETE | JWT | Delete a toolset |
|
|
376
|
+
|
|
377
|
+
### Running your own registry
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
cd server
|
|
381
|
+
pip install -r requirements.txt
|
|
382
|
+
python init_db.py # create SQLite database
|
|
383
|
+
uvicorn app.main:app --port 8000
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Set `TOOLSTORE_REGISTRY_URL=http://localhost:8000/index.json` to point the
|
|
387
|
+
CLI at a local registry. The default is:
|
|
388
|
+
|
|
389
|
+
https://mrw33554432-agenttoolstore.hf.space/index.json
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Toolsets Catalog
|
|
394
|
+
|
|
395
|
+
All 14 toolsets published on the live registry.
|
|
396
|
+
|
|
397
|
+
### Document processing
|
|
398
|
+
|
|
399
|
+
| Toolset | Functions | Dependencies |
|
|
400
|
+
|---------|-----------|-------------|
|
|
401
|
+
| **xlsx-toolkit** | `xlsx_read` · `xlsx_sheets` · `xlsx_to_csv` · `xlsx_create` | `openpyxl` |
|
|
402
|
+
| **pdf-toolkit** | `pdf_extract` · `pdf_meta` · `pdf_merge` · `pdf_form_fields` | `pdfplumber`, `PyPDF2` |
|
|
403
|
+
| **docx-toolkit** | `docx_read` · `docx_info` · `docx_extract_tables` · `docx_create` | `python-docx` |
|
|
404
|
+
| **pptx-toolkit** | `pptx_read` · `pptx_info` · `pptx_create` | `python-pptx` |
|
|
405
|
+
|
|
406
|
+
### Utility
|
|
407
|
+
|
|
408
|
+
| Toolset | Functions | Dependencies |
|
|
409
|
+
|---------|-----------|-------------|
|
|
410
|
+
| **text-transform** | `text_diff` · `regex_extract` · `markdown_table` · `text_stats` | stdlib |
|
|
411
|
+
| **file-verify** | `check_json` · `check_yaml` · `check_csv` · `file_hash` · `detect_encoding` | `PyYAML`, `chardet` (optional) |
|
|
412
|
+
| **calc-toolkit** | `eval_expression` · `convert_unit` · `basic_stats` | stdlib |
|
|
413
|
+
| **text-gen** | `lorem_words` · `lorem_paragraphs` · `generate_sentences` · `generate_data` | stdlib |
|
|
414
|
+
| **batch-ops** | `batch_rename` · `batch_find_replace` · `batch_stats` · `batch_copy` | stdlib |
|
|
415
|
+
|
|
416
|
+
### Guidance & diagnostics
|
|
417
|
+
|
|
418
|
+
| Toolset | Functions | Dependencies |
|
|
419
|
+
|---------|-----------|-------------|
|
|
420
|
+
| **debug-toolkit** | `analyze_error` · `extract_log_patterns` | stdlib |
|
|
421
|
+
| **webapp-testing-toolkit** | `check_url` · `extract_urls` | stdlib |
|
|
422
|
+
| **doc-coauthoring-toolkit** | `document_outline` · `markdown_template` | stdlib |
|
|
423
|
+
| **internal-comms-toolkit** | `comms_template` · `format_bullets` | stdlib |
|
|
424
|
+
| **stuck-toolkit** | doc-only — no code bindings | — |
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Project Structure
|
|
429
|
+
|
|
430
|
+
```
|
|
431
|
+
AgentToolStore/
|
|
432
|
+
├── client/ # Python SDK (pip install toolstore)
|
|
433
|
+
│ ├── pyproject.toml
|
|
434
|
+
│ └── src/toolstore/
|
|
435
|
+
│ ├── cli.py # Typer CLI (update, search, use, publish, …)
|
|
436
|
+
│ ├── native_tool.py # tool_store_tool() — the agent-facing entry point
|
|
437
|
+
│ ├── toolset.py # @tool decorator + schema generation
|
|
438
|
+
│ ├── toolset_manager.py # AST-based toolset discovery & publishing
|
|
439
|
+
│ ├── exec_tools.py # Local + remote toolset execution
|
|
440
|
+
│ ├── config_manager.py # Settings, registry URL, env-var overrides
|
|
441
|
+
│ ├── mcp_client.py # MCP client (stdio / SSE transport)
|
|
442
|
+
│ ├── mcp_server.py # MCP server — expose ToolStore via MCP
|
|
443
|
+
│ ├── index_manager.py # Local index cache
|
|
444
|
+
│ ├── transport.py # stdio / SSE / streamable-http transports
|
|
445
|
+
│ ├── skill_manager.py # Agent Skills loader + discovery
|
|
446
|
+
│ ├── skill_discovery.py # Skill directory scanner
|
|
447
|
+
│ ├── schema_converter.py # Convert ToolStore schemas to OpenAI format
|
|
448
|
+
│ ├── management/ # Management server + SPA (custom HTTP server)
|
|
449
|
+
│ │ ├── server.py
|
|
450
|
+
│ │ ├── api_helpers.py
|
|
451
|
+
│ │ ├── api_mcp.py
|
|
452
|
+
│ │ ├── api_skills.py
|
|
453
|
+
│ │ └── static/
|
|
454
|
+
│ │ └── app.js
|
|
455
|
+
│ └── docker_pool.py # Docker container pool (optional)
|
|
456
|
+
│
|
|
457
|
+
├── server/ # Registry server (FastAPI + SQLite)
|
|
458
|
+
│ ├── Dockerfile # HF Spaces deployment
|
|
459
|
+
│ ├── requirements.txt
|
|
460
|
+
│ ├── init_db.py
|
|
461
|
+
│ └── app/
|
|
462
|
+
│ ├── main.py # FastAPI app — browse page, API, auth
|
|
463
|
+
│ ├── models.py # Pydantic models (ToolSet, Binding, …)
|
|
464
|
+
│ ├── database.py # SQLite with HF Storage Bucket
|
|
465
|
+
│ ├── db.py # Connection helper
|
|
466
|
+
│ └── auth.py # JWT auth + user management
|
|
467
|
+
│
|
|
468
|
+
├── toolsets/ # All 14 published toolsets
|
|
469
|
+
│ ├── xlsx-toolkit/
|
|
470
|
+
│ ├── pdf-toolkit/
|
|
471
|
+
│ ├── docx-toolkit/
|
|
472
|
+
│ ├── pptx-toolkit/
|
|
473
|
+
│ ├── text-transform/
|
|
474
|
+
│ ├── file-verify/
|
|
475
|
+
│ ├── calc-toolkit/
|
|
476
|
+
│ ├── text-gen/
|
|
477
|
+
│ ├── batch-ops/
|
|
478
|
+
│ ├── debug-toolkit/
|
|
479
|
+
│ ├── webapp-testing-toolkit/
|
|
480
|
+
│ ├── doc-coauthoring-toolkit/
|
|
481
|
+
│ ├── internal-comms-toolkit/
|
|
482
|
+
│ └── stuck-toolkit/
|
|
483
|
+
│
|
|
484
|
+
├── Dockerfile # Root Dockerfile (HF Spaces entry point)
|
|
485
|
+
├── _publish_toolsets.py # Utility: batch-publish all toolsets
|
|
486
|
+
├── LICENSE # MIT
|
|
487
|
+
└── README.md
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## Development
|
|
493
|
+
|
|
494
|
+
```bash
|
|
495
|
+
git clone https://github.com/Mrw33554432/AgentToolStore.git
|
|
496
|
+
cd AgentToolStore
|
|
497
|
+
pip install -e client/
|
|
498
|
+
|
|
499
|
+
# Run a local registry for testing
|
|
500
|
+
cd server && pip install -r requirements.txt && python init_db.py
|
|
501
|
+
uvicorn app.main:app --port 8000 &
|
|
502
|
+
|
|
503
|
+
# Point the CLI at your local registry
|
|
504
|
+
export TOOLSTORE_REGISTRY_URL=http://localhost:8000/index.json
|
|
505
|
+
|
|
506
|
+
# Test a toolset
|
|
507
|
+
toolstore use text-transform --function text_stats text="Hello world."
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## Contributing
|
|
513
|
+
|
|
514
|
+
1. Write a toolset (`toolsets/<name>/toolset.py` + `doc.md`)
|
|
515
|
+
2. Decorate every callable function with `@tool`
|
|
516
|
+
3. Use keyword-only arguments with type hints and Google-style docstrings
|
|
517
|
+
4. Keep imports inside each function so they fail cleanly at call time
|
|
518
|
+
5. Test with `toolstore use <name> --function <fn> <args>`
|
|
519
|
+
6. Open a PR against `main`
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## Remaining Work
|
|
524
|
+
|
|
525
|
+
- **xlsx / pdf / docx / pptx testing** — these toolsets need `openpyxl`,
|
|
526
|
+
`pdfplumber`, `python-docx`, and `python-pptx` installed in the test
|
|
527
|
+
environment for full integration tests
|
|
528
|
+
- **Rate limiting** — the registry server has no rate limiting on public
|
|
529
|
+
endpoints
|
|
530
|
+
- **Large payload handling** — docx/pptx toolset bindings can be large;
|
|
531
|
+
better error handling for oversized publishes
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## License
|
|
536
|
+
|
|
537
|
+
MIT — see [LICENSE](LICENSE)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
toolstore/__init__.py,sha256=xyrGXt1_dm8jvdPwhVdium5-_120ZEap8o9mCPU4qxk,977
|
|
2
|
+
toolstore/adapters.py,sha256=K5kkeq52h2wKXtubAtzgUrcM6EyGSZ42y3vPFCE9K4A,8371
|
|
3
|
+
toolstore/cli.py,sha256=yEyjUlvz5DM8RnQaZ3TiFuuTXGYJ4dJeo-mgSk77gwM,64125
|
|
4
|
+
toolstore/config_manager.py,sha256=hVFDcvNzfhLKjQHvZHlUGIiGr01Of9wQ-f2QQLpqq_U,7316
|
|
5
|
+
toolstore/docker_pool.py,sha256=TuxnSK_5d6y2h3eSFMoq7acHGSG7cMq58X97RqaOZGI,12364
|
|
6
|
+
toolstore/exec_tools.py,sha256=NZyPtYcrbNIeVute9FUoJz-L0wa0VIBptecBNLXt0rc,9513
|
|
7
|
+
toolstore/index_manager.py,sha256=p4q6aMTqRcK1h5KpkLBuNQyC5BNF1XYqqa1zi9nkrEg,9516
|
|
8
|
+
toolstore/mcp_client.py,sha256=Ei1k-qqIzlmNEdgCp3qFWy0I-E6hUHRNPcnEmt5vtIs,11751
|
|
9
|
+
toolstore/mcp_server.py,sha256=Jl1wph7CjGBoRL2V2LCiz2aBDfuvYLcxNXJeim208zk,14219
|
|
10
|
+
toolstore/native_tool.py,sha256=911ImoAd5mBeB0ihjLVHAZE5tE1-x6kuuvVyodjMlMw,22320
|
|
11
|
+
toolstore/remote_runner.py,sha256=GGemkCBePHVx-AOZ1x266dH4SaVm8GARRMcSEX0tMGA,8708
|
|
12
|
+
toolstore/schema_converter.py,sha256=tqyFZpkiAzIgt20_EmKs0_YmYSVEWUI2BJ-2MUMIa1U,6399
|
|
13
|
+
toolstore/schemas.py,sha256=Fzf7nRanqDDdXs9gjIJ3PysMfG2-uVvUueHVRULi_0I,5311
|
|
14
|
+
toolstore/skill_discovery.py,sha256=LDDfrSyHK1t0ndBKKzYB0v6nXpHMnuKRreVcC-_PhjA,9339
|
|
15
|
+
toolstore/skill_manager.py,sha256=sepMgcJd3XlWifx7QQA6jH1ArzwovUOY1RTveAm2KCs,19321
|
|
16
|
+
toolstore/toolset.py,sha256=uBbJf-3RSPAidJ2BJxf-fHpnD336NVe73mEOuQA48i8,9544
|
|
17
|
+
toolstore/toolset_manager.py,sha256=YWYHD0MNo4rXT7gBI7OcjHiOR_bKZulimhVtuWylHMc,13349
|
|
18
|
+
toolstore/transport.py,sha256=BlXvZKeYbFQrfwfeEtQOiWAAIrG9Cn8YYATZpMqrwvI,13148
|
|
19
|
+
toolstore/workflow.py,sha256=Et5y-ktaY6lro1PHhsVaeLB-jkmz6jQV4ebaiv69VyU,14677
|
|
20
|
+
toolstore/management/__init__.py,sha256=vP9B1Zh_tSoA7yABRXiXj6sTF-mhjQzOXIAr7n3rwZk,60
|
|
21
|
+
toolstore/management/api_helpers.py,sha256=06fvuGy43KhpsjN-xa6_iBEVoKbxBOlRyobDXGMo_rQ,4739
|
|
22
|
+
toolstore/management/api_mcp.py,sha256=1t6sfgDN07gF-t0YhHlYUHTvh7aJmyfiZpcWUCl3rWc,6943
|
|
23
|
+
toolstore/management/api_skills.py,sha256=UKSzw8JBQKeOAwUX8fwoNCWlk0m1tFnb8E9Taz6uQAs,6689
|
|
24
|
+
toolstore/management/server.py,sha256=jEB9hCs1SI3dhTrP5cZhR8TrngX0y3NfEUvHXZ4z8N8,31989
|
|
25
|
+
toolstore/management/static/app.css,sha256=WHV6m18hLeA3VasPAdyFGPSncjkqHKI3m_hlzUpky8A,24362
|
|
26
|
+
toolstore/management/static/app.js,sha256=lcb-fHXMR6uiwWApcP_oBCBuIrs0OdzirpSaC14gjnQ,41976
|
|
27
|
+
toolstore/management/static/index.html,sha256=MnXu2a9p2lVE7Yat-Pd3K-ffVom9NuB72d5SzS_tMoQ,18175
|
|
28
|
+
toolstore/management/static/tab_mcp.js,sha256=tSKmwHBiXn2Ax_ec_dS43FkfjQjt7njPWFslB9NHtAk,20208
|
|
29
|
+
agent_tool_store-2.0.0.dist-info/METADATA,sha256=-YpznfNgD2_GOUd1bZ6CwTzMRMtBV5mx9XUA3Qb9XD4,18864
|
|
30
|
+
agent_tool_store-2.0.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
31
|
+
agent_tool_store-2.0.0.dist-info/entry_points.txt,sha256=7AcR3aZC12pCboQKRPuiJRmZ5A5hSWM_CcUtEF5OP7Y,48
|
|
32
|
+
agent_tool_store-2.0.0.dist-info/RECORD,,
|
toolstore/__init__.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""ToolStore — universal tool platform for AI agents.
|
|
2
|
+
|
|
3
|
+
``pip install agent-tool-store``
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
__version__ = "2.0.0"
|
|
7
|
+
|
|
8
|
+
from .management.server import ManagementServer
|
|
9
|
+
from .native_tool import get_secondary_tool_names
|
|
10
|
+
from .toolset import tool, get_tool, get_tool_names, clear_registry
|
|
11
|
+
from .toolset_manager import ToolsetManager, ToolsetDefinition, get_toolset_manager
|
|
12
|
+
|
|
13
|
+
# Provider adapters (zero-dependency, lightweight)
|
|
14
|
+
from .adapters import (
|
|
15
|
+
to_openai,
|
|
16
|
+
to_anthropic,
|
|
17
|
+
to_langchain,
|
|
18
|
+
to_openai_batch,
|
|
19
|
+
to_anthropic_batch,
|
|
20
|
+
from_openai,
|
|
21
|
+
from_anthropic,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"ManagementServer",
|
|
26
|
+
"tool",
|
|
27
|
+
"get_tool",
|
|
28
|
+
"get_tool_names",
|
|
29
|
+
"clear_registry",
|
|
30
|
+
"ToolsetManager",
|
|
31
|
+
"ToolsetDefinition",
|
|
32
|
+
"get_toolset_manager",
|
|
33
|
+
"get_secondary_tool_names",
|
|
34
|
+
# Adapters
|
|
35
|
+
"to_openai",
|
|
36
|
+
"to_anthropic",
|
|
37
|
+
"to_langchain",
|
|
38
|
+
"to_openai_batch",
|
|
39
|
+
"to_anthropic_batch",
|
|
40
|
+
"from_openai",
|
|
41
|
+
"from_anthropic",
|
|
42
|
+
"__version__",
|
|
43
|
+
]
|