3GPP Scout API & MCP Server
Hosted semantic search over 3GPP technical specifications (8,700+ document versions, Rel-15 through Rel-20) and a TDoc catalog for recent working-group meetings, via REST and a remote MCP server at https://api.3gppscout.com/mcp/.
The 3GPP Scout API lets you search across the full text of 3GPP specifications using natural language. Your query is semantically matched against indexed content, reranked for precision, and returned with the matching text along with full section context. The same API also looks up meeting TDocs (contributions, CRs, liaison statements, summaries), searches their text, and returns meeting decisions where extracted. Agents can use the same corpus through the hosted MCP server without running a local index.
All endpoints are read-only and require an API key for access (MCP uses OAuth instead).
FAQ
Is 3GPP Scout a hosted 3GPP MCP server? Yes. The remote MCP endpoint is https://api.3gppscout.com/mcp/ (Streamable HTTP, OAuth 2.1). Product page: https://3gppscout.com/mcp. You do not need to run a local index or clone a self-hosted GitHub MCP project.
Which 3GPP documents are indexed? The full published TS/TR corpus for Rel-15 through Rel-20 (8,700+ document versions), kept current as 3GPP publishes new and revised specifications.
Do you cover TDocs? Yes. See TDoc Catalog: latest two meeting rounds of RAN1, RAN2, RAN3, RAN4, and SA2, plus on-demand fetch of any named TDoc. Meeting decisions are a pilot subset. Company position comparison and cross-meeting stories are not built yet.
REST or MCP? Same corpus either way. REST at https://api.3gppscout.com with an API key; MCP at https://api.3gppscout.com/mcp/ with OAuth. TDoc calls are ordinary metered requests, same as search.
Base URL
https://api.3gppscout.comAll endpoints are relative to this base URL. The API is served over HTTPS only.
Quick Start
Search for anything in the 3GPP spec corpus with a single request:
curl -X POST https://api.3gppscout.com/search/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "How does RRC connection setup work in NR?",
"rerank_top_k": 5
}'{
"query": "How does RRC connection setup work in NR?",
"results": [
{
"id": 42,
"doc_number": "38.331",
"doc_type": "TS",
"version": "19.1.0",
"release": "Rel-19",
"section_number": "5.3.3",
"section_title": "RRC connection establishment",
"content": "The purpose of this procedure is to establish an RRC connection...",
"similarity": 0.8234,
"relevance_score": 0.9512,
"section_text": "...full section text..."
}
],
"total": 5,
"reranked": true,
"elapsed_ms": 420.3
}That's it. The API handles search, content retrieval, and reranking in a single call.
Authentication
All API requests require a valid API key passed as a Bearer token in the Authorization header.
Authorization: Bearer YOUR_API_KEYGetting an API Key
Sign in to the 3GPP Scout Dashboard and navigate to API Keys to create and manage your keys.
Error Responses
| Status | Meaning |
|---|---|
401 | Missing, malformed, or invalid API key |
401 | API key has been deactivated |
402 | Monthly API/MCP/BYOK retrieval allowance exhausted |
The /health, /docs, /skill.md, and /agent-setup/prompt.md endpoints do not require authentication.
API, MCP, and BYOK Retrieval Quotas
REST API keys, OAuth-authenticated MCP tools, and BYOK hosted-chat retrieval share one monthly allowance. Regular Scout-funded hosted chat uses prepaid credits instead. Explorer includes 150 requests per calendar month. Founding Engineer includes 1,000 requests per calendar month for $8/month.
An exhausted allowance returns HTTP 402. FastAPI places the
contract in detail, and FastMCP-generated tools preserve the
same actionable payload.
{
"detail": {
"code": "api_quota_exhausted",
"message": "Monthly API request quota exhausted. Upgrade to Founding Engineer for $8/month and 1,000 requests per month.",
"current_plan": "explorer",
"used": 150,
"limit": 150,
"remaining": 0,
"reset_at": "2026-09-01T00:00:00Z",
"upgrade": {
"plan": "Founding Engineer",
"price": {"amount": 8, "currency": "USD", "interval": "month"},
"monthly_price_cents": 800,
"requests_per_month": 1000,
"url": "https://dashboard.3gppscout.com/dashboard/billing"
}
}
}remaining
is zero. Wait until the UTC reset_at timestamp or direct the
user to the absolute upgrade.url. Error responses and
enforcement logs do not contain API keys, request bodies, or query text.
Text Search
Semantic search over text chunks. Your query is embedded and matched against all indexed text content. Results are optionally reranked for higher precision.
Request Body
| Parameter | Type | Description |
|---|---|---|
| query required | string | Natural language search query |
| match_count | int | Candidate matches to retrieve before reranking. Default 50 |
| match_threshold | float | Minimum cosine similarity (0–1). Default 0.0 |
| rerank | bool | Rerank results with Voyage rerank-2. Default true |
| rerank_top_k | int | Results to keep after reranking. Default 10 |
| include_section_text | bool | Include parent section full text. Default true |
| filter_release | string | Filter by release, e.g. "Rel-19" |
| filter_doc_type | string | Filter by doc type: "TS", "TR" |
| filter_doc_number | string | Filter by document, e.g. "38.331" |
| filter_series | string | Filter by series, e.g. "38" |
| filter_section_number | string | Filter by section, e.g. "5.4" |
Response
| Field | Type | Description |
|---|---|---|
| query | string | Echo of the search query |
| results | TextResult[] | Matching text chunks with metadata |
| total | int | Number of results returned |
| reranked | bool | Whether reranking was applied |
| elapsed_ms | float | Server-side processing time in ms |
Example
curl -X POST https://api.3gppscout.com/search/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "HARQ process for downlink in NR",
"filter_series": "38",
"rerank_top_k": 5
}'Image Search
Semantic search over image chunks (diagrams, figures, tables). Your query is embedded and matched against all indexed images.
Request Body
| Parameter | Type | Description |
|---|---|---|
| query required | string | Natural language search query |
| match_count | int | Number of results. Default 10 |
| match_threshold | float | Minimum similarity. Default 0.3 |
| filter_release | string | Filter by release |
| filter_doc_number | string | Filter by document number |
| filter_series | string | Filter by series |
Response
Each result includes an image_path field: a relative URL to fetch the actual image. See Get Image.
| Field | Type | Description |
|---|---|---|
| id | int | Image index within the document |
| doc_number | string | Source document number |
| doc_type | string | Document type (TS or TR) |
| version | string | Document version, e.g. "19.1.0" |
| release | string | 3GPP release, e.g. "Rel-19" |
| section_number | string | Section containing the figure |
| caption | string | Figure caption extracted from the spec |
| context_before | string | Text immediately before the figure |
| context_after | string | Text immediately after the figure |
| image_path | string | Relative URL to the PNG, e.g. /images/38.300/19.1.0/8 |
| similarity | float | Cosine similarity score |
Example
curl -X POST https://api.3gppscout.com/search/images \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "random access procedure diagram",
"match_count": 5
}'Combined Search
Text + image search in a single request. Queries both indexes simultaneously, reranks text results, and returns both sets.
Request Body
| Parameter | Type | Description |
|---|---|---|
| query required | string | Natural language search query |
| text_match_count | int | Text candidate matches before reranking. Default 50 |
| rerank | bool | Rerank text results. Default true |
| rerank_top_k | int | Text results after reranking. Default 10 |
| include_section_text | bool | Include parent section text. Default true |
| image_match_count | int | Image results to return. Default 5 |
| filter_release | string | Filter both searches by release |
| filter_doc_type | string | Filter text search by doc type |
| filter_doc_number | string | Filter both searches by document |
| filter_series | string | Filter both searches by series |
| filter_section_number | string | Filter text search by section |
Example
curl -X POST https://api.3gppscout.com/search/combined \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "beam management procedure in NR",
"filter_doc_number": "38.214",
"rerank_top_k": 5,
"image_match_count": 3
}'Filtering
All search endpoints support metadata filters that narrow results before similarity matching. Filters are applied server-side for efficient pre-filtering.
| Filter | Example Value | Description |
|---|---|---|
filter_release | "Rel-19" | 3GPP release (Rel-15 through Rel-20 indexed) |
filter_doc_type | "TS" | Document type: TS (technical specification) or TR (technical report) |
filter_doc_number | "38.331" | Specific document number |
filter_series | "38" | 3GPP series (e.g. 38 = NR/5G, 23 = system architecture) |
filter_section_number | "5.4" | Exact section number (text search only) |
Filters can be combined. For example, filter_series: "38" + filter_release: "Rel-19" searches only the latest 5G NR specs.
Reranking
Text search results are reranked by default using a cross-encoder reranking model. The flow is:
- Embed query → retrieve
match_countnearest matches (default 50) - Fetch the text content for each match
- Pass query + all candidate texts to the reranker
- Return the top
rerank_top_kresults sorted by relevance score
Reranked results include both similarity (semantic similarity, 0–1) and relevance_score (reranker output, 0–1). The relevance score is generally a better signal for result quality.
Set "rerank": false to skip reranking and return results sorted by similarity only.
List Documents
Returns metadata for available documents. Use filters to check if a specific document is indexed (fast): without filters returns all ~3,200 documents (slower, cached for 60 minutes).
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| doc_number | string | Filter by document number, e.g. "38.811". Recommended: avoids scanning all documents. |
| release | string | Filter by release, e.g. "Rel-19" |
| series | string | Filter by series, e.g. "38" |
| doc_type | string | Filter by type: "TS" or "TR" |
Examples
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/documents?doc_number=38.811"curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/documents?doc_type=TR&release=Rel-19"[
{
"id": 1,
"doc_number": "38.811",
"doc_type": "TR",
"version": "15.4.0",
"release": "Rel-15",
"series": "38",
"title": null,
"filename": "38811-f40.zip",
"total_text_chunks": 812,
"total_image_chunks": 45,
"status": "complete"
}
]Get Document
Fetch a single document by its numeric ID (as returned by /documents).
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| document_id required | int | Numeric document ID |
Example
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.3gppscout.com/documents/42Get Sections
Fetch full section text by section number. Section numbers are not unique across documents, so doc_number is required.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| section_number required | string | Section to look up. Numeric ("5.3.3"), trailing-letter ("5.3.1a"), or annex ("A.1", "B.2.3"). |
| doc_number required | string | Document number, e.g. "38.331", "38.874". |
| version | string | Version, e.g. "19.1.0" |
| release | string | Release, e.g. "Rel-19" |
| prefix | bool | Match sub-sections too ("5.4" → "5.4.1", "5.4.6"; "A" → "A.1", "A.2.3"). Default false |
[]. Use /sections/toc to see the actual section IDs available for a document.
Example
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/sections?section_number=5.3.3&doc_number=38.331&release=Rel-19"Annex example
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/sections?section_number=A.1&doc_number=38.874"Table of Contents
Lists all section numbers and titles for a document without full text: useful for browsing a spec's structure.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| doc_number required | string | Document number, e.g. "38.321" |
| version | string | Version, e.g. "19.1.0" |
Example
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/sections/toc?doc_number=38.321"Get Image
Serve an extracted figure or diagram as a PNG image. The image_path field from image search results maps directly to this endpoint.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| doc_number required | string | Document number, e.g. "38.300" |
| version required | string | Document version, e.g. "19.1.0" |
| image_index required | int | Image index within the document (from search results) |
Response
Returns the raw PNG bytes with Content-Type: image/png. No JSON wrapper.
| Status | Meaning |
|---|---|
200 | PNG image bytes |
400 | Invalid document number, version, or index |
404 | Image not found for this document/version/index |
429 | Per-IP rate or concurrency limit exceeded |
<img> tags, chat messages, or markdown without needing an API key. This endpoint does not consume Explorer request quota. Responses are cacheable for 24 hours.
Usage with Image Search
The typical flow is: search for images, then use the image_path from results to fetch the actual PNG.
# 1. Search for images
curl -X POST https://api.3gppscout.com/search/images \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "user plane protocol stack", "filter_doc_number": "38.300"}'
# Response includes: "image_path": "/images/38.300/19.1.0/8"
# 2. Fetch the image (no auth needed)
curl https://api.3gppscout.com/images/38.300/19.1.0/8 --output figure.pngEmbedding in HTML
<img src="https://api.3gppscout.com/images/38.300/19.1.0/8"
alt="User Plane Protocol Stack (TS 38.300)" />TDoc Catalog
TDocs are the documents companies and groups submit to 3GPP working group meetings: contributions, CRs and pCRs, liaison statements, feature-lead summaries, chair notes, and meeting reports. Scout keeps them in a TDoc catalog, separate from the TS/TR corpus. The catalog holds the full registers of the latest two meeting rounds of RAN1, RAN2, RAN3, RAN4, and SA2 (currently 30 meetings, 19,137 registered TDocs, 17,748 parsed and searchable), plus TDocs linked by revision, plus any TDoc you fetch on demand (usually within seconds). Meeting decisions from chair notes and reports are extracted for a pilot subset so far. Company position comparison and cross-meeting stories are not built yet.
Each TDoc endpoint is one metered request, like the search endpoints.
doc_kind, the register status, and the
official_url on the 3GPP server. Source companies carry a role: submitter,
co_submitter, or editor. A company's position comes only from a TDoc where it is a submitter
or co-submitter. Proposal text is not an agreement; the register status is the decision source.
List responses include coverage, the meetings searched, so an empty list is a real "nothing found".
Errors
| Code | HTTP | Meaning |
|---|---|---|
tdoc_not_indexed | 404 | The ID is not in the catalog yet. Call POST /tdocs/{tdoc_id}/fetch. |
tdoc_not_found | 404 | No register entry and no file on the 3GPP server. |
tdoc_withdrawn | 410 | Registered but withdrawn. Metadata is in detail.tdoc. |
tdoc_fetch_in_progress | 202 | An on-demand fetch is still running. Retry after retry_after seconds. |
organization_ambiguous | 409 | A company name matches several organizations. Candidates are returned. |
invalid_parameter | 400 | A filter value is not recognized, for example an unknown group or meeting ID. |
search_unavailable | 502 | POST /tdocs/search could not reach either search path. Retry shortly. |
Get TDoc
One TDoc by ID: title, kind, register status, meeting, agenda item, source companies with roles,
revision links, and the official download URL. With include=units, each numbered "Proposal N" and
"Observation N" comes back as a verbatim quote with an anchor.
Parameters
| Parameter | Type | Description |
|---|---|---|
| tdoc_id required | string | TDoc ID, e.g. R1-2605951 |
| include | string | Comma-separated: units, text (text blocks with anchors), revisions |
| text_offset | int | First text block to return. Use text.next_offset to page. |
| max_text_chars | int | Character budget for text blocks (default 30,000, max 150,000) |
content.status is complete, partial (see partial_reasons), or
not_retrieved. Anchors name the file and location: #p23 is paragraph 23,
#page4-p2 is page 4 paragraph 2, #slide3-p1 is a slide, #Sheet1!r7 is a sheet row.
Example
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/tdocs/R1-2605951?include=units"Response (abridged)
{
"tdoc_id": "R1-2605951",
"title": "Discussion on NTN specific requirements and design",
"doc_kind": "contribution",
"status": "not treated",
"status_label": "Contribution. Register status: not treated at R1-126. No decision recorded in the register.",
"meeting": {"meeting_id": "R1-126", "start_date": "2026-08-24", "end_date": "2026-08-28"},
"agenda_item": "10.7.1",
"sources": [{"org_id": "lekha-wireless", "display_name": "Lekha Wireless Solutions", "role": "submitter"}],
"official_url": "https://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_126/Docs/R1-2605951.zip",
"content": {"status": "complete", "extractor": "pipeline", "unit_count": 9},
"units": [
{"unit_id": "R1-2605951:proposal-1", "unit_type": "proposal", "label": "Proposal 1",
"quote": "Proposal 1: For satellite assistance information ...", "page": null,
"anchor": "R1-2605951.docx#p21"}
]
}Fetch TDoc on Demand
Downloads a TDoc from the 3GPP server and parses it, usually within 60 seconds. Works for
catalog TDocs that are not parsed yet and for TDoc IDs the catalog does not know (the meeting is found from the TDoc
number ranges). Returns the same shape as GET /tdocs/{tdoc_id} plus a fetch block with
timings. Idempotent: an already parsed TDoc returns at once.
Takes the same include, text_offset, and max_text_chars parameters
(default include=units).
.doc files are marked partial, because Word
auto-numbered labels are not visible to the lightweight reader. Legacy PowerPoint (.ppt) files return
content.status = "unavailable" with a reason. Both are queued for the full pipeline.
Example
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/tdocs/R2-2604548/fetch?include=units,text"List TDocs
Catalog listing by company, meeting, agenda item, kind, status, work item, target spec, or
title words. Company names resolve through aliases and common misspellings; source_resolution shows how.
This matches titles and metadata, not document text.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| source | string | Company name, alias, or org_id, e.g. Mavenir |
| role | string | Comma-separated: submitter, co_submitter, editor |
| meeting | string | Comma-separated meeting IDs, e.g. R1-126 or RAN1#126 |
| group | string | Comma-separated groups, e.g. R1, RAN2, S2 |
| agenda_item | string | Agenda item and its sub-items, e.g. 10.7 |
| doc_kind | string | Comma-separated, e.g. contribution,cr,summary |
| status | string | Comma-separated register statuses, e.g. agreed,approved |
| work_item | string | Work item code, e.g. NR_NTN_Ph3-Core |
| spec | string | Target spec, e.g. 38.213 |
| since / until | date | Meeting start date bounds, YYYY-MM-DD |
| q | string | Words that must all appear in the title or abstract |
| limit / cursor | int / string | Page size (max 200) and next_cursor |
Example
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/tdocs?source=Manevir"Search TDocs
Searches the text of indexed TDocs by meaning and by exact term. Semantic (vector) matches and
keyword matches are merged and reranked. Exact identifiers in the query are matched literally and passages that
contain them come first: TDoc IDs such as R2-2008188, IE names such as ta-CommonDrift,
spec numbers such as 38.213, and quoted phrases. Use it for "are there any TDocs about X" and "who is
proposing Y". Use GET /tdocs to list a register by metadata, and GET /tdocs/{tdoc_id} to
read a whole TDoc.
Body
| Field | Type | Description |
|---|---|---|
| query required | string | Topic in plain words or exact terms, e.g. timing advance pre-compensation for NTN |
| filters | object | Same fields as GET /tdocs: source (company, matches submitters and co-submitters), meeting, group, agenda_item, doc_kind, status, work_item, spec, release, since, until |
| unit_types | string[] | proposal, observation, or body |
| rerank_top_k | int | Passages to return (default 10, max 50) |
| max_per_tdoc | int | Passages per TDoc (default 2). Use 1 for a list of distinct TDocs. |
| include_text | bool | Include passage text (default true) |
Each result carries the same TDoc fields as GET /tdocs (kind, register status and
status_label, meeting, agenda item, sources with roles, official_url) plus the passage:
unit_type, unit_labels (for example Proposal 3), page,
anchor, text, relevance_score, and matched_by
(vector, lexical, tdoc_id). Register status is joined at query time. The same
passage in several versions of one summary is returned once, with the others in also_in.
coverage lists the meetings whose TDoc text is indexed and how many of their TDocs are, so an empty
result is a real "nothing found in these meetings".
Example
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"query": "ta-CommonDrift", "filters": {"group": "R1"}, "max_per_tdoc": 1}' \
"https://api.3gppscout.com/tdocs/search"Response (abridged)
{
"results": [
{"tdoc_id": "R1-2606369", "title": "NR-NTN GNSS resilience", "doc_kind": "contribution",
"status_label": "Contribution. Register status: not treated at R1-126. No decision recorded in the register.",
"meeting": {"meeting_id": "R1-126"}, "agenda_item": "9.4.1",
"sources": [{"org_id": "qualcomm", "display_name": "Qualcomm", "role": "submitter"}],
"unit_type": "observation", "unit_labels": ["Observation 5", "Observation 6"],
"anchor": "R1-2606369.docx#p112", "text": "...", "relevance_score": 0.70,
"matched_by": ["lexical", "vector"], "identifier_hits": ["ta-CommonDrift"]}
],
"coverage": {"groups": ["R1"], "meetings": ["R1-125", "R1-126"], "indexed_tdocs": 131, "registered_tdocs": 3460}
}Meetings
Meetings in the catalog with dates, TDoc number range, TDoc counts, and
coverage (full_register or partial). Filters: group,
since, until, state.
One meeting (R1-126 or RAN1#126): agenda items with TDoc counts and
key documents (chair notes, meeting reports, summaries, way forwards). decision_sources lists the chair
notes and reports, and decisions.counts counts the extracted decisions by type.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/meetings/R1-126"What the meeting decided: agreements, working assumptions, conclusions, FFS items, and CR,
LS, and way-forward outcomes. Each decision has a verbatim quote, its source (chair notes,
meeting or session report, feature-lead summary, or register status) with anchor, the TDoc it was recorded under,
the TDocs it references, and the proposals it adopts. Decisions never come from proposal text. Filters:
agenda_item, decision_type (default: every type except noted),
q (topic words), source_kind. coverage lists the meeting's decision sources
and how many have been processed.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.3gppscout.com/meetings/R1-126/decisions?q=NTN%20timing"Organizations
Resolves a company name. status is exact, fuzzy,
ambiguous, or not_found; candidates carry match scores and TDoc counts.
One organization with aliases and activity: TDoc counts by role, meeting, and kind, plus
recent TDocs. Accepts an alias such as manevir.
MCP Server
The 3GPP Scout API includes an MCP (Model Context Protocol) server for Cursor, Claude, Codex, OpenCode, and other compatible agents.
Explorer accounts include 150 Scout requests per UTC month for free. Your external agent or model provider may charge separately.
Add to Cursor (one click)
Clicking the button opens Cursor and installs the 3GPP Scout MCP server automatically.
Agent-guided setup
Ask any supported agent to fetch and execute the appropriate instructions from https://api.3gppscout.com/agent-setup/prompt.md. The public Markdown prompt covers Cursor, Claude, Codex, OpenCode, and generic MCP clients, including OAuth and a small verification request.
Manual Configuration
For Cursor, add to .cursor/mcp.json in your workspace or user settings:
{
"mcpServers": {
"3gpp-scout": {
"url": "https://api.3gppscout.com/mcp/"
}
}
}For current Claude, Codex, and OpenCode commands and configuration, use the agent-guided setup prompt above.
Authentication
The MCP server uses OAuth 2.1: no API key is needed in the config. On first use, your browser will open for you to sign in with your 3GPP Scout account. After approving access, the MCP client handles tokens automatically.
Available Tools
Once connected, your agent has access to all API endpoints as MCP tools:
search_text: semantic search over specification textsearch_images: search diagrams, figures, and tablessearch_combined: text + image search in one calllist_documents/get_document: browse available documentsget_sections/list_sections: fetch section text and table of contentsget_image: fetch extracted figures as PNG imagesget_tdoc/fetch_tdoc: one TDoc with quoted proposals, parsed on demand when neededlist_tdocs: TDocs by company, meeting, agenda item, kind, or status, with coveragesearch_tdocs: TDoc text by meaning and exact term (IE names, TDoc IDs, spec numbers), with coveragelist_meetings/get_meeting: meetings, agenda items, and key documentslist_meeting_decisions: what a meeting agreed, with quotes from chair notes, reports, and summariesresolve_organization/get_organization: company names, aliases, and activity
MCP Resource
The MCP server also provides a scout://skill-guide resource: a comprehensive guide your agent can read to understand the API, recommended workflows, and best practices.
Skill File
For agents that don't support MCP, we provide a Skill File: a standalone markdown document containing everything an LLM agent needs to use the API effectively: endpoints, parameters, workflows, and tips.
Download
https://api.3gppscout.com/skill.md
How to Use
- Download or copy the file from the link above
- Save it as
SKILL.mdin your project (e.g..cursor/skills/3gpp-scout/SKILL.md) - Your agent will read it automatically and know how to call the API
The skill file covers the same information as the MCP resource (scout://skill-guide) but works with any agent framework: just include it in the agent's context.
OpenClaw
The 3GPP Scout skill is published on ClawHub, the skill registry for OpenClaw. If you use an OpenClaw-compatible agent, you can install the skill directly from the registry.
Install
https://clawhub.ai/chriscarrotlabs/3gpp-scout
Configure your API key
Once installed, set your API key as the SCOUT_API_KEY environment variable:
export SCOUT_API_KEY="sk-your-key-here"Or add it to ~/.openclaw/openclaw.json under skills."3gpp-scout".env.SCOUT_API_KEY.
The ClawHub listing has passed OpenClaw's security scan (benign, high confidence) and is updated whenever the skill file here changes.
Models & Embeddings
The API uses three Voyage AI models:
| Model | Purpose | Dimensions |
|---|---|---|
voyage-context-3 | Text query & chunk embedding | 1024 |
voyage-multimodal-3 | Image query & chunk embedding | 1024 |
rerank-2 | Cross-encoder reranking for text results | - |
Text chunks are contextualized embeddings: each chunk is embedded along with metadata about the document and section it belongs to, improving retrieval quality for domain-specific queries.
Architecture
The API is a stateless server backed by cloud infrastructure:
Client Request
│
▼
┌──────────────────────┐
│ 3GPP Scout API │ api.3gppscout.com
└──────────┬───────────┘
│
┌─────────┼──────────┬──────────┐
▼ ▼ ▼ ▼
Embedding Vector Content Image
Model Search Store Store
(text/JSON) (PNGs)
Request flow for text search:
- Embed the query string using the text embedding model
- Run vector similarity search with optional metadata filters
- Resolve matches to their source document and chunk
- Fetch chunk text and section context
- Optionally rerank candidates for higher precision
- Return the final results
Request flow for image serving:
- Image search returns results with
image_path(e.g./images/38.300/19.1.0/8) - Client fetches the image URL directly
- API proxies the PNG from Google Cloud Storage
Corpus Coverage
The index covers all six 3GPP releases from Rel-15 through Rel-20: 8,700+ document versions and 1.3M+ sections across 2.6M+ text vectors and 225K+ image vectors.
| Release | Document versions | Sections |
|---|---|---|
| Rel-15 | 1,504 | 199K+ |
| Rel-16 | 1,607 | 221K+ |
| Rel-17 | 1,714 | 260K+ |
| Rel-18 | 1,788 | 285K+ |
| Rel-19 | 2,028 | 378K+ |
| Rel-20 | 100 | 29K+ |
| Total | 8,741 | 1.37M+ |
Processing Pipeline
Each document goes through a multi-stage pipeline: parsing, semantic chunking, embedding, section extraction, and image extraction. The chunking stage produces optimized chunks of 400–800 tokens for high-quality retrieval. Images are extracted as individual PNGs and served via the /images endpoint.
Health Check
Returns API status and model info. Use this to verify the server is running.
Example
curl https://api.3gppscout.com/health{
"status": "ok",
"version": "0.2.0",
"models": {
"text_embedding": "voyage-context-3",
"image_embedding": "voyage-multimodal-3",
"reranker": "rerank-2"
}
}OpenAPI / Swagger
The auto-generated interactive API docs are available at /swagger (Swagger UI) and /redoc (ReDoc). The raw OpenAPI schema is at /openapi.json.