Universal tool platform for AI agents โ 14+ toolsets, MCP, YAML workflows, provider adapters (OpenAI/Anthropic/LangChain)
Project description
title: AgentToolStore Registry emoji: ๐ ๏ธ colorFrom: blue colorTo: purple sdk: docker app_port: 7860 pinned: false
AgentToolStore
A package index for agent tools. PyPI for Python packages, npm for
JavaScript โ ToolStore does the same for agent-callable toolsets. Agents
discover tools through a single tool_store function instead of wiring up
dozens of tools by hand.
โ Client SDK docs โ installing, integrating into agents, CLI, MCP bridge, skills โ Registry server docs โ API endpoints, running locally, deploying on HF Spaces
Live registry: mrw33554432-agenttoolstore.hf.space
How it works
toolstore update โ downloads index.json from registry
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Local index cache โ โ search and info read from here (no network)
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ tool_store(execute) โ โ fetches code from registry on demand
โ โ temp dir โ import โ runs in-process, no Docker
โ โ call function โ JSON โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
toolstore updatepulls the registry index and caches it locallysearch/inforead from the local cache โ instant, no networkexecutefetches code from the registry, installs deps explicitly, runs in-process, returns JSON
Installation
pip install toolstore
Or from source:
git clone https://github.com/Mrw33554432/AgentToolStore.git
cd AgentToolStore/client
pip install -e .
Requirements: Python โฅ3.10, httpx, pydantic, rich, typer.
Adding to Your Agent
Add one tool definition and one handler. The agent discovers every published
toolset through a single tool_store call.
How it fits into an agent loop
System prompt Tool call loop
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
"Tool store includes but not 1. Agent calls tool_store(search)
limited to: Echo Service, โ discovers xlsx-toolkit
calculator, weather, ..."
2. Agent calls tool_store(info)
โ gets xlsx_read params + docs
3. Agent calls tool_store(execute)
โ runs xlsx_read, gets result
4. Agent calls tool_store(close)
โ frees context space
1. Tool definition
Register this in your agent's function-calling tool list:
TOOL_STORE_SCHEMA = {
"type": "function",
"function": {
"name": "tool_store",
"description": (
"A universal tool manager that lets you search, inspect, "
"and execute thousands of tools and local utilities."
),
"parameters": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["search", "execute", "info", "close"],
"description": (
"The action to perform: 'search' finds tools "
"matching a query; 'execute' runs a tool; "
"'info' adds a tool to your context so you can "
"see its parameters; 'close' removes it."
),
},
"query": {
"type": "string",
"description": "Search query string (for action='search')",
},
"tool_name": {
"type": "string",
"description": (
"Name of the tool to inspect, execute, or close "
"(required for action='info', 'execute', or 'close')"
),
},
"arguments": {
"type": "object",
"description": (
"Arguments for the tool execution "
"(required for action='execute')"
),
},
},
"required": ["action"],
},
},
}
2. Handler
Wire the native function into your tool-call router. The native function
handles search, info, and execute โ add a small shim for close:
from toolstore.native_tool import tool_store_tool
def handle_tool_store(action: str, **kwargs) -> str:
if action == "close":
return f"Closed tool '{kwargs.get('tool_name', '')}'."
return tool_store_tool(action=action, **kwargs)
3. Secondary tools prompt
Most tools are exposure: secondary โ too many to list in every system
message. Inject a compact listing into the system prompt instead. Call
get_secondary_tool_names() then info with format="secondary":
from toolstore.native_tool import get_secondary_tool_names, tool_store_tool
names = get_secondary_tool_names()
listing = tool_store_tool(action="info", tool_names=names, format="secondary")
system_prompt += f"\n\n{listing}"
Produces:
Tool store includes but is not limited to the following tools:
- Echo Service
- calculator
- weather
- skill:algorithmic-art
...
The agent sees names; when it needs a tool it calls info again (without
format="secondary") for the full schema, then execute.
4. Agent conversation example
Agent: tool_store(action="search", query="read Excel files")
โ Found: xlsx-toolkit โ Read, create, and manipulate Excel files
Agent: tool_store(action="info", tool_name="xlsx-toolkit")
โ Returns bindings for xlsx_read, xlsx_sheets, xlsx_to_csv, xlsx_create
with parameter types and docstrings for each
Agent: tool_store(action="execute", tool_name="xlsx-toolkit",
arguments={"function": "xlsx_read",
"filepath": "/workspace/report.xlsx"})
โ {"sheets": ["Sheet1"], "data": {"Sheet1": [[...], ...]}}
Agent: tool_store(action="close", tool_name="xlsx-toolkit")
โ Closed tool 'xlsx-toolkit'.
5. Execution model
| Property | Behaviour |
|---|---|
| Runtime | In-process โ no Docker, no sandbox |
| Code origin | Fetched from registry, cached after first download |
| Dependencies | Never auto-installed; agent gets a clear error listing what's needed |
| Isolation | Each toolset runs in its own temp directory |
| Safety | All code is visible in the registry; deps are explicit; agent decides what to install |
6. Local execution (no registry)
Skip the registry entirely and call toolsets from a local directory:
from toolstore.exec_tools import _execute_toolset_local
result = _execute_toolset_local(
toolset_path="./toolsets/xlsx-toolkit",
function_name="xlsx_read",
filepath="/workspace/data.xlsx",
)
CLI Usage
# Pull the latest index from the registry
toolstore update
# Search for tools
toolstore search "spreadsheet"
# Inspect a toolset
toolstore info xlsx-toolkit
# Execute a function
toolstore use text-transform --function text_stats text="Hello world."
# Publish your own toolset
toolstore login --username <user> --password <pass>
toolstore toolset publish ./toolsets/my-toolkit
# Delete a toolset
toolstore delete my-toolkit
# Run ToolStore as an MCP server (stdio or SSE)
toolstore serve
# Export the tool_store schema for use with OpenAI / vLLM
toolstore export
# Manage skills
toolstore skill discover /path/to/skills
toolstore skill list-dirs
Full command reference:
| Command | Description |
|---|---|
update |
Pull the latest registry index and scan local MCP servers |
search |
Search for tools by name, description, or tags |
use |
Execute a tool function immediately |
info |
Show detailed schema and documentation for a tool |
login |
Authenticate with the registry to publish |
publish |
Publish a new tool or update an existing one |
delete |
Remove a tool from the registry |
export |
Export the meta-tool schema (OpenAI / vLLM formats) |
serve |
Run ToolStore as an MCP server (stdio or SSE) |
skill |
Manage Agent Skills (scan, discover, publish, โฆ) |
toolset |
Manage toolsets (scan, list, publish, โฆ) |
mcp-server |
Register and manage MCP servers |
docker |
Configure Docker execution permissions |
Writing a Toolset
A toolset is a directory with two files:
my-toolkit/
โโโ toolset.py # @tool functions (code bindings)
โโโ doc.md # human + agent guidance
toolset.py
Every function decorated with @tool becomes a callable binding. The decorator
auto-generates an OpenAI function-calling schema from type hints and docstrings:
from toolstore.toolset import tool
@tool
def my_function(*, input: str, count: int = 1) -> dict:
"""Do something useful.
Args:
input: The input text.
count: How many times to repeat.
"""
return {"result": input * count}
Rules:
- Use keyword-only arguments (
*,) - Annotate every parameter with a type hint
- Write a Google-style docstring with an
Args:section - Return a JSON-serializable dict
Two kinds of toolsets
| Type | toolset.py |
doc.md |
Example |
|---|---|---|---|
| Code | Real @tool functions |
Full docs | xlsx-toolkit, file-verify |
| Doc-only | Minimal empty module | Full guidance | stuck-toolkit |
Doc-only toolsets are valid โ they carry skill content without code bindings. No placeholder functions allowed. Code or nothing.
Registry API
The registry is a FastAPI server backed by SQLite, hosted on Hugging Face Spaces. All endpoints are public except auth and publish.
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/ |
GET | No | Browse page (HTML) โ dark-themed cards showing all published toolsets |
/api |
GET | No | API root |
/health |
GET | No | Health check โ database connectivity status |
/index.json |
GET | No | Full index โ every toolset with metadata, bindings, and full source code |
/auth/register |
POST | No | Register a new user account |
/auth/token |
POST | No | Login โ returns JWT access token (OAuth2 password flow) |
/publish |
POST | JWT | Publish a new toolset or update an existing one |
/tools/{name} |
DELETE | JWT | Delete a toolset |
Running your own registry
cd server
pip install -r requirements.txt
python init_db.py # create SQLite database
uvicorn app.main:app --port 8000
Set TOOLSTORE_REGISTRY_URL=http://localhost:8000/index.json to point the
CLI at a local registry. The default is:
https://mrw33554432-agenttoolstore.hf.space/index.json
Toolsets Catalog
All 14 toolsets published on the live registry.
Document processing
| Toolset | Functions | Dependencies |
|---|---|---|
| xlsx-toolkit | xlsx_read ยท xlsx_sheets ยท xlsx_to_csv ยท xlsx_create |
openpyxl |
| pdf-toolkit | pdf_extract ยท pdf_meta ยท pdf_merge ยท pdf_form_fields |
pdfplumber, PyPDF2 |
| docx-toolkit | docx_read ยท docx_info ยท docx_extract_tables ยท docx_create |
python-docx |
| pptx-toolkit | pptx_read ยท pptx_info ยท pptx_create |
python-pptx |
Utility
| Toolset | Functions | Dependencies |
|---|---|---|
| text-transform | text_diff ยท regex_extract ยท markdown_table ยท text_stats |
stdlib |
| file-verify | check_json ยท check_yaml ยท check_csv ยท file_hash ยท detect_encoding |
PyYAML, chardet (optional) |
| calc-toolkit | eval_expression ยท convert_unit ยท basic_stats |
stdlib |
| text-gen | lorem_words ยท lorem_paragraphs ยท generate_sentences ยท generate_data |
stdlib |
| batch-ops | batch_rename ยท batch_find_replace ยท batch_stats ยท batch_copy |
stdlib |
Guidance & diagnostics
| Toolset | Functions | Dependencies |
|---|---|---|
| debug-toolkit | analyze_error ยท extract_log_patterns |
stdlib |
| webapp-testing-toolkit | check_url ยท extract_urls |
stdlib |
| doc-coauthoring-toolkit | document_outline ยท markdown_template |
stdlib |
| internal-comms-toolkit | comms_template ยท format_bullets |
stdlib |
| stuck-toolkit | doc-only โ no code bindings | โ |
Project Structure
AgentToolStore/
โโโ client/ # Python SDK (pip install toolstore)
โ โโโ pyproject.toml
โ โโโ src/toolstore/
โ โโโ cli.py # Typer CLI (update, search, use, publish, โฆ)
โ โโโ native_tool.py # tool_store_tool() โ the agent-facing entry point
โ โโโ toolset.py # @tool decorator + schema generation
โ โโโ toolset_manager.py # AST-based toolset discovery & publishing
โ โโโ exec_tools.py # Local + remote toolset execution
โ โโโ config_manager.py # Settings, registry URL, env-var overrides
โ โโโ mcp_client.py # MCP client (stdio / SSE transport)
โ โโโ mcp_server.py # MCP server โ expose ToolStore via MCP
โ โโโ index_manager.py # Local index cache
โ โโโ transport.py # stdio / SSE / streamable-http transports
โ โโโ skill_manager.py # Agent Skills loader + discovery
โ โโโ skill_discovery.py # Skill directory scanner
โ โโโ schema_converter.py # Convert ToolStore schemas to OpenAI format
โ โโโ management/ # Management server + SPA (custom HTTP server)
โ โ โโโ server.py
โ โ โโโ api_helpers.py
โ โ โโโ api_mcp.py
โ โ โโโ api_skills.py
โ โ โโโ static/
โ โ โโโ app.js
โ โโโ docker_pool.py # Docker container pool (optional)
โ
โโโ server/ # Registry server (FastAPI + SQLite)
โ โโโ Dockerfile # HF Spaces deployment
โ โโโ requirements.txt
โ โโโ init_db.py
โ โโโ app/
โ โโโ main.py # FastAPI app โ browse page, API, auth
โ โโโ models.py # Pydantic models (ToolSet, Binding, โฆ)
โ โโโ database.py # SQLite with HF Storage Bucket
โ โโโ db.py # Connection helper
โ โโโ auth.py # JWT auth + user management
โ
โโโ toolsets/ # All 14 published toolsets
โ โโโ xlsx-toolkit/
โ โโโ pdf-toolkit/
โ โโโ docx-toolkit/
โ โโโ pptx-toolkit/
โ โโโ text-transform/
โ โโโ file-verify/
โ โโโ calc-toolkit/
โ โโโ text-gen/
โ โโโ batch-ops/
โ โโโ debug-toolkit/
โ โโโ webapp-testing-toolkit/
โ โโโ doc-coauthoring-toolkit/
โ โโโ internal-comms-toolkit/
โ โโโ stuck-toolkit/
โ
โโโ Dockerfile # Root Dockerfile (HF Spaces entry point)
โโโ _publish_toolsets.py # Utility: batch-publish all toolsets
โโโ LICENSE # MIT
โโโ README.md
Development
git clone https://github.com/Mrw33554432/AgentToolStore.git
cd AgentToolStore
pip install -e client/
# Run a local registry for testing
cd server && pip install -r requirements.txt && python init_db.py
uvicorn app.main:app --port 8000 &
# Point the CLI at your local registry
export TOOLSTORE_REGISTRY_URL=http://localhost:8000/index.json
# Test a toolset
toolstore use text-transform --function text_stats text="Hello world."
Contributing
- Write a toolset (
toolsets/<name>/toolset.py+doc.md) - Decorate every callable function with
@tool - Use keyword-only arguments with type hints and Google-style docstrings
- Keep imports inside each function so they fail cleanly at call time
- Test with
toolstore use <name> --function <fn> <args> - Open a PR against
main
Remaining Work
- xlsx / pdf / docx / pptx testing โ these toolsets need
openpyxl,pdfplumber,python-docx, andpython-pptxinstalled in the test environment for full integration tests - Rate limiting โ the registry server has no rate limiting on public endpoints
- Large payload handling โ docx/pptx toolset bindings can be large; better error handling for oversized publishes
License
MIT โ see LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agent_tool_store-2.0.0.tar.gz.
File metadata
- Download URL: agent_tool_store-2.0.0.tar.gz
- Upload date:
- Size: 102.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02c5d9886799258d3c9fd02503d2ae9ffab268eae0bf3d6778d02bd32ad7f7b0
|
|
| MD5 |
abbcd53fa0851c3e94813bd32fc7de6f
|
|
| BLAKE2b-256 |
0d1e9f9101230882f395623506a38a60b722cc74cdc0638acb206ff1cb08e3a1
|
File details
Details for the file agent_tool_store-2.0.0-py3-none-any.whl.
File metadata
- Download URL: agent_tool_store-2.0.0-py3-none-any.whl
- Upload date:
- Size: 113.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09cd2aa2e463b6c6a95b8b1f4da1681ec39ce36c684c82f38095013214ffa66c
|
|
| MD5 |
c07aaf40b812182582fd2eeced3304b8
|
|
| BLAKE2b-256 |
bbd818d33edc653a610655b8b6a3a220e8a2c7ef50e13e319f778a2dd741d0d7
|