unix-docs-mcp
The server provides access to historical 4.2BSD UNIX documentation, manual pages, source code, and system calls through 13 tools.
Documents: Browse the three included prose documents (System Manual, Networking Implementation Notes, USENIX Supplementary Documents), view metadata and tables of contents, full-text search with snippets, and read specific page ranges.
Manual pages: List all 681 man pages (filterable by section), search across them, and read any page by name and section.
Source code: Grep-style search with path filtering, read files or line ranges, and locate symbol definitions, declarations, and references.
System calls: Browse the 152-entry syscall table and look up details by name or number.
Cross-corpus: Search simultaneously across documents, man pages, and source code, with results grouped by type.
It operates over stdio for MCP client integration; demos include a syscall dossier generator and running period-correct utilities on a 4.2BSD emulator.
Provides tools for searching and reading historical 4.2BSD documentation, manual pages, and source code, including system call information.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@unix-docs-mcpwhat's the man page for read(2)?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
unix-docs — 4.2BSD, cross-referenced. Ask it anything.
You're reading this over a network stack whose ideas were first written, in 1983, inside the file you'll find in five seconds with this tool: sys/netinet/tcp_input.c.
The whole 4.2BSD kernel and userland — 3,198 files, 681 manual pages, 152 system calls — indexed, cross-referenced, and served to your AI agent over MCP. Every answer comes with a path:line citation from a real index. Nothing is recalled from memory. Nothing is guessed.
Don't guess what 4.2BSD does. Ask it.
The kernel your internet grew up on
In 1983, a group at Berkeley ran a VAX 11/780 and shipped the release that invented the modern network stack: the BSD socket API, TCP/IP as we know it, socket(), connect(), the mbuf. Every connection you make today runs on decisions first made in this tree.
That tree — complete, with all of its period-correct warts — is in this repository. Not a mirror to download. Not a rendering. The source, ingested and cross-referenced so you can read it like a system:
The complete 4.2BSD source tree —
sys/kernel andsrc/userland, 3,198 C/assembly/header files (~23 MB)All 681 manual pages — sections 1–8, l, n, o, nroff-cleaned to plain text
The 4.2BSD System Manual, Networking Implementation Notes, and USENIX supplements
The full syscall table — with argument counts and kernel handlers, parsed from the actual switch table
The reachable proof it's real: a new 4.2BSD program — jot, written in period-correct K&R C — compiled and run inside a booted 4.2BSD VAX emulator. Scroll down; the output is there.
Related MCP server: mcp-docs
Watch it work
Read a whole data structure instead of one grep line:
read_definition({ symbol: "mbuf", path_filter: "sys/h" })
→ ===== sys/h/mbuf.h:28-35 =====
28 struct mbuf {
29 struct mbuf *m_next; /* next buffer in chain */
30 u_long m_off; /* offset of data */
31 short m_len; /* amount of data in this mbuf */
...Find your way around a subsystem you've never seen:
list_source_files({ path: "sys/netinet" })
→ ===== sys/netinet =====
sys/netinet/tcp_input.c (934 lines)
sys/netinet/tcp_output.c (333 lines)
... 33 files in allSearch for an exact string a keyword index can't express:
grep_source({ pattern: "m->m_len", context: 1 })
→ sys/net/raw_usrreq.c-47- m->m_next = m0;
sys/net/raw_usrreq.c:48: m->m_len = sizeof(struct raw_header);Resolve a header the way the 4.2BSD compiler would:
resolve_include({ name: "<sys/mbuf.h>" })
→ sys/h/mbuf.h (113 lines) — <sys/...> is the kernel header directory sys/hGet the whole story on a system call — note that exit is implemented by rexit() in the kernel, a name you would never have guessed:
get_syscall({ name_or_number: "1", include_manpage: false })
→ #1 exit
## Switch table
sys/sys/init_sysent.c:107: 1 argument, implemented by rexit()
## Kernel implementation
sys/sys/kern_exit.c:23: rexit()
## libc stub
src/lib/libc/vax/sys/_exit.c
## Manual page
exit(2) - terminate a process18 tools, one reference
Every access path you need is a tool, and every tool tells the agent when to use it:
Documents
list_documents— list the prose documentsget_document_info— metadata plus a page-by-page overviewsearch_documents— ranked full-text search with snippetsread_pages— read a page or range of pages
Manual pages
list_manpages— list pages, optionally by sectionapropos— search names and NAME-section descriptions, likeapropos(1)search_manpages— ranked full-text search, optionally restricted to a sectionread_manpage— full text of a page, e.g.read(2)
Source code
list_source_files— browse a directory, likels(1)search_source— ranked keyword search; files carrying every term rank firstgrep_source— exact substring or regex search with contextread_source_file— read a file or a line range, with line numbersfind_symbol— case-sensitive lookup of definitions, declarations, referencesread_definition— a symbol's whole definition: function body, struct body, or macroresolve_include— map<sys/mbuf.h>to its file in the tree
System calls
list_syscalls— the table, with argument counts and kernel handlersget_syscall— a full dossier for one call: table entry, switch table, kernel implementation, libc stub, and man page
Across everything
search_all— one query across documents, man pages, and source
Choosing between the search tools
You want | Use |
The page that documents a concept |
|
Every page that mentions a term |
|
Where an idea lives in the source |
|
An exact string, or a regex |
|
Where a symbol is defined and used |
|
To read the code of a definition |
|
The corpus is also exposed as MCP resources — enumerable, fetchable URIs:
URI | Contents |
| index of the prose documents |
| the syscall table, with argument counts and handlers |
| one manual page, e.g. |
| one page of a prose document |
| one source file, e.g. |
…and three prompts for common 4.2BSD work: trace_syscall (follow a call from the libc stub into the kernel), kernel_subsystem_tour (survey a kernel directory), and write_utility (write a program in period-correct K&R C, verifying every library routine against the tree).
Proof it's real: a program compiled and run on 4.2BSD
demo/jot.c is a new utility written for 4.2BSD in period-correct K&R C — no ANSI headers (4.2BSD has none), no getopt, explicit old-style declarations. jot first shipped in 4.3BSD, so it is a natural addition to a 4.2BSD system.
demo/sim42.py and demo/emulator-jot.py boot a real 4.2BSD VAX 11/780 on an Open SIMH emulator, transfer jot.c, compile it with the 4.2BSD C compiler, and run a demonstration suite:
$ python3 demo/emulator-jot.py
== compiling with 4.2BSD cc ==
-rwxrwxr-x 1 root 10240 Aug 4 23:39 /tmp/jot
$ /tmp/jot 5 -> 1 2 3 4 5
$ /tmp/jot 8 1 8 -s ' ' -> 1 2 3 4 5 6 7 8
$ /tmp/jot -c 5 97 -> a ` _ ^ ]
$ /tmp/jot -r 4 1 10 -> 4.74837 9.21693 9.57097 7.52004
$ /tmp/jot -b hello 3 -> hello hello hello
$ /tmp/jot -w "n=%g;" 4 1 2 0.25 -> n=1; n=1.25; n=1.5; n=1.75;
$ /tmp/jot -p 2 4 0 1 0.3 -> 0 0.3 0.6 0.9
$ /tmp/jot 4 4 1 -> 4 3 2 1The whole cycle is unattended — sim42.py drives the emulator console over a PTY, handling the kernel's automatic-reboot halts and csh's here-doc quirks. This is not a screenshot of the past; it is a system you can still compile against.
demo/syscall-dossier.mjs shows the corpus doing its job: a small MCP client that assembles a fully-cited dossier for any syscall — table entry, man page, kernel routine, callers, and related prose — in one run:
$ node demo/syscall-dossier.mjs socket
## 1. The call
> MCP: get_syscall("socket", include_manpage: true)
#97 socket
sys/sys/init_sysent.c:203: 3 arguments, implemented by socket()
sys/sys/uipc_syscalls.c:24: socket()
src/lib/libc/vax/sys/socket.c
socket(2) - create an endpoint for communicationGet it running in two minutes
git clone https://github.com/runit-xze/unix-docs-mcp
cd unix-docs-mcp
yarn
yarn start # launch the MCP server over stdio
yarn test # run the test suite (57 passing)Configure it as an MCP server for any MCP client, e.g. in opencode.json:
{
"mcp": {
"unix-docs": {
"type": "stdio",
"command": "node",
"args": ["/path/to/unix-docs-mcp/src/index.js"]
}
}
}Memory is honest: the server lazy-loads each corpus on first use. Indexing the full source tree takes ~1.7 s and brings resident memory to ~390 MB (the man-page corpus adds ~20 MB). Clients that only use the man pages never build the source index. If you run many MCP servers in one session, keep this in mind when sizing the host.
Under the hood
scripts/ingest.mjs builds the prose corpus from OCR'd PDFs. scripts/ingest-dev.mjs builds the man page, source, and syscall corpora from a 4.2BSD distribution. Two things are derived at runtime rather than baked into data/, so they can never drift from the committed tree: the argument counts and kernel handlers come from parsing sys/sys/init_sysent.c, and the apropos descriptions come from the NAME section of each man page.
The cross-reference index (find_symbol, read_definition) is what makes this different from a pile of text: a symbol's definitions, declarations, and every reference, ranked and path:line-cited, so an agent can answer "what calls tcp_input" by reading, not by guessing.
Build on it
This project's own code is dedicated to the public domain under CC0 — take it, adapt it, ship it. The bundled 4.2BSD material is a different story; see the license section.
Good first contributions: new ingest targets, better symbol classification, and demos that push the emulator further. The test suite is 57 tests and the e2e test drives the real stdio protocol.
License
Two different licenses apply to different parts of this repository:
This project's own code — the server, library, script, test, and demo files under
src/,scripts/,test/, anddemo/— is dedicated to the public domain under CC0 1.0 Universal.The bundled 4.2BSD material under
data/(source code, man pages, and prose documentation) is not covered by the CC0 dedication. It carries a mix of Berkeley and AT&T copyrights and has no single clean license; see LICENSE.data for the details, the TUHS 4.2BSD distribution for provenance, and the individual file headers for the applicable terms.
Available Tools
13 toolsfind_symbolFind a symbol in 4.2BSD sourceA
Locate a function, struct, macro, typedef, or variable across the 4.2BSD source. Definitions are listed first, then declarations and references, each as path:line: code.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol to find, e.g. "m_retry" or "sockaddr" | |
| max_results | No | Maximum number of occurrences to return | |
| path_filter | No | Only consider files whose path contains this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses useful behavioral details: definitions are listed first, then declarations/references, and each result appears as 'path:line: code'. This adds context beyond basic purpose, though it does not mention edge cases like not-found behavior or output limits beyond what schema provides.
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, front-loaded with the main verb and resource, and includes an output format example. Every word contributes value; there is 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?
The description covers purpose, result ordering, and output format, which is sufficient for a simple search tool with a well-defined schema and no output schema. It lacks an explicit mention of alternatives or edge cases, but the core information needed to use the tool is present.
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 not add parameter-specific meaning beyond the schema, but the schema already documents all parameters (symbol, max_results, path_filter) with examples and bounds.
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 a specific verb ('Locate') and resource ('function, struct, macro, typedef, or variable across the 4.2BSD source'), making the tool's function unambiguous. It also differentiates from siblings like search_source by focusing on symbol lookup and mentioning result ordering.
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 implies use for symbol lookup, but does not explicitly state when to prefer this over sibling tools like search_source or search_all, nor does it provide when-not or alternative guidance. The context is clear but lacks explicit usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_infoDocument info and page overviewA
Return metadata for one document plus a page-by-page overview (first line of each page), useful as a table of contents before reading specific pages.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document id, e.g. 4.2bsd-system-manual |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosure. It specifies that the tool returns metadata plus a page-by-page overview (first line of each page), which accurately conveys the behavior and implies a read-only operation. It does not detail what metadata fields are included, but for a simple read tool this is reasonably transparent.
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, well-structured sentence that front-loads the action ('Return metadata'), specifies the resource and output format, and ends with a practical use case. Every part earns its place 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 low complexity (one parameter, no output schema), the description provides sufficient context about what the tool returns and when to use it. It could specify metadata fields or output structure in more detail, but for selection and invocation the current description is complete enough.
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 fully documents the single parameter doc_id, including an enum of allowed values and an example description. Since schema description coverage is 100%, the description adds no additional parameter semantics, and the baseline score of 3 applies.
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 returns metadata for one document plus a page-by-page overview consisting of the first line of each page. This distinguishes it from siblings like list_documents (listing) and read_pages (reading full content) by highlighting its role as a table-of-contents summary.
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 frames the tool as useful as a table of contents before reading specific pages, giving a clear when-to-use context. It does not name alternative tools or explicitly state when not to use it, but the use case is sufficiently implied relative to siblings like read_pages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_syscallLook up a system callA
Look up a 4.2BSD system call by number or name (e.g. "2" or "fork"). Returns its number, name, and any notes.
| Name | Required | Description | Default |
|---|---|---|---|
| name_or_number | Yes | System call number (e.g. "3") or name (e.g. "read") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the return behavior ('Returns its number, name, and any notes') and implies a read-only operation via 'Look up.' While it doesn't explicitly say 'does not modify anything,' the verb and return-value statement are sufficient for a simple lookup. It does not mention error handling or edge cases, but these are not critical for this level of transparency.
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, well-structured sentence that starts with the verb, gives examples, and states what is returned. Every part is necessary and informative, with no wasted words. This is exemplary conciseness.
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 simple one-parameter lookup tool with no output schema, the description fully covers the necessary context: what it does, how to invoke it (with examples), and what it returns. It also specifies the system call version (4.2BSD), which adds important scope. There is no missing critical information for the agent to select and invoke this 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 schema already fully describes the parameter (100% coverage), so the baseline is 3. The description adds value by providing concrete examples ('2' or 'fork') and clarifying that both numeric and named lookups are supported, which reinforces the schema's description. This enrichment justifies a score above baseline.
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 function: 'Look up a 4.2BSD system call by number or name.' It gives concrete examples and specifies the resource (system call) and the action (look up). This distinguishes it from sibling tools like list_syscalls, which lists all syscalls rather than retrieving 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 clearly indicates when to use this tool: when you have a specific system call number or name to look up. It doesn't explicitly mention alternatives like list_syscalls for enumeration, but the context is clear from the wording and examples. There are no exclusions provided, so it falls short of the explicit alternative guidance at score 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsList ingested documentsA
List the historical UNIX documents available on this server, with metadata such as title, authors, source URL, page count, and a short description.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the scope (historical UNIX documents on the server) and the metadata fields returned, but it does not explicitly mention read-only behavior, pagination, limits, or ordering. The word 'List' implies a non-mutating operation, but more transparency would be beneficial.
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, front-loaded sentence that states the action ('List') and the resource ('historical UNIX documents available on this server'), followed by relevant metadata fields. No redundant or vague language exists.
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 simple no-parameter listing tool, the description adequately covers the resource scope and return metadata. It could mention whether all documents are returned or if pagination is involved, but the simplicity and clarity of the operation make it nearly 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?
The tool has zero parameters and an empty schema. Since there are no parameters to describe, the baseline of 4 applies. The description adds no parameter-specific information, but nothing is needed in this case.
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 lists historical UNIX documents with specific metadata fields (title, authors, source URL, page count, description). This verb+resource pair is distinct from sibling tools like search_documents (search vs. list) and list_manpages (manpages vs. documents).
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 implies use when you want an overview of all ingested documents, but it does not explicitly mention alternatives or exclusions. Sibling tools such as search_documents or get_document_info are not referenced, leaving the usage guidance to inference from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_manpagesList man pagesA
List the 4.2BSD manual pages, optionally restricted to a section (1=commands, 2=syscalls, 3=libc, 4=devices, 5=formats, 6=games, 7=documents, 8=admin, l=local, n=new, o=obsolete).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of names to return | |
| section | No | Restrict to this manual section |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explicitly states a read-only listing operation and defines the section semantics, but does not disclose other behavioral traits like authentication needs, rate limits, or return format. This is acceptable for a simple list operation 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 a single, concise sentence that front-loads the main purpose. The parenthetical listing section meanings is dense but necessary and does not waste words. It is appropriately sized for the tool's simplicity.
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 simple listing tool with detailed schema documentation, the description covers the essential resource and filtering options. It omits explicit mention of return structure or ordering, but those are not critical for a list operation. It is sufficiently complete for an agent to select and invoke 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 schema already describes both parameters (limit and section) with 100% coverage. The description adds significant semantic value by mapping each section enum value to its meaning (e.g., 1=commands, 2=syscalls), which the schema does not provide. This enrichment justifies a score above baseline.
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 action ('List'), the resource ('4.2BSD manual pages'), and the optional filtering by section. It distinguishes itself from siblings like list_documents and list_syscalls by specifying the exact resource type.
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?
It provides clear context for when to use the tool by describing optional section filtering and explaining what each section means. However, it does not explicitly mention when not to use it or offer alternatives such as search_manpages, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_syscallsList 4.2BSD system callsA
List the 4.2BSD system call table (number, name, and any notes). Optionally filter by name substring.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Only show syscalls whose name contains this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It discloses that the output includes number, name, and notes, and that filtering is by substring. However, it does not mention output format, case sensitivity, or explicitly confirm it is a read-only operation, leaving some gaps for a simple listing 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 a single sentence that is front-loaded with the action and includes only necessary information. No waste 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?
For a simple one-parameter listing tool with no output schema, the description is sufficiently complete: it states what is listed and the optional filtering. It does not cover alternatives or edge cases, but the tool's simplicity makes this acceptable.
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 description's 'filter by name substring' essentially mirrors the schema's parameter description ('Only show syscalls whose name contains this substring'). With schema description coverage at 100%, the description adds no new parameter semantics beyond the baseline.
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 lists the 4.2BSD syscall table with number, name, and notes, and optionally filters by name substring. It does not explicitly distinguish from sibling tools like get_syscall, but the action and resource are specific enough.
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 implies usage for listing syscalls and mentions an optional filter, but provides no explicit guidance on when to use this tool vs alternatives like get_syscall or search_all. No exclusions or alternative recommendations are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_manpageRead a manual pageA
Read the full text of one 4.2BSD manual page by name and optional section (e.g. name="read", section="2"). If the name is ambiguous across sections, give the section.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Man page name, e.g. "read" or "getifaddr" | |
| section | No | Manual section (2=syscalls, 3=libc, 4=devices, 5=formats) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool returns the full text of exactly one page, and explains the ambiguity resolution behavior. This is transparent for a read-only tool, though it does not mention error cases or output formatting.
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 exceptionally concise: two sentences, front-loaded with the core action, and each clause earns its place. The example and ambiguity note are efficient and useful without 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?
For a simple read tool with two parameters and no output schema, the description is complete enough for an agent to invoke it correctly. It covers name, optional section, and ambiguity resolution. It could mention what happens when the page is not found, but that is a minor omission.
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%, establishing a baseline of 3. The description adds meaningful guidance beyond the schema by giving a concrete example ('name="read", section="2"') and by explaining when the optional section parameter should be supplied due to ambiguity.
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 verb and resource: 'Read the full text of one 4.2BSD manual page by name and optional section.' This distinguishes it from sibling tools like list_manpages or search_manpages, which list or search rather than read a specific page.
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 context for use, including how to disambiguate when a name exists across sections ('If the name is ambiguous across sections, give the section'). It does not explicitly name alternatives or exclusions, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pagesRead document pagesA
Read raw text of one page or a contiguous range of pages from a document. Use get_document_info first to find the right pages.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document id | |
| end_page | No | Last page number to read (inclusive). Omit to read a single page. | |
| start_page | Yes | First page number to read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It discloses the read-only nature and the 'raw text' output, and clarifies range behavior. However, it does not mention error handling, page indexing (1-based), or what happens with out-of-range pages, though the schema partially covers the parameter constraints.
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 concise sentences, front-loaded with the primary action. The first sentence states the purpose, the second gives a usage guideline. Zero wasted words.
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 simple read tool, the description covers the core purpose and a key prerequisite. It lacks details on return format and edge cases, but 'raw text' implies the output. Given no output schema, this is reasonably 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 description coverage is 100%, so the baseline is 3. The description adds the concept of a contiguous range, complementing the end_page omit behavior, but does not provide substantial new meaning beyond what the schema already documents.
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 reads raw text of one page or a contiguous range of pages from a document. It uses a specific verb (read) and resource (document pages), effectively distinguishing it from sibling tools like read_manpage and read_source_file.
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?
It explicitly instructs to use get_document_info first to find the right pages, providing clear sequencing. It does not mention alternatives or exclusions, but the context implies this is the tool for reading document pages, not other document types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_source_fileRead a 4.2BSD source fileA
Read a source file from the 4.2BSD tree by path (e.g. "sys/sys/sysent.c" or "src/lib/libc/gen/read.c"). Optionally restrict to a line range. At most 1500 lines are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path in the source tree, e.g. "sys/netinet/tcp_input.c" | |
| end_line | No | Last line to read (inclusive) | |
| start_line | No | First line to read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It explicitly states the 1500-line maximum and optional line-range limiting, which are important operational traits. Error behavior for missing files is not covered, but this is a minor gap for a simple read 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 two sentences long, front-loaded with the core purpose and examples, and contains no redundant information. Every word earns its place.
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 simple file-reading tool with clear schema and no output schema, the description provides enough context: what it reads, examples, and output limits. It doesn't explicitly describe the return format, but that is implied and not critical for a read operation.
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 already describes all three parameters with examples for 'path'. The description adds a general 'line range' hint and the 1500-line limit, but does not add significant semantic detail beyond the schema. Baseline 3 is appropriate for 100% schema 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 states a specific verb ('Read') and resource ('source file from the 4.2BSD tree') with concrete path examples. This clearly distinguishes the tool from siblings like read_manpage or read_pages.
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 tool's intended use is clear from the description and name. It provides practical usage context (line range restriction, 1500-line cap) but does not explicitly mention when to prefer this over alternatives like search_source or read_manpage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_allSearch everythingA
Search across all corpora at once: prose documentation, manual pages, and source code. Results are grouped by kind and labeled.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search terms | |
| max_results | No | Maximum results per corpus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds useful context by stating results are 'grouped by kind and labeled,' but it does not explicitly mention the read-only nature, result ordering, or potential limitations beyond what the schema covers.
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 at two sentences with no redundant phrases. It front-loads the action and scope, then adds a relevant detail about output grouping, making every word earn its place.
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 simple search tool, the description covers the essential aspects: what is searched and how results are presented. While an output schema is absent, the description could include more structural details about results, but it is sufficient for correct tool selection and invocation, especially given sibling 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?
The schema covers 100% of the parameters with detailed descriptions (query and max_results), so the tool description need not add parameter semantics. The description adds no extra parameter detail, and the baseline of 3 is appropriate since the schema does the heavy lifting.
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 action (search) and the resource (all corpora), enumerating the specific document types. It distinguishes itself from sibling search tools by emphasizing 'at once' and listing all three corpora, making its scope 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 communicates the primary use case: searching across every corpus simultaneously, which implies its use for broad queries. It provides clear context but does not explicitly state when to prefer individual search tools or exclude this tool for single-corpus searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsFull-text searchA
Search the ingested UNIX documentation. Returns ranked page-level matches with a snippet around the first hit. Optionally restrict to a single document by doc_id.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query, e.g. "TCP retransmission" or "socket options" | |
| doc_id | No | Restrict search to this document | |
| max_results | No | Maximum number of matches to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It discloses the output ('ranked page-level matches with a snippet') and the optional restriction, which is meaningful for a search tool. It does not mention quirks like result limits or error handling, but those are adequately covered by the schema.
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, front-loaded with the core purpose, and every detail earns its place. It avoids redundancy and clearly conveys the essential behavior without unnecessary fluff.
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 simple search tool with a rich input schema, the description explains the return format sufficiently, especially given no output schema. It could mention default max_results or pagination behavior, but the schema already provides max_results details, making this adequately 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 description coverage is 100% with detailed parameter descriptions, so the baseline is 3. The description's mention of doc_id adds no new meaning beyond the schema's 'Restrict search to this document'; it offers no additional semantic insight for query or max_results.
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 identifies the tool with a specific verb ('Search'), a precise resource ('ingested UNIX documentation'), and output details ('ranked page-level matches with a snippet'). It distinguishes itself from sibling tools like search_manpages and search_source by focusing on documents and the optional doc_id restriction.
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?
It provides clear context that this is for searching ingested UNIX documentation, and the optional doc_id clarifies a specific use case. However, it does not explicitly mention alternatives like search_manpages or search_source, so guidance is clear but lacks explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_manpagesSearch manual pagesA
Search the 4.2BSD manual pages. Returns ranked matches with a snippet around the first hit. Restrict with section (2=syscalls, 3=libc, 4=devices, 5=formats).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query, e.g. "socket options" or "open flags" | |
| section | No | Restrict to this manual section | |
| max_results | No | Maximum number of matches to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that results are ranked and include a snippet around the first hit, which gives some transparency. However, it does not mention behavior such as default result count, ordering specifics, or empty-result handling. For a simple read-only search tool, this is acceptable but not rich.
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, front-loaded with the core purpose, and every sentence contributes useful information. It includes the result format and parameter usage without fluff, achieving maximum conciseness.
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 straightforward search tool with a simple schema and no output schema, the description adequately covers purpose, result format, and key parameter semantics. It lacks an explicit mention of alternative tools, but the sibling list and clear naming make the scope obvious. A more detailed note on return value structure or pagination might be nice, but is not essential for this level of complexity.
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 schema covers 100% of parameters, so the baseline is 3. The description adds value beyond the schema by explaining the numeric section meanings (2=syscalls, 3=libc, etc.), which is not in the schema's enum descriptions. It also clarifies that the snippet is around the first hit, which relates to query interpretation. This extra guidance justifies a 4.
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 searches the 4.2BSD manual pages and returns ranked matches with snippets. This distinguishes it from siblings like search_documents (general documents) and search_source (source code), while also contrasting with read_manpage (reading a full page). The verb 'search' and resource 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 clear context: it is for searching manual pages, and the section restriction guidance (e.g., 2=syscalls, 3=libc) is helpful. It does not explicitly reference alternative tools or state when not to use it, but the naming and content implicitly differentiate it from sibling search tools. A brief note about using search_source for source code would earn a 5, but the current guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sourceSearch 4.2BSD source codeA
Search the 4.2BSD kernel and userland C source. Returns matching lines in the style of grep (path:line: code). Optionally filter by a path substring such as "netinet" or "libc/gen".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search terms, e.g. "m_get" or "struct mbuf" | |
| max_results | No | Maximum number of matching lines to return | |
| path_filter | No | Only consider files whose path contains this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output format (grep-style) and the filtering option, but does not specify search semantics such as whether regex is supported, case sensitivity, or behavior when no matches are found. The read-only nature is implied by 'Search', but not explicitly stated, leaving some ambiguity.
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, front-loaded with the primary purpose and output format in the first sentence, and a concise optional-filter hint in the second. Every word serves a purpose, with no redundancy or fluff. It is an excellent model of brevity.
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 simple search tool with 3 parameters, no output schema, and no annotations, the description covers the essential aspects: scope, return format, and optional filtering. It could be more complete by noting edge cases like no-result behavior or search semantics, but given the simplicity, it is largely adequate. The absence of an output schema makes the explicit return format description important, and it is provided.
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 schema already documents all parameters. The description adds minimal value beyond the schema, only providing concrete examples for path_filter. The query and max_results are not further elaborated, so the description does not significantly enhance parameter understanding beyond the baseline.
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 searches '4.2BSD kernel and userland C source' and specifies the output format as 'path:line: code'. This distinguishes it from sibling tools like search_documents or search_manpages, which target different corpora. The verb 'Search' and resource are explicit.
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 gives a clear context of use ('Search the 4.2BSD kernel and userland C source') and provides a practical filtering tip with examples ('netinet' or 'libc/gen'). However, it does not explicitly mention when to prefer this tool over alternatives like find_symbol or search_all, nor does it state exclusions. This is a clear context with no exclusions, warranting a 4.
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
find_symbol - First observed
get_document_info - First observed
get_syscall - First observed
list_documents - First observed
list_manpages - First observed
list_syscalls - First observed
read_manpage - First observed
read_pages - First observed
read_source_file - First observed
search_all - First observed
search_documents - First observed
search_manpages - First observed
search_source
TDQS
Scored across 13 tools
Each tool targets a distinct corpus (documents, manpages, source, syscalls) with distinct actions (list, get, search, read, find). The descriptions clearly differentiate between search_documents, search_manpages, and search_source, so there is no real ambiguity.
All tool names follow a consistent verb_noun snake_case pattern (list_, get_, search_, read_, find_). Even search_all fits the verb+noun pattern with 'all' as the object. No mixed naming conventions are present.
13 tools is well-scoped for a multi-corpus documentation server. Each corpus (documents, manpages, source, syscalls) has just the right set of operations, and search_all provides a cross-corpus entry point. No redundant tools exist.
The tool set covers the full read-only lifecycle for documents (list/get/search/read), manpages (list/search/read), source (search/read/find), and syscalls (list/get). A minor gap is the lack of a directory listing for source files, but search_source and find_symbol partially mitigate this.
Maintenance
Related MCP Connectors
MCP server for opencode documentation, generated by doc2mcp.
MCP server for manus documentation, generated by doc2mcp.
Remote MCP server for Tandem docs, install guides, SDKs, workflows, and agent setup help.
MCP server for innovationlab documentation, generated by doc2mcp.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA tutorial MCP server for learning the Model Context Protocol by building file and system tools. Provides hands-on experience creating custom tools that enable AI models to interact with files and execute system commands.-
- AlicenseNot gradedqualityCmaintenanceGeneric MCP server that exposes Markdown documentation to LLMs, enabling them to search and answer questions about any software documentation.MIT
- FlicenseNot gradedqualityDmaintenanceMCP server providing filesystem operations, shell execution, and web search capabilities.-
- AlicenseAqualityCmaintenanceMCP server to access and search adonis-mcp documentation files from GitHub, with tools for listing, searching, and extracting code examples.346 npm1MIT