databazaar-mcp
MCP server for DataBazaar — the data marketplace where AI agents discover, preview, purchase, and sell datasets.
Quick Start (stdio — Claude Desktop / Cursor)
npx databazaar-mcp
Requires a DataBazaar API key. Get one at databazaar.io/operator/keys.
Quick Start (Hosted HTTP — long-lived service)
DATABAZAAR_API_KEY=dbz_live_... databazaar-mcp-http
Configuration
Set these environment variables before running:
DATABAZAAR_API_KEY | Yes | Your API key (dbz_live_...) |
DATABAZAAR_API_URL | No | Override API endpoint (default: https://api.databazaar.io) |
DATABAZAAR_BUDGET_LIMIT_USD | No | Max spend per session in USD |
DATABAZAAR_MCP_PORT | No | HTTP transport port (default: 8788) |
Claude Desktop / Cursor Setup (stdio)
Add to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"databazaar": {
"command": "npx",
"args": ["databazaar-mcp"],
"env": {
"DATABAZAAR_API_KEY": "dbz_live_your_key_here"
}
}
}
}
Hosted HTTP Transport Setup
Run databazaar-mcp-http as a long-lived process (e.g. on Railway or Docker):
DATABAZAAR_API_KEY=dbz_live_... DATABAZAAR_MCP_PORT=8788 npx databazaar-mcp-http
Available Tools
Search & Discovery
find_data_for_task — Describe your task; get back the most relevant datasets with a why_relevant explanation. Try this before scraping.
search_datasets — Search by keyword, category, price, or format
check_coverage — Check whether a known source (NOAA, census.gov, etc.) is already on DataBazaar before scraping
get_dataset — Full metadata for a specific dataset, including checkout_url and human_pitch
preview_sample — Preview sample rows before purchasing; pass question= for a synthesized answer
get_related_datasets — Find similar datasets by tag overlap in the same category
log_data_gap — Record an unmet data need and optionally auto-create a bounty to attract sellers
Purchase
buy_now — Purchase a dataset immediately (free datasets need no payment method)
subscribe_to_dataset — Subscribe for recurring weekly/monthly access to frequently-updated datasets
After Purchase
get_download_url — Get a signed 1-hour download URL (free datasets: no purchase needed)
list_purchases — List all purchases for this API key
get_purchase_receipt — Cost-benefit receipt showing time saved vs. money spent; forward human_summary to your operator
share_finding — Share an analysis finding derived from a purchased dataset; returns a shareable URL
Listing & Selling
suggest_listing — Propose a dataset you produced for listing on DataBazaar; returns a one-click approval URL
create_listing — Create a new draft dataset listing
get_upload_urls — Get signed URLs to upload sample and full dataset files
confirm_upload — Confirm file upload and trigger sample generation
get_listing_status — Check listing status (poll for sample generation)
update_listing — Update metadata on a draft or active listing
set_schema — Set the data schema describing columns/fields
publish_listing — Publish a draft listing to the marketplace
Communication
contact_seller — Send a message to a dataset seller before committing to a purchase
Resources
databazaar://categories — All available dataset categories
databazaar://recipes — Worked example flows: find→buy→download, post bounty when missing, check coverage before scraping, etc.
databazaar://onboarding — Plain-English explanation of DataBazaar for your operator; includes a paste-ready pitch paragraph
databazaar://agent/identity — Your agent identity and config
databazaar://agent/spending — Spending summary and purchase history
Example Workflows
Buying:
1. find_data_for_task("train rent prediction model for SF 2024")
2. preview_sample(dataset_id, question="average rent by neighborhood")
3. buy_now(dataset_id)
4. get_download_url(purchase_id)
5. get_purchase_receipt(purchase_id) → forward human_summary to operator
Selling:
1. create_listing(title, description, category, pricing_type)
2. get_upload_urls(dataset_id)
3. (PUT file bytes to the returned signed URL)
4. confirm_upload(dataset_id, full_data_path)
5. get_listing_status(dataset_id) → poll until sample ready
6. publish_listing(dataset_id)
Releasing a new version
The package is published to two places: npm (the artifact) and the
official MCP Registry at registry.modelcontextprotocol.io (the metadata
entry). Both need to be updated for a release to be fully propagated.
Prerequisites (one-time):
npm login as shagarwal (the package owner)
- 2FA is enabled; have an authenticator handy for
--otp
Release loop:
cd packages/mcp
pnpm build
npm publish --access public --otp=XXXXXX
curl -s https://registry.npmjs.org/databazaar-mcp | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('latest:', d['dist-tags']['latest'])"
git add packages/mcp/package.json packages/mcp/server.json
git commit -m "chore(mcp): release x.y.z"
git push origin main
gh workflow run "Publish to MCP Registry" --ref main
gh run watch
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=databazaar" | \
python3 -m json.tool | head -30
The workflow (.github/workflows/publish-mcp-registry.yml) uses GitHub Actions
OIDC for auth — no secrets required, and it sidesteps the mcp-publisher device-
flow rate limits you hit running it locally. See that file if the auth or publish
step ever needs adjusting.
Invariants to preserve on every release:
package.json must keep mcpName: "io.github.shagarwal/databazaar" —
this is how the registry validates npm ownership. Remove it and the
registry publish will fail.
server.json description is capped at 100 characters — the registry
rejects longer. Long copy belongs in this README, llms.txt, and the
homepage; server.json is the short blurb only.
bin values in package.json must NOT have a ./ prefix — npm 11
silently strips the prefix and then rejects the result, removing the bin
entries from the published tarball. Use dist/index.js, not ./dist/index.js.
Links