Skip to main content
Glama

graph-tool-call

Los agentes LLM no pueden incluir miles de definiciones de herramientas en su contexto. La búsqueda vectorial encuentra herramientas similares, pero pierde el flujo de trabajo al que pertenecen. graph-tool-call construye un grafo de herramientas y recupera la cadena correcta, no solo una coincidencia.

Sin recuperación

graph-tool-call

248 herramientas (API K8s)

12% precisión

82% precisión

1068 herramientas (API completa de GitHub)

desbordamiento de contexto

78% Recall@5

Uso de tokens

8,192 tok

1,699 tok (79% ↓)

Medido con qwen3:4b (4-bit) — benchmark completo

PyPI License: MIT Python 3.10+ CI Zero Dependencies

Inglés · 한국어 · 中文 · 日本語



Por qué

Los agentes LLM necesitan herramientas. Pero a medida que aumenta el número de herramientas, dos cosas fallan:

  1. Desbordamiento de contexto — 248 endpoints de la API de Kubernetes = 8,192 tokens de definiciones de herramientas. El LLM se bloquea y la precisión cae al 12%.

  2. La búsqueda vectorial pierde los flujos de trabajo — Buscar "cancelar mi pedido" encuentra cancelOrder, pero el flujo real es listOrders → getOrder → cancelOrder → processRefund. La búsqueda vectorial devuelve una herramienta; tú necesitas la cadena.

graph-tool-call resuelve ambos problemas. Modela las relaciones de las herramientas como un grafo, recupera flujos de trabajo de varios pasos mediante búsqueda híbrida (BM25 + recorrido de grafos + embedding + anotaciones MCP) y reduce el uso de tokens entre un 64% y un 91% mientras mantiene o mejora la precisión.

Escenario

Solo vectorial

graph-tool-call

"cancelar mi pedido"

Devuelve cancelOrder

listOrders → getOrder → cancelOrder → processRefund

"leer y guardar archivo"

Devuelve read_file

read_file + write_file (relación COMPLEMENTARIA)

"eliminar registros antiguos"

Devuelve cualquier herramienta que coincida con "delete"

Herramientas destructivas clasificadas primero mediante anotaciones MCP

"ahora cancélalo" (después de listar pedidos)

Sin contexto del historial

Desprioriza herramientas usadas, impulsa herramientas del siguiente paso

Múltiples especificaciones Swagger con herramientas superpuestas

Herramientas duplicadas en los resultados

Deduplicación automática entre fuentes

1,200 endpoints de API

Lento, resultados ruidosos

Categorizado + recorrido de grafos para una recuperación precisa


Cómo funciona

OpenAPI / MCP / Python functions → Ingest → Build tool graph → Hybrid retrieve → Agent

Ejemplo — El usuario dice "cancela mi pedido y procesa un reembolso"

La búsqueda vectorial encuentra cancelOrder. Pero el flujo de trabajo real es:

                    ┌──────────┐
          PRECEDES  │listOrders│  PRECEDES
         ┌─────────┤          ├──────────┐
         ▼         └──────────┘          ▼
   ┌──────────┐                    ┌───────────┐
   │ getOrder │                    │cancelOrder│
   └──────────┘                    └─────┬─────┘
                                        │ COMPLEMENTARY
                                        ▼
                                 ┌──────────────┐
                                 │processRefund │
                                 └──────────────┘

graph-tool-call devuelve toda la cadena, no solo una herramienta. La recuperación combina cuatro señales mediante Reciprocal Rank Fusion (wRRF) ponderado:

  • BM25 — coincidencia de palabras clave

  • Recorrido de grafos — expansión basada en relaciones (PRECEDES, REQUIRES, COMPLEMENTARY)

  • Similitud de embedding — búsqueda semántica (opcional, cualquier proveedor)

  • Anotaciones MCP — sugerencias de solo lectura / destructivas / idempotentes


Instalación

El paquete principal tiene cero dependencias — solo la biblioteca estándar de Python. Instala solo lo que necesites:

pip install graph-tool-call                # core (BM25 + graph) — no dependencies
pip install graph-tool-call[embedding]     # + embedding, cross-encoder reranker
pip install graph-tool-call[openapi]       # + YAML support for OpenAPI specs
pip install graph-tool-call[mcp]           # + MCP server / proxy mode
pip install graph-tool-call[all]           # everything

Extra

Instala

Cuándo usar

openapi

pyyaml

Especificaciones YAML OpenAPI

embedding

numpy

Búsqueda semántica (conectar a Ollama/OpenAI/vLLM)

embedding-local

numpy, sentence-transformers

Modelos locales de sentence-transformers

similarity

rapidfuzz

Detección de duplicados

langchain

langchain-core

Integración con LangChain

visualization

pyvis, networkx

Exportación de grafo HTML, GraphML

dashboard

dash, dash-cytoscape

Panel interactivo

lint

ai-api-lint

Corrección automática de malas especificaciones API

