3gpp-mcp AGENTS.md

3gpp-mcp AGENTS.md is an instructions file for Codex, OpenCode from higebu/3gpp-mcp. It costs 2,286 tokens per session, scanned A, original, MIT.

Repository instructions for 3gpp-mcp, a tool that downloads 3GPP telecommunications specifications, converts them to Markdown, stores them in a searchable database, and provides access through MCP or a web viewer.

In plain words
What is it for?
Use them when building, testing, importing specifications, running the web viewer, or changing the MCP server.
Why use it?
They give coding agents the commands, project structure, rules, and known pitfalls needed to work on the repository without guessing.

Instructions file for CodexOpenCode

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add instructions/higebu/3gpp-mcp/agents-md
Clone the repo
git clone --depth 1 https://github.com/higebu/3gpp-mcp

Made for: Codex, OpenCode.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for 3gpp-mcp AGENTS.md

README.md
[![agentmods](https://agentmods.dev/badge/instructions/higebu/3gpp-mcp/agents-md.svg)](https://agentmods.dev/instructions/higebu/3gpp-mcp/agents-md)
Your own site
<a href="https://agentmods.dev/instructions/higebu/3gpp-mcp/agents-md"><img src="https://agentmods.dev/badge/instructions/higebu/3gpp-mcp/agents-md.svg" alt="Measured on agentmods" height="20"></a>
Per session 2,286 This file is loaded in full into every session.
When invoked 2,286 The same file — it is already loaded in full.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.02286 $0.02286
Opus 5 $0.01143 $0.01143
Sonnet 5 $0.00457 $0.00457
Haiku 4.5 $0.00229 $0.00229

Measured today against content hash 1c196f3d400f, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

3gpp-mcp AGENTS.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

AGENTS.md · 135 lines

How it starts

The opening of the file, as written. The whole thing — 135 lines — stays where its author put it; the contents beside it link to each section on GitHub.

AGENTS.md

MCP server that downloads 3GPP specification documents (.docx), converts them to Markdown, stores them in SQLite with FTS5 full-text search, and serves them via MCP tools and an optional web viewer. Go 1.26+, pure Go SQLite (modernc.org/sqlite) — no CGO.

README.md has the command reference, MCP tool list, environment variables, code-fence table and deployment guide. This file only covers what an agent cannot easily discover from the code.

Commands

make build                # Build to bin/3gpp-mcp
go test ./...             # Run tests (-short skips tests that hit the 3GPP FTP)
gofmt -l . && go vet ./... && golangci-lint run   # Lint (CI also runs go test -race)
make build-db             # Download + import latest version of every spec (RELEASE=19 for one release, MAX_RELEASE=19 to cap)
make web                  # HTTP server with web viewer at :8080
make e2e                  # Playwright suite for web viewer JS behavior (CI job "e2e"); hermetic server harness in e2e/e2eserver

Package Map

  • cmd/3gpp-mcp/ — CLI entry point (serve, build, download, import, import-dir, update, plus query subcommands mirroring the MCP read tools 1:1 in query.go). New subcommands register in the commands slice in main.go — dispatch, the usage line and the shell completion scripts are all generated from it
  • internal/converter/docx/ — DOCX → Markdown parser; internal/converter/pipeline/ — streaming download + convert worker pool
  • internal/db/ — SQLite schema, queries, FTS5
  • internal/versionstore/ — on-demand cache of spec versions not in the prebuilt database
  • internal/tools/ — MCP tool handlers; internal/web/ — web viewer (reads through the same tools.Source, so it is version-aware)
  • internal/specver/ — base-36 archive token (k20) ↔ dotted version (20.2.0)
  • internal/structdiff/, internal/textdiff/ — compare_versions diff logic, shared with the web compare page

Invariants & Gotchas

  • One version per spec in the main database. specs is keyed by (id, version), but InsertSpecWithSectionsAndImages drops any other version of the same spec. Search depends on this: the FTS index has no version column, so a second version would double every hit.
  • Archived versions never reach search. versionstore fetches them into a separate SQLite file ($XDG_CACHE_HOME/3gpp-mcp/versions.db) with no FTS tables. Fetches are deduplicated per (spec, version) and run on a context detached from the caller so a client timeout does not discard the work; entries are evicted LRU, and a version's text and images evict as one unit. Images are fetched lazily on the first get_image/list_images call. OpenAPI YAML and cross-references are prebuilt-only.
  • OpenAPI search is a second FTS index. openapi_chunks / openapi_chunks_fts (db.OpenAPIIndexSchema) hold one row per schema and per operation, derived from openapi_specs by internal/openapiindex and rebuilt wholesale — never incrementally, because most $refs cross into another file, so importing one document changes the chunks of documents imported before it. build and update end in rebuildOpenAPIIndex; import and import-dir deliberately do not, because the YAML arrives in the archive zip and a .docx import cannot touch openapi_specs. The tokenizer is plain unicode61, no porter: these rows are identifiers, not prose, and -/./_ split so a partial name matches. A schema chunk expands $ref one level, through items and additionalProperties as well as directly — that is how the 5G SBI definitions state most of their relationships. Like the rest of the OpenAPI features it is prebuilt-only and absent from versionstore. Databases built before this existed have no index at all — serve opens read-only and cannot create it, so SearchOpenAPI returns db.ErrNoOpenAPIIndex and the tool points at build-openapi-index. The index is never allowed to be stale: a rebuild that fails drops it (DropOpenAPIIndex) rather than leaving chunks that describe the previous corpus, so the honest "missing" state is the only failure mode. update keeps its working copy on such a failure — the spec import costs hours, the index seconds — but only after confirming the drop took.
  • get_asn1 answers from the asn1_defs table, built at DB build time. internal/asn1index extracts every top-level assignment (candidates seeded via sections_fts MATCH 'ASN1START' — a LIKE over a full corpus takes minutes) and build, update, import and import-dir all end in a wholesale rebuild — import too, because unlike OpenAPI YAML a .docx does carry ASN.1. Like the OpenAPI index it is never allowed to be stale: a failed rebuild drops it, and serve (read-only) reports it missing and names build-asn1-index. Without the table the cross-spec (spec_id-less) mode and the wrong-spec hint are lost; the per-spec path falls back to reading the whole document per call. Archived versions never enter the index.
  • Image references are format-independent: image://NAME?w=&h= in body text, <img src="image://..."> in table cells. structdiff.NormalizeImageRefs keeps conversion-pair extension changes (.emf/.wmf/.pcz/.png) from counting as content changes in diffs.
  • Tagged code fences (```asn1, ```diameter, ```xml, ```sip, ```sdp, ```latex): Diameter, XML, SIP and SDP blocks carry no code style in the source documents and are detected by content (internal/converter/docx/xmlblock.go, internal/converter/docx/sipblock.go); paragraphs already fenced via style/font keep bare ``` fences and never enter content detection. ```latex is structural, not content-detected: mathFenceBody (internal/converter/docx/mathblock.go) promotes a paragraph whose only content is one formula. Changing fence or notation output requires a database rebuild (make build-db) and a bump of versionstore.cacheSchemaVersion, which wipes old version caches on open.
  • Math is format-independent, like image references: ```latex for a standalone equation, $$...$$ for display math where a fence cannot go (a table cell, a list item), $...$ inline. runInfo.Text holds bare LaTeX and runInfo.markdownText() is the only place the delimiters are added — so mergeAdjacentRuns must never merge a math run, or they vanish silently. ommlToLaTeX guarantees the LaTeX carries no </> (escapeMathAngles), which is why internal/converter/docx/table.go can write cell math unescaped and keep & as a matrix column separator.
  • Paragraph indentation is preserved as no-break spaces (U+00A0, one source tab = four): trimming it destroyed list nesting (issue #188), and keeping literal tabs/spaces would reopen the CommonMark indented-code-block problem (issue #25). preserveIndent in internal/converter/docx/paragraph.go is the single place the rewrite happens; like fence/notation changes, touching it needs a rebuild and a versionstore.cacheSchemaVersion bump.
  • HTTP transport runs stateless (StreamableHTTPOptions{Stateless: true}) — required to serve MCP protocol 2026-07-28; older protocol versions get per-request sessions.
  • webmcp.js is a thin same-origin passthrough to /mcp/ (W3C document.modelContext): it registers the tools reported by tools/list at page load, so the browser registration stays in sync with the server without a tool list of its own. The e2e harness (e2e/e2eserver) mounts /mcp/ with the same tools.NewStreamableHTTPHandler as buildHTTPHandler, so the bridge is tested against the real stateless handler.
  • --convert-image (EMF/WMF → PNG) requires LibreOffice (soffice) at runtime.
  • Tool descriptions stay under 1024 characters. The OpenAI-compatible chat completions API rejects a longer tools[].function.description ("string too long. Expected a string with maximum length 1024"), and clients that front other vendors' models with that API shape (GitHub Copilot, Gemini models included) drop the whole tool list on one over-long description. TestToolDescriptionLength enforces the cap on what tools/list actually returns; detail that does not fit goes into the parameter descriptions (jsonschema tags), which no API caps.

Read the full file on GitHub · 135 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · +8 lines · +130 tokens per session 1c196f3d400f
  2. 5d ago First seen · 127 lines · 2,156 tokens per session scan A b7b5bfc6e1e4

Subscribe to this mod's changes

3gpp-mcp AGENTS.md is an instructions file published in the GitHub repository higebu/3gpp-mcp (16 stars, last pushed today), licensed MIT. It adds 2,286 tokens to every session, about $0.0114 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other instructions, from other repositories

vscode buildNext.instructions.md

Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).

microsoft/vscode · 6,785 tokens

spec-kit AGENTS.md

AGENTS.md instructions for github/spec-kit, covering agents.md, about spec kit and specify, quickstart — add a new integration in 5 steps, integration architecture and integrationmanifest — file tracking.

github/spec-kit · 7,104 tokens

codex AGENTS.md

AGENTS.md instructions for openai/codex, covering rust/codex-rs, the codex-core crate, code review rules, crate api surface and model visible context.

openai/codex · 5,182 tokens

vscode oss-third-party-notices.instructions.md

Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, applying the notice (cutover) and fallback chain (never fail the build).

microsoft/vscode · 5,001 tokens

langchain AGENTS.md

AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.

langchain-ai/langchain · 4,469 tokens

deepseek-harness AGENTS.md

AGENTS.md instructions for deepseek-ai/deepseek-harness, covering agents.md, pre-stable apis and released session data, repository layout, commands and host sandbox failures.

deepseek-ai/deepseek-harness · 3,733 tokens