Skip to main content
Glama

graph-tool-call

LLM 에이전트는 수천 개의 도구 정의를 컨텍스트에 모두 담을 수 없습니다. 벡터 검색은 유사한 도구를 찾지만, 해당 도구가 속한 워크플로우는 놓칩니다. graph-tool-call은 도구 그래프를 구축하고 단순한 일치 항목이 아닌 올바른 체인을 검색합니다.

검색 없음

graph-tool-call

248개 도구 (K8s API)

12% 정확도

82% 정확도

1068개 도구 (GitHub 전체 API)

컨텍스트 오버플로우

78% Recall@5

토큰 사용량

8,192 토큰

1,699 토큰 (79% ↓)

qwen3:4b (4-bit)로 측정됨 — 전체 벤치마크

PyPI License: MIT Python 3.10+ CI Zero Dependencies

English · 한국어 · 中文 · 日本語



이유

LLM 에이전트에게는 도구가 필요합니다. 하지만 도구의 수가 증가함에 따라 두 가지 문제가 발생합니다:

  1. 컨텍스트 오버플로우 — 248개의 Kubernetes API 엔드포인트 = 8,192 토큰의 도구 정의. LLM이 과부하를 일으키고 정확도가 **12%**로 떨어집니다.

  2. 벡터 검색은 워크플로우를 놓침 — *"주문 취소"*를 검색하면 cancelOrder를 찾지만, 실제 흐름은 listOrders → getOrder → cancelOrder → processRefund입니다. 벡터 검색은 하나의 도구만 반환하지만, 실제로는 체인이 필요합니다.

graph-tool-call은 이 두 가지를 모두 해결합니다. 도구 관계를 그래프로 모델링하고, 하이브리드 검색(BM25 + 그래프 탐색 + 임베딩 + MCP 주석)을 통해 다단계 워크플로우를 검색하며, 정확도를 유지하거나 향상시키면서 토큰 사용량을 64~91% 절감합니다.

시나리오

벡터 전용

graph-tool-call

"주문 취소"

cancelOrder 반환

listOrders → getOrder → cancelOrder → processRefund

"파일 읽고 저장"

read_file 반환

read_file + write_file (보완 관계)

"오래된 기록 삭제"

"delete"와 일치하는 도구 반환

MCP 주석을 통해 파괴적 도구 우선순위 지정

"이제 취소해" (주문 목록 조회 후)

기록 컨텍스트 없음

사용된 도구 순위 하락, 다음 단계 도구 순위 상승

도구가 중복되는 여러 Swagger 사양

결과에 중복 도구 포함

소스 간 자동 중복 제거

1,200개 API 엔드포인트

느리고 노이즈가 많은 결과

범주화 + 그래프 탐색으로 정밀 검색


작동 원리

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

예시 — 사용자가 *"주문 취소하고 환불 처리해"*라고 말함

벡터 검색은 cancelOrder를 찾습니다. 하지만 실제 워크플로우는 다음과 같습니다:

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

graph-tool-call은 단일 도구가 아닌 전체 체인을 반환합니다. 검색은 **가중치 기반 상호 순위 융합(wRRF)**을 통해 네 가지 신호를 결합합니다:

  • BM25 — 키워드 매칭

  • 그래프 탐색 — 관계 기반 확장 (PRECEDES, REQUIRES, COMPLEMENTARY)

  • 임베딩 유사도 — 의미론적 검색 (선택 사항, 모든 공급자)

  • MCP 주석 — 읽기 전용 / 파괴적 / 멱등성 힌트


설치

핵심 패키지는 의존성이 전혀 없으며 — Python 표준 라이브러리만 사용합니다. 필요한 것만 설치하세요:

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

추가 기능

설치 항목

사용 시기

openapi

pyyaml

YAML OpenAPI 사양

embedding

numpy

의미론적 검색 (Ollama/OpenAI/vLLM 연결)

embedding-local

numpy, sentence-transformers

로컬 sentence-transformers 모델

similarity

rapidfuzz

중복 탐지

langchain

langchain-core

LangChain 통합

visualization

pyvis, networkx

HTML 그래프 내보내기, GraphML

dashboard

dash, dash-cytoscape

대화형 대시보드

lint

ai-api-lint

잘못된 API 사양 자동 수정

mcp

mcp

MCP 서버 / 프록시 모드


빠른 시작

30초 만에 체험하기 (설치 불필요)

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

Python API

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",
)

워크플로우 계획

plan_workflow()는 전제 조건이 포함된 순차적 실행 체인을 반환하여 에이전트의 왕복 요청을 3~4회에서 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")

워크플로우 편집, 매개변수화 및 시각화 — Direct API 가이드를 참조하세요.

기타 도구 소스

# 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])

MCP 주석(readOnlyHint, destructiveHint, idempotentHint, openWorldHint)은 검색 신호로 사용됩니다. 쿼리 의도가 자동으로 분류되며, 읽기 쿼리는 읽기 전용 도구를 우선시하고 삭제 쿼리는 파괴적 도구를 우선시합니다.


