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.
npx agentmods add instructions/higebu/3gpp-mcp/agents-mdgit clone --depth 1 https://github.com/higebu/3gpp-mcpWrote 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.
[](https://agentmods.dev/instructions/higebu/3gpp-mcp/agents-md)<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>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.
| Model | Per session | Once 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 |
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.
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 inquery.go). New subcommands register in thecommandsslice inmain.go— dispatch, the usage line and the shell completion scripts are all generated from itinternal/converter/docx/— DOCX → Markdown parser;internal/converter/pipeline/— streaming download + convert worker poolinternal/db/— SQLite schema, queries, FTS5internal/versionstore/— on-demand cache of spec versions not in the prebuilt databaseinternal/tools/— MCP tool handlers;internal/web/— web viewer (reads through the sametools.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.
specsis keyed by(id, version), butInsertSpecWithSectionsAndImagesdrops 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.
versionstorefetches 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 firstget_image/list_imagescall. 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 fromopenapi_specsbyinternal/openapiindexand rebuilt wholesale — never incrementally, because most$refs cross into another file, so importing one document changes the chunks of documents imported before it.buildandupdateend inrebuildOpenAPIIndex;importandimport-dirdeliberately do not, because the YAML arrives in the archive zip and a.docximport cannot touchopenapi_specs. The tokenizer is plainunicode61, no porter: these rows are identifiers, not prose, and-/./_split so a partial name matches. A schema chunk expands$refone level, throughitemsandadditionalPropertiesas 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 fromversionstore. Databases built before this existed have no index at all —serveopens read-only and cannot create it, soSearchOpenAPIreturnsdb.ErrNoOpenAPIIndexand the tool points atbuild-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.updatekeeps 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/asn1indexextracts every top-level assignment (candidates seeded viasections_fts MATCH 'ASN1START'— a LIKE over a full corpus takes minutes) andbuild,update,importandimport-dirall end in a wholesale rebuild — import too, because unlike OpenAPI YAML a.docxdoes 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 namesbuild-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.NormalizeImageRefskeeps 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.```latexis 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 ofversionstore.cacheSchemaVersion, which wipes old version caches on open. - Math is format-independent, like image references:
```latexfor a standalone equation,$$...$$for display math where a fence cannot go (a table cell, a list item),$...$inline.runInfo.Textholds bare LaTeX andrunInfo.markdownText()is the only place the delimiters are added — somergeAdjacentRunsmust never merge a math run, or they vanish silently.ommlToLaTeXguarantees the LaTeX carries no</>(escapeMathAngles), which is whyinternal/converter/docx/table.gocan 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).
preserveIndentininternal/converter/docx/paragraph.gois the single place the rewrite happens; like fence/notation changes, touching it needs a rebuild and aversionstore.cacheSchemaVersionbump. - 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/(W3Cdocument.modelContext): it registers the tools reported bytools/listat 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 sametools.NewStreamableHTTPHandlerasbuildHTTPHandler, 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.TestToolDescriptionLengthenforces the cap on whattools/listactually returns; detail that does not fit goes into the parameter descriptions (jsonschematags), which no API caps.
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.
- today Changed · +8 lines · +130 tokens per session 1c196f3d400f
- 5d ago First seen · 127 lines · 2,156 tokens per session scan A b7b5bfc6e1e4
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.
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).
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.
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.
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).
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.
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.