MCP
Streamable HTTP tools for agents — same product jobs as /api/v3 REST
Last updated:
ConnectLink copied!
Endpoint: https://silphcoanalytics.xyz/api/v3/mcp/. Send Authorization: Bearer with a dashboard API key (sk_live_...) or an MCP OAuth access token. Core market tools also run without a key at the playground tier. Caller-owned tools and get_usage require a verified user identity; a browser key plus x-silph-user-tokenis supported. A get_usage call without that identity returns HTTP 401 with error: "user_required".
Muse / MCP OAuth: /connectors/muse.md. Discovery: /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource/api/v3/mcp. Login is Google. Signed-in free is 2,000 API units/month and 10 chat messages/month. Pro is $12.99/mo.
Clients need the Streamable HTTP transport, custom request headers, and redirect-following — the bare path 307s to the trailing-slash URL. The server is stateless: each POST is independent (multi-worker safe); Bearer auth on every call. SDKs may still send mcp-session-id, but stale IDs are ignored.
Keyless price is REST only: GET /api/v3/price?tcg_card_id=swsh7-215&grade_key=PSA:10. Load the skill first: /skill-api.md. Full getting-started copy: /docs/reference/mcp.md.
ToolsLink copied!
Public product jobs — market data plus seller discovery, caller-owned lists, and caller-scoped usage when signed in (JWT or x-silph-user-token):
search— card lookup:qfor name/id search, or anidslist for batch resolve. Ambiguous names return candidates (never silent top-1). A query that names a set or era also returnsset_matches/era_matches— pass the id asset_idoreraon set-scoped tools.oracle— SilphCo Price per locked grain (rowswithgradeon every row): readprice.value_usdfrom theprice.v2object.methodandoutliersselect the estimator. There is no fallback across grade, finish, language, or edition: a row withstatus: nonehas a nullvalue_usd.price_history/get_sales/get_listings— price history, recent sales, and live asks; all takeidslists, and sales/listings also scope byset_id.get_population— graded slab counts (PSA/BGS/CGC) by grade for individual cards, viaidsorqueries, with an optionalgraderfilter.price_history— per-card or set-finish price history for charts.list_user_lists/get_list_contents/analyze_list_holdings— read caller-owned lists;get_list_contentsacceptslist_idorlist_nameto select a named list; paginate contents withcursor/next_cursor.get_list_analytics— one call of analytics for a list of 50-100+ cards: per entry, at its exact grade and finish, the price, last clean sale, 90-day median, trend, lowest live ask, population and distance to your target, plus rollups by series, grade, population band, price band and card type. Costs 1 unit per distinct card analyzed.set_watchlist_targetssets or clears per-entry target prices on a watchlist.add_to_watchlist/remove_from_watchlistaccept optionallist_idorlist_nameselectors for named watchlists; omitting both keeps the default Watchlist. /add_cards_to_list/remove_cards_from_list— idempotent writes scoped to the authenticated caller (nouser_idparam).create_list/rename_list/delete_list— list lifecycle.delete_listis two-step: the first call reports the item count asneeds_confirmand changes nothing, then call again withconfirm=true. The default Watchlist is protected; named watchlists can be renamed or deleted.update_holding— correct a saved lot in place:quantity(absolute, not a delta),cost_basis_usd,grade_key,finish,acquired_at,notes.add_cards_to_listonly merges quantity upward and cannot set a cost basis.get_usage— the identified caller's own consumption: units used today against the daily limit, daily history, which endpoint families cost them, and a per-MCP-tool split (by_mcp_tool). Units are the billed quantity, not request counts.
execute_sql is not available on public MCP. Tool failures return result.isError: true with a JSON-RPC 200 — check the envelope, not just the status code.
Public MCP version 1.49.1 — market tools on every dashboard key; list tools and get_usage require a signed-in user. Agents can read the full changelog over MCP at silphco://changelog, and the published filter vocabularies at silphco://vocab; the version is also served as mcp_version on the status payload and serverInfo.version on initialize.
Agent patternsLink copied!
Identity, then filters. search(q="Nidoking") resolves the card; pass finish="reverse_holo" on oracle or get_listings. A set title or era phrase is not a card name — pass set_id or era on set-scoped tools.
δ-era commons (ex11-ex15). get_sales(era=delta_species, rarity=Common) or get_listings(era=delta_species).
Population vs grade spread. get_population answers how many slabs exist by grade. One card's graded spread is a different question — use oracle with one row per grade.
Batch firstLink copied!
oracle, get_sales, and get_listings take ids lists; search takes q or an ids list — one call, same cost as the ids inside it.
Client configLink copied!
{
"mcpServers": {
"silphco": {
"server_url": "https://silphcoanalytics.xyz/api/v3/mcp/",
"headers": {
"Authorization": "Bearer ${SILPH_API_KEY}"
}
}
}
}Two entries that point at the same URL expose the same tools: the server name in your client config (Cursor shows entries such as user-silphco and user-silphco--evan) is only a local label — the account each entry acts as is set solely by the Authorization: Bearer key in that entry's headers (or by its OAuth login). Name each entry after the key it uses.
Fanatics Collect rows refresh in roughly 12-hour batches (observed about 07:00 and 19:00 UTC); weekly-auction current_bid_usd / bid_count arrive in the same batch — bids are not polled more often than fixed asks. Read each row's observed_at for its batch; per-source cadence is in the API contract notes.
Need REST instead? Agents and reference → For agents. Full handshake curl walkthrough: /docs/reference/mcp.md.