통합 방식 선택

graph-tool-call은 여러 통합 패턴을 제공합니다. 스택에 맞는 것을 선택하세요:

사용 중인 도구...

패턴

토큰 절감

가이드

Claude Code / Cursor / Windsurf

MCP 프록시 (N개의 MCP 서버 통합 → 3개의 메타 도구)

~1,200 토큰/턴

docs/integrations/mcp-proxy.md

모든 MCP 호환 클라이언트

MCP 서버 (단일 소스를 MCP로)

다양함

docs/integrations/mcp-server.md

LangChain / LangGraph (50개 이상 도구)

게이트웨이 도구 (N개의 도구 → 2개의 메타 도구)

92%

docs/integrations/langchain.md

OpenAI / Anthropic SDK (기존 코드)

미들웨어 (1줄 몽키 패치)

76–91%

docs/integrations/middleware.md

검색에 대한 직접 제어

Python API (retrieve() + 포맷 어댑터)

다양함

docs/integrations/direct-api.md

MCP 프록시 (가장 일반적)

많은 MCP 서버를 사용할 때, 도구 이름이 모든 LLM 턴마다 쌓입니다. 이를 하나의 서버 뒤로 묶으세요: 172개의 도구 → 3개의 메타 도구.

# 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

전체 설정, 패스스루 모드, 원격 전송 → MCP 프록시 가이드.

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)

62개의 도구를 모두 바인딩하는 것 대비 92% 토큰 절감. 자동 필터 및 수동 패턴은 LangChain 가이드를 참조하세요.

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,
)

patch_anthropic을 통해 Anthropic과도 작동합니다. 미들웨어 가이드를 참조하세요.


벤치마크

두 가지 질문: (1) 검색된 하위 집합만 제공되었을 때 LLM이 여전히 올바른 도구를 선택하는가? (2) 검색기 자체가 올바른 도구를 상위 K개 안에 순위를 매기는가?

데이터셋

도구 수

기준 정확도

graph-tool-call

토큰 절감

Petstore

19

100%

95% (k=5)

64%

GitHub

50

100%

88% (k=5)

88%

Mixed MCP

38

97%

90% (k=5)

83%

Kubernetes core/v1

248

12%

82% (k=5 + 온톨로지)

79%

핵심 발견 — 248개의 도구에서 기준 모델은 (컨텍스트 오버플로우로 인해) 12%로 붕괴되지만, graph-tool-call은 82%로 복구합니다. 소규모에서는 기준 모델도 강력하므로, graph-tool-call의 가치는 정확도 손실 없는 토큰 절감에 있습니다.

→ 전체 결과 (파이프라인 / 검색 전용 / 경쟁력 / 1068 규모 / 200개 도구 LangChain 에이전트, GPT 및 Claude 대상): docs/benchmarks.md

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

고급 기능

임베딩 기반 하이브리드 검색

BM25 + 그래프 위에 의미론적 검색을 추가하세요. 무거운 의존성이 필요 없으며, 외부 임베딩 서버에 연결하기만 하면 됩니다.

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

가중치는 자동으로 재조정됩니다. 모든 공급자 형식은 API 참조를 확인하세요.

검색 튜닝

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)

기록 인식 검색

이전에 호출된 도구를 전달하여 순위를 낮추고 다음 단계 후보의 순위를 높입니다.

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

저장 / 불러오기 (임베딩 + 가중치 보존)

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")

LLM 강화 온톨로지

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

더 풍부한 범주, 관계 및 검색 키워드를 구축합니다. Ollama, OpenAI 클라이언트, litellm 및 모든 호출 가능한 객체를 지원합니다. API 참조를 참조하세요.

기타 기능

기능

API

문서

사양 간 중복 탐지

find_duplicates / merge_duplicates

API 참조

충돌 탐지

apply_conflicts

API 참조

운영 분석

analyze

API 참조

대화형 대시보드

dashboard()

API 참조

HTML / GraphML / Cypher 내보내기

export_html / export_graphml / export_cypher

API 참조

잘못된 OpenAPI 사양 자동 수정

from_url(url, lint=True)

ai-api-lint


문서

문서

설명

CLI 참조

모든 graph-tool-call CLI 명령어

Python API 참조

ToolGraph 메서드, 헬퍼, 미들웨어, LangChain

통합

MCP 서버 / 프록시, LangChain, 미들웨어, 직접 API

벤치마크 결과

전체 파이프라인 / 검색 / 경쟁력 / 규모 테이블

아키텍처

시스템 개요, 파이프라인 계층, 데이터 모델

설계 노트

알고리즘 설계 — 정규화, 의존성 탐지, 온톨로지

연구

경쟁 분석, API 규모 데이터

릴리스 체크리스트

릴리스 프로세스, 변경 로그 흐름


기여

기여를 환영합니다.

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

라이선스

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