mcp

mcp

Modo servidor / proxy MCP


Inicio rápido

Pruébalo en 30 segundos (sin instalación)

uvx graph-tool-call search "user authentication" \
  --source https://petstore.swagger.io/v2/swagger.json
Query: "user authentication"
Source: https://petstore.swagger.io/v2/swagger.json (19 tools)
Results (5):

  1. getUserByName  — Get user by user name
  2. deleteUser     — Delete user
  3. createUser     — Create user
  4. loginUser      — Logs user into the system
  5. updateUser     — Updated user

API de Python

from graph_tool_call import ToolGraph

# Build a tool graph from the official Petstore API
tg = ToolGraph.from_url(
    "https://petstore3.swagger.io/api/v3/openapi.json",
    cache="petstore.json",
)
print(tg)
# → ToolGraph(tools=19, nodes=22, edges=100)

# Search for tools
tools = tg.retrieve("create a new pet", top_k=5)
for t in tools:
    print(f"{t.name}: {t.description}")

# Search with workflow guidance
results = tg.retrieve_with_scores("process an order", top_k=5)
for r in results:
    print(f"{r.tool.name} [{r.confidence}]")
    for rel in r.relations:
        print(f"  → {rel.hint}")

# Execute an OpenAPI tool directly
result = tg.execute(
    "addPet", {"name": "Buddy", "status": "available"},
    base_url="https://petstore3.swagger.io/api/v3",
)

Planificación de flujos de trabajo

plan_workflow() devuelve cadenas de ejecución ordenadas con requisitos previos, reduciendo los viajes de ida y vuelta del agente de 3-4 a 1.

plan = tg.plan_workflow("process a refund")
for step in plan.steps:
    print(f"{step.order}. {step.tool.name} — {step.reason}")
# 1. getOrder      — prerequisite for requestRefund
# 2. requestRefund — primary action

plan.save("refund_workflow.json")

Edita, parametriza y visualiza flujos de trabajo: consulta la guía de la API directa.

Otras fuentes de herramientas

# From an MCP server (HTTP JSON-RPC tools/list)
tg.ingest_mcp_server("https://mcp.example.com/mcp")

# From an MCP tool list (annotations preserved)
tg.ingest_mcp_tools(mcp_tools, server_name="filesystem")

# From Python callables (type hints + docstrings)
tg.ingest_functions([read_file, write_file])

Las anotaciones MCP (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) se utilizan como señales de recuperación: la intención de la consulta se clasifica automáticamente, y las consultas de lectura priorizan las herramientas de solo lectura, mientras que las consultas de eliminación priorizan las herramientas destructivas.


Elige tu integración

graph-tool-call incluye varios patrones de integración. Elige el que coincida con tu stack:

Estás usando...

Patrón

Ganancia en tokens

Guía

Claude Code / Cursor / Windsurf

Proxy MCP (agrega N servidores MCP → 3 meta-herramientas)

~1,200 tok/turno

docs/integrations/mcp-proxy.md

Cualquier cliente compatible con MCP

Servidor MCP (fuente única como MCP)

varía

docs/integrations/mcp-server.md

LangChain / LangGraph (más de 50 herramientas)

Herramientas Gateway (N herramientas → 2 meta-herramientas)

92%

docs/integrations/langchain.md

SDK de OpenAI / Anthropic (código existente)

Middleware (monkey-patch de 1 línea)

76–91%

docs/integrations/middleware.md

Control directo sobre la recuperación

API de Python (retrieve() + adaptador de formato)

varía

docs/integrations/direct-api.md

Proxy MCP (el más común)

Cuando tienes muchos servidores MCP, sus nombres de herramientas se acumulan en cada turno del LLM. Agrúpalos detrás de un servidor: 172 herramientas → 3 meta-herramientas.

# 1. Create ~/backends.json listing your MCP servers
# 2. Register the proxy with Claude Code
claude mcp add -s user tool-proxy -- \
  uvx "graph-tool-call[mcp]" proxy --config ~/backends.json

Configuración completa, modo passthrough, transporte remoto → Guía de Proxy MCP.

Gateway de LangChain

from graph_tool_call.langchain import create_gateway_tools

# 62 tools from Slack, GitHub, Jira, MS365...
gateway = create_gateway_tools(all_tools, top_k=10)
# → [search_tools, call_tool] — only 2 tools in context

agent = create_react_agent(model=llm, tools=gateway)

Reducción del 92% de tokens frente a vincular las 62 herramientas. Consulta la guía de LangChain para patrones de filtrado automático y manual.

Middleware de SDK

from graph_tool_call.middleware import patch_openai

patch_openai(client, graph=tg, top_k=5)  # ← add this one line

# Existing code unchanged — 248 tools go in, only 5 relevant ones are sent
response = client.chat.completions.create(
    model="gpt-4o",
    tools=all_248_tools,
    messages=messages,
)

