Skip to main content
Glama
Japan Used Camera Market MCP Server

Japan Used Camera Market MCP Server

by Enu27

Japan Used Market — MCP server (cameras, watches)

CI npm

An MCP server that lets Claude and other MCP clients search, price and watch Japan's used camera and watch shops. Every tool takes a market: "camera" (default) or "watch".

Market

Shop (sources id)

Coverage

Grades, best → worst

camera

Fujiya Camera, Nakano (fujiya)

full used stock, ~3,500

NEW > A > AB+ > AB > AB- > B > ASIS > PARTS

Sanpou Camera, Jiyugaoka (sanpou)

full used stock, ~1,300

Naniwa / Lemon-sha / Takachiho (naniwa)

new arrivals only, ~200–300

Hard Off Off Mall (hardoff)

cameras and lenses on sale, ~16,000

watch

WATCHNIAN (watchnian)

full used stock, ~3,900; box / warranty card

NEW > UNUSED > SA > A > AB > B > C > JUNK, plus ANTIQUE

Hard Off Off Mall (offmall)

wristwatches on sale, ~24,000

Grades are normalized across shops, and every shop's own label is kept as well. Prices come in JPY and USD. Watches also carry the reference number (e.g. SBGA211, 16233).

It runs the Japan Used Camera Market and Japan Used Watch Market Actors on Apify with your own Apify token, so runs are billed to your Apify account. That is pay per result, and the free plan's monthly credit covers light use.

Renamed from @keiya-dev/japan-used-camera-mcp. The old package still works (it now just starts this one), and calls without market behave exactly as in 0.2.0. Switch the package name in your config when convenient.

Install

You need Node.js 20+ and an Apify API token: Apify Console → Settings → API & Integrations.

Claude Desktop

Edit claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "japan-used-market": {
      "command": "npx",
      "args": ["-y", "@keiya-dev/japan-used-market-mcp"],
      "env": { "APIFY_TOKEN": "apify_api_..." }
    }
  }
}

Restart Claude Desktop. The five tools appear under the 🔨 icon.

Claude Code

claude mcp add japan-used-market -e APIFY_TOKEN=apify_api_... -- npx -y @keiya-dev/japan-used-market-mcp

Cursor / other stdio clients

Command npx, args ["-y", "@keiya-dev/japan-used-market-mcp"], env APIFY_TOKEN.

Streamable HTTP

APIFY_TOKEN=apify_api_... npx -y @keiya-dev/japan-used-market-mcp --http --port 3000
  • Endpoint http://localhost:3000/mcp; health check /health.

  • Each request may send its own token as Authorization: Bearer <APIFY_TOKEN>; otherwise the server's APIFY_TOKEN is used.

  • The server is stateless (POST only, JSON responses).

Related MCP server: ec-mcp

Tools

Tool

What it does

Typical time

list_markets

The markets, their shop ids, grades, price-history coverage and example keywords. No Apify run.

instant

search_listings

Current listings matching keywords / brands / grades / minPriceJpy / maxPriceJpy from the selected sources. Returns shop, title, brand, model key, normalized + raw grade, JPY, USD, stock flag and URL; watches add ref, gender and accessories (e.g. box + warranty card, WATCHNIAN only). maxItems 1–200 (default 20).

15–60 s

price_stats

Per-model summary of in-stock listings right now: count, min / median / max (JPY and USD) by shop and by grade, cheapest listing. maxItems = listings read first (default 300; 0 = everything, ~25 min with all shops).

1–4 min

price_history

Daily min / median / max / count per model, by shop, grade and shop × grade, for the last days (default 90). Reads stored snapshots (since 2026-11-05: daily for Fujiya, Sanpou, Naniwa and WATCHNIAN; weekly on Sundays for Hard Off), so there is no crawling. Needs keywords, brands or models (model keys from price_stats).

seconds

start_monitor

Creates, in your Apify account, a saved Task in monitor mode plus a Schedule (default hourly, cron, timezone) and starts the first run (baseline). Later runs emit only NEW / PRICE_DROP / PRICE_UP / SOLD_OUT, optionally POSTed to alertWebhookUrl (Slack, Discord, n8n…). Your client should confirm with you first; delete the Task/Schedule in Apify Console when done.

~1 min to set up

