Keytomic MCP
Enables AI clients to perform bounded website Quick Audits via MCP tools, covering crawlability, indexability, and metadata.
README
Keytomic MCP
Keytomic MCP gives AI clients free, public remote access to bounded website Quick Audits. It translates MCP tool calls into requests to Keytomic's private crawler API without owning crawl execution or storing audit data.
The production MCP endpoint is planned for:
https://mcp.keytomic.com/
The operational health endpoint is:
https://mcp.keytomic.com/health
What this server does
The server exposes one focused workflow:
- An MCP client starts a Quick Audit for a public HTTP or HTTPS URL.
- The crawler API asynchronously audits up to 25 pages.
- The client polls the Audit Job using its opaque
auditId. - When complete, the client reads the summary and paginated category issues.
Every Quick Audit covers three fixed categories:
crawlabilityindexabilitymetadata
The MCP Adapter is intentionally small and stateless. The separate Crawler API owns job execution, durable state, results, quotas, expiry, and recovery.
MCP tools
| Tool | Input | Result |
|---|---|---|
start_website_audit |
url |
Starts a fixed 25-page Quick Audit and returns an auditId |
get_audit_status |
auditId |
Returns lifecycle state and crawl progress |
get_audit_summary |
auditId |
Returns the completed score and category totals |
get_audit_category |
auditId, category, optional cursor |
Returns up to 20 issues and an optional next cursor |
Typical tool sequence
start_website_audit
|
v
get_audit_status ----> queued / running
|
v
completed
|
+------> get_audit_summary
|
+------> get_audit_category
|
+------> repeat with nextCursor
Audit Jobs expire after 24 hours. Clients should treat auditId and pagination
cursors as opaque values.
Scope
Included
- Remote MCP over Streamable HTTP at
/ - Compatibility with legacy stateless MCP clients
- Structured and text tool results
- Strict validation at MCP and crawler boundaries
- Stable, client-safe error codes
- Internal bearer authentication to the Crawler API
- Health endpoint at
/health - Production multi-stage Docker image
- CI checks for formatting, types, tests, build, and Docker
- Stateless horizontal scaling
Deliberately excluded
- Website crawling inside this repository
- Local job ownership, persistence, queues, or caches
- Caller accounts, API keys, or login
- Configurable page limits or audit categories
- MCP resources, prompts, cancellation, or stdio transport
- Billing, subscriptions, or usage entitlements
- Browser extensions or npm package publication
These boundaries keep the public adapter independently deployable while the Crawler API remains the system of record.
Architecture
MCP client
|
| Streamable HTTP JSON-RPC
v
Keytomic MCP Adapter
|
| private HTTP + internal bearer token
v
Keytomic Crawler API
|
+---- execution
+---- job state
+---- results
+---- quotas and recovery
The code follows four direct module boundaries:
server.ts ──> mcp/module.ts ──> crawler/port.ts <── crawler/http-adapter.ts
│ │
└──────────────── config.ts ─────────────────────────┘
src/server.tscomposes dependencies and mounts/and/health.src/mcp/module.tsowns the four public tools and error mapping.src/crawler/port.tsdefines the crawler capabilities needed by MCP.src/crawler/http-adapter.tsowns private HTTP details and response validation.- Contract files keep Zod schemas beside their respective boundaries.
See Repository Design for the authoritative architecture and trade-offs.
Error contract
Tool failures remain valid MCP responses and use a small public vocabulary:
| Code | Meaning |
|---|---|
not_found_or_expired |
The Audit Job is unknown or has expired |
audit_not_ready |
Results were requested before the job completed |
capacity_rejected |
Temporary crawler capacity is exhausted |
crawler_unavailable |
The private crawler could not complete the request |
invalid_crawler_response |
Crawler output failed strict validation |
internal_error |
An unexpected adapter failure occurred |
When the Crawler API supplies a safe numeric retry delay, the error includes
retryAfterSeconds. Private response bodies, internal credentials, and
implementation details are never returned to MCP clients.
Security model
The public MCP endpoint is authless. Its risk is bounded by the fixed 25-page Quick Audit contract and capacity controls owned by the Crawler API.
- The internal crawler token comes only from runtime configuration.
- The token is never accepted from clients, returned in results, or logged.
- Crawler responses fail closed when their schemas do not match.
- Unknown and expired jobs share one error to avoid disclosing job existence.
- The runtime uses an unprivileged container user.
- No caller or audit data is persisted by this service.
Report vulnerabilities using the process in SECURITY.md.
Requirements
- Node.js 24
- pnpm 10
- Access to a compatible Keytomic Crawler API
Local development
Install dependencies and create local configuration:
pnpm install
cp .env.example .env
Set the required values:
CRAWLER_API_BASE_URL=https://crawler-api.example.com
CRAWLER_API_TOKEN=replace-me
PORT=3000
Start the development server:
pnpm dev
Local endpoints:
- MCP:
http://localhost:3000/ - Health:
http://localhost:3000/health
Commands
| Command | Purpose |
|---|---|
pnpm dev |
Run the TypeScript server in watch mode |
pnpm check |
Check formatting and lint rules with Biome |
pnpm typecheck |
Type-check without emitting files |
pnpm test |
Build and run the Vitest suite |
pnpm build |
Compile production JavaScript into dist/ |
pnpm start |
Run the compiled production server |
Run the complete local quality gate:
pnpm check
pnpm typecheck
pnpm test
pnpm build
docker build --tag keytomic-mcp .
Docker
Build and run the production image:
docker build --tag keytomic-mcp .
docker run --rm \
--publish 3000:3000 \
--env CRAWLER_API_BASE_URL=https://crawler-api.example.com \
--env CRAWLER_API_TOKEN=replace-me \
keytomic-mcp
The image uses Node.js 24 Alpine, contains production dependencies only, runs as
an unprivileged user, and checks /health for container health.
Testing
The test suite exercises observable behavior at three seams:
- MCP JSON-RPC through the in-memory Hono handler.
- Crawler HTTP through an injected
fetch. - The compiled Node server through real loopback HTTP.
Remote crawler behavior is the only mocked boundary. Private helpers are tested through public outcomes.
Deployment
The intended production topology is one stateless container deployed through Dokploy:
- Dokploy builds the root
Dockerfile. - Runtime configuration supplies the crawler URL and token.
- Traefik routes
mcp.keytomic.comto container port3000. - Route53 points the public hostname to the Dokploy server.
- Dokploy monitors
/health.
CI validates pushes and pull requests but does not deploy.
Product roadmap
The current four-tool Quick Audit is the stable product core. Future work is prioritized by user value and operational evidence; roadmap items are direction, not a compatibility promise.
1. Production launch and reliability
- Deploy and verify
mcp.keytomic.com. - Add end-to-end smoke checks against the production MCP and Crawler API.
- Define availability, latency, capacity, and error-rate service indicators.
- Document incident response, token rotation, rollback, and recovery.
Exit criterion: the public endpoint is observable, supportable, and safe to operate continuously.
2. MCP client experience
- Publish setup examples for major remote MCP clients.
- Add copy-paste tool workflows and troubleshooting guidance.
- Validate structured outputs and legacy compatibility across supported clients.
- Gather failure and completion feedback without storing audit content.
Exit criterion: a new user can connect, run an audit, and understand the result without operator help.
3. Audit usefulness
- Use real Quick Audit feedback to identify missing explanations or result context.
- Improve issue titles, descriptions, and remediation guidance at the Crawler API boundary.
- Evaluate additional bounded categories only when the Crawler API owns their contracts and execution.
- Preserve predictable limits and explicit pagination as result depth grows.
Exit criterion: expansions solve demonstrated user problems and retain a small, stable MCP surface.
4. Sustainable public access
- Measure aggregate capacity pressure and abuse patterns outside audit content.
- Tune domain and global capacity limits in the Crawler API.
- Evaluate fair-use controls only if authless access becomes operationally unsafe.
- Keep client-facing capacity errors actionable and retryable.
Exit criterion: free access remains reliable without moving crawler ownership or durable user state into this adapter.
5. Protocol and platform maturity
- Review the pinned MCP SDK when its required APIs become stable.
- Add protocol capabilities only when they materially improve the audit workflow.
- Keep dependency upgrades reviewed, reproducible, and covered by compatibility tests.
- Revisit deployment topology only when production evidence exceeds the limits of one stateless container.
Exit criterion: platform changes reduce operational risk or improve the user workflow without speculative architecture.
Roadmap decision rules
Every proposed capability must answer:
- What observed user or operational problem does it solve?
- Does it belong in the MCP Adapter or the Crawler API?
- Can the adapter remain stateless?
- Does it preserve a bounded, understandable public contract?
- How will compatibility, security, and operations be verified?
Hard-to-reverse changes require an ADR before implementation.
Project documentation
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。