Card Grader MCP avatar

Card Grader MCP

Pricing

from $30.00 / 1,000 card identification (single photo)s

Go to Apify Store
Card Grader MCP

Card Grader MCP

Vision-based trading card identification, centering analysis, and grading assessment. Supports Pokémon, Magic: The Gathering, Yu-Gi-Oh!, and sports cards.

Pricing

from $30.00 / 1,000 card identification (single photo)s

Rating

0.0

(0)

Developer

Brian Mowell

Brian Mowell

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

8 days ago

Last modified

Share

Vision-based trading card identification, centering analysis, and grading assessment.

Supported card types: Pokémon TCG, Magic: The Gathering, Yu-Gi-Oh!, sports cards (Topps, Panini, Upper Deck, Bowman, etc.)

Grading services: CGC, PSA, BGS, SGC, TAG


Tools

ToolDescriptionPPE
identify_cardSingle front photo → name, set, rarity, centering, value$0.03
identify_card_both_sidesFront + back → full centering both sides + damage$0.05
analyze_centeringCentering-only analysis → L/R, T/B ratios, CGC/PSA/BGS sub-grades$0.03
estimate_card_valueText-only value lookup (no image needed)$0.02
grade_assessmentFull submission assessment → submit/borderline/skip + reasoning$0.04

Setup

Environment Variables

$export ANTHROPIC_API_KEY="sk-ant-..."

Set in Apify Console → Source → Environment Variables (mark as secret).

Local Development

cd card-grader
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
export ANTHROPIC_API_KEY="sk-ant-..."
python run_server.py

Server starts on http://localhost:4321/mcp


Testing

Encode a test image

$BASE64=$(base64 -w 0 /path/to/card.jpg)

Test identify_card

from server import identify_card
import base64
with open("card.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
result = identify_card(image_data=b64, mime_type="image/jpeg")
print(result)

Test analyze_centering

from server import analyze_centering
import base64
with open("card.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
result = analyze_centering(image_data=b64)
print(result["centering"])

Test estimate_card_value (no image)

from server import estimate_card_value
result = estimate_card_value(
card_name="Charizard",
card_set="Base Set",
card_number="4/102",
year=1999,
rarity="holo rare",
card_variant="shadowless",
condition="near mint raw",
)
print(result)

Test grade_assessment

from server import grade_assessment
import base64
with open("card.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
result = grade_assessment(
image_data=b64,
target_grade="10",
grading_service="CGC",
)
print(result["assessment"]["submission_recommendation"])
print(result["assessment"]["cgc_summary"])

Test identify_card_both_sides

from server import identify_card_both_sides
import base64
with open("front.jpg", "rb") as f:
front_b64 = base64.b64encode(f.read()).decode()
with open("back.jpg", "rb") as f:
back_b64 = base64.b64encode(f.read()).decode()
result = identify_card_both_sides(
front_image_data=front_b64,
back_image_data=back_b64,
)
print(result["card"]["cgc_summary"])

Deploy to Apify

rm -rf venv
apify push

After push: re-enable Actor Standby in Apify Console → Settings.

Claude Desktop config

{
"mcpServers": {
"card-grader": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://YOUR_USERNAME--card-grader.apify.actor/mcp?token=apify_api_XXXXX"]
}
}
}

CGC Centering Scale Reference

Sub-GradeL/R & T/B
10 (Pristine)55/45 or better
9.5 (Gem Mint)60/40 or better
9 (Mint)65/35 or better
8.5 (NM/Mint+)65/35–70/30
8 (NM/Mint)70/30–75/25
7.5 and belowWorse than 75/25

Note: Centering is measured from photos. Corners, edges, and surface require hands-on inspection for accurate sub-grades.


License

MIT — Mowell Labs 2025