3gpp-mcp
3gpp-mcp
3GPP 사양을 LLM에서 접근할 수 있게 해주는 MCP(Model Context Protocol) 서버입니다.
배경
3GPP 사양은 모바일 및 통신 엔지니어링에 필수적인 참고 자료이지만, LLM이 효과적으로 활용하기에는 어려움이 있습니다:
문서가 너무 많음 - 여러 시리즈에 걸쳐 수천 개의 사양이 존재하여 올바른 사양을 찾기 어렵습니다.
개별 문서가 너무 큼 - 많은 사양이 수백 페이지에 달하여 일반적인 컨텍스트 창을 훨씬 초과합니다.
Word 파일로 배포됨 - 사양은
.docx/.doc형식으로 게시되며 텍스트 처리를 위해 변환이 필요합니다.교차 참조가 많음 - 사양은 서로를 자주 참조하며, 단일 문서만 읽어서는 완전한 그림을 얻을 수 없습니다.
표와 그림에 정보가 밀집됨 - 복잡한 표와 흐름도는 중요한 세부 정보를 담고 있습니다. 이 도구는 표를 마크다운으로 변환하고 임베디드 이미지를 추출하여 LLM이 볼 수 있도록 합니다.
버전 복잡성 - 동일한 사양이 여러 3GPP 릴리스에 걸쳐 존재하며, 올바른 버전을 식별하는 것이 중요합니다.
이 도구는 .docx 파일을 구문 분석하고, 콘텐츠를 섹션별로 구조화하며, 모든 것을 SQLite 데이터베이스에 전체 텍스트 검색(FTS5)과 함께 저장하여 이러한 문제를 해결합니다. 그런 다음 MCP 서버는 검색, 섹션별 탐색, 교차 참조 추적을 위한 도구를 제공하여 LLM이 엔지니어와 같은 방식으로 사양을 탐색할 수 있도록 합니다.
왜 RAG가 아닌가?
임베딩 기반 RAG는 문서 Q&A의 정확도를 높이는 일반적인 방법이며, 3GPP 문서에 특화된 RAG 시스템(Telco-RAG, TelcoAI)이 존재합니다. 이 도구는 더 간단한 접근 방식을 취합니다. 모델 앞에 검색 파이프라인을 구축하는 대신, 모델에게 검색 및 탐색 도구를 제공하여 엔지니어처럼 사양을 스스로 탐색하게 합니다. 즉, 전체 텍스트 검색 후 섹션 계층 구조와 교차 참조를 따라 이동합니다. 검색은 구조화된 섹션에 대한 일반 FTS5 검색이므로, 임베딩 모델이나 벡터 데이터베이스를 실행할 필요가 없으며 모든 것이 단일 SQLite 파일에 저장됩니다.
TeleQnA로 측정한 결과, 이 도구는 세 가지 모델 제품군에서 3GPP 표준 질문에 대한 정확도를 6.512.0% 포인트 향상시킵니다. 대부분의 향상은 텍스트 자체를 보유한 데서 비롯됩니다. 동일한 데이터베이스에 대한 단일 BM25 쿼리만으로도 +7.8+9.6% 포인트를 기여합니다. 이 도구의 자체 검색은 첫 번째 검색된 구절에서 두 단계 이상 떨어진 답변을 찾아야 하는 질문에서 차별화됩니다. 사양 자체에서 생성된 작업(프로토콜 코드, ASN.1 구조, 5G SBI 스키마)에서는 88-100%를 정확하게 답변하고 인용하며, 모든 작업 유형과 모든 모델에서 동일한 BM25 기준선을 +26~+88% 포인트 차이로 능가합니다. 자세한 내용은 BENCHMARK.md를 참조하십시오.
Related MCP server: mcp-docs
시작하기
1. 설치
# Homebrew
brew install higebu/tap/3gpp-mcp
# ...or with Go 1.26+
go install github.com/higebu/3gpp-mcp/cmd/3gpp-mcp@latest사전 빌드된 바이너리는 릴리스 페이지에서도 제공됩니다. LibreOffice는 선택 사항입니다(.doc에서 .docx 변환 및 EMF/WMF 이미지를 PNG로 변환하는 데 필요).
2. 데이터베이스 구축
사양을 다운로드하여 데이터베이스로 가져옵니다. 각 사양 처리 후 임시 파일이 삭제되어 디스크 사용량이 최소화됩니다.
# Download and import the latest version of every spec (all releases)
3gpp-mcp build --latest --db data/3gpp.db --convert-doc --convert-image
# ...or restrict to a single release
3gpp-mcp build --release 19 --db data/3gpp.db --convert-doc --convert-image이 명령은 3GPP FTP 아카이브를 스크래핑하고, ZIP 파일을 다운로드하며, .docx 파일을 추출 및 구문 분석하고, 구조화된 콘텐츠를 SQLite 데이터베이스에 삽입합니다.
3. MCP 클라이언트에 등록
Claude Code
claude mcp add --scope user 3gpp -- 3gpp-mcp serve --db /path/to/data/3gpp.dbVS Code / GitHub Copilot
code --add-mcp '{"name":"3gpp","command":"3gpp-mcp","args":["serve","--db","/path/to/data/3gpp.db"]}'GitHub Copilot CLI
~/.config/github-copilot/cli-mcp.json에 추가(존재하지 않는 경우 생성):
{
"mcpServers": {
"3gpp": {
"command": "3gpp-mcp",
"args": ["serve", "--db", "/path/to/data/3gpp.db"]
}
}
}Codex CLI
codex mcp add --name 3gpp --command 3gpp-mcp --args serve --db /path/to/data/3gpp.dbClaude Desktop
구성 파일(macOS의 경우 ~/Library/Application Support/Claude/claude_desktop_config.json, Windows의 경우 %APPDATA%\Claude\claude_desktop_config.json`)에 추가:
{
"mcpServers": {
"3gpp": {
"command": "3gpp-mcp",
"args": ["serve", "--db", "/path/to/data/3gpp.db"]
}
}
}4. 웹 뷰어(선택 사항)
HTTP 전송에 --web을 추가하여 브라우저에서 사양을 탐색할 수 있습니다:
3gpp-mcp serve --db data/3gpp.db --transport http --addr :8080 --web
# MCP endpoint: http://localhost:8080/mcp/
# Web viewer: http://localhost:8080/기능: 필터링 기능이 있는 사양 목록, TOC 사이드바가 있는 섹션 뷰어, 페이지 매김 기능이 있는 전체 텍스트 검색, 과거 버전 탐색(버전은 사양별로 나열되며 MCP 도구와 마찬가지로 요청 시 다운로드), 버전 비교(구조 요약 및 섹션별 diff), 임베디드 이미지, 교차 참조 링크, 구문 강조 기능이 있는 OpenAPI 정의, 변환기가 생성하는 LaTeX 수식의 KaTeX 렌더링, 다크 모드, 반응형 디자인. 코드 블록은 표기법별로 구문이 강조됩니다. ASN.1, Diameter, SIP/RTSP, SDP 및 XML(코드 블록 참조).
WebMCP
브라우저가 W3C WebMCP API(document.modelContext, 2026년 기준 Chrome origin trial)를 제공하는 경우, 뷰어는 페이지 로드 시 모든 MCP 도구를 브라우저에 등록하여 브라우저 내 에이전트가 사양 데이터베이스를 직접 쿼리할 수 있도록 합니다. 등록은 /mcp/ 엔드포인트에 대한 동일 출처 통과(passthrough)이며 서버 측에서 구성할 것이 없으며 API가 없는 브라우저에는 영향을 미치지 않습니다. Origin trial 기간 동안에는 Chrome 플래그(chrome://flags)를 통해 로컬에서 활성화하거나, 공유 배포의 경우 프론팅 프록시에서 Origin-Trial 헤더를 제공합니다.
배포
Streamable HTTP
HTTP 전송은 상태 비저장입니다. MCP 프로토콜 버전 2026-07-28(핸드셰이크 필요 없음, Mcp-Session-Id 없음)을 지원하며, 이전 클라이언트(2024-11-05 ~ 2025-11-25)는 요청별 세션을 통해 계속 작동합니다.
HTTP 전송으로 서버 시작:
3gpp-mcp serve --db data/3gpp.db --transport http --addr :8080선택적으로 Bearer 토큰 인증 활성화:
export THREEGPP_MCP_BEARER_TOKEN=$(openssl rand -hex 32)
3gpp-mcp serve --db data/3gpp.db --transport http --addr :8080그런 다음 HTTP를 통해 연결하도록 클라이언트를 구성합니다.
{
"mcpServers": {
"3gpp": {
"url": "http://your-server:8080",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN"
}
}
}
}--web을 사용하면 MCP 엔드포인트가 /mcp/로 이동합니다.
프로덕션 배포에 대한 내용은 examples/systemd/를 참조하십시오.
Docker
Dockerfile은 멀티 스테이지로 구성되어 있으며, 직접 릴리스용 데이터베이스를 구축하여 SQLite 데이터베이스(섹션, OpenAPI 정의 및 임베디드 이미지)가 내장된 자체 포함 이미지를 생성합니다. 빌드 컨텍스트에 사전 구축된 데이터베이스가 필요하지 않습니다.
# Build an image with the latest version of every spec baked in (default)
docker build -t 3gpp-mcp:latest .
# ...or restrict the database to a single release
docker build --build-arg RELEASE=19 -t 3gpp-mcp:rel19 .
# ...or cap the newest release, keeping specs that have no version in it
docker build --build-arg MAX_RELEASE=19 -t 3gpp-mcp:max-rel19 .
# stdio transport (Claude Code / IDE integration)
docker run --rm -i 3gpp-mcp:latest
# HTTP transport
docker run --rm -p 8080:8080 3gpp-mcp:latest serve --db /3gpp.db --transport http --addr :8080RELEASE의 기본값은 latest이며, 모든 릴리스의 각 사양 최신 버전을 내장합니다. 단일 릴리스로 제한하려면 --build-arg RELEASE=<n>(예: 19)를 설정하거나, 최신 릴리스를 상한선으로 설정하고 해당 릴리스에 버전이 없는 사양은 삭제하지 않으려면 --build-arg MAX_RELEASE=<n>을 설정합니다. 이 두 인수는 함께 사용할 수 없습니다.
Cloud Run
Cloud Run에서 실행하려면 cloudbuild.yaml(빌드 + 푸시 + 배포) 및 service.yaml(Cloud Run 서비스 사양)을 참조하십시오.
도구
아래의 모든 도구에는 셸 사용 및 스크립팅을 위한 CLI 대응 명령도 있습니다(list_specs → 3gpp-mcp list-specs). 자세한 내용은 명령어 참조의 쿼리 명령어를 참조하십시오.
사양 탐색
도구 | 설명 | 주요 매개변수 |
| 사용 가능한 사양 목록 표시(페이지 매김) |
|
| 사양의 버전 목록 및 각 버전을 읽을 수 있는 위치 표시 |
|
| 사양의 목차 가져오기 |
|
| 섹션 콘텐츠 가져오기(페이지 매김) |
|
| 사양의 두 버전 비교: 구조 요약 또는 섹션 텍스트 diff |
|
모든 get_toc, get_section 및 search 결과는 페이지 매김된 응답의 모든 페이지에서 해당 사양과 버전을 명시합니다.
과거 버전
데이터베이스에는 사양당 하나의 버전만 저장됩니다. 다른 버전을 읽으려면 version을 get_section 또는 get_toc에 전달합니다. version은 점으로 구분된 형식(15.8.0), 아카이브 토큰(f80), 릴리스 선택자(Rel-15 또는 15, 해당 릴리스에서 최신 버전 선택) 또는 latest를 허용합니다. 릴리스 선택자와 latest는 3GPP 아카이브를 기준으로 확인되므로 요청 시 가져오기가 필요합니다(--no-fetch에서는 작동하지 않음). compare_versions의 old_version 및 new_version도 동일한 형식을 허용합니다. new_version의 기본값은 데이터베이스에 있는 버전입니다.
데이터베이스에 없는 버전은 3GPP 아카이브에서 다운로드되어 첫 번째 사용 시 변환됩니다. 대규모 사양의 경우 최대 몇 분이 걸릴 수 있습니다. 호출 예산이 만료될 때까지 실행 중이면 도구에서 이를 알리고 동일한 호출을 나중에 반복하면 콘텐츠를 반환합니다. 결과는 기본 데이터베이스와 별도인 크기 제한 캐시에 저장됩니다(serve 참조). 따라서:
search는 데이터베이스에 있는 버전만 다룹니다. 교차 릴리스 전체 텍스트 검색은 지원되지 않습니다.get_references는 데이터베이스에 있는 버전에 대한 데이터만 있으며, 아카이브된 버전에서 읽은 섹션은 해당 헤더에 명시됩니다.get_image및list_images도version을 허용합니다. 아카이브된 버전의 이미지는 첫 번째 사용 시 자체적으로 다운로드됩니다(버전당 추가 아카이브 다운로드 1회, 동일한 재시도 동작). EMF/WMF 그림은 서버에 LibreOffice가 설치된 경우 PNG로 변환됩니다.섹션 번호는 릴리스 간에 이동할 수 있습니다. 이전 버전의 섹션을 읽기 전에 해당 버전의
get_toc을 확인하십시오.
검색
도구 | 설명 | 주요 매개변수 |
| 모든 사양에 대한 전체 텍스트 검색 |
|
search 도구는 SQLite FTS5 쿼리 구문을 지원합니다:
구문 검색:
"service based interface"부울 연산자:
AMF AND UE,AMF OR SMF,NOT deprecated긍정 용어 뒤의 제외:
handover -conditional접두사 일치:
handov*열 필터:
title:authentication,content:handover근접:
NEAR(AMF UE, 5)
하이픈이나 점이 포함된 용어(IMS-AKA, 38.101)는 자동으로 인용되므로 수동 이스케이프가 필요하지 않습니다.
교차 참조
도구 | 설명 | 주요 매개변수 |
| 사양과 RFC 간의 상호 참조 가져오기 |
|
OpenAPI 정의
도구 | 설명 | 주요 매개변수 |
| 사용 가능한 OpenAPI 정의 나열 |
|
| OpenAPI 정의 가져오기 (페이지네이션) |
|
| OpenAPI 정의 전체 텍스트 검색 |
|
search_openapi는 search가 사용하는 것과 별개의 자체 FTS5 인덱스를 사용합니다:
search는 사양 조항 텍스트를 다루며 OpenAPI 콘텐츠를 반환하지 않고,
search_openapi는 OpenAPI 콘텐츠만 다룹니다. 하나의 검색 결과는 하나의 문서가 아닌 하나의 정의입니다
— components.schemas의 스키마, 또는 하나의 경로에 대한 하나의 HTTP 메서드 (PUT /nf-instances/{nfInstanceID}와 같이 명명됨) — 따라서 어떤 API 문서가 정의하는지 몰라도 데이터 타입이나 엔드포인트를 찾을 수 있으며,
get_openapi로 전체 내용을 읽을 수 있습니다. 단일 베어 텀인 쿼리는 정확히 그 이름의 정의를 먼저 순위화하므로,
NFProfile은 NFProfile 스키마를 참조만 하는 스키마보다 먼저 반환합니다.
스키마의 인덱싱된 텍스트는 한 단계의 $ref 확장을 전달합니다 — items와 additionalProperties를 통해 직접적으로, 이것이 5G SBI 정의가 대부분의 관계를 명시하는 방식입니다 — 따라서 참조된 타입의 필드는 이를 사용하는 스키마에서 검색 가능합니다; 두 단계 떨어진 타입은 해당 텍스트에 포함되지 않습니다. search와 달리, 이 인덱스는 형태소 분석을 적용하지 않습니다
— 식별자는 작성된 그대로 일치됩니다 — 그리고 -, . 및 _는 토큰을 분할하므로,
Nnrf_NFManagement는 NFManagement로도, /nf-instances는 instances로도 찾을 수 있습니다. camelCase는 분할되지 않습니다.
인덱스는 build와 update의 끝에 구축됩니다. import와 import-dir은 이를 건드리지 않습니다: YAML 파일은 아카이브 zip에 포함되어 제공되므로, .docx를 가져와도 인덱싱할 내용이 변경될 수 없습니다. 이 도구가 존재하기 전에 구축된 데이터베이스에는 인덱스가 없습니다; build-openapi-index로 제자리에 추가하세요.
ASN.1 정의
도구 | 설명 | 주요 매개변수 |
| 하나의 사양 또는 모든 사양에서 이름으로 ASN.1 할당을 가져오거나 사양의 할당 이름을 나열합니다 |
|
ASN.1로 지정된 프로토콜(RRC TS 38.331/36.331, NGAP TS 38.413, S1AP TS 36.413, XnAP, F1AP, ...)은 -- ASN1START / -- ASN1STOP 마커 사이에 ASN.1을 작성하며, 변환기는 이를 ```asn1 펜스로 저장합니다 (코드 블록 참조). get_asn1은 해당 펜스에서 모든 최상위 할당(타입, 상수 및 정보 객체)을 추출합니다.
name과 함께 사용하면 해당 할당의 전체 텍스트와 이를 정의하는 섹션을 반환하므로 답변을 인용할 수 있습니다. 이는 모든 IE를 하나의 조항에 정의하는 프로토콜에 중요합니다: NGAP의 IE 정의 조항은 수백 킬로바이트로, 하나의 get_section 페이지보다 훨씬 크지만, "ASN.1이 여기서 허용하는 범위는 무엇인가"에 답하는 하나의 정의는 몇 줄에 불과합니다. 일치는 대소문자와 구분자를 무시하므로, IE 테이블의 AMF UE NGAP ID는 ASN.1의 AMF-UE-NGAP-ID를 찾습니다; 일치하는 항목이 없는 이름에는 유사한 이름이 제안됩니다. 두 번 이상 정의된 이름은 각각 자체 소스 라인 아래에 모든 정의를 반환합니다.
어떤 사양이 이름을 정의하는지 모를 때는 spec_id를 생략하세요: 이름은 데이터베이스의 모든 사양에서 확인되며, 데이터베이스 빌드 시간(build, update, import 및 import-dir 모두 새로 고침)에 구축된 이름 인덱스에서 가져옵니다. 잘못된 사양을 지정한 조회는 이름이 실제로 정의된 위치를 알려줍니다. 이 도구가 존재하기 전에 구축된 데이터베이스에는 인덱스가 없습니다 — build-asn1-index로 제자리에 추가하세요. 사양 간 확인은 데이터베이스 버전만 다룹니다 — spec_id(및 선택적으로 version)를 전달하여 보관된 버전을 읽으십시오. get_section과 동일한 온디맨드 다운로드 동작이 적용됩니다.
spec_id와 name 없이 사용하면 정의 섹션별로 그룹화된 모든 할당 이름을 나열합니다.
포함된 이미지
도구 | 설명 | 주요 매개변수 |
| 사양에 포함된 이미지 나열 |
|
| LLM이 볼 수 있는 base64 데이터로 포함된 이미지 가져오기 |
|
PNG/JPEG/GIF/WebP 이미지는 LLM이 직접 볼 수 있습니다. EMF/WMF 이미지(대부분의 3GPP 그림이 이 형식을 사용)는 기본적으로 원시 데이터로 저장됩니다. 빌드 시 LibreOffice를 통해 PNG로 변환하려면 --convert-image를 사용하세요.
그림은 이미지 형식에 관계없이 단일 표기법으로 섹션 텍스트에서 참조됩니다: 본문 텍스트에서는 , 테이블 셀 내에서는 <img src="image://NAME?w=&h=" ...>. 해당 NAME을 get_image에 전달하세요; 원본 파일명(image3.emf)과 변환된 파일명(image3.png) 모두 확인됩니다.
코드 블록
섹션 텍스트는 태그된 코드 펜스를 전달하므로 LLM과 웹 뷰어 모두 표기법을 구분할 수 있습니다:
펜스 | 내용 |
|
|
| Diameter 명령 및 그룹화된 AVP 정의 (RFC 6733 CCF) |
| XML 스키마, XML 본문 예제 및 DTD |
| SIP/RTSP 메시지 예제 |
| 독립형 SDP 세션 설명 |
| Word OMML에서 변환된 독립형 방정식 |
| 소스 문서가 코드로 스타일링한 기타 모든 것 |
수식
Word 수식(OMML)은 세 가지 표기법으로 LaTeX로 변환되므로, 수식이 독립적으로 있든 문장 내에 있든 읽을 수 있습니다:
표기법 | 위치 |
| 내용이 방정식뿐인 단락. 방정식 번호는 |
| 펜스 블록이 될 수 없는 표시 방정식 — 테이블 셀 또는 목록 항목 내부. |
| 문장 내의 수식. |
들여쓰기
3GPP 산문은 들여쓰기에 구조를 인코딩합니다 — 중첩된 요구사항 및 조건 목록, 다단계 정의. 본문 단락의 선행 공백은 줄 바꿈 없는 공백(U+00A0)으로 보존되며, 소스 문서의 탭 하나는 4개가 됩니다: 리터럴 탭 또는 4개 이상의 선행 공백은 Markdown에서 들여쓰기된 코드 블록이 되고(내부의 <sub>와 같은 HTML은 해석되지 않음), 줄 바꿈 없는 공백은 모든 렌더러에서 시각적 중첩을 유지하고 전체 텍스트 검색에 방해가 되지 않습니다.
팁
모델에 도구 사용 지시하기
서버를 연결한다고 해서 모델이 자동으로 이를 참조하는 것은 아닙니다: 선택권이 주어지면 일부 모델은 기억에서 3GPP 질문에 답합니다. 벤치마크에서 Claude Sonnet 5는 TeleQnA 질문의 40%에서 검색을 건너뛰었고 GPT 5.6 Luna는 60%에서 건너뛰었으며, 해당 질문에서 도구는 아무 소용이 없었습니다. 클라이언트의 시스템 프롬프트에 한 문장을 추가하면 그 재량권이 사라집니다. 측정된 문구:
기억에서 답하지 마십시오. 먼저 사양을 검색하고 검색한 텍스트에 답을 근거하십시오. 이미 답을 알고 있다고 확신하는 경우에도 마찬가지입니다.
해당 문장은 Luna의 건너뛰기 비율을 0으로 만들고 이득을 +5.9에서 +12.0 포인트로 높였으며, 이미 모든 질문을 검색한 모델에는 아무런 영향을 미치지 않았고, 도구가 연결되지 않으면 아무 소용이 없습니다 — 답변을 몰래 가져오는 대신 검색을 강제합니다. 같은 정신의 더 강력한 하우스 룰 — 3GPP에 관한 모든 답변은 이 도구를 통해 검색된 조항 텍스트에 근거하고 조항을 인용하십시오 — 은 합리적이지만, 위 문장만이 벤치마크에서 측정된 것입니다.
릴리스별 별도 데이터베이스
릴리스 간 부분 비교를 위해 compare_versions와 version 매개변수는 추가 설정이 필요 없습니다. 한 릴리스에 대해 지속적으로 작업할 때는 릴리스별 별도 데이터베이스를 구축하는 것이 여전히 유용합니다: 전체 텍스트 search, get_references 및 OpenAPI 정의는 데이터베이스에 포함된 버전만 다루므로, 릴리스별 데이터베이스는 온디맨드 다운로드 없이 해당 릴리스에 대한 세 가지 모두를 제공합니다.
# Build databases for different releases
3gpp-mcp build --release 18 --db data/3gpp-rel18.db --convert-doc --convert-image
3gpp-mcp build --release 19 --db data/3gpp-rel19.db --convert-doc --convert-image--release는 해당 정확한 릴리스에 버전이 있는 사양만 유지하므로,
이전 릴리스에서 고정된 사양(예: TS 34.108)은 데이터베이스에서 완전히 누락됩니다. 해당 사양을 잃지 않고 릴리스를 고정하려면 대신 선택을 제한하십시오 — 모든 사양은 한도 이하의 최신 버전으로 가져옵니다:
# Everything as of Release 19: specs with no Rel-19 version fall back to their
# newest older version rather than dropping out.
3gpp-mcp build --max-release 19 --db data/3gpp-rel19.db --convert-doc --convert-image
# Keep the cap when refreshing the database later.
3gpp-mcp update --max-release 19 --db data/3gpp-rel19.db --convert-doc별도의 MCP 서버로 등록하십시오:
claude mcp add --scope user 3gpp-rel18 -- 3gpp-mcp serve --db /path/to/data/3gpp-rel18.db
claude mcp add --scope user 3gpp-rel19 -- 3gpp-mcp serve --db /path/to/data/3gpp-rel19.db사양 최신 상태 유지
update 명령을 사용하여 데이터베이스에 이미 있는 사양의 최신 버전을 확인하십시오:
3gpp-mcp update --db data/3gpp.db --convert-doc --convert-image명령어 참조
serve
MCP 서버를 시작합니다.
플래그 | 설명 | 기본값 |
| SQLite 데이터베이스 경로 |
|
| 전송 유형: |
|
| HTTP 수신 주소 (환경 변수: |
|
| HTTP 인증용 Bearer 토큰 (환경 변수: | |
| MCP 서버와 함께 웹 뷰어 활성화 (HTTP 전송 전용) |
|
| 데이터베이스에 없는 사양 버전의 온디맨드 가져오기 비활성화 |
|
| 온디맨드 버전 캐시 경로 |
|
| 버전 캐시 크기 제한 (MB). |
|
| 도구 호출이 온디맨드 가져오기를 기다린 후 호출자에게 재시도를 요청하는 시간 (환경 변수: |
|
버전 캐시는 별도의 SQLite 파일이므로, 메인 데이터베이스는 읽기 전용으로 유지되며 추가 버전으로 오염되지 않습니다. 캐시를 생성할 수 없는 경우(예: scratch 기반 컨테이너 이미지와 같은 읽기 전용 또는 임시 파일 시스템), 서버는 경고를 기록하고 온디맨드 가져오기를 비활성화한 상태로 실행됩니다. 다른 모든 기능은 계속 작동합니다. 캐시된 버전은 크기 제한을 초과하면 가장 오래 사용되지 않은(LRU) 순서로 제거됩니다.
HTTP 전송은 또한 인증 없이 200 OK를 반환하는 GET /health를 노출합니다. 이 경로를 플랫폼 상태 확인(Cloud Run, Sakura AppRun, Kubernetes liveness/readiness 프로브 등)에 사용하십시오.
build
데이터베이스로 사양을 다운로드하고 가져옵니다 (초기 설정에 권장). 별칭: pipeline.
플래그 | 설명 | 기본값 |
| 출력 SQLite 데이터베이스 경로 |
|
| 특정 릴리스(예: | |
| 릴리스를 기준으로 선택 제한 (예: | |
| 각 사양을 최신 버전으로 선택 (다른 선택자가 제공되지 않은 경우 사용) |
|
| 특정 사양(예: | |
| 시리즈별 필터링, 쉼표로 구분 (예: | |
| 병렬 작업자 수 | NumCPU |
| LibreOffice를 사용하여 |
|
| LibreOffice를 사용하여 EMF/WMF 이미지를 PNG로 변환 |
|
| 아카이브를 스크래핑하는 대신 파일에서 사양 목록 읽기 (선택자는 여전히 필요함) | |
| 사양 목록 캐시 비활성화 |
|
| 사양 목록 스크래핑을 위한 동시성 ( |
|
| HTTP 타임아웃 |
|
--release, --max-release, --latest, --series 또는 --spec 중 하나는 반드시 제공되어야 합니다. --spec-list가 포함된 경우: 파일이 후보 항목을 제공하고 선택자가 이를 필터링합니다.
--release와 --max-release는 지정된 릴리스에 버전이 없는 사양에 대해 다르게 동작합니다. --release 19는 해당 사양을 삭제하고, --max-release 19는 제한 아래의 최신 버전으로 유지합니다. 이 둘은 함께 사용할 수 없습니다.
기타 명령어
download— 변환 없이 사양 다운로드 (--output-dir, 기본값specs).build와 마찬가지로--release,--max-release,--latest,--series또는--spec중 하나가 필요합니다.import— 단일.docx파일을 데이터베이스로 가져옵니다. 별칭:convert. 사용법:3gpp-mcp import --db data/3gpp.db path/to/spec.docximport-dir— 디렉토리의 모든.docx파일을 데이터베이스로 가져옵니다. 별칭:convert-dir. 사용법:3gpp-mcp import-dir --db data/3gpp.db ./specsupdate— 데이터베이스의 사양을 최신 버전으로 업데이트하거나--max-release로 제한합니다.build-openapi-index— 기존 데이터베이스의 OpenAPI 검색 인덱스를 다시 빌드합니다.build와update가 자체적으로 수행하므로,search_openapi가 존재하기 전에 빌드된 데이터베이스에 인덱스를 추가하기 위한 것입니다.serve는 데이터베이스를 읽기 전용으로 열고 즉시 생성할 수 없습니다.build-asn1-index— 기존 데이터베이스의 ASN.1 이름 인덱스를 다시 빌드합니다.build,update,import및import-dir이 자체적으로 수행하므로,get_asn1이 존재하기 전에 빌드된 데이터베이스에 인덱스를 추가하기 위한 것입니다.completion— 셸 완성 스크립트 출력:3gpp-mcp completion bash(또는zsh,fish)
제한은 데이터베이스에 저장되지 않으므로, --max-release 19로 빌드된 데이터베이스는 update에도 동일한 플래그가 필요합니다. 그렇지 않으면 업데이트가 모든 사양을 아카이브의 최신 릴리스로 끌어올립니다. 제한이 있으면 업데이트는 사양을 양방향으로 이동하므로, 이미 빌드된 제한 없는 데이터베이스를 제한 아래로 내립니다. 모든 버전이 제한 위에 있는 사양은 제거됩니다. 제한된 데이터베이스에 속하는 버전이 없기 때문입니다. 아카이브 목록에서 누락된 사양은 그대로 둡니다. 실패한 목록은 철회된 사양과 동일하게 보이기 때문입니다.
쿼리 명령어
쿼리 명령어(list-specs, list-versions, get-toc, get-section, get-asn1, compare-versions, search, list-openapi, get-openapi, search-openapi, get-references, list-images, get-image)는 MCP 읽기 도구와 1:1로 일치하므로, MCP 클라이언트 없이 셸에서 데이터베이스를 검사하고 스크립팅할 수 있습니다:
3gpp-mcp search --db data/3gpp.db --limit 3 "AMF AND authentication" | jq '.results[].section_number'
3gpp-mcp get-section --db data/3gpp.db "TS 23.501" 5.15.2 | less모든 명령어에 공통된 규칙:
플래그는 위치 인수보다 먼저 와야 합니다.
JSON 결과는 들여쓰기되고 페이지 매김 없이 stdout으로 출력됩니다.
jq,head또는less로 파이프하십시오. 경고 및 진행 메모는 stderr로 전송되므로 stdout은 구문 분석 가능한 상태로 유지됩니다.--version(및compare-versions)을 허용하는 명령어는 MCP 도구와 동일한 버전 형식(15.8.0,f80,Rel-15,latest)을 사용하며, 재시도를 요청하는 대신 온디맨드 다운로드가 완료될 때까지 기다립니다. Ctrl-C로 중단하십시오. 이 명령어들은serve의 가져오기 플래그(--no-fetch,--version-cache,--version-cache-mb,--fetch-budget)를 공유합니다. 버전을 지정하지 않는 쿼리는 버전 캐시를 생성하지 않습니다(list-versions는 기존 캐시를 읽어cached가용성을 보고하지만, 캐시를 생성하지는 않습니다).모든 명령어는
--db(기본값3gpp.db)를 사용합니다.
환경 변수
변수 | 설명 |
|
|
|
|
| HTTP 전송 인증용 Bearer 토큰 |
| PaaS 규칙 (Cloud Run / Heroku); |
| 온디맨드 버전 캐시 크기 제한 (MB) (기본값 |
| 도구 호출이 온디맨드 가져오기를 기다리는 시간 (기본값 |
| 최대 ZIP 다운로드 크기 (기본값 |
| 사양 목록 캐시 TTL (시간) (기본값 |
| 아카이브 목록 가져오기 시도 간 초기 백오프 (ms) (기본값 |
| XDG 기본 디렉토리 사양에 따른 캐시 디렉토리 루트 |
Available Tools
13 toolscompare_versionsA
Compare two versions of a 3GPP specification. Without section_number, returns a structural summary: sections added, removed, renumbered, retitled, and whose content changed. With section_number, returns a line-level unified diff of that section's text. Use list_versions first to see which versions exist; a version not yet cached is downloaded and converted on first use — when the tool says a download is in progress, call it again with the same arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Start line number (0-based, default: 0) | |
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| max_chars | No | Maximum number of characters to return (can be combined with max_lines) | |
| max_lines | No | Maximum number of lines to return (default: 200) | |
| new_version | No | Newer version to compare to. Defaults to the version in the database. | |
| old_version | Yes | required,Older version to compare from (e.g. 17.9.0). Also accepts an archive token (h90) or a release selector (Rel-17). Use list_versions to see what exists. | |
| context_lines | No | Unchanged lines shown around each change in a section diff (default: 3) | |
| section_number | No | Compare only this section's text as a unified diff (e.g. 5.15.2). Omit for a structural summary of the whole specification. | |
| include_subsections | No | With section_number: include subsections in the diff (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It transparently discloses that uncached versions trigger a download that may require a second call. It also explains the two output modes. While it doesn't cover all potential edge cases (e.g., error handling), the key behavioral trait is well documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: four sentences covering two distinct modes, prerequisites, and first-use behavior. No redundant words. Information is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters and no output schema, the description is remarkably complete. It explains the two output modes, how to pick versions, and the caching behavior. The only minor gap is that it doesn't describe the format of the structural summary, but that's a niche detail. Overall, it provides sufficient context for correct tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. However, the description adds significant context beyond the schema: it explains how 'section_number' changes the output type (summary vs. diff), and gives concrete examples like '5.15.2'. The 'old_version' description also clarifies it accepts archive tokens and release selectors, which is not in the schema. This adds substantial semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Compare two versions of a 3GPP specification', clearly defining the verb and resource. It then distinguishes two modes: without section_number (structural summary) and with section_number (line-level diff). This differentiates it from sibling tools like 'get_section' or 'list_versions'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use each mode and directs to use 'list_versions first to see which versions exist'. It also explains behavior on first use (download/conversion) and instructs to retry if a download is in progress. This is clear guidance on usage vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asn1A
Get ASN.1 definitions from the 3GPP specifications. The protocol specifications (RRC TS 38.331/36.331, NGAP TS 38.413, S1AP TS 36.413, XnAP, F1AP, LPP TS 37.355, ...) write their ASN.1 between -- ASN1START / -- ASN1STOP markers, and this tool extracts every top-level assignment from those blocks. With name, it returns the full text of that assignment — type, constant or information object — together with the specification and section that define it, so the answer can be cited. Use it when you know a type, IE or constant name and need its definition or constraints: the defining clause can be hundreds of kilobytes, which get_section can only page through. If you do not know which specification defines the name, omit spec_id — the name is resolved across every specification in the database. Matching ignores case and separators, so an IE table title like 'AMF UE NGAP ID' finds AMF-UE-NGAP-ID. With a spec_id and no name, it lists every assignment name grouped by the section that defines it. Pass version (with spec_id) to read a past version, which is downloaded and converted on first use; call list_versions first to see which versions exist.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ASN.1 assignment name (e.g. AMF-UE-NGAP-ID). Matching ignores case and separators, so an IE title like 'AMF UE NGAP ID' also resolves. Required when spec_id is omitted; with a spec_id, omit it to list every assignment name in the specification. | |
| offset | No | Start line number (0-based, default: 0) | |
| spec_id | No | Specification ID (e.g. TS 38.413). Omit it to look the name up across every specification in the database — use that when you do not know which specification defines the type. | |
| version | No | Specification version to read (e.g. 18.6.0). Also accepts an archive token (i60) or a release selector (Rel-18). Defaults to the version in the database, and requires spec_id. Use list_versions to see what exists. | |
| max_chars | No | Maximum number of characters to return (can be combined with max_lines) | |
| max_lines | No | Maximum number of lines to return (default: 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the scope of extraction (only top-level assignments from blocks between ASN1START/ASN1STOP markers), behavior with and without the name parameter, case-insensitive and separator-ignoring matching, and handling of past versions (downloaded and converted on first use). Since no annotations are provided, the description carries full burden, which it largely fulfills, though it could be more explicit about potential limitations (e.g., if the tool is destructive or read-only).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise for the amount of information conveyed, but it is somewhat lengthy (multiple sentences). It is front-loaded with the core purpose, then progressively adds details on usage modes, matching behavior, and version handling. Every sentence adds value, but some redundancy could be trimmed (e.g., explaining matching behavior both in the main description and in the parameter description).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, multiple usage modes, no output schema), the description provides comprehensive guidance on how the tool behaves in different scenarios (with/without name, with/without spec_id, with version). It also addresses how to cite results and how to discover versions. The only gap is the lack of information about the return format or output structure, but since there is no output schema, the description could be more explicit about what the tool returns (e.g., structured text, markdown, etc.).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the schema. The description adds extra context beyond the schema, such as the effect of omitting spec_id to search across all specs, the matching behavior (case-insensitive, separator-ignoring), and the fact that name is required when spec_id is omitted. It also explains the version parameter behavior and recommends list_versions. However, since schema coverage is complete, the description exceeds the baseline of 3 but does not substantially add new meaning for every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts ASN.1 definitions from 3GPP specifications, specifying verb ('Get', 'extracts') and resource ('ASN.1 definitions from the 3GPP specifications'). It distinguishes it from siblings like get_section by explaining that the defining clause can be hundreds of kilobytes, which get_section can only page through.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (e.g., 'Use it when you know a type, IE or constant name and need its definition or constraints') and when to use alternatives (e.g., 'the defining clause can be hundreds of kilobytes, which get_section can only page through'). It also provides guidance on omitting spec_id when the specification is unknown, and directs users to call list_versions first to see available versions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_imageA
Get an embedded image from a 3GPP specification. Returns the image as base64-encoded data that can be directly viewed by the LLM. Use list_images to discover available images for a spec. Pass version to read a past version's image; the images of an archived version are downloaded on first use, which takes up to a few minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | required,Image filename (e.g. image1.png) | |
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| version | No | Specification version to read (e.g. 18.6.0). Also accepts an archive token (i60) or a release selector (Rel-18). Defaults to the version in the database. Use list_versions to see what exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and excels: it states the output is base64-encoded, mentions a latency caveat for archived versions ('up to a few minutes'), and explains the default version behavior. This fully discloses behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main action and output, and each sentence adds unique value. Could be slightly more concise by combining the first two sentences, but no superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 3 parameters, the description covers tool purpose, input semantics, latency behavior, and next steps via sibling links. It does not mention what happens if parameters are invalid or if an image doesn't exist, but the overall completeness is high for the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already explains each parameter well. The description adds value by clarifying `version` accepts both version strings and archive tokens, and defaults to the database version, which goes beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Get an embedded image') and resource ('3GPP specification'), and clearly distinguishes this tool from siblings like `list_images` by stating its function and output format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly points to `list_images` for discovering available images and `list_versions` for version discovery, providing clear guidance on when to use alternative tools. However, it does not mention when not to use this tool (e.g., for non-image content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_openapiA
Get OpenAPI definition content for 5G service-based interface APIs (TS 29.xxx series). Use this tool to look up HTTP request/response details, API paths, parameters, request bodies, response schemas, and data type definitions. Use the path parameter to filter by API endpoint (e.g. /nf-instances) or the schema parameter to filter by data type (e.g. NFProfile). Use list_openapi first to discover available API names.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Filter by API path (e.g. /nf-instances) | |
| offset | No | Start line number for pagination (0-based, default: 0) | |
| schema | No | Filter by schema name (e.g. NFProfile) | |
| spec_id | Yes | required,Specification ID (e.g. TS 29.510) | |
| api_name | Yes | required,API name (e.g. Nnrf_NFManagement) | |
| max_lines | No | Maximum lines to return (default: 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the tool as a 'get' and 'look up' operation, implying it is read-only and non-destructive. However, it does not explicitly state that it is safe, nor does it mention pagination behavior (offset, max_lines) or what happens in edge cases like no results. The description is adequate but lacks explicit behavioral details beyond the verb choice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loading the purpose in the first sentence and then elaborating on capabilities and usage. Every sentence contributes meaningful information without redundancy or fluff. It is compact and immediately informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and no annotations, the description should provide a thorough understanding of the tool. It covers the main purpose, prerequisite workflow, and parameter usage, but it does not describe the output format (e.g., JSON/YAML), the meaning of offset and max_lines for pagination, or error handling. This leaves gaps in what a user can expect from the tool's response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The description adds value by providing concrete examples for the path parameter ('/nf-instances') and schema parameter ('NFProfile'), and by explaining the intended workflow for spec_id and api_name (use list_openapi to discover). This goes beyond the schema's structural descriptions, though it does not cover offset or max_lines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get OpenAPI definition content for 5G service-based interface APIs (TS 29.xxx series).' It distinguishes from siblings like list_openapi by specifying that it retrieves actual definition content, not just listing available APIs. The mention of looking up HTTP request/response details, paths, and schemas further clarifies the specific resource and action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to 'Use list_openapi first to discover available API names,' providing a clear prerequisite and directing to an alternative tool. It also gives specific usage guidance for parameters: 'Use the path parameter to filter by API endpoint (e.g. /nf-instances) or the schema parameter to filter by data type (e.g. NFProfile).' This tells the user exactly when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referencesA
Get cross-references between 3GPP specifications and RFCs.
Directions:
outgoing (default): Find all specs/RFCs referenced by a given section. Requires spec_id and section_number. Use include_subsections to also gather refs from child sections.
incoming: Find all sections that reference a given spec (and optionally a specific section). Requires spec_id. section_number is optional.
Returns structured reference data including target spec, section, title (if available in DB), and context snippet. Responses are capped at 500 references; a separate notice reports the total, and offset pages through the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Number of references to skip, for paging past a truncated response (default: 0) | |
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| direction | No | outgoing (default): references FROM this section to other specs. incoming: references TO this spec/section from other specs. | |
| section_number | No | Section number (e.g. 5.1.2). Required for outgoing direction. | |
| include_subsections | No | Include subsections when collecting outgoing references (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully handles behavioral disclosure. It reveals the 500-reference cap, pagination via offset, and that responses include structured data plus a total-count notice. It does not mention rate limits or authorization, but those are not critical for a read-only lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for each direction, uses bullet-style formatting for readability, and every sentence adds essential guidance. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 parameters, two modes), the description covers all necessary details: parameter requirements per mode, default behaviors, response structure, pagination limit, and output format. Without an output schema, it still describes the return data adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. However, the description adds semantic value beyond the schema by explaining parameter roles in context (e.g., section_number is required for outgoing, optional for incoming) and linking params to use cases (include_subsections only relevant for outgoing).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: finding cross-references between 3GPP specs and RFCs. It distinguishes two modes (outgoing and incoming) with specific resource targets (specs, RFCs, sections), and the sibling context shows no other tool overlaps with this function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use outgoing vs incoming direction, lists required vs optional parameters for each, and notes a default behavior ('outgoing (default)'). It also mentions a cap of 500 references with pagination, guiding the agent on handling large result sets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sectionA
Get the markdown content of a specific section in a 3GPP specification. This tool is for reading specification document text (architecture, procedures, requirements). For API details such as HTTP request/response bodies, paths, and data models of 5G service-based interfaces (TS 29.xxx series), use get_openapi instead. Specify the section number with the section_number parameter (e.g. 5.1.2). Figures appear as  links; fetch one with get_image and that NAME. Formulas are LaTeX: a standalone equation is a ```latex code block (its equation number kept as \tag{7.3-1}), and a formula inside a sentence or a table cell is delimited with $...$, or $$...$$ when the source sets it as a display equation. Pass version to read a past version, which is downloaded and converted on first use; call list_versions first to see which versions exist. Large sections are paginated (default 200 lines). Use offset and max_lines to navigate.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Start line number (0-based, default: 0) | |
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| version | No | Specification version to read (e.g. 18.6.0). Also accepts an archive token (i60) or a release selector (Rel-18). Defaults to the version in the database. Use list_versions to see what exists. | |
| max_chars | No | Maximum number of characters to return (can be combined with max_lines) | |
| max_lines | No | Maximum number of lines to return (default: 200) | |
| section_number | Yes | required,Section number to retrieve (e.g. 5.1.2) | |
| include_subsections | No | Include all subsections (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility. It transparently explains how figures appear as `` links and how to fetch them with `get_image`, details LaTeX formula formatting (standalone vs. inline), describes version handling (first-use download/conversion), and reveals pagination behavior (default 200 lines). It does not cover error cases or what happens for invalid sections, but the behavioral disclosure is rich and helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph of ~150 words, dense but well-organized. It front-loads the core purpose and sibling distinction, then covers output format, version handling, and pagination. While it could benefit from bullet points or more whitespace for scanning, every sentence adds value and there is no repetition. It is concise for the amount of information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, 2 required, no output schema, and no annotations, the description covers purpose, usage alternatives, output format (figures, formulas), version behavior, and pagination. It does not describe error handling (e.g., invalid section/spec) or the exact structure of the return value, but it provides enough context for an agent to use the tool effectively in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all 7 parameters have descriptions), so baseline is 3. The description adds extra meaning beyond the schema: e.g., for `section_number` it gives an example ('5.1.2'), for `version` it explains the first-use download behavior, and for `offset`/`max_lines` it contextualizes pagination. This additional context improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get the markdown content of a specific section in a 3GPP specification.' It also specifies the type of content (architecture, procedures, requirements) and explicitly distinguishes from the sibling tool `get_openapi` for API details. The verb 'get' and resource 'section' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides direct guidance on when to use this tool vs. `get_openapi` for API details. It advises to call `list_versions` first to check available versions and explains pagination with offset and max_lines. This explicit context helps the agent choose the correct tool and navigate parameters effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tocA
Get the table of contents (section structure) of a 3GPP specification. Pass version to see the structure of a past version, which is downloaded and converted on first use; section numbers often move between releases, so check the table of contents before reading a section of an older version.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| version | No | Specification version to read (e.g. 18.6.0). Also accepts an archive token (i60) or a release selector (Rel-18). Defaults to the version in the database. Use list_versions to see what exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It reveals that passing a 'version' triggers a download and conversion on first use, and notes that section numbers often change between releases. These are important behavioral traits. However, it does not state whether the operation is read-only or whether it has any side effects beyond the initial conversion (e.g., caching behavior). The transparency is good but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with no wasted words. The first sentence defines the core purpose, and the second sentence adds targeted usage guidance and a behavioral note. Every sentence serves a clear function, and the structure is front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description is nearly complete. It explains what the tool does, the version behavior, and a typical use case. It could be improved by briefly describing the return format (e.g., list of section numbers and titles), but the phrase 'section structure' provides enough context for an agent to infer the output. The absence of an output schema increases the value of a description, and this one is sufficient but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description adds minimal parameter-specific meaning beyond what the schema already provides. It mentions the 'version' parameter's purpose ('see the structure of a past version') and the conversion note, but the schema already describes the parameter's accepted formats and defaults. The description does not enrich the semantics of 'spec_id' beyond what is obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('table of contents (section structure) of a 3GPP specification'). It distinguishes the purpose from siblings like 'get_section' (which reads a specific section) and 'list_versions' (which lists versions). The phrase 'check the table of contents before reading a section' further clarifies its role relative to sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use this tool to inspect the section structure, especially before reading an older version. It warns that section numbers move between releases, implying when to use this tool over others. While it does not explicitly name alternative tools (e.g., 'get_section'), the guidance is direct and actionable. The version parameter description (in schema) adds additional hints like using 'list_versions', which compensates slightly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_imagesA
List embedded images in a 3GPP specification. Returns image names, MIME types, and whether they are viewable by LLMs. Use get_image to retrieve a specific image. Pass version to list a past version's images; the images of an archived version are downloaded on first use, which takes up to a few minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) | |
| version | No | Specification version to read (e.g. 18.6.0). Also accepts an archive token (i60) or a release selector (Rel-18). Defaults to the version in the database. Use list_versions to see what exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits such as the latency for archived versions ('takes up to a few minutes') and the defaulting behavior of the version parameter. No annotations are provided, so the description carries the full burden and does so effectively, though it could mention if the list is paginated or has size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and well-structured, with the main action upfront, followed by sibling tool reference, and version handling details. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only 2 parameters with full schema descriptions and no output schema, the description covers usage context well. It explains the version parameter's behavior and an edge case (archived version latency). A minor gap is not stating whether the returned list is complete or paginated, but overall it is sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with descriptions for both parameters, so the baseline is 3. The description adds useful context for the 'version' parameter (e.g., about archive tokens and release selectors) beyond the schema's brief note, but does not add new info for 'spec_id'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('List embedded images in a 3GPP specification') and specifies what it returns ('image names, MIME types, and whether they are viewable by LLMs'). It distinguishes itself from sibling tools like 'get_image' by noting that 'list_images' lists images while 'get_image' retrieves a specific one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use this tool vs alternatives: 'Use get_image to retrieve a specific image.' It also explains how to handle versions, including past archived versions that may have a delay. However, it does not explicitly mention when not to use it or other exclusions beyond the sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_openapiA
List available OpenAPI definitions from 3GPP specifications (TS 29.xxx series). Use this to discover API names before calling get_openapi. Optionally filter by spec ID.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | No | Filter by specification ID (e.g. TS 29.510) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It describes the basic action (listing definitions) and optional filtering, but does not disclose any behavioral traits such as return format, pagination, authentication requirements, or performance implications. For a simple read-only list tool, this is minimally adequate but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences. The first sentence defines the action and resource; the second provides usage context and an optional filter. Every phrase earns its place, with no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (one optional parameter, no output schema), the description is mostly complete. It links usage to get_openapi and mentions filtering. However, it does not explain the return data shape (e.g., list of API names) or differentiate from other sibling tools like list_specs or search_openapi. Slight room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the single parameter spec_id has a schema description). The description adds 'Optionally filter by spec ID,' which mirrors the schema. Since the schema already documents the parameter fully, the description adds minimal extra meaning, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List available OpenAPI definitions from 3GPP specifications (TS 29.xxx series).' It uses a specific verb ('list') and resource ('OpenAPI definitions'), and distinguishes from siblings like get_openapi (which gets a specific definition) and list_specs (which lists specs). The context 'discover API names before calling get_openapi' further clarifies its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: 'Use this to discover API names before calling get_openapi.' It also mentions optional filtering by spec ID. While it does not explicitly state when not to use it or list alternatives (e.g., list_specs), the guidance is clear and contextually useful for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_specsA
List available 3GPP specifications. Optionally filter by series number and/or by an ID prefix (query). Results are paginated (default 20 per page); use limit and offset to navigate.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 20) | |
| query | No | Filter specs whose ID starts with this text (e.g. '38.21' matches 38.211, 38.212, 38.213) | |
| offset | No | Number of results to skip for pagination (default: 0) | |
| series | No | Filter by series number (e.g. 23 for TS 23.xxx) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It adds pagination defaults and filter semantics beyond the schema, but does not mention authentication needs, output format, error behavior, or rate limits—leaving significant gaps for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences: first states purpose, second covers filtering and pagination. No wordiness, front-loaded key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing tool with 4 optional parameters and no output schema, the description explains filters and pagination adequately but omits what the response looks like (e.g., fields returned, ordering). Without output schema, the description should hint at the return structure to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context that filters can be combined and how pagination works (limit/offset navigation), but most parameter meaning is already clear from schema descriptions. The added value is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb "List" and the resource "available 3GPP specifications." It mentions optional filtering by series and ID prefix, plus pagination—fully distinguishing this from sibling tools that list images, OpenAPI specs, or versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains optional filtering and pagination, so the agent knows how to use it. However, it does not provide any guidance on when NOT to use this tool vs. alternatives (e.g., search, get_section), missing the opportunity to prevent misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsA
List the versions of a 3GPP specification, newest first.
Each entry reports where the version can be read from:
database: in the prebuilt database, covered by search, images and cross-references
cached: fetched on demand earlier, available immediately
archive: exists upstream; reading it downloads and converts it first, which takes up to a few minutes for a large specification
Pass a version from this list to get_section or get_toc to read a past version.
| Name | Required | Description | Default |
|---|---|---|---|
| spec_id | Yes | required,Specification ID (e.g. TS 23.501) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description effectively discloses behavioral traits: newest-first order, the meaning of three statuses (database, cached, archive), and time cost for archive versions. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose sentence, bulleted details, and a usage recommendation. It is concise with no redundant information, though slightly more compacting is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully explains the output (list of versions with status meanings) and connects to sibling tools, making the tool's usage context complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds no meaning beyond the schema's own parameter description ('Specification ID (e.g. TS 23.501)'). Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List the versions of a 3GPP specification, newest first' – a specific verb and resource that clearly distinguishes from sibling tools like list_specs (list specifications) and list_images (list images).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for use: 'Pass a version from this list to get_section or get_toc to read a past version.' This guides when to use the tool, but does not explicitly exclude scenarios where it should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Full-text search across 3GPP specifications using SQLite FTS5 syntax.
Query syntax:
AND/OR/NOT: AMF AND authentication
Phrase: "service based interface"
Prefix: handov*
Column filter: title:authentication or content:handover
Proximity: NEAR(AMF UE, 5)
Hyphenated or dotted terms (e.g. IMS-AKA, sec-agree, 38.101) are auto-quoted to avoid FTS5 syntax errors.
After a positive term, "-term" excludes that term (e.g. AMF -SMF), same as NOT. An exclusion cannot begin a query or immediately follow AND/OR.
Stemming:
The index uses porter stemming: inflected English forms match each other (handover finds handovers).
Prefix and phrase queries operate on stemmed forms, so they can match a bit more broadly than the exact surface text.
Pagination:
Results come as {results, total_count, limit, offset}; total_count is the full match count.
Use limit (default 10, max 200) and offset to page through matches beyond the first page.
Tips:
Use exact 3GPP terms (AMF, SMF, gNB, UE, NRF, PCF, etc.)
Phrase search improves precision for multi-word concepts
title:term restricts matches to section headings only
Use spec_ids to search across multiple specifications at once
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results per page (default: 10, max: 200) | |
| query | Yes | required,FTS5 query string. Hyphenated or dotted terms like IMS-AKA and 38.101 are auto-quoted. Use AND/OR/NOT operators and double-quoted phrases for exact matches (e.g. '"core network" AND AMF'). | |
| offset | No | Number of results to skip for pagination (default: 0). Combine with total_count in the response to page through all matches. | |
| spec_id | No | Limit search to a single specification (e.g. TS 23.501). Ignored when spec_ids is provided. | |
| spec_ids | No | Limit search to one or more specifications (e.g. ["TS 23.501", "TS 23.502"]). Takes precedence over spec_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given there are no annotations, the description carries full burden for behavioral disclosure. It explicitly states key behaviors: auto-quoting of hyphenated/dotted terms, exclusion syntax, porter stemming, pagination with total_count, and the precedence of spec_ids over spec_id. This is comprehensive beyond what the schema reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with clear sections (Query syntax, Stemming, Pagination, Tips) and is well organized. It earns its length given the complexity of FTS5 syntax, but could be slightly more concise in the exclusion rules section, which repeats some details from the syntax list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers query syntax, stemming, pagination, and provides domain tips. There is no output schema, but the response structure is described inline (results, total_count, limit, offset). The description is complete for a search tool of this complexity. Minor gap: it does not explain what happens on an empty query or FTS5 syntax errors beyond auto-quoting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add value for some parameters (e.g., explaining spec_ids precedence over spec_id, and specifying default/max for limit), but mostly the query syntax details are an extension of the 'query' parameter's natural behavior rather than new parameter-specific semantics. The description does not add meaning significantly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear verb and resource: 'Full-text search across 3GPP specifications'. It specifies the technology (SQLite FTS5 syntax), and the query examples clearly differentiate it from sibling tools like search_openapi or list_specs. The purpose is specific and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides extensive query syntax and tips for effective search (tips on exact terms, phrase search, column filters), but it does not explicitly state when to use this tool versus alternatives like search_openapi or get_section. There is no 'when-not-to-use' guidance. Usage is implied through examples and tips but not formally defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_openapiA
Full-text search across the OpenAPI definitions of the 5G service-based interface APIs (TS 29.xxx series), using SQLite FTS5 syntax.
Use this when you need an API detail but do not know which API document holds it — searching for a data type (NFProfile, SmContextCreateData) or an endpoint (/nf-instances, subscriptions) finds it without guessing an api_name first. When you already know the document, get_openapi reads it directly.
This is a separate index from the search tool: search covers specification clause text and never returns OpenAPI content, and this tool covers OpenAPI content only.
Results:
One hit is one definition, not one document: either a schema (a data type from components.schemas) or an operation (one HTTP method of one path, named like "PUT /nf-instances/{nfInstanceID}").
A query that is a single bare term ranks a definition of exactly that name first, so searching NFProfile returns the NFProfile schema itself ahead of the schemas that merely reference it.
Each hit reports spec_id, api_name, kind, name and a snippet. Pass those to get_openapi (with its schema or path parameter) to read the full definition.
A schema's text carries one level of $ref expansion, so referenced field names are searchable, but a type two hops away is not. Follow it up with get_openapi.
Set include_body to get the matched definition's full text inline. It is much larger than a snippet.
Query syntax:
AND/OR/NOT: NFProfile AND heartbeat
Phrase: "nf instances"
Prefix: subscri*
Column filter: name:NFProfile or body:nfInstanceId or api_name:Nnrf_NFManagement
Hyphenated, dotted or underscored terms (e.g. nf-instances, 29.510, Nnrf_NFManagement) are auto-quoted to avoid FTS5 syntax errors.
Tokenization:
Unlike search, this index applies no stemming: identifiers are matched as written, and inflected English forms do not fold together.
'-', '.' and '_' split tokens, so Nnrf_NFManagement is indexed as "nnrf" and "nfmanagement" and /nf-instances as "nf" and "instances" — a partial name matches, but camelCase is not split (supportedFeatures is one token).
Pagination:
Results come as {results, total_count, limit, offset}; total_count is the full match count.
Use limit (default 10, max 200) and offset to page through matches beyond the first page.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Limit the search to one kind of definition: "schema" for data types or "operation" for endpoints. Both are searched when omitted. | |
| limit | No | Maximum number of results per page (default: 10, max: 200) | |
| query | Yes | required,FTS5 query string. Hyphenated or dotted terms like nf-instances and 29.510 are auto-quoted. Use AND/OR/NOT operators and double-quoted phrases for exact matches. | |
| offset | No | Number of results to skip for pagination (default: 0). Combine with total_count in the response to page through all matches. | |
| api_name | No | Limit the search to a single API document (e.g. Nnrf_NFManagement). Use list_openapi to see the available names. | |
| spec_ids | No | Limit the search to one or more specifications (e.g. ["TS 29.510", "TS 29.518"]). | |
| include_body | No | Return the full text of each matching definition instead of a snippet (default: false). Costs many more tokens; prefer the default and follow up with get_openapi. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It comprehensively discloses behavior: result granularity (one definition per hit), ranking (exact name matches first), $ref expansion depth, include_body effect, query syntax (including auto-quoting for special characters), tokenization rules (no stemming, split on hyphens/dots/underscores, no camelCase split), and pagination details. No contradictory or missing behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections (Results, Query syntax, Tokenization, Pagination) and front-loaded with the main purpose. While it is long, every sentence provides necessary information given the tool's complexity. It could be slightly more concise, but it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 parameters, no output schema, multiple sibling tools), the description is complete. It explains the result structure, how to follow up with get_openapi, the difference from search, tokenization idiosyncrasies, and pagination. It addresses all likely agent questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds substantial value beyond the schema. It explains the query syntax in detail (operators, phrases, column filters, auto-quoting), the purpose and cost of include_body, how pagination uses limit/offset with total_count, and the meaning of kind (schema vs operation). The description makes the parameters much more usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool performs full-text search on OpenAPI definitions of 5G APIs, using SQLite FTS5 syntax. It distinguishes from sibling tools by explicitly contrasting with 'search' (covers clause text, not OpenAPI) and 'get_openapi' (for when the document is already known).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this when you need an API detail but do not know which API document holds it.' It also gives a clear alternative: 'When you already know the document, get_openapi reads it directly.' Additionally, it contrasts with the sibling 'search' tool, specifying that search covers different content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
compare_versions - First observed
get_asn1 - First observed
get_image - First observed
get_openapi - First observed
get_references - First observed
get_section - First observed
get_toc - First observed
list_images - First observed
list_openapi - First observed
list_specs - First observed
list_versions - First observed
search - First observed
search_openapi
TDQS
Scored across 13 tools
Every tool targets a distinct content type or operation: listing vs. retrieval, specification text vs. ASN.1 vs. OpenAPI vs. images vs. cross-references. The two search tools explicitly separate specification clauses from OpenAPI definitions, eliminating ambiguity.
All tools use a consistent lowercase snake_case convention with a verb-noun pattern (list_*, get_*, search_*, compare_versions). No mixed conventions or irregular names, making it easy to infer functionality from the name.
13 tools is a well-scoped set for a specification retrieval system. Each tool adds a distinct capability—discovery, reading, searching, comparison, images, ASN.1, OpenAPI, references—without redundancy or bloat.
The tool surface covers the full lifecycle of read-only specification access: discovery (list_specs, list_versions, list_openapi, list_images), retrieval (get_section, get_image, get_asn1, get_openapi), searching (search, search_openapi), comparison (compare_versions), and cross-references (get_references). No obvious gaps for the stated domain.
Maintenance
Related MCP Connectors
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
3GPP Scout connects Cursor, Claude, Codex and other MCP clients to a hosted, continuously updated 3GPP search service. Search TS/TR specifications across Rel-15 through Rel-20, retrieve cited clauses, and search text, diagrams and figures. Explore recent RAN1, RAN2, RAN3, RAN4 and SA2 TDocs, company proposals and extracted meeting decisions, with source links. Connect using Streamable HTTP at https://api.3gppscout.com/mcp/ and sign in with OAuth 2.1. No local index or API key in the MCP configuration is required. Explorer includes 150 API/MCP requests per month; Founding Engineer includes 1,000 for $8/month. Hosted Scout chat is billed separately. 3GPP Scout is an independent product and is not affiliated with, endorsed or sponsored by 3GPP, ETSI or any 3GPP Organizational Partner. 3GPP™ is a trade mark of ETSI registered for the benefit of its Members and of the 3GPP Organizational Partners. Excerpts are quoted for reference and the official documents govern. Copyright, correction or removal requests: contact@3gppscout.com.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables AI assistants to access and search 3GPP telecommunications specifications through direct integration with the TSpec-LLM dataset. Provides real-time specification content, implementation requirements, and multi-spec comparisons for 3GPP standards development.444 npm29MIT
- AlicenseNot gradedqualityDmaintenanceGeneric MCP server that exposes Markdown documentation to LLMs, enabling them to search and answer questions about any software documentation.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that indexes documents and serves relevant context to LLMs via Retrieval Augmented Generation (RAG).28 npm36MIT
- AlicenseAqualityDmaintenanceA local-first MCP server that ingests PDFs, extracts structure, and provides semantic search and sequential navigation tools for AI clients to query and learn from documents.10MIT