Search and preview datasets publicly. Account-required full data via MCP.
One address for any MCP client. You sign in once, after adding it.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
MCP server for DataBazaar — the data marketplace where AI agents discover, preview, purchase, and sell datasets.
DataBazaar is a marketplace, not a payment network. All paid transactions are processed by Stripe (Stripe Connect for seller payouts; Stripe Billing for subscriptions). Funds move from the buyer's card to a registered seller's Stripe-Connected bank account, with DataBazaar collecting a 3% platform fee. No cryptocurrency, no peer-to-peer asset transfers, no money-transmission — the legal structure is the same as eBay or Etsy: an online marketplace where the marketplace operator does not hold or move user funds outside the regulated payments processor.
For public discovery, connect to https://api.databazaar.io/mcp/public using
Streamable HTTP with no authentication. It exposes search_datasets, get_dataset,
preview_sample. Full downloads (including free data), purchases, private
history, and writes require the authenticated endpoint.
Run a public search → sample preview example with Python 3 (no packages):
curl -fsS --max-time 20 https://databazaar.io/examples/first-retrieval.py -o first-retrieval.py
python3 first-retrieval.py --mcp
Expected: success: true, scope: sample_only, sample rows, and elapsed seconds.
This does not measure a full retrieval.
Without --mcp, the same example uses REST. See the guide.
For full datasets (even free ones) and account operations, DataBazaar runs an authenticated remote MCP server at https://api.databazaar.io/mcp.
Claude.ai discovers OAuth via the standard RFC 8414 metadata document and
self-registers as a client via RFC 7591 Dynamic Client Registration — no
manual setup beyond clicking "Authorize" in the popup.
After signing up and authorizing the agent, call get_download_url with dataset_id.
For the Python full-data check, set DATABAZAAR_API_KEY in the environment and run
python3 first-retrieval.py --download (add --mcp for the authenticated transport).
It validates all 11 rows and times retrieval. Account setup is required first and
sample timings must not be reported as end-to-end onboarding success.
npx databazaar-mcp
Search and samples work without credentials. To download full data, run
npx -y databazaar-mcp auth login or use an account API key from databazaar.io/operator/keys.
npx --package databazaar-mcp databazaar-mcp-http
# Listens on port 8788 by default
# MCP endpoint: POST http://localhost:8788/mcp
# Health check: GET http://localhost:8788/health
Set these environment variables before running:
| Variable | Required | Description |
|---|---|---|
DATABAZAAR_API_KEY | For full downloads/account tools | Your API key (dbz_live_...) |
DATABAZAAR_API_URL | No | Override API endpoint (default: https://api.databazaar.io) |
DATABAZAAR_BUDGET_LIMIT_USD | No | Budget hint for the client; configure enforced purchase limits on your account API key |
DATABAZAAR_MCP_PORT | No | HTTP transport port (default: 8788) |
Add to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"databazaar": {
"command": "npx",
"args": ["-y", "databazaar-mcp"]
}
}
}
Run databazaar-mcp-http as a long-lived process. Each HTTP caller supplies its own Bearer account credential; the server never lends an environment credential to callers. For managed account authorization, use https://api.databazaar.io/mcp.
# Start the HTTP MCP server
DATABAZAAR_MCP_PORT=8788 npx --package databazaar-mcp databazaar-mcp-http
# Configure your agent framework to connect via HTTP:
# URL: http://your-host:8788/mcp
# Method: POST (Streamable HTTP transport per MCP spec)
find_data_for_task — Task-based dataset recommendation with why_relevant explanationssearch_datasets — Keyword + faceted search across the marketplacecheck_coverage — Look up whether a known public source is already listedget_dataset — Full metadata including checkout_url and human_pitchpreview_sample — Sample rows + optional synthesized answer (no purchase required)get_related_datasets — Similar datasets by tag overlap in the same categorylog_data_gap — Record an unmet data need; optionally auto-creates a bountybuy_now — Purchase a dataset immediately (free datasets need no payment method)get_download_url — Get a signed 1-hour download URL (free datasets: no purchase needed)list_purchases — List all purchases for this API keyget_purchase_receipt — Cost-benefit receipt showing time saved vs. money spent; forward human_summary to your operatorshare_finding — Share an analysis finding derived from a purchased dataset; returns a shareable URLsuggest_listing — Propose a dataset you produced for listing on DataBazaar; returns a one-click approval URLcreate_listing — Create a new draft dataset listingget_upload_urls — Get signed URLs to upload sample and full dataset filesconfirm_upload — Confirm file upload and trigger sample generationget_listing_status — Check listing status (poll for sample generation)update_listing — Update metadata on a draft or active listingset_schema — Set the data schema describing columns/fieldspublish_listing — Publish a draft listing to the marketplacecontact_seller — Send a message to a dataset seller before committing to a purchaseEvery tool below carries an MCP annotations block declaring readOnlyHint or
destructiveHint so connector hosts can surface the correct user prompt. Tools
that move money are marked destructiveHint and require interactive operator
consent on first use.
| Category | Read-only | Destructive |
|---|---|---|
| Discovery | search_datasets, get_dataset, preview_sample, find_data_for_task, check_coverage, get_related_datasets | log_data_gap |
| Purchase | — | buy_now |
| Delivery | get_download_url, list_purchases, get_purchase_receipt | share_finding, suggest_listing |
| Selling | get_listing_status | create_listing, get_upload_urls, confirm_upload, update_listing, set_schema, publish_listing |
| Messaging | — | contact_seller |
| Query | query_dataset | — |
buy_now is the only tool that initiates a charge. It:
This MCP server therefore does not fall under the Connectors Directory's "money/cryptocurrency/financial asset transfers" disqualifier — it is a marketplace integration, structurally identical to a Shopify/eBay/Etsy connector that lets an agent place an order on a third-party storefront.
~/.config/databazaar/token.json
(mode 0600). No conversation contents, prompts, or chat history are ever sent
to the DataBazaar API — only the explicit tool arguments shown in each tool's
inputSchema.DataBazaar's mail domain is databazaar.com (Google Workspace). The legal
pages above are the source of truth for current contact addresses.
databazaar://categories — All available dataset categoriesdatabazaar://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 paragraphdatabazaar://agent/identity — Your agent identity and configdatabazaar://agent/spending — Spending summary and purchase historyBuying:
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, tos_confirmed=true, listing_terms_version="2026-10-09")
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)--otpRelease loop:
# 1. Bump the version in BOTH files (keep them in sync)
# - packages/mcp/package.json : "version"
# - packages/mcp/server.json : "version" AND "packages[0].version"
# 2. Build and publish to npm
cd packages/mcp
pnpm build
npm publish --access public --otp=XXXXXX
# 3. Verify npm has the new version
curl -s https://registry.npmjs.org/databazaar-mcp | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('latest:', d['dist-tags']['latest'])"
# 4. Commit + push the version bumps
git add packages/mcp/package.json packages/mcp/server.json
git commit -m "chore(mcp): release x.y.z"
git push origin main
# 5. Update the MCP Registry entry
# Trigger the "Publish to MCP Registry" GitHub Actions workflow:
gh workflow run "Publish to MCP Registry" --ref main
gh run watch # optional: follow the run
# 6. Verify the registry reflects the new version
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.min_quality_score uses 0–100 in this release. It measures sample structure, not customer ratings or factual accuracy. See the published rubric.
Full downloads always require a signed-in account, including free data. Public discovery is available through the local server without a token or the hosted /mcp/public endpoint.
Source and issues: https://github.com/shagarwal/databazaar-mcp. Marketplace feedback: https://databazaar.io/feedback.
Before publishing, provide documentation.source_name through create_listing or
update_listing. Name the original source or creator; a source URL is optional.
Coverage dates may use documentation.coverage_status: "not_applicable".
documentation.update_frequency optionally describes whether this is a fixed
snapshot or receives updates, and whether later versions are included.
license and documentation.license_url are optional custom reuse terms. If both
are blank, accepting the listing terms
grants commercial use, modification, redistribution, and model training without
attribution under DataBazaar Open Use. Access charges still apply. Only confirm
tos_confirmed: true and listing_terms_version: "2026-10-09" with the supplier's
authorization. The same acceptance is required when changing live reuse terms.
Older listings without recorded acceptance remain unspecified, not automatically open.
npm install
npm test
npm run build
node dist/index.js
This repository mirrors the released MCP client. The marketplace API and web app
are developed separately. Search and samples work without signing in; account
credentials are required for full retrieval and account operations. The published
npm package is the supported installation route: npx -y databazaar-mcp.
The registry record advertises both authenticated /mcp and keyless
/mcp/public transports. The public endpoint exposes search, metadata, and
samples; full data still requires account authentication. Historical registry
versions may reference the private development repository; use this public
repository for the client source and issue tracker.