{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T18:31:07.506Z","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp","markdownUrl":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp.md","server":{"slug":"mildo-ai-provenio","name":"Provenio — Art Intelligence","registryName":"io.github.mildo-ai/provenio","description":"Art provenance intelligence — 282K-node knowledge graph with cited answers and honest gaps.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"api-mcp","type":"remote","identifier":"https://provenio.art/api/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp","version":"0.4.2","transport":null,"scoredAt":"2026-11-05T06:44:42.225Z"},"score":{"total":25,"tier":"low","status":"scored","weekDelta":0,"history":[{"date":"2026-11-05","total":25},{"date":"2026-11-04","total":25},{"date":"2026-11-03","total":25},{"date":"2026-11-02","total":25},{"date":"2026-11-01","total":25},{"date":"2026-10-31","total":25},{"date":"2026-10-30","total":25},{"date":"2026-10-29","total":25},{"date":"2026-10-28","total":25},{"date":"2026-10-27","total":25},{"date":"2026-10-26","total":25},{"date":"2026-10-25","total":25},{"date":"2026-10-24","total":25},{"date":"2026-10-23","total":25},{"date":"2026-10-22","total":25},{"date":"2026-10-21","total":25},{"date":"2026-10-20","total":25},{"date":"2026-10-19","total":25},{"date":"2026-10-18","total":25},{"date":"2026-10-17","total":25},{"date":"2026-10-16","total":25},{"date":"2026-10-15","total":25},{"date":"2026-10-14","total":25},{"date":"2026-10-13","total":25},{"date":"2026-10-12","total":25},{"date":"2026-10-10","total":25},{"date":"2026-10-09","total":25},{"date":"2026-10-04","total":25},{"date":"2026-10-03","total":25},{"date":"2026-10-02","total":25}]},"categories":[{"name":"Endpoint Security","score":63,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","HTTPS is enforced; there's no plaintext access path.","The HSTS (Strict-Transport-Security) header is present.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.unreachable","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_present","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":0,"verdict":"fail","reasons":["Transport check failed: declared streamable-http, but the endpoint returned HTTP 404."],"codes":[{"code":"transport.http_error","args":{"status":"404","transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":0,"verdict":"unverified","reasons":["Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list."],"codes":[{"code":"schema.unreachable","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":0,"verdict":"unverified","reasons":["Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolquality.unreachable","args":{}}]},{"name":"Tool Safety","score":0,"verdict":"unverified","reasons":["Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list."],"codes":[{"code":"toolsafety.unreachable","args":{}}]},{"name":"Capabilities","score":0,"verdict":"unverified","reasons":["Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"codes":[{"code":"cap.unreachable","args":{}}]}],"inconclusive":["Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.","Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.","Stability not yet verified: not enough scan history yet (needs a 30-day window).","Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.","Capabilities not yet verified: we couldn't read the endpoint's capabilities."],"malware":[],"components":[{"slug":"api-mcp","type":"remote","identifier":"https://provenio.art/api/mcp","withdrawn":false,"score":25,"current":true,"url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp","markdownUrl":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp.md"}],"facts":[{"label":"Endpoint","value":"https://provenio.art/api/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"0.4.2"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"search_artists","title":null,"description":"Cost: ~0.4s. Shortlist person nodes by name/nationality/era. Returns [{id, display_name, birth_year, death_year, nationality, era}].\nUse when: you have a name but no person ID. Try a partial name if exact match fails (e.g. 'Basquiat' not 'Jean-Michel Basquiat').\nDo NOT use if: you already know the ID — call get_artist directly (one call).\nReturns person IDs in 'person:slug' format — pass these directly as the 'artist' parameter in search_artworks.\nSTOP after this unless you need a specific artist's full profile.","inputs":[{"name":"era","type":"string","required":false,"description":"Substring match against era, e.g. 'baroque', 'modernism', 'contemporary'."},{"name":"limit","type":"integer","required":false,"description":"Max rows returned. Default 20. Check has_more to know if more exist."},{"name":"nationality","type":"string","required":false,"description":"Substring match, e.g. 'dutch', 'japanese', 'french'. Combined with other filters as AND."},{"name":"query","type":"string","required":true,"description":"Free-text substring match on display_name and id (case-insensitive). Use empty string '' to browse by filters only."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":254},{"name":"search_artworks","title":null,"description":"Cost: ~0.5s. Shortlist artworks by title/artist/medium/date, or risk-filter (provenance_risk, attribution_status). Returns summary rows.\nUse when: you need a list, not one work's detail.\nDo NOT use if: you know the artwork ID — call get_artwork (one call contains iconography + custody + polity + transactions).\nDo NOT chain multiple search_artworks calls for the same work — use get_artwork after you have the ID.\nDo NOT put artist names in the query field alone — use the artist filter with the person ID slug (e.g. 'person:jean-michel-basquiat'). If title is ambiguous, combine query + artist filter.\nTitle match is substring (ILIKE %query%). For best results, use the artist filter rather than embedding artist name in query.\nNote: when provenance_risk filter is used, returns coverage_gaps: ['no_custody_history'] when the matching custody record pool is smaller than expected — interpret this as a data-density limitation, not a clean result.\nSTOP after this unless you need deep detail on ONE artwork.","inputs":[{"name":"artist","type":"string","required":false,"description":"Filter by creator — person ID slug ('picasso') or full 'person:...' form (e.g. 'person:jean-michel-basquiat'). Obtain this from search_artists if needed."},{"name":"attribution_status","type":"string","required":false,"description":"Filter by authorship status. 'disputed' surfaces contested attributions; 'workshop' surfaces 'Workshop of X' works; 'anonymous' surfaces unattributed; 'single_author' surfaces those with confirmed cr…"},{"name":"date_from","type":"integer","required":false,"description":"Earliest production year (inclusive)."},{"name":"date_to","type":"integer","required":false,"description":"Latest production year (inclusive)."},{"name":"limit","type":"integer","required":false,"description":"Max rows. Default 10."},{"name":"medium","type":"string","required":false,"description":"Substring match on medium, e.g. 'oil', 'bronze', 'watercolor'."},{"name":"provenance_risk","type":"string","required":false,"description":"Surface artworks whose custody_history matches a risk profile. Use for bulk due-diligence audits."},{"name":"query","type":"string","required":true,"description":"Substring match on title and id (ILIKE %query%). Empty '' browses all. Do NOT embed artist names here — use the artist parameter instead."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":470},{"name":"search_auction_history","title":null,"description":"Cost: ~0.7s. Auction transaction rows with optional percentile_summary=true to also return P25/50/75/90 + realized-vs-estimate in ONE call.\nUse when: need lot-level prices OR percentile stats.\nDo NOT use if: you only need per-artist aggregates — use query_market_summary.\nSINGLE-CALL FRIENDLY — combine filters + percentile_summary for appraisal work.","inputs":[{"name":"artist_name","type":"string","required":false,"description":"Artist name substring, e.g. 'Basquiat', 'Gauguin'. Case-insensitive."},{"name":"artwork_id","type":"string","required":false,"description":"Filter by specific artwork ID slug or full 'artwork:...'."},{"name":"date_from","type":"string","required":false,"description":"ISO date or year, e.g. '1990' or '1990-05-01'."},{"name":"date_to","type":"string","required":false,"description":"ISO date or year for upper bound."},{"name":"limit","type":"integer","required":false,"description":"Max rows. Default 10."},{"name":"medium_keyword","type":"string","required":false,"description":"Substring match against artwork medium (joins via artwork_id). E.g. 'oil', 'bronze', 'watercolor', 'print'."},{"name":"min_price_usd","type":"integer","required":false,"description":"Minimum price in USD. Uses price_usd_2024_cpi when available, else nominal USD. 1e6 = 1 million."},{"name":"percentile_summary","type":"boolean","required":false,"description":"If true, also return P25/P50/P75/P90 percentiles and avg realized/estimate ratio over the filtered set. Use for appraisal / comp-set analysis."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":314},{"name":"get_artist","title":null,"description":"Cost: ~1s. Composite artist profile — identity + reception + 1-hop influence in/out + education + market aggregates. SINGLE CALL USUALLY SUFFICIENT.\nUse when: you have an artist ID and need their full picture.\nDo NOT chain with get_influence_network unless you need depth > 1. Do NOT use for multi-artist comparison — use query_market_summary.","inputs":[{"name":"artist_id","type":"string","required":true,"description":"Person ID slug ('paul-gauguin') or full 'person:...' ID. Case-sensitive slug."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":117},{"name":"get_artwork","title":null,"description":"Cost: ~1s. Composite artwork profile — metadata + Panofsky subjects + reception + custody + polity + transactions. SINGLE CALL USUALLY SUFFICIENT.\nUse when: you have an artwork ID.\nDo NOT chain with get_provenance_chain unless you need gap-risk flags specifically.","inputs":[{"name":"artwork_id","type":"string","required":true,"description":"Artwork ID slug or full 'artwork:...' ID."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":88},{"name":"get_movement_context","title":null,"description":"Cost: ~0.5s. Concept node + linked artworks. Pass cross_tradition=true for hasFunctionalAnalog concepts (lotus↔rose). SINGLE CALL USUALLY SUFFICIENT.\nUse when: definitional context or iconography cluster.\nDo NOT use for artwork filters — use search_artworks.","inputs":[{"name":"concept_id","type":"string","required":true,"description":"Concept ID slug ('period-dutch-golden-age', 'movement-impressionism', 'iconography-lotus-purity') or full 'concept:...' ID."},{"name":"cross_tradition","type":"boolean","required":false,"description":"If true, also return concepts linked via hasFunctionalAnalog for cross-tradition analogy queries."},{"name":"limit","type":"integer","required":false,"description":"Max linked artworks. Default 20."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":156},{"name":"get_influence_network","title":null,"description":"Cost: ~2-3s. N-hop influence BFS. Use ONLY when depth>1 needed — get_artist already has 1-hop.","inputs":[{"name":"direction","type":"string","required":false,"description":"outgoing = who the seed influenced; incoming = who influenced the seed; both = union."},{"name":"max_depth","type":"integer","required":false,"description":"BFS depth. Default 2. Keep ≤3 unless needed — cost grows combinatorially."},{"name":"seed_person_id","type":"string","required":true,"description":"Seed artist — person ID slug or full 'person:...'."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":110},{"name":"get_reception_arc","title":null,"description":"Cost: ~1s. Time-ordered reception claims for artist or artwork. Use for valence-shift narrative. Use query_reception_price_correlation if you also need price.","inputs":[{"name":"artist_id","type":"string","required":false,"description":"Person ID slug or 'person:...'. Mutually exclusive with artwork_id."},{"name":"artwork_id","type":"string","required":false,"description":"Artwork ID slug or 'artwork:...'. Mutually exclusive with artist_id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":94},{"name":"get_provenance_chain","title":null,"description":"Cost: ~1s. Custody timeline + gap-risk flags (Nazi, colonial, Russian Rev, Knoedler 1970-2009). Use only for deep due diligence — get_artwork already has basic custody.","inputs":[{"name":"artwork_id","type":"string","required":true,"description":"Artwork ID slug or full 'artwork:...' ID."},{"name":"period_end","type":"integer","required":false,"description":"Restrict chain to custody periods overlapping this year or earlier (e.g. 1945)."},{"name":"period_start","type":"integer","required":false,"description":"Restrict chain to custody periods overlapping this year or later (e.g. 1933 for Nazi-era slice)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":133},{"name":"get_lineage_cluster","title":null,"description":"Cost: ~1s. Formal teacher/student cluster (education_lineage). Use for academic lineage. For conceptual influence: get_influence_network.","inputs":[{"name":"artist_id","type":"string","required":true,"description":"Seed person ID slug or 'person:...'."},{"name":"include_students","type":"boolean","required":false,"description":"Include people who studied under the seed."},{"name":"include_teachers","type":"boolean","required":false,"description":"Include people the seed studied under."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":86},{"name":"find_comparable_artworks","title":null,"description":"Cost: ~2s. Comparable set. EITHER artwork_id seed → similar works, OR artist_id seed → peer artists. Not for same-artist lot history (use search_auction_history).","inputs":[{"name":"artist_id","type":"string","required":false,"description":"Seed artist person ID slug or 'person:...'. Returns peer artists by era/polity/tradition overlap. Mutually exclusive with artwork_id."},{"name":"artwork_id","type":"string","required":false,"description":"Seed artwork ID slug or 'artwork:...'. Mutually exclusive with artist_id."},{"name":"iconographic_subject","type":"string","required":false,"description":"Optional subject keyword (artwork_seed mode only)."},{"name":"limit","type":"integer","required":false,"description":null},{"name":"medium_keyword","type":"string","required":false,"description":"Medium keyword (artwork_seed mode only)."},{"name":"patron_class","type":"string","required":false,"description":"Patron class keyword (artwork_seed mode only)."},{"name":"period","type":"string","required":false,"description":"Period concept ID or keyword."},{"name":"years_back","type":"integer","required":false,"description":"Lookback window from today, default 15."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":201},{"name":"query_market_summary","title":null,"description":"Cost: ~2s. Per-artist market aggregates × reception × polity. Use for cross-artist comparison. Single artist deep profile: get_artist. Individual lots: search_auction_history.","inputs":[{"name":"artist_id","type":"string","required":false,"description":"Specific artist."},{"name":"era","type":"string","required":false,"description":"Era substring (e.g. 'contemporary', 'modern')."},{"name":"limit","type":"integer","required":false,"description":null},{"name":"min_price_usd","type":"integer","required":false,"description":"Min across max_usd_2024 → max_realized_price_usd → max_usd_nominal (whichever available)."},{"name":"polity","type":"string","required":false,"description":"Polity name substring (e.g. 'French Republic', 'Qing')."},{"name":"reception_register","type":"string","required":false,"description":"Filter by the artist's latest reception register."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":157},{"name":"query_polity_dispersal","title":null,"description":"Cost: ~2s. Polity-origin artworks now dispersed. Use for restitution/cultural-heritage analysis. For simple list: search_artworks.","inputs":[{"name":"polity_id","type":"string","required":true,"description":"Polity ID slug or 'place:...' (e.g. 'benin-kingdom')."},{"name":"rank_by_claim_priority","type":"boolean","required":false,"description":"If true, add claim_priority_score to each row (seizure=3, unknown=2, gift/bequest=1; +1 if within collapse window) and sort DESC. Repatriation advocate use case."},{"name":"years_after_collapse","type":"integer","required":false,"description":"How many years after collapse to count as 'dispersal-adjacent'. Default 80 — Nazi-era (Third Reich, place:polity-nazi-germany) restitutions typically occur 50-70 years after 1945 (e.g. Klimt's Adele…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":227},{"name":"get_exhibition_history","title":null,"description":"Cost: ~0.5s–1s. Exhibition history for an artist OR artwork. SINGLE CALL.\nReturns normalised exhibition records (exhibitions table) when available; falls back to\nknowledge-graph event nodes (raw_json scan) when the normalised table is empty.\nCoverage: 94 curated events for 20+ artists as of 2026-04-24.\nFor artists with no data, returns actionable guidance including the exact CLI command\nto run artsy_exhibitions.py to ingest missing records.\nAlways returns coverage_gaps and suggested_next_tools when data is sparse or absent.","inputs":[{"name":"artist_id","type":"string","required":false,"description":"Person ID slug or 'person:...'. Mutually exclusive with artwork_id."},{"name":"artwork_id","type":"string","required":false,"description":"Artwork ID slug or 'artwork:...'. Mutually exclusive with artist_id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":180},{"name":"get_career_trajectory","title":null,"description":"Cost: ~2s. Artist career trajectory analysis: milestones, career stage, pattern detection (A–E), and comparable historical artists who followed the same path.\nCareer stages: PRE_MARKET → REGIONAL → CRITICAL_PHASE → MARKET_ENTRY → ESTABLISHED.\nPatterns: A=institutional escalation, B=curator championing, C=movement anchor, D=late market discovery, E=diaspora rediscovery.\nUse for: emerging artist discovery, gallery acquisition decisions, curator narrative building.\nDo NOT use for purely biographical queries — use get_artist instead.","inputs":[{"name":"artist_id","type":"string","required":true,"description":"Person ID slug or 'person:...'. Required."},{"name":"include_comparables","type":"boolean","required":false,"description":"Whether to include historical comparable artists (default true). Set false to reduce latency."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":170},{"name":"query_reception_price_correlation","title":null,"description":"Cost: ~2s. Reception × price timeline for one artist. Combines get_reception_arc + price trend in one call.","inputs":[{"name":"artist_id","type":"string","required":true,"description":"Person ID slug or 'person:...'."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":55},{"name":"compare_career_patterns","title":null,"description":"Cost: ~4s. Side-by-side career trajectory comparison for two artists.\nReturns full trajectory data for each + a structured comparison: pattern overlap score, career stage delta, exhibition/market delta, interpretation, and recommendation.\nUse when: gallery wants to pitch an emerging artist by showing they mirror a validated comparable's early career.\nUse when: curator needs narrative evidence that artist A is at the same inflection point artist B was at in year X.\nDo NOT use when: you need data on one artist — use get_career_trajectory instead.\nDo NOT use when: you want to discover emerging artists — use find_emerging_artists_by_pattern instead.","inputs":[{"name":"artist_id_1","type":"string","required":true,"description":"First artist — person ID slug or 'person:...'."},{"name":"artist_id_2","type":"string","required":true,"description":"Second artist — person ID slug or 'person:...'. Use a well-documented historical artist as the benchmark."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":196},{"name":"find_emerging_artists_by_pattern","title":null,"description":"Cost: ~3s. Discover emerging artists whose current KG footprint matches a historical career pattern.\nPatterns: A=institutional_escalation, B=curator_championing, C=movement_anchor, D=late_market_discovery, E=diaspora_rediscovery.\nReturns ranked candidates with confidence score, exhibition/market data, and signal summary.\nUse when: gallery wants a shortlist of artists at an early inflection point matching a proven pattern.\nUse when: curator is building a thematic exhibition and wants artists at the right career stage.\nUse when: collector wants names not yet on the market radar.\nDo NOT use when: you already have a specific artist in mind — use get_career_trajectory instead.\nDo NOT use when: you want to compare two artists — use compare_career_patterns instead.\nCoverage note: results depend on exhibition data ingested; artists with no exhibition records won't appear.","inputs":[{"name":"birth_year_after","type":"number","required":false,"description":"Filter to artists born after this year. Default varies by pattern."},{"name":"limit","type":"number","required":false,"description":"Max candidates to return (1–30). Default 10."},{"name":"min_confidence","type":"number","required":false,"description":"Minimum confidence score (0–1). Default 0.35."},{"name":"pattern","type":"string","required":true,"description":"Pattern to search: 'A_institutional_escalation', 'B_curator_championing', 'C_movement_anchor', 'D_late_market_discovery', or 'E_diaspora_rediscovery'. Single letter also accepted (e.g. 'A')."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":321},{"name":"search_galleries","title":null,"description":"Cost: ~1s. Search galleries by name, tier, country, or city.\nTiers: mega (Gagosian/Zwirner level), major (international program), boutique (focused), emerging (newer).\nUse when: identifying which galleries operate in a specific market or tier band.\nUse when: building a B2B target list (galleries by region/tier).\nDo NOT use when: you want to know which gallery represents a specific artist — use find_galleries_by_artist instead.","inputs":[{"name":"city","type":"string","required":false,"description":"City name (case-insensitive partial match)."},{"name":"country","type":"string","required":false,"description":"ISO 2-letter code (e.g. 'US', 'GB', 'KR')."},{"name":"limit","type":"number","required":false,"description":"Max results (1–100). Default 20."},{"name":"query","type":"string","required":false,"description":"Free-text search across gallery name and id."},{"name":"tier","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":189},{"name":"get_gallery_artists","title":null,"description":"Cost: ~1s. Get the represented-artist roster for a specific gallery.\nReturns: gallery metadata + ordered list of artists with exclusivity (exclusive/shared/former/deceased_estate), period, notes.\nUse when: preparing pitch context for a specific gallery (cold email, fair planning).\nUse when: validating whether artist representation overlap exists between two galleries.\nDo NOT use when: you only have the artist name — use find_galleries_by_artist instead.","inputs":[{"name":"gallery_id","type":"string","required":true,"description":"Gallery ID slug or 'gallery:...'. Required."},{"name":"include_former","type":"boolean","required":false,"description":"Include former representations and deceased estates (default true)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"find_galleries_by_artist","title":null,"description":"Cost: ~1s. Find all galleries that represent (currently or formerly) a specific artist.\nReturns: ordered list of representations (current first, then deceased_estate, then former), with gallery tier/city/country and period.\nUse when: verifying primary-market representation for valuation or attribution context.\nUse when: building artist-centric outreach (which galleries control supply).\nUse when: tracking representation history for a deceased artist's estate.","inputs":[{"name":"artist_id","type":"string","required":true,"description":"Person ID slug or 'person:...'. Required."},{"name":"include_former","type":"boolean","required":false,"description":"Include former representations (default true)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":131},{"name":"lookup_met_museum","title":null,"description":"Cost: ~0.3s. Search the Metropolitan Museum of Art collection (free public API · ~480K objects) and optionally dereference an objectID.\nUse when: you need a museum-confirmed match for an artist or work, or want to triangulate Provenio data against Met holdings.\nReturns either {total, objectIDs[]} for a search OR a full object record if object_id supplied.\nSource: https://collectionapi.metmuseum.org/public/collection/v1 · zero PII, public domain images flagged.","inputs":[{"name":"has_images","type":"boolean","required":false,"description":"Filter to objects with images. Search-only."},{"name":"limit","type":"integer","required":false,"description":"Max objectIDs to return (1-50)."},{"name":"object_id","type":"integer","required":false,"description":"Met objectID for full record dereference."},{"name":"query","type":"string","required":false,"description":"Free-text search (artist, title, keyword). Required if object_id not given."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":187},{"name":"lookup_europeana","title":null,"description":"Cost: ~0.5s. Search the Europeana cultural heritage corpus (~50M records from EU museums/archives) for art records.\nUse when: triangulating Provenio data against European museum holdings, or finding object records with images for a Western European artist.\nReturns: {total, items: [{title, creator, dataProvider, year, image_url, edm_url}]}\nSource: api.europeana.eu (public-domain Europe gateway, demo key embedded; users can supply own key via byok_external_query for high-volume).","inputs":[{"name":"limit","type":"integer","required":false,"description":"Max records (1-50)."},{"name":"query","type":"string","required":true,"description":"Search query, e.g. 'pissarro paris 1897' or 'who:\"Rembrandt\"'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":161},{"name":"lookup_wikidata_art","title":null,"description":"Cost: ~3-8s. Run a SPARQL query against Wikidata (public, no auth) for art-related entities.\nUse when: you need cross-museum location data for an artist's works, or biographical data not in Provenio.\nPattern: pass a SPARQL query string. Example below to get all Klimt artworks with current location.\nReturns: {total, bindings: [...]} — raw SPARQL JSON results format.\nSource: https://query.wikidata.org/sparql · 12-second SPARQL query timeout enforced.","inputs":[{"name":"sparql","type":"string","required":true,"description":"SPARQL SELECT query. Example for Klimt's artworks with location:\nSELECT ?artworkLabel ?locationLabel WHERE { ?artwork wdt:P170 wd:Q34661. ?artwork wdt:P276 ?location. SERVICE wikibase:label { bd:serv…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":204},{"name":"byok_external_query","title":null,"description":"Cost: ~variable. Forward a JSON HTTP request to YOUR own external API endpoint and return the response.\nUse when: you need to query a third-party art-market source (Artnet/Artprice/your own gallery DB) that we do not host.\nAuth: pass your API key in MCP request header 'x-byok-auth' — we forward it as Authorization to your endpoint.\nAllowed hosts: must match an HTTPS URL on the public internet (no internal IPs, localhost, file://, etc).\nReturns: {status, body, headers, fetched_at, source_url} — body parsed if JSON, raw if not.\nLogged for your own audit trail; never trained on. We do NOT cache or persist response bodies.","inputs":[{"name":"body_json","type":"object","required":false,"description":"Optional JSON body for POST requests."},{"name":"endpoint_url","type":"string","required":true,"description":"Full HTTPS URL of your external API. Required."},{"name":"method","type":"string","required":false,"description":"HTTP method (GET or POST). Default GET."},{"name":"timeout_ms","type":"number","required":false,"description":"Per-request timeout in ms (max 20000)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":224},{"name":"search","title":null,"description":"Search the Provenio art-provenance knowledge graph (artists + artworks) by free text. Returns a ranked list of {id, title, url}. Pass an id to `fetch` for the full record. Use this as the entry point for any name/title lookup. (ChatGPT connector entry tool — wraps search_artists + search_artworks.)","inputs":[{"name":"query","type":"string","required":true,"description":"Free-text query — an artist name, artwork title, movement, or keyword."}],"outputs":[{"name":"results","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":100},{"name":"fetch","title":null,"description":"Fetch the full Provenio record for an id returned by `search` (person:… or artwork:…). Returns {id, title, text, url, metadata} where text is a readable provenance/market/influence summary. (ChatGPT connector document-fetch tool — wraps get_artist / get_artwork.)","inputs":[{"name":"id","type":"string","required":true,"description":"An id from search results, e.g. 'person:jacob-jordaens' or 'artwork:...'."}],"outputs":[{"name":"id","type":"string","required":true,"description":null},{"name":"metadata","type":"object","required":false,"description":null},{"name":"text","type":"string","required":true,"description":null},{"name":"title","type":"string","required":true,"description":null},{"name":"url","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":100}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T06:44:42.000Z","track":"remote","endpoint":"https://provenio.art/api/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=provenio.art","issuer":"CN=YR2,O=Let's Encrypt,C=US","notBefore":"2026-10-25T01:20:53Z","notAfter":"2027-01-23T01:20:52Z","keyType":"RSA","keyBits":2048,"isCa":false},{"subject":"CN=YR2,O=Let's Encrypt,C=US","issuer":"CN=Root YR,O=ISRG,C=US","notBefore":"2025-09-03T00:00:00Z","notAfter":"2028-09-02T23:59:59Z","keyType":"RSA","keyBits":2048,"isCa":true},{"subject":"CN=Root YR,O=ISRG,C=US","issuer":"CN=ISRG Root X1,O=Internet Security Research Group,C=US","notBefore":"2026-05-13T00:00:00Z","notAfter":"2032-09-02T23:59:59Z","keyType":"RSA","keyBits":4096,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"provenio.art.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"art.","outcome":"verified","label":"Verified"},{"zone":"provenio.art.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"inconclusive","label":"Inconclusive","gate":null,"gateLabel":null,"status":404,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":308},"transports":[{"transport":"streamable-http","outcome":"http_error","label":"HTTP error","status":404,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-07-26","recent":[{"id":"chg_01a0e6ac-f8c9-7a8f-8176-f6fe7cba186a","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-09-28","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0e6ac-f8c9-7a8f-8176-f6fe7cba186a"},{"id":"chg_01a0d735-26ac-7135-8259-5496938b76e3","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-09-25","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0d735-26ac-7135-8259-5496938b76e3"},{"id":"chg_01a03cac-b63a-71e8-b2e3-6ec62e5a89cc","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-08-26","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a03cac-b63a-71e8-b2e3-6ec62e5a89cc"},{"id":"chg_01a0325f-24d0-79f2-bbd4-413b04d1ddcb","kind":"check.unverifiable","summary":"Stability (0.93 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d0-79f2-bbd4-413b04d1ddcb"},{"id":"chg_01a0325f-24d1-7b05-b888-c10fae3a2b2a","kind":"check.verdict","summary":"Transport (pass → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d1-7b05-b888-c10fae3a2b2a"},{"id":"chg_01a0325f-24d2-719b-88a8-ba52ce0b04b2","kind":"check.unverifiable","summary":"Authorization (partial → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d2-719b-88a8-ba52ce0b04b2"},{"id":"chg_01a0325f-24d2-7706-86b9-bd600977666a","kind":"check.unverifiable","summary":"Schema quality (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d2-7706-86b9-bd600977666a"},{"id":"chg_01a0325f-24d3-7059-b94b-d6e2fcef911e","kind":"check.unverifiable","summary":"Capabilities (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d3-7059-b94b-d6e2fcef911e"},{"id":"chg_01a0325f-24d3-760f-ae72-e6cf97fd0f53","kind":"check.unverifiable","summary":"Tool coverage (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d3-760f-ae72-e6cf97fd0f53"},{"id":"chg_01a0325f-24d3-7b22-802a-2681bfaf5011","kind":"capture.status_changed","summary":"Endpoint reachability (reachable → not serving MCP)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d3-7b22-802a-2681bfaf5011"},{"id":"chg_01a0325f-24d4-74da-98fa-d525e3be6e92","kind":"score.total_changed","summary":"Trust score (87 → 25)","materiality":"functional","direction":"regression","scoreDelta":-62,"occurredOn":"2026-08-24","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0325f-24d4-74da-98fa-d525e3be6e92"},{"id":"chg_01a02812-82ff-7a82-bad0-f8d960b11b8b","kind":"score.total_changed","summary":"Trust score (86 → 87)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-22","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a02812-82ff-7a82-bad0-f8d960b11b8b"},{"id":"chg_01a01dc6-0a20-7551-ad2d-981cf9f358b4","kind":"score.total_changed","summary":"Trust score (85 → 86)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-20","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a01dc6-0a20-7551-ad2d-981cf9f358b4"},{"id":"chg_01a01379-1ea1-79af-bc30-a70a1e23022a","kind":"score.total_changed","summary":"Trust score (84 → 85)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-18","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a01379-1ea1-79af-bc30-a70a1e23022a"},{"id":"chg_01a0092c-530f-7163-bf5f-674b8aed822c","kind":"score.total_changed","summary":"Trust score (83 → 84)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-16","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_01a0092c-530f-7163-bf5f-674b8aed822c"},{"id":"chg_019ffedf-a05f-71a0-8c70-934d05faf35a","kind":"score.total_changed","summary":"Trust score (82 → 83)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-14","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_019ffedf-a05f-71a0-8c70-934d05faf35a"},{"id":"chg_019ff492-f8bb-7729-aff7-e335e4e70856","kind":"score.total_changed","summary":"Trust score (81 → 82)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-12","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_019ff492-f8bb-7729-aff7-e335e4e70856"},{"id":"chg_019fef6c-e153-7d65-bb9d-d563b18fe521","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-08-11","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_019fef6c-e153-7d65-bb9d-d563b18fe521"},{"id":"chg_019fe51f-e156-734c-8999-6ac81c81a010","kind":"score.total_changed","summary":"Trust score (79 → 80)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-09","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_019fe51f-e156-734c-8999-6ac81c81a010"},{"id":"chg_019fdad2-ef7d-7375-83fe-a3ea6cdcbbe8","kind":"score.total_changed","summary":"Trust score (78 → 79)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-08-07","url":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp#chg-chg_019fdad2-ef7d-7375-83fe-a3ea6cdcbbe8"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp","markdown":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp.md","changelogJson":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/mildo-ai-provenio/api-mcp.xml","external":[{"label":"Remote endpoint","href":"https://provenio.art/api/mcp"},{"label":"Repository","href":"https://github.com/mildo-ai/provenio"}]}}