mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-09 15:19:10 +02:00
* Simplify Provider interface and consolidate docket registration - Remove get_http_routes from Provider (unused) - Remove ProviderLifespanConfig, _base_lifespan, _register_tasks - Remove supports_tasks flag from Provider.__init__ - Consolidate all docket registration in server._docket_lifespan() - Simplify lifespan() to take no parameters - Move MountedProvider to separate module * Fix control flow in ComponentService resource methods * Move providers to server/providers * Ensure MountedProvider get_* methods go through middleware * Fix get_resource to only return concrete resources Reverts template-checking in get_resource that broke task execution. Tasks need access to the original template, not instantiated resources. * Move prefix utilities into mounted.py, deprecate import_server - Add resource prefix functions (add/remove/has_resource_prefix) to mounted.py - Deprecate import_server with warning to use mount() instead - Add tool_names uniqueness validation in MountedProvider * Fix provider iteration order and remove dead _is_mounted flag - Remove unused _is_mounted flag (MountedProvider.lifespan() calls _lifespan not _lifespan_manager, so the flag was never checked) - Fix provider iteration: change reversed() to forward order in execution methods (_call_tool, _read_resource_middleware, _get_prompt_content_middleware) to match documented "first non-None wins" semantics - Fix ComponentService to handle prefix-less mounted servers using _strip_tool_prefix()/_strip_resource_prefix() methods - Update conflict resolution tests to expect first-registered provider wins - Add regression tests for Docket behavior and prefix-less ComponentService * Add TaskComponents type and exception handling for provider task registration - Create TaskComponents dataclass with FunctionTool/FunctionResource/etc. types for proper typing of get_tasks() return value - Add try/except wrapper around provider.get_tasks() in _docket_lifespan for consistent error handling (warn + continue or raise based on settings) - Remove type: ignore comments from server.py task registration loop
102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
# /// script
|
|
# dependencies = ["aiosqlite"]
|
|
# ///
|
|
"""
|
|
Creates and seeds the tools database.
|
|
|
|
Run with: uv run examples/providers/sqlite/setup_db.py
|
|
"""
|
|
|
|
import asyncio
|
|
import json
|
|
from pathlib import Path
|
|
|
|
import aiosqlite
|
|
|
|
DB_PATH = Path(__file__).parent / "tools.db"
|
|
|
|
|
|
async def setup_database() -> None:
|
|
"""Create the tools table and seed with example tools."""
|
|
async with aiosqlite.connect(DB_PATH) as db:
|
|
await db.execute("""
|
|
CREATE TABLE IF NOT EXISTS tools (
|
|
name TEXT PRIMARY KEY,
|
|
description TEXT NOT NULL,
|
|
parameters_schema TEXT NOT NULL,
|
|
operation TEXT NOT NULL,
|
|
default_value REAL,
|
|
enabled INTEGER DEFAULT 1
|
|
)
|
|
""")
|
|
|
|
tools_data = [
|
|
(
|
|
"add_numbers",
|
|
"Add two numbers together",
|
|
json.dumps(
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"a": {"type": "number", "description": "First number"},
|
|
"b": {"type": "number", "description": "Second number"},
|
|
},
|
|
"required": ["a", "b"],
|
|
}
|
|
),
|
|
"add",
|
|
0,
|
|
1,
|
|
),
|
|
(
|
|
"multiply_numbers",
|
|
"Multiply two numbers",
|
|
json.dumps(
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"a": {"type": "number", "description": "First number"},
|
|
"b": {"type": "number", "description": "Second number"},
|
|
},
|
|
"required": ["a", "b"],
|
|
}
|
|
),
|
|
"multiply",
|
|
1,
|
|
1,
|
|
),
|
|
(
|
|
"divide_numbers",
|
|
"Divide two numbers",
|
|
json.dumps(
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"a": {"type": "number", "description": "Dividend"},
|
|
"b": {"type": "number", "description": "Divisor"},
|
|
},
|
|
"required": ["a", "b"],
|
|
}
|
|
),
|
|
"divide",
|
|
0,
|
|
1,
|
|
),
|
|
]
|
|
|
|
await db.executemany(
|
|
"""
|
|
INSERT OR REPLACE INTO tools
|
|
(name, description, parameters_schema, operation, default_value, enabled)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
""",
|
|
tools_data,
|
|
)
|
|
await db.commit()
|
|
|
|
print(f"Database created at: {DB_PATH}")
|
|
print("Seeded 3 tools: add_numbers, multiply_numbers, divide_numbers")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(setup_database())
|