工具注册服务器

toolregistry-server 是一个用于注册 Python 函数并将其通过 OpenAPI 或 MCP 协议暴露为服务的工具服务器。

  • by Oaklight
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Oaklight/toolregistry-server

使用说明

工具注册表服务器

定义自定义工具,并通过OpenAPI或MCP接口为其提供服务。建于 工具注册表.

概述

toolregistry-server 允许您将Python函数注册为工具,并通过多种协议将其作为服务公开。它提供:

  • 注册表生成器:与协议无关的配置加载和源代码注册(registry_builder)
  • 协议适配器: OpenAPIAdapter (FastAPI/REST)和 MCPAdapter (模型上下文协议)
  • 应用程序编排: App 用于构建注册表和调度到任何适配器的类;子类 prepare_registry() 用于自定义注册表
  • 认证:统一承载令牌支持(auth.load_tokens)
  • 命令行界面: toolregistry-server openapi / toolregistry-server mcp 随着 --config, --profile,以及更多

生态系统

包 描述 PyPI 文档
工具注册表 核心库——工具注册、模式生成、执行 文档
工具注册表服务器 服务器适配器——通过OpenAPI和MCP公开工具 文档
工具注册表中心 即用型工具——计算器、网络搜索、文件操作等。 文档
toolregistry (core)
       ↓
toolregistry-server (tool server)
       ↓
toolregistry-hub (tool collection + server config)

安装

# Base (RouteTable, registry_builder, auth)
pip install toolregistry-server

# With OpenAPI support
pip install toolregistry-server[openapi]

# With MCP support
pip install toolregistry-server[mcp]

# Full
pip install toolregistry-server[all]

快速开始

程序化——OpenAPI服务器

from toolregistry import ToolRegistry
from toolregistry_server import RouteTable
from toolregistry_server.adapters.openapi import OpenAPIAdapter

registry = ToolRegistry()

@registry.register
def greet(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

route_table = RouteTable(registry)
adapter = OpenAPIAdapter(route_table)
adapter.run(host="0.0.0.0", port=8000)

程序化-MCP服务器

import asyncio
from toolregistry import ToolRegistry
from toolregistry_server import RouteTable
from toolregistry_server.adapters.mcp import MCPAdapter

registry = ToolRegistry()
# ... register tools ...
route_table = RouteTable(registry)

adapter = MCPAdapter(route_table)
adapter.run(transport="stdio")                        # blocking
# or: asyncio.run(adapter.run_async(transport="sse", host="0.0.0.0", port=8000))

高级-- App 类

from toolregistry_server.app import App

# From a config file
App().serve_openapi(config_path="tools.yaml", host="0.0.0.0", port=8000)
App().serve_mcp(config_path="tools.yaml", transport="stdio")

# From a pre-built registry
from toolregistry import ToolRegistry
registry = ToolRegistry()
# ... register tools ...
App().serve_openapi(registry=registry, port=9000)

自定义应用程序子类

以(权力)否决 prepare_registry 添加内置工具、钩子或元数据:

from toolregistry_server.app import App

class MyApp(App):
    def prepare_registry(self, **kwargs):
        from toolregistry import ToolRegistry
        registry = ToolRegistry()
        registry.register(my_builtin_tool)
        # optionally apply user config on top
        if kwargs.get("config_path"):
            from toolregistry_server import apply_config, load_config
            apply_config(registry, load_config(kwargs["config_path"]))
        return registry

MyApp().serve_openapi(host="0.0.0.0", port=8000)

命令行界面

# OpenAPI server from config file
toolregistry-server openapi --config tools.yaml --port 8000

# MCP server (stdio)
toolregistry-server mcp --config tools.yaml --transport stdio

# MCP server (SSE)
toolregistry-server mcp --config tools.yaml --transport sse --port 8000

# With deployment profile (disables network/filesystem tools)
toolregistry-server openapi --config tools.yaml --profile remote

# With Bearer token auth
toolregistry-server openapi --config tools.yaml --tokens /path/to/tokens.txt

配置文件

JSONC和YAML都支持。三种源类型: python, mcp, openapi.

mode: denylist     # or "allowlist"
disabled: []       # namespaces to exclude (denylist mode)

tools:
  # Python module — all public functions
  - type: python
    module: my_package.tools
    namespace: my_tools

  # Python class
  - type: python
    class: my_package.Calculator
    namespace: calculator

  # MCP server (stdio subprocess)
  - type: mcp
    transport: stdio
    command: ["python", "-m", "my_mcp_server"]
    namespace: mcp_tools

  # MCP server (SSE / streamable-http)
  - type: mcp
    transport: http
    url: http://localhost:8080/mcp
    namespace: remote_mcp

  # OpenAPI endpoint
  - type: openapi
    url: https://api.example.com/openapi.json
    namespace: external_api
    auth:
      type: bearer
      token_env: EXTERNAL_API_TOKEN

看 examples/config.yaml 和 examples/config.jsonc 如需查看完整示例。

建筑

┌─────────────────────────────────────────────────────────────┐
│                    registry_builder                         │
│   load_config · apply_config · register_*_source            │
│   apply_profile · PROFILE_DISABLE_TAGS                      │
└─────────────────────────┬───────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                       RouteTable                            │
│              (central routing layer)                        │
└─────────────────────────┬───────────────────────────────────┘
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│  OpenAPIAdapter │ │   MCPAdapter    │ │  (your adapter) │
│   (FastAPI)     │ │  stdio/sse/http │ │  Adapter ABC    │
└─────────────────┘ └─────────────────┘ └─────────────────┘
          │               │
          ▼               ▼
┌─────────────────┐ ┌─────────────────┐
│  HTTP Clients   │ │   MCP Clients   │
└─────────────────┘ └─────────────────┘

添加新适配器

  1. 子类 Adapter 从 toolregistry_server.adapters
  2. 实施 run(**kwargs) 和 create_and_run(cls, route_table, **kwargs)
  3. 可选实施 add_cli_arguments(parser) 用于CLI集成
  4. 呼叫 App().serve(MyAdapter, ...) --没有更改 App 需要

部署配置文件

--profile 启动时应用基于标签的工具筛选:

配置文件 禁用
remote FILE_SYSTEM, DESTRUCTIVE, PRIVILEGED 标记工具
local NETWORK 标记工具

文档

贡献

欢迎投稿!请查看我们的 贡献指南 了解详情。

许可证

麻省理工学院——见 许可证.

相关项目