También funciona con Anthropic mediante patch_anthropic. Consulta la guía de Middleware.


Benchmark

Dos preguntas: (1) ¿El LLM sigue eligiendo la herramienta correcta cuando solo se le da el subconjunto recuperado? (2) ¿El recuperador clasifica las herramientas correctas en el top K?

Dataset

Herramientas

Precisión base

graph-tool-call

Reducción de tokens

Petstore

19

100%

95% (k=5)

64%

GitHub

50

100%

88% (k=5)

88%

MCP mixto

38

97%

90% (k=5)

83%

Kubernetes core/v1

248

12%

82% (k=5 + ontología)

79%

Hallazgo clave — con 248 herramientas, la base colapsa (desbordamiento de contexto) al 12%, mientras que graph-tool-call se recupera al 82%. A escalas más pequeñas, la base ya es sólida, por lo que el valor de graph-tool-call es el ahorro de tokens sin pérdida de precisión.

→ Resultados completos (pipeline / solo recuperación / competitivo / escala 1068 / agente LangChain de 200 herramientas en GPT y Claude): docs/benchmarks.md

# Reproduce
python -m benchmarks.run_benchmark                                # retrieval only
python -m benchmarks.run_benchmark --mode pipeline -m qwen3:4b    # full pipeline

Características avanzadas

Búsqueda híbrida basada en embeddings

Añade búsqueda semántica sobre BM25 + grafo. No se necesitan dependencias pesadas: conéctate a cualquier servidor de embedding externo.

tg.enable_embedding("ollama/qwen3-embedding:0.6b")        # Ollama (recommended)
tg.enable_embedding("openai/text-embedding-3-large")      # OpenAI
tg.enable_embedding("vllm/Qwen/Qwen3-Embedding-0.6B")     # vLLM
tg.enable_embedding("sentence-transformers/all-MiniLM-L6-v2")  # local
tg.enable_embedding(lambda texts: my_embed_fn(texts))     # custom callable

Los pesos se reequilibran automáticamente. Consulta la referencia de la API para todas las formas de proveedores.

Ajuste de recuperación

tg.enable_reranker()                                      # cross-encoder rerank
tg.enable_diversity(lambda_=0.7)                          # MMR diversity
tg.set_weights(keyword=0.2, graph=0.5, embedding=0.3, annotation=0.2)

Recuperación consciente del historial

Pasa las herramientas llamadas anteriormente para despriorizarlas e impulsar los candidatos del siguiente paso.

tools = tg.retrieve("now cancel it", history=["listOrders", "getOrder"])
# → [cancelOrder, processRefund, ...]

Guardar / cargar (preserva embeddings + pesos)

tg.save("my_graph.json")
tg = ToolGraph.load("my_graph.json")
# Or use cache= in from_url() for automatic save/load
tg = ToolGraph.from_url(url, cache="my_graph.json")

Ontología mejorada por LLM

tg.auto_organize(llm="ollama/qwen2.5:7b")
tg.auto_organize(llm="litellm/claude-sonnet-4-20250514")
tg.auto_organize(llm=openai.OpenAI())

Construye categorías, relaciones y palabras clave de búsqueda más ricas. Soporta Ollama, clientes OpenAI, litellm y cualquier invocable. Consulta la referencia de la API.

Otras características

Característica

API

Docs

Detección de duplicados entre especificaciones

find_duplicates / merge_duplicates

Ref API

Detección de conflictos

apply_conflicts

Ref API

Análisis operativo

analyze

Ref API

Panel interactivo

dashboard()

Ref API

Exportación HTML / GraphML / Cypher

export_html / export_graphml / export_cypher

Ref API

Corrección automática de malas especificaciones OpenAPI

from_url(url, lint=True)

ai-api-lint


Documentación

Doc

Descripción

Referencia CLI

Todos los comandos CLI de graph-tool-call

Referencia API Python

Métodos ToolGraph, helpers, middleware, LangChain

Integraciones

Servidor / proxy MCP, LangChain, middleware, API directa

Resultados de benchmark

Tablas completas de pipeline / recuperación / competitivo / escala

Arquitectura

Resumen del sistema, capas de pipeline, modelo de datos

Notas de diseño

Diseño de algoritmos: normalización, detección de dependencias, ontología

Investigación

Análisis competitivo, datos de escala de API

Lista de verificación de lanzamiento

Proceso de lanzamiento, flujo de changelog


Contribución

Las contribuciones son bienvenidas.

git clone https://github.com/SonAIengine/graph-tool-call.git
cd graph-tool-call
pip install poetry pre-commit
poetry install --with dev --all-extras
pre-commit install   # auto-runs ruff on every commit

# Test, lint, benchmark
poetry run pytest -v
poetry run ruff check . && poetry run ruff format --check .
python -m benchmarks.run_benchmark -v

Licencia

MIT

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SonAIengine/graph-tool-call'

If you have feedback or need assistance with the MCP directory API, please join our Discord server