expo-docs
Enables fast, offline search and retrieval of Expo documentation from local .mdx files, with tools for searching, getting content, listing sections, API references, and quick start guides.
README
Expo Docs MCP Server
A blazing-fast MCP (Model Context Protocol) server for Expo documentation that reads directly from local .mdx files.
🚀 Key Features
- Lightning Fast: Reads directly from local
.mdxfiles - no HTTP server needed - Smart Caching: Disk-based cache with version + docs fingerprint invalidation
- Full-Text Search: Powerful search with intelligent scoring algorithm
- Zero Network: Works completely offline
- Optimized for Bun: Built specifically for Bun's performance
📊 Performance
| Metric | First Run | Cached Run |
|---|---|---|
| Index Build | ~90-120ms | ~12-20ms |
| Search Query | ~1-10ms | ~1-10ms |
| Documents | 997 .mdx files | 997 .mdx files |
| Cache Size | ~4.4MB | ~4.4MB |
Measured on the current local docs snapshot.
🛠️ Setup
Choose your preferred installation method:
Option 1: npx (Zero Install)
No installation needed! Just add to your Cursor MCP configuration:
{
"mcpServers": {
"expo-docs": {
"command": "npx",
"args": ["expo-local-docs-mcp"]
}
}
}
✅ Always uses latest version
✅ No manual updates needed
⚠️ Slight delay on first run (cached after)
Option 2: Global Install (Recommended)
Install once, use everywhere:
npm install -g expo-local-docs-mcp
# or with pnpm
pnpm install -g expo-local-docs-mcp
Then add to your Cursor MCP configuration:
{
"mcpServers": {
"expo-docs": {
"command": "expo-local-docs-mcp"
}
}
}
✅ Instant startup (no download)
✅ Cleaner config
⚠️ Manual updates: npm update -g expo-local-docs-mcp
Option 3: Local Project Install
Install in your project:
cd ~/my-expo-project
npm install expo-local-docs-mcp
Then add to your Cursor MCP configuration:
{
"mcpServers": {
"expo-docs": {
"command": "node",
"args": [
"/absolute/path/to/node_modules/expo-local-docs-mcp/dist/server.js"
]
}
}
}
✅ Version locked to project
⚠️ Must install per project
⚠️ Need absolute path in config
That's it! The package includes 997 Expo SDK docs in the current snapshot and works out of the box with any method.
For Contributors: Local Development
If you want to contribute or customize:
Prerequisites
- Bun installed (recommended) or Node.js
- Expo documentation
.mdxfiles in theexpo-sdk/folder
Installation
cd /path/to/expo-local-docs-mcp
bun install
bun run build
Test It Works
bun run test
You should see:
✅ All tests passed!
✓ Index loaded: 997 entries (~90-120ms first run)
✓ Index loaded: 997 entries (~12-20ms cached run)
Configuration for Local Development
Add to your Cursor MCP configuration (~/.cursor/mcp.json or ~/.config/cursor/mcp.json):
{
"mcpServers": {
"expo-docs": {
"command": "bun",
"args": ["/<workingdirectory>/expo-local-docs-mcp/dist/server.js"],
"env": {
"EXPO_DOCS_PATH": "/<workingdirectory>/expo-local-docs-mcp/expo-sdk",
"EXPO_CACHE_DIR": "/<workingdirectory>/expo-local-docs-mcp/.expo-cache"
}
}
}
}
Important: Update the paths to match your actual installation location.
📚 Available Tools
1. search_expo_docs
Search the Expo documentation with intelligent ranking.
Parameters:
query(string, required): Search querysection(string, optional): Filter by section (e.g., 'guides', 'router', 'versions')maxResults(number, optional): Max results (default: 10)
Example:
{
"query": "camera permissions",
"section": "guides",
"maxResults": 5
}
2. get_expo_doc_content
Get the full content of a specific documentation page.
Parameters:
path(string, required): Document path (e.g.,/versions/latest/sdk/camera)
Example:
{
"path": "/get-started/introduction"
}
3. list_expo_sections
List all documentation sections or get documents in a specific section.
Parameters:
section(string, optional): Get documents in this section
Example:
{
"section": "router"
}
4. get_expo_api_reference
Get API reference for a specific Expo SDK module.
Parameters:
module(string, required): Module name (e.g., 'camera', 'expo-camera')version(string, optional): SDK version (e.g., 'latest', 'v55.0.0', or '55.0.0')
Example:
{
"module": "camera"
}
5. get_expo_quick_start
Get quick start documentation.
Parameters:
topic(string, optional): Specific topic (e.g., 'create-a-project')
Example:
{
"topic": "create-a-project"
}
🏗️ Architecture
expo-local-docs-mcp/
├── src/
│ ├── server.ts # MCP server implementation
│ ├── config.ts # Configuration management
│ ├── diskCache.ts # Disk cache management
│ ├── mdxParser.ts # MDX file parser (frontmatter + content)
│ ├── searchIndex/ # Search index module
│ │ ├── index.ts # Public API exports
│ │ ├── types.ts # TypeScript types
│ │ ├── state.ts # Index state management
│ │ ├── loader.ts # Index building and loading
│ │ ├── search.ts # Search algorithm
│ │ ├── query.ts # Document queries
│ │ └── fileUtils.ts # File system utilities
│ └── tools/ # MCP tool handlers
│ ├── definitions.ts # Tool schemas
│ └── handlers/ # Tool implementations
│ ├── index.ts # Handler dispatcher
│ ├── types.ts # Handler types
│ ├── searchExpoDocs.ts
│ ├── getExpoDocContent.ts
│ ├── listExpoSections.ts
│ ├── getExpoApiReference.ts
│ └── getExpoQuickStart.ts
├── expo-sdk/ # Your Expo documentation .mdx files
│ ├── get-started/
│ ├── guides/
│ ├── router/
│ ├── versions/
│ └── ...
├── .expo-cache/ # Generated cache (auto-created)
│ └── search-index.json
├── dist/ # Built server
│ └── server.js
├── test-server.ts # Basic functionality tests
├── test-tools.ts # Comprehensive tool tests
└── package.json
🔧 Development
# Run in development mode
bun run dev
# Build for production
bun run build
# Start built server
bun run start
# Run tests
bun run test
bun run test:tools
bun run test:all
# Clear cache (force rebuild)
bun run clear-cache
🎯 Environment Variables
| Variable | Default | Description |
|---|---|---|
EXPO_DOCS_PATH |
./expo-sdk |
Path to expo-sdk folder containing .mdx files |
EXPO_CACHE_DIR |
./.expo-cache |
Cache directory location |
EXPO_DOCS_MAX_RESULTS |
20 |
Max search results to return |
EXPO_DOCS_CACHE_MAX_AGE |
86400000 |
Cache age in ms (24 hours) |
📦 Dependencies
@modelcontextprotocol/sdk- MCP protocol implementation@types/node- TypeScript Node.js typestypescript- TypeScript compiler
That's it! No HTTP clients, no HTML parsers, just fast file I/O.
🐛 Troubleshooting
Index not building
- Ensure
expo-sdk/folder exists and contains.mdxfiles - Check file permissions on the directory
- Try
bun run clear-cacheand restart
Search returning no results
- Wait for index to build (check console output)
- Verify .mdx files have content
- Try broader search terms
Cache rebuilding every time
- Check
.expo-cache/folder permissions - Verify cache file is being created:
ls -lh .expo-cache/ - Check disk space
"Cannot find module" errors
- Run
bun installto ensure dependencies are installed - Run
bun run buildto rebuild
📝 How It Works
- Startup: Server initializes and attempts to load from disk cache
- Cache Check: Cache is valid only when version, age, and docs fingerprint all match (typically ~12-20ms load)
- Fresh Build: If no valid cache, scans
expo-sdk/recursively for all.mdxfiles (currently 997 files) - Parsing: Extracts YAML frontmatter and strips MDX/JSX to get clean text content
- Indexing: Builds in-memory search index with path mapping (~90-120ms)
- Caching: Saves complete index to
search-index.json(~4.4MB) - Search: Uses optimized scoring algorithm (exact matches > word matches)
MDX Parsing
Each .mdx file's frontmatter is parsed:
---
title: Camera
description: A React component that renders a preview...
packageName: expo-camera
platforms: ["android", "ios", "web"]
---
This metadata is used for better search results and filtering.
Search Scoring Algorithm
The search uses a dual-layer scoring system for maximum relevance:
Exact Phrase Matches:
- Title contains exact query: 1000 points
- Description contains exact query: 500 points
- Path contains exact query: 300 points
- Content contains exact query: 100 points
Individual Word Matches (with boundary detection):
- Word match in title: 50 points per occurrence
- Word match in description: 25 points per occurrence
- Word match in path: 15 points per occurrence
- Word match in content: 1 point per occurrence
Performance Optimizations:
- Pre-compiles escaped regex patterns for each search word
- Uses
for...ofloop instead of.map()for better performance - Only creates scored objects for entries with matches (score > 0)
- Single-pass algorithm with early section filtering
🔄 Updating Documentation
To update the Expo docs:
- Replace/update files in
expo-sdk/folder - Clear the cache:
bun run clear-cache - Restart the MCP server
The index will automatically rebuild on next startup.
❓ FAQ
Q: Should I use npx or install globally?
A: Global install (npm install -g) is recommended for faster startup and cleaner config. Use npx if you want automatic updates.
Q: How do I update to the latest version?
A:
- npx: Automatic (always uses latest)
- Global:
npm update -g expo-local-docs-mcp - Local:
npm update expo-local-docs-mcpin your project
Q: How do I test npx execution?
A: Run npx expo-local-docs-mcp directly in your terminal. It should start the MCP server on stdio.
Q: Do I need the localhost:3002 server running?
A: No! That was the old v1.x architecture. v2.0 reads files directly.
Q: Can I delete the cache folder?
A: Yes! It will automatically rebuild (typically ~90-120ms). Cache locations:
- npm/npx:
/tmp/expo-local-docs-mcp-cache/(macOS/Linux) - Local dev:
.expo-cache/(project root)
Q: What happens if an .mdx file is missing?
A: The server gracefully skips it and continues indexing other files.
Q: Can I use this with Node.js instead of Bun?
A: Yes! The npm package is built to work with Node.js. Local development can use either Bun or Node.
Q: How big is the npm package?
A: It depends on the included docs snapshot. The current repo snapshot indexes 997 .mdx docs and builds a ~4.4MB cache file.
📈 Indexed Content
Total documents: 997 .mdx files
Total sections: 40
Cache size: ~4.4MB
Top sections:
- versions: 602 docs (SDK API references)
- guides: 59 docs
- router: 47 docs (Expo Router)
- eas: 35 docs (EAS services)
- eas-update: 27 docs
- tutorial: 25 docs
- develop: 21 docs
- build-reference: 21 docs
- archive: 18 docs
- modules: 17 docs
🎉 Benefits vs v1.x
| Feature | v1.x (HTTP) | v2.0 (Files) |
|---|---|---|
| Speed (first run) | 5-10s | 90-120ms |
| Speed (cached) | 1-2s | 12-20ms |
| Network required | Yes | No |
| Dependencies | axios, cheerio | None |
| HTTP server needed | Yes (localhost:3002) | No |
| Offline support | No | Yes |
| Search quality | Good | Better |
📄 License
MIT
🤝 Contributing
This is a personal MCP server optimized for local Expo documentation access. Feel free to fork and adapt for your needs!
Version: 2.0.5
Built with: Bun + TypeScript
Performance: 🚀 Blazing Fast
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。