An MCP server, written in Swift, for Apple developer documentation: SwiftUI, AppKit, UIKit, Foundation, SwiftData, the Human Interface Guidelines, and every other framework on developer.apple.com. Pages come back as clean Markdown.
| Tool | What it does |
|---|---|
search_docs |
Full-text search of developer.apple.com: symbols, articles, sample code, and WWDC videos. Filters: framework (also adds exact symbol-name matches from that framework's index), type (documentation, sample_code, video), and platform (for example "macOS 14"). |
get_doc |
Fetches a page as Markdown: declaration, availability, overview, parameters, code samples, topics, relationships, and sample code download links. Accepts a URL, a path (swiftui/view), a doc:// id, or a dotted name (AppKit.NSWindow). Options: language: "objc", topics (compact, full, none), section (for example "Overview" or a Topics group like "Handling Mouse Events"), hide_deprecated, and offset/max_chars for paging through long pages. |
browse_framework |
Searches or outlines a framework's whole symbol tree, for example every NSTableView* in AppKit. Works for the Human Interface Guidelines ("HIG"). Filters: query, kind, path, depth, language, hide_deprecated, hide_beta. |
get_video |
Fetches a WWDC session: description, chapter summaries, and code snippet titles by default. Use include: "code" for the code, "transcript" for the timestamped transcript, or "all". Accepts a URL or an id like wwdc2025-256. |
list_frameworks |
Lists all of Apple's documented technologies. |
Every tool returns Markdown for the model plus structured content that matches its declared outputSchema, for clients that use it.
Pages can also be attached as MCP resources:
| URI | Content |
|---|---|
apple-docs://doc/{path} |
A documentation page, e.g. apple-docs://doc/swiftui/navigationstack. Add ?language=objc for Objective-C. |
apple-docs://video/{id} |
A WWDC session, e.g. apple-docs://video/wwdc2025-256. Add ?include=transcript, code, or all. |
apple-docs://framework/{name} |
A framework's table of contents, e.g. apple-docs://framework/appkit or apple-docs://framework/hig. |
developer.apple.com URLs work as resource URIs too. The server lists the SwiftUI, AppKit, UIKit, Foundation, SwiftData, Observation, Swift, and HIG landing pages as ready-made resources.
Requires macOS 13 or later and Swift 6 (Xcode or the Command Line Tools).
git clone https://github.com/zmscode/apple-docs-mcp.git
cd apple-docs-mcp
make installThis builds a release binary and installs it to ~/.local/bin/apple-docs-mcp. Set PREFIX to install somewhere else. Run it again after any change. Then restart Claude Desktop (⌘Q) and start a new Claude Code session to pick up the update.
claude mcp add --scope user apple-docs -- ~/.local/bin/apple-docs-mcp{
"mcpServers": {
"apple-docs": { "command": "/Users/you/.local/bin/apple-docs-mcp" }
}
}For Claude Desktop, this goes in ~/Library/Application Support/Claude/claude_desktop_config.json.
| Command | What it does |
|---|---|
make test |
Unit and end-to-end tests against saved fixtures. The first run downloads the fixtures and records the snapshots; after that, no network is needed. |
make test-live |
Checks the real developer.apple.com, to catch format changes the fixtures can't. |
make fixtures |
Re-downloads the fixtures. Follow with make snapshots and review the snapshot diff, which shows how Apple's format changed. |
make snapshots |
Re-records the Markdown snapshots in Tests/AppleDocsKitTests/Fixtures/Snapshots after an intentional rendering change. |
The fixtures are copies of Apple's pages, so they aren't checked in. Snapshots are rendered from them, so they're recorded locally too: they catch changes from your own edits, and from Apple's format after a make fixtures.
Use make test rather than plain swift test. With the Command Line Tools (no Xcode), SwiftPM passes the testing macro plugin path in a form the compiler can't use, so incremental test builds fail with "plugin for module 'TestingMacros' not found". The Makefile works around it.
The code lives in the AppleDocsKit library. Sources/AppleDocsMCP/main.swift just starts the server.
| File | Contents |
|---|---|
Server.swift |
Server setup, plus resources |
Tools.swift |
Tool definitions, search_docs, get_doc, list_frameworks, and pagination |
Browse.swift |
browse_framework, and loading framework trees |
Videos.swift |
get_video, and parsing video pages |
Renderer.swift |
Converts DocC JSON to Markdown, and applies Objective-C variants |
DocsClient.swift |
Networking, retries, caching, and search stream parsing |
Output.swift |
Structured output types and their JSON Schemas |
| Environment variable | Purpose |
|---|---|
APPLE_DOCS_SEARCH_URL |
Overrides the search endpoint if Apple moves it. The current value is in the SEARCH_CONFIG script on developer.apple.com/search. |
- Pages are fetched as DocC render JSON from
developer.apple.com/tutorials/data/<path>.jsonand converted to Markdown. - Framework trees come from
developer.apple.com/tutorials/data/index/<framework>. Content without an index, like the Human Interface Guidelines, is outlined by following topic sections from its landing page. - Objective-C pages are produced by applying the page's
variantOverridespatches. - Video pages are HTML only, so
get_videodepends on the page's class names (supplement summary,transcript-content, and so on).make test-livewill flag it if Apple redesigns them. - Search uses the same backend as developer.apple.com/search. Apple doesn't document this endpoint, so it could change. If it fails,
search_docsfalls back to title matches from framework symbol lists (the named framework, or SwiftUI, AppKit, UIKit, and Foundation), and says so in its output. - Requests time out after 20 seconds. Timeouts, dropped connections, 429s, and 5xx responses are retried with backoff. Concurrent requests for the same URL share one download.
- Responses are cached in memory for 6 hours, up to 48 MB in total, evicting the least recently used first.
MIT. This project isn't affiliated with Apple; documentation content is fetched from developer.apple.com at run time and belongs to Apple.