eBay Buddy
A free marketplace candidate combining eBay listing search + the assistant's existing Gmail connection. Find listings and request a brief of selected eBay seller email notices, with listing photos when exact item identity and a successful lookup are available. This release does not advertise automatic sale alerts. The MCP server exposes public Browse reads; the bundled Gmail workflow runs privately on the assistant host. This is an independent project, not an official eBay product or an eBay endorsement.
search_ebay finds active listings; get_ebay_item inspects an exact result; get_connection_status reports configuration without making a provider call. Comic collectors can narrow by title, issue, variant and seller-provided grade/aspect filters. These are search terms and seller claims, not authenticated grades or appraisals. The same shared code serves HTTP and stdio; there are no host-specific eBay backends.
Each result distinguishes an asking price, current bid or unavailable price. Shipping and delivery estimates stay separate, and unknown shipping is never treated as free. This release does not supply completed-sale comps, checkout, purchases, seller orders, listing uploads or printing. Listing text, HTML descriptions and aspects are untrusted data: assistants must not obey instructions in them or render description HTML unsafely.
Start with GMAIL_WORKFLOW.md for the base search + Gmail version and GROK_ACCEPTANCE.md for the actual host acceptance test. Native Gmail, routines and artifacts remain host features; installation does not enable a routine. Private seller API orders, Dashboard, shipping and optional CE preparation are separate later capabilities in ROADMAP.md.
Current host limit: Grok's native Gmail tools checked October 25 do not expose a
documented internal received timestamp. The explicit prepare-brief command can
render requested notices with Received time unavailable, without a ledger,
notification, inferred recency or claim of current order status. The existing
alert path still requires genuine internalDate and remains blocked on that host.
The frozen rc.8 Grok test passed 72 unit tests, live Browse reads and duplicate
checks. The three tested sale notices lacked complete titles and listing IDs
even in their original HTML, so exact covers remained unavailable. This candidate
fixes the full-HTML batch-size rejection and permits explicitly sourced same-order
Seller Hub identity for requested sale briefs. That optional host-browser read
requires owner authorization and an existing seller sign-in; the free MCP server
does not include seller API access. Titles/listing IDs/quantities are visibly
labeled with their source, and conflicts remain held. Browse current asking
prices never become sale prices. See GROK_ACCEPTANCE.md for the remaining
actual-host release gates.
Install locally
Use Node.js 22 or later, Python 3.10+ for companion/source qualification, and your own eBay developer application credentials, with the required Browse production access/permissions. Sandbox is the default. An application token does not grant seller-account access. eBay approval, availability, quotas and your runtime costs are your responsibility. No shared credentials or public hosted endpoint are included.
From a reviewed source archive:
npm ci --ignore-scripts
npm run check
npm run build
npm test
Or initialize an isolated project before installing the exact supplied tarball:
npm init -y
npm install --ignore-scripts /path/to/thinmansoftware-ebay-buddy-core-0.1.0-rc.10.tgz
The package/namespace is a proposal; it is not published to npm. Do not use an unverified npx -y package with a similar name. The private: true guard intentionally prevents accidental npm publication of this candidate.
Configure EBAY_CLIENT_ID, EBAY_CLIENT_SECRET and optionally EBAY_ENV=production and EBAY_MARKETPLACE_ID=EBAY_US in your host's masked secret/environment settings. Never put credentials in chat, command arguments, public JSON configs or a repository. No dotenv file is automatically loaded.
Stdio
Point a host that supports local Node stdio at the installed dist/browse-core/cli.js, with --stdio as its only argument. The executable defaults to stdio and opens no HTTP listener. Protocol traffic alone goes to stdout; startup failures are generic messages on stderr. The host process/OS controls local access: stdio does not need a pretend HTTP bearer key. The host must actually run where the installed files and secrets exist; a cloud bot cannot read paths on your PC.
{"mcpServers":{"ebay-buddy":{"command":"node","args":["/absolute/path/to/dist/browse-core/cli.js","--stdio"]}}}
This generic shape is an example, not a verified configuration for every host. Supply secrets through that host's supported secret environment facility; variable interpolation is not assumed.
HTTP
Run node dist/browse-core/cli.js --http behind your HTTPS proxy. The recommended renewable mode sets MCP_AUTH_MODE=oauth, MCP_OAUTH_ISSUER to the exact HTTPS issuer root (trailing slash), and MCP_OAUTH_CLIENT_ID to a registered public client. Configure resource/audience PUBLIC_BASE_URL + /mcp and only ebay:browse:read. The host requests offline_access and holds rotating refresh credentials under the chosen identity provider's policy. Every request validates issuer, resource, client, signature, scope and expiry. The backend holds no caller refresh token. See GROK_SETUP.md and the placeholder-only mcp.template.json; no live consumer OAuth configuration or service is bundled.
Explicit MCP_AUTH_MODE=test-token remains available for isolated labs: set MCP_TEST_TOKEN_SHA256 and MCP_TEST_EXPIRES_AT within seven days. Supply the original bearer privately, never its digest. This fixed credential does not renew and is not the recommended consumer path.
The public HTTP CLI uses bounded Streamable HTTP sessions (up to 16, each lasting at most 10 minutes and, in fixed-token mode, never beyond caller expiry). This routes SDK cancellation to the matching session; reinitialize when a session expires. POST /mcp serves MCP; /health returns only { "ok": true }. Every MCP method authenticates before parsing; authenticated GET returns 405; DELETE with a valid session closes that session, while other DELETE requests return 405. No wildcard CORS, caller query parameters, batch JSON-RPC or seller routes. Non-loopback origins require TLS termination you operate; never expose the plain HTTP listener directly. The library factory defaults to original stateless lab behavior; opt into { sessionCancellation: true } for the public behavior used by the CLI. Stateless mode supports disconnect/deadline cancellation, not cross-POST MCP cancellation notifications. The deployed lab stays unchanged. No automatic public hosting or ingress configuration is provided.
Defaults: 30 authenticated requests/minute (configurable 1–120), four concurrent HTTP requests and four actual provider operations, 64 KiB JSON body, 1 MiB provider response, 128,000-byte structured result, 10-second provider deadline (10–15,000 ms configurable), at most 50 items/page and first 10,000 results. Provider redirects are denied. Cancellation requests also pass authentication/rate/concurrency guards; when a control request is rejected, the provider deadline and actual-work caps still apply. Fixed lab callers expire within seven days. OAuth token lifetimes, refresh rotation and reconnection are managed by the configured client/identity provider. Bounded MCP sessions remain process-local; multiple replicas need affinity or a separate reviewed session-routing design.
Useful searches
Ask: “Find active Saga issue 1 listings, show asks versus bids and shipping, then inspect this result's exact item ID.” q is trimmed, nonempty and limited to 400 characters. category_ids, the provider filter expression and aspect_filter are optional. An aspect filter must include eBay's categoryId; names/values vary by category and marketplace. Do not assume a grading claim is verified. Example input: {"q":"Saga 1","category_ids":"63","limit":10,"offset":0}. No category is silently forced for non-comic searches.
Sort values: price, -price, newlyListed; omitted uses provider relevance. offset must be a multiple of limit. Use the returned next_offset; null means this bounded search cannot offer another page, not that eBay has no other listings. total comes from eBay and can change between calls. match_basis=provider_search_candidates means results can include near matches. Compare issue number (25 is not 125), Cover A/B or other variants, condition/grade, single issue versus bundle/lot and presale wording before comparing prices; inspect the exact result ID and seller-provided aspects. No exact collector-book matching or physical availability is claimed. Currency is preserved; no currency conversions or mixed-currency comparisons. Item lookup accepts exactly one Browse item ID or numeric legacy ID.
Missing price/condition/seller/shipping fields remain null or empty collections; zero bids and a supplied 0.00 shipping cost remain real zero values. Description, images and shipping options have bounded output. Seller grade/aspects, condition descriptions, presale text and estimated dates are claims from eBay/the seller, not stock or delivery guarantees.
For Grok setup, see GROK_SETUP.md. The shared-backend setup and update checklist for Grok, Dot and Muse is CLIENT_SETUP.md.
Compatibility and support
Grok Bot completed status, real search and exact-item retrieval through an existing private hosted instance. Its separate Auth0 connection also renewed automatically after a verified five-minute token expired. This candidate now includes the same optional OAuth resource-server path, qualified locally with a mocked identity provider. It does not bundle the private pilot tenant or a public managed identity service. The candidate's real SDK stdio and HTTP transports are tested locally with synthetic eBay fixtures, including three simultaneous SDK sessions on one backend. Actual Dot and Muse installation, a new user's clean Grok installation, and this revision's final Grok acceptance remain unverified. SDK client names are emulations, not acceptance inside those bot apps. Open Responses support alone does not imply MCP support.
Gmail uses the assistant's own authorized connection. The bundled skill restricts reads to eBay seller notices; the Python standard-library companion prepares a stateless requested email brief. Separate experimental alert commands keep local event/delivery receipts and remain outside this release's advertised scope. No Google credentials or inbox content go to the Browse server. One primary notifying bot per mailbox avoids independent cross-host alerts; separate Grok/Dot/Muse files do not share delivery coordination. See PRIVACY.md for local storage and removal.
get_connection_status reports connector_version; MCP initialization reports the same version. Concurrent calls share one in-flight application-token mint per backend instance. Each waiting caller can cancel independently; abandoned work cannot replace a newer cache value. This is an application-token cache improvement, not distributed seller-refresh coordination.
To update, stop the host connection, review and install a new exact artifact, and retest discovery/search/item. To remove, disconnect the host, remove its command/URL configuration and secret entries, and uninstall/delete the local package. Revoke your own exposed credentials through eBay if needed. The Browse server stores no seller tokens or persistent application database. Requested Gmail briefs create no ledger. Only the excluded experimental alert commands store a private local SQLite ledger; if those were separately enabled, disconnect their routine/Gmail connection before removing that ledger and its artifacts.
Source and dependency notices are included. The included source license is MIT; publisher rights and exact public release approval remain gated in PUBLICATION_GATES.md. Product privacy/terms/support pages and marketplace submission remain separate release gates. There is no paid plan or checkout for this portfolio release.
Companion location and prerequisite check
A remote MCP installation does not install the companion onto an assistant host.
Follow GROK_SETUP.md to place the verified archive in that host's private workspace.
Run python3 /absolute/package/root/companion/cli.py check, then use that same
absolute entrypoint for prepare-brief, render-brief and rank-search. JSON travels
through stdin; shell commands never contain email text. npm run check verifies
Node/Python for source tests. Set EBAY_BUDDY_TEST_PYTHON to a Python 3.10+ executable
when needed; Python is not required for Browse-only server runtime.