sources and grades must belong to the chosen market (default: all of its shops). A mismatch, e.g. market: "watch" with sources: ["fujiya"], returns an error naming the valid values without starting a run. Monitors are named jucm-monitor-<name> (camera) or juwm-monitor-<name> (watch) in your Apify account.

Example prompts

  • "What's the cheapest AB-or-better Leica M6 in Japanese shops right now?"

  • "Compare Nikon Zf prices by shop and grade."

  • "How has the median Fujifilm X100VI price moved over the last 30 days?"

  • "Watch for new Voigtländer lenses under ¥80,000 and post them to my Slack webhook https://hooks.slack.com/services/…"

  • "Find a Grand Seiko SBGA211 in SA or better with box and papers, and give me the USD price."

  • "What's the median price of a Rolex 16233 in Japan, by shop?"

  • "Alert me on Discord when a new King Seiko appears."

Develop

npm install
npm test            # tsc build + end-to-end tests (stdio, HTTP, missing token; camera + watch, market validation) against a fake Apify API
npm run start       # stdio
npm run start:http  # HTTP on :3000

APIFY_API_BASE_URL overrides the Apify API base URL (used by the tests).

Notes

  • Not affiliated with any of the shops. Prices are the shops' tax-included asking prices, not sold prices.

  • Data comes from the shops' public listing pages (plus WATCHNIAN product pages for box / warranty card in search). Serial numbers and condition notes are not read.

  • The Actors' READMEs cover coverage, limits and pricing: https://apify.com/keiya_dev/japan-used-camera-market · https://apify.com/keiya_dev/japan-used-watch-market

  • legacy/ is the old @keiya-dev/japan-used-camera-mcp package: a thin wrapper that starts this server.

License

MIT

Available Tools

4 tools
price_historyDaily price history per modelA

Daily min / median / max / count per model, by shop and condition grade, from stored daily snapshots of the shops (Fujiya, Sanpou and Naniwa; collected since 2026-11-05, so the first month is short). No crawling — returns in seconds. Needs keywords, brands or models.

NameRequiredDescriptionDefault
daysNoDays back from today (Japan time).
brandsNoExact brand names, e.g. ["Leica", "Nikon", "FUJIFILM"].
gradesNoNormalized condition grades, best to worst: NEW > A > AB+ > AB > AB- > B > ASIS > PARTS.
modelsNoExact model keys as returned by price_stats ("model" field), e.g. ["leica m6", "nikon zf"].
sourcesNoShops: fujiya (full used stock), sanpou (full used stock), naniwa (new arrivals only), hardoff (Hard Off Off Mall cameras + lenses on sale, ~16,000). Default: all four.
keywordsNoMatch any of these in brand + title (case-insensitive, English or Japanese), e.g. ["Leica M6", "X100VI"].
maxPriceJpyNo
minPriceJpyNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and does well: it discloses the data source (stored daily snapshots), performance expectations (returns in seconds, no crawling), and a material data caveat (collection began 2026-11-05, first month is short). It stops short of describing result size, pagination, or behavior when all filters are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the returned metrics and followed by the freshness/performance caveats. Minor noise: the shop list is repeated from the schema, and it names only Fujiya, Sanpou and Naniwa while `sources` also includes hardoff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, no-output-schema, no-annotation tool, the description covers the return shape and data freshness but leaves the two price-bound parameters unexplained and omits hardoff from the snapshot coverage. The unenforced "needs keywords, brands or models" requirement is a notable unresolved ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the baseline is 3. The description adds the collection start date, which gives the `days` parameter real meaning, but it ignores minPriceJpy/maxPriceJpy entirely, and "Needs keywords, brands or models" conflicts with a schema declaring zero required parameters - an agent could reasonably expect a validation error that will not occur.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and output shape: "Daily min / median / max / count per model, by shop and condition grade." The phrase "from stored daily snapshots ... No crawling — returns in seconds" implicitly separates it from a live-crawl sibling like search_listings, but neither price_stats nor search_listings is named, so sibling routing is left partly to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Needs keywords, brands or models" gives a precondition for use, which is real guidance. However, there is no explicit when-not, no statement of how this differs from price_stats (which supplies the model keys), and no guidance on what happens if no filter is supplied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

price_statsCurrent price stats per modelA

Per-model price summary of in-stock listings right now: count and min / median / max (JPY and USD), broken down by shop and by normalized condition grade, plus the cheapest listing. Use keywords to stay fast (~1–4 min).

NameRequiredDescriptionDefault
brandsNoExact brand names, e.g. ["Leica", "Nikon", "FUJIFILM"].
gradesNoNormalized condition grades, best to worst: NEW > A > AB+ > AB > AB- > B > ASIS > PARTS.
sourcesNoShops: fujiya (full used stock), sanpou (full used stock), naniwa (new arrivals only), hardoff (Hard Off Off Mall cameras + lenses on sale, ~16,000). Default: all four.
keywordsNoMatch any of these in brand + title (case-insensitive, English or Japanese), e.g. ["Leica M6", "X100VI"].
maxItemsNoListings to read before summarizing (0 = all; a full read of all shops takes ~4 min).
maxPriceJpyNo
minPriceJpyNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it discloses latency (~1–4 min), that only in-stock listings are counted, and exactly what aggregates are returned. It does not explicitly state read-only behavior or rate limits, but the latency warning is the operationally important trait for a long-running read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence, front-loaded with the core purpose and return contents, ending with the actionable performance hint. The parenthetical currency and timing details earn their space, though the sentence is long enough to be slightly harder to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description effectively substitutes for one by enumerating the returned statistics and their groupings. The main residual gap is the two undocumented price-bound filters, plus no explicit statement of read-only semantics for a 7-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71%, so the baseline is 3, and the description adds real value on top: it links keywords to reduced runtime and maps the shop/condition breakdown outputs back to the sources and grades filters. minPriceJpy and maxPriceJpy remain undocumented in both schema and description, which keeps it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource precisely (per-model price summary of in-stock listings) and enumerates the computed statistics (count, min/median/max in JPY and USD, per-shop and per-grade breakdowns, cheapest listing). That distinguishes it from search_listings and price_history by implication, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: an agent can infer this is the tool for aggregate current pricing rather than listing retrieval or historical trends. The only explicit guidance is the performance tip to use keywords to stay fast, with no when-not-to-use conditions or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_listingsSearch used camera listings in JapanA

Search current used camera / lens listings at Japanese shops (Fujiya Camera, Sanpou Camera, Naniwa new arrivals, Hard Off Off Mall). Returns title, brand, normalized condition grade, price in JPY and USD, stock status and URL. Takes ~15–60 s.

NameRequiredDescriptionDefault
brandsNoExact brand names, e.g. ["Leica", "Nikon", "FUJIFILM"].
gradesNoNormalized condition grades, best to worst: NEW > A > AB+ > AB > AB- > B > ASIS > PARTS.
sourcesNoShops: fujiya (full used stock), sanpou (full used stock), naniwa (new arrivals only), hardoff (Hard Off Off Mall cameras + lenses on sale, ~16,000). Default: all four.
keywordsNoMatch any of these in brand + title (case-insensitive, English or Japanese), e.g. ["Leica M6", "X100VI"].
maxItemsNoStop after this many matching listings (1–200).
maxPriceJpyNo
minPriceJpyNo
includeSoldOutNoAlso return listings marked sold out.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and usefully discloses source coverage, returned fields, and a 15–60 s latency expectation. It does not clarify read-only behavior, authentication needs, failure modes, or whether results are cached/live beyond the word 'current'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences: purpose first, returned fields second, latency last. Every sentence adds relevant information without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an eight-parameter search tool with no output schema and no annotations, the description supplies the key return shape, source scope, and expected latency. It remains slightly incomplete on price-filter semantics, sorting behavior, and operational caveats, but is sufficient for an agent to understand and call the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already documents most parameters, including brands, grades, sources, keywords, maxItems, and includeSoldOut. The description adds little parameter-specific meaning beyond mentioning source shops and normalized condition grades, and the min/max price filters are left without extra explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: searching current used camera/lens listings at named Japanese shops. It clearly distinguishes the tool from price-oriented siblings by focusing on live listings, though it does not explicitly reference the sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context implies this is the tool for finding current listings rather than price statistics, price history, or monitoring. However, it provides no explicit when-to-use guidance, exclusions, or routing against the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_monitorStart a change monitor (scheduled)A

Creates, in the user's own Apify account, a saved Task running this Actor in monitor mode and a Schedule for it (hourly by default), then starts the first run to record the baseline. Later runs emit only changes (NEW / PRICE_DROP / PRICE_UP / SOLD_OUT) and can POST them to a Slack / Discord / n8n webhook. This creates resources and recurring runs that use the user's Apify credit — confirm with the user first.

NameRequiredDescriptionDefault
cronNoCron expression for the Schedule (default hourly). Please not more often than every 15 minutes.0 * * * *
nameYesShort id for the Task and Schedule, lowercase letters, digits and dashes, e.g. "leica-m-watch".
brandsNoExact brand names, e.g. ["Leica", "Nikon", "FUJIFILM"].
gradesNoNormalized condition grades, best to worst: NEW > A > AB+ > AB > AB- > B > ASIS > PARTS.
sourcesNoShops: fujiya (full used stock), sanpou (full used stock), naniwa (new arrivals only), hardoff (Hard Off Off Mall cameras + lenses on sale, ~16,000). Default: all four.
keywordsNoMatch any of these in brand + title (case-insensitive, English or Japanese), e.g. ["Leica M6", "X100VI"].
timezoneNoAsia/Tokyo
alertEventsNoEvent types to output and send. Default: NEW and PRICE_DROP.
maxPriceJpyNo
minPriceJpyNo
alertWebhookUrlNoSlack / Discord incoming webhook or any URL that accepts a JSON POST.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does it well: it discloses that resources are created in the user's own Apify account, that runs are recurring and billable against their credit, that a baseline run happens immediately, and that later runs only emit deltas which may be POSTed to a webhook. This is exactly the side-effect and cost information an agent needs before invoking a mutating, scheduled tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what happens and followed by the risk warning; nothing is redundant. The cost/confirmation warning is placed at the end where it functions as a final gate before invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, annotation-free tool with no output schema, the description covers the mutation and cost side well but says nothing about what is returned (task ID, schedule ID, run ID) or how a monitor is later stopped or modified. Those omissions matter because nothing else in the definition supplies them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 73% and the schema already documents cron defaults, grade ordering, source semantics, and alertEvents defaults, so the description adds little parameter-level detail beyond restating the event types and the default hourly cadence. It does not explain how filters like brands/keywords/price bounds interact with the change detection, which would have been genuine added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb chain and resources: creates a saved Task in monitor mode, a Schedule, and starts a baseline run. It also clarifies that subsequent runs emit only change events, which cleanly separates this write/setup tool from the read-only siblings search_listings, price_stats, and price_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear operating context (long-running monitoring with change-only output) and an explicit precondition -- confirm with the user first because it consumes Apify credit. It never explicitly contrasts itself with the sibling query tools (e.g. 'use search_listings for a one-off check'), so the alternative selection is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.3.0
    • First observedprice_history
    • First observedprice_stats
    • First observedsearch_listings
    • First observedstart_monitor

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct mode of access: live search, current aggregate stats, stored historical snapshots, and automated monitoring setup. The only potential overlap is price_stats vs price_history, but the descriptions cleanly separate 'in-stock right now' from 'stored daily snapshots over time'. No two tools appear interchangeable.

Naming Consistency4/5

All names use snake_case, which is consistent, but the verb pattern is mixed: search_listings and start_monitor are verb_noun while price_stats and price_history are noun-only. Still highly readable and predictable enough for an agent to infer purpose.

Tool Count4/5

Four tools is on the lean side but each maps to a genuinely different capability (search, aggregate, history, monitoring), so nothing feels redundant. Marginal thinness aside, the surface is well-scoped for a niche market-data server.

Completeness4/5

The find-analyze-track lifecycle is covered: search live listings, summarize current prices, query historical trends, and set up ongoing monitoring. Minor gaps exist (no single-listing detail fetch, no way to enumerate supported shops/brands/models, no monitor management/edit), but agents can work around these via keyword search and start_monitor's parameters.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to search and compare prices across Japanese used camera, watch, luxury brand, and instrument marketplaces from multiple stores, returning price, brand, condition, and source store information.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables searching products, fetching item details, listing categories, and viewing seller profiles for Japanese marketplaces Mercari and Yahoo! Flea Market via MCP tools.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query live pricing, resale, company KYC, SEC filings, patents, trademarks, public tenders, auctions and related market intelligence through MCP, returning clean typed JSON from primary sources on a pay-per-result basis.
    MIT