Quickstart
Go from data to live MCP endpoint in three steps. Everything below is real and current as of today.
Sign up & upload
Create a free account, then either drop a structured data file or paste a URL. Supported file formats:
Or for URL extraction, pick a mode:
- → Markdown — fetches one page, converts to clean markdown, parses tags/links/headings into a document corpus.
- → Crawl — same-origin BFS up to N pages, all stored as markdown documents.
- → JSON — uses Cloudflare's structured-extraction endpoint to coerce the page into records.
Wait for provisioning
ShipMCP runs the following pipeline asynchronously (typically 30–60 seconds):
- Creates a dedicated Neon Postgres project
- Loads your data (file parser or web extractor)
- Introspects the schema
- Generates 5+ MCP tools per table (search, filter, get-by-id, count-by, FK joins)
- Publishes
llms.txtat/{slug}/llms.txt - Sends you a "live" email and updates the dashboard
Connect Claude Desktop (or any MCP client)
From the endpoint detail page, copy the URL and create a token. Then add to claude_desktop_config.json:
{
"mcpServers": {
"products": {
"url": "https://shipmcp.sh/products-abc12/mcp",
"headers": {
"Authorization": "Bearer smcp_..."
}
}
}
}Restart Claude Desktop. The agent calls initialize, reads the instructions field (which points at the public llms.txt), then calls tools/list to see what's available.
Agent discovery via llms.txt
Every active endpoint serves an llms.txt at two well-known paths (no auth required):
https://shipmcp.sh/{slug}/llms.txt https://shipmcp.sh/{slug}/.well-known/llms.txtThe file describes the endpoint's purpose, full schema, all available tools with argument signatures, FK relationships, and connection instructions. It's auto-generated from your live database every time you re-ingest.
Tool generation rules
For each table in your database, ShipMCP produces tools based on column types:
| Column trait | Generated tool |
|---|---|
| text, varchar | search_* (full-text), filter_* (exact match) |
| int, numeric | filter_* (min/max range), sort |
| timestamptz, date | filter_* (date range), sort by recency |
| boolean | filter_* toggle |
| primary key | get_*_by_id |
| foreign key | get_*_for_* (cross-table join) |
| low-cardinality text | count_*_by_* (aggregation) |