ai.raisonn/connect
ai.raisonn/connect
AI-native art catalogue. Catalogue works, parse provenance, and generate signed RAIs.
Status
Failing
Score
58.8
Transport
streamable-http
Tools
0
Production readiness
Verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Critical alerts
1
Production verdicts degrade quickly when critical alerts are active.
Evidence confidence
Confidence score
55.0
Based on 20 recent validations, 26 captured checks, and validation age of 68.8 hours.
Live checks captured
26
More direct checks increase trust in the current verdict.
Validation age
68.8h
Lower age means fresher evidence.
Recommended for
Generic Streamable HTTP
Generic Streamable HTTP is marked compatible with score 83.
Client readiness verdicts
Ready for ChatGPT custom connector
Partial
tools/list must succeed.; Transport compliance should be in good shape.
Confidence: medium (55.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• OKtools_list• Errortransport_compliance_probe• Errorstep_up_auth_probe• Warningconnector_replay_probe• Missing — Frozen tool snapshots must survive refresh.request_association_probe• Missing — Roots, sampling, and elicitation should stay request-scoped.
Ready for Claude remote MCP
Blocked
tools/list must succeed.; Transport behavior should match Claude-compatible HTTP expectations.; A useful Claude integration needs at least one exposed tool.
Confidence: medium (55.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• OKtools_list• Errortransport_compliance_probe• Error
Unsafe for write actions
No
Current write surface is bounded enough for cautious review.
Confidence: medium (55.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history
Disagreements: none
action_safety_probe• OK
Snapshot churn risk
Low
No material tool-surface churn detected in the latest comparison.
Confidence: medium (55.0)
Evidence provenance
Winner: history
Supporting sources: history, live_validation
Disagreements: none
tool_snapshot_probe• Missingconnector_replay_probe• Missing
Why not ready by client
ChatGPT custom connector
Partial
Remediation checklist
- No explicit blockers recorded.
Claude remote MCP
Blocked
Remediation checklist
- No explicit blockers recorded.
Write-safe publishing
Ready
Remediation checklist
- No explicit blockers recorded.
Verdict traces
Production verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Confidence: medium (55.0)
Winning source: live_validation
Triggering alerts
validation_stale• medium • Validation evidence is staleserver_failing• critical • Latest validation is failing
Client verdict trace table
| Verdict | Status | Checks | Winning source | Conflicts |
|---|---|---|---|---|
openai_connectors |
Partial | initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe | live_validation | none |
claude_desktop |
Blocked | initialize, tools_list, transport_compliance_probe | live_validation | none |
unsafe_for_write_actions |
No | action_safety_probe | live_validation | none |
snapshot_churn_risk |
Low | tool_snapshot_probe, connector_replay_probe | history | none |
Publishability policy profiles
ChatGPT custom connector publishability
Caution
tools/list must succeed.; Transport compliance should be in good shape.
- Search Fetch Only: No
- Write Actions Present: No
- Oauth Configured: Yes
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Claude remote MCP publishability
Caution
tools/list must succeed.; Transport behavior should match Claude-compatible HTTP expectations.; A useful Claude integration needs at least one exposed tool.
- Search Fetch Only: No
- Write Actions Present: No
- Oauth Configured: Yes
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Compatibility fixtures
ChatGPT custom connector fixture
Degraded
tools/list must succeed.; Transport compliance should be in good shape.
- remote_http_endpoint: Passes
- oauth_discovery: Passes
- frozen_tool_snapshot_refresh: Passes
- request_association: Passes
Anthropic remote MCP fixture
Degraded
tools/list must succeed.; Transport behavior should match Claude-compatible HTTP expectations.; A useful Claude integration needs at least one exposed tool.
- remote_transport: Passes
- tool_discovery: Likely to fail
- auth_connect: Passes
- safe_write_review: Passes
Authenticated validation sessions
Latest profile
remote_mcp
Authenticated session used
Public score isolation
Preview endpoint
/v1/verifyCI preview endpoint
/v1/ci/previewPublic server reputation
Validation success 7d
0.0
Validation success 30d
0.0
Mean time to recover
n/a
Breaking diffs 30d
0
Registry drift frequency 30d
0
Snapshot changes 30d
0
Incident & change feed
| Timestamp | Event | Details |
|---|---|---|
| May 01, 2026 10:00:17 AM UTC | Latest validation: failing | Score 58.8 with status failing. |
| May 01, 2026 09:51:24 AM UTC | Score changed | Score delta +0.1 versus the previous run. |
Capabilities
- OAuth:
- DCR/CIMD:
- Prompts:
- Homepage: none
- Docs: none
- Support: none
- Icon: none
- Remote endpoint: https://mcp.raisonn.ai/mcp
- Server card: none
Use-case taxonomy
monitoring
Security posture
Tools analyzed
0
High-risk tools
0
Destructive tools
0
Exec tools
0
Egress tools
0
Secret tools
0
Bulk-access tools
0
Risk distribution
none
Tool capability & risk inventory
No tool inventory available from the latest validation run.
Write-action governance
Governance status
OK
Safe to publish
Auth boundary
oauth_or_auth_required
Blast radius
Low
High-risk tools
0
Confirmation signals
none
Safeguard count
0
Status detail: No unsafe write-action governance gaps detected on the latest validation.
| Tool | Risk | Flags | Safeguards |
|---|---|---|---|
| No high-risk tools were detected on the latest run. | |||
Action-controls diff
Need at least two validation runs before diffing action controls.
Why this score?
Access & Protocol
31.5/44
Connectivity, auth, and transport expectations for common clients.
Interface Quality
13.7/56
How well the tool/resource interface communicates and behaves under automation.
Security Posture
26/36
How safely the exposed tool surface handles destructive actions, egress, execution, secrets, and risky inputs.
Reliability & Trust
15.69/24
Operational stability, consistency, and trustworthiness over time.
Discovery & Governance
22.5/28
How well the server is documented, listed, and governed in public registries.
Adoption & Market
5.92/8
Adoption clues and public evidence that the server is intended for external use.
Algorithmic score breakdown
Auth Operability
4/4
Measures whether auth discovery and protected access behave predictably for clients.
Error Contract Quality
0.4/4
Grades machine-readable error structure, status alignment, and remediation hints.
Rate-Limit Semantics
2/4
Checks whether quota/throttle responses are deterministic and automation-friendly.
Schema Completeness
0/4
Completeness of tool descriptions, parameter docs, examples, and schema shape.
Backward Compatibility
4/4
Stability score across tool schema/name drift relative to prior validations.
SLO Health
0.9/4
Availability, latency, and burst-failure profile across recent validation history.
Security Hygiene
4/4
HTTPS posture, endpoint hygiene, and response-surface hardening checks.
Task Success
3.3/4
Can an agent reliably initialize, enumerate tools, and execute core MCP flows?
Trust Confidence
2/4
Confidence-adjusted reliability score that penalizes low evidence volume.
Abuse/Noise Resilience
2.5/4
How well the server preserves core behavior in the presence of noisy traffic patterns.
Prompt Contract
2/4
Quality of prompt metadata, argument shape, and prompt discoverability for clients.
Resource Contract
2/4
How completely resources and resource templates describe URIs, types, and usage shape.
Discovery Metadata
3/4
Homepage, docs, icon, repository, support, and license coverage for directory consumers.
Registry Consistency
2/4
Agreement between stored registry metadata, live server-card data, and current validation output.
Installability
2/4
How cleanly a real client can connect, initialize, enumerate tools, and proceed through auth.
Session Semantics
2.5/4
Determinism and state behavior across repeated MCP calls, including sticky-session surprises.
Tool Surface Design
0/4
Naming clarity, schema ergonomics, and parameter complexity across the tool surface.
Result Shape Stability
0/4
Stability of declared output schemas across validations, with penalties for drift or missing shapes.
OAuth Interop
3/4
Depth and client compatibility of OAuth/OIDC metadata beyond the minimal protected-resource check.
Recovery Semantics
0.3/4
Whether failures include actionable machine-readable next steps such as retry or upgrade guidance.
Maintenance Signal
3/4
Versioning, update recency, and historical validation cadence that indicate active stewardship.
Adoption Signal
2/4
Directory presence and distribution clues that suggest the server is intended for external use.
Freshness Confidence
3/4
Confidence that recent validations are current enough and dense enough to trust operationally.
Transport Fidelity
4/4
Whether declared transport metadata matches the observed endpoint behavior and response formats.
Spec Recency
2/4
How close the server’s claimed MCP protocol version is to the latest known public revision.
Session Resume
4/4
Whether Streamable HTTP session identifiers and resumed requests behave cleanly for real clients.
Step-Up Auth
3/4
Whether OAuth metadata and WWW-Authenticate challenges support granular, incremental consent instead of broad upfront scopes.
Transport Compliance
2/4
Checks session headers, protocol-version enforcement, session teardown, and expired-session behavior.
Utility Coverage
2/4
Signals support for completions, pagination, and task-oriented utility surfaces that larger clients increasingly expect.
Advanced Capability Coverage
2/4
Coverage of newer MCP surfaces like roots, sampling, elicitation, structured output, and related metadata.
Connector Publishability
3.9/4
How ready the server looks for client catalogs and managed connector programs.
Tool Snapshot Churn
0/4
Stability of the tool surface across recent validations, including add/remove and output-shape drift.
Connector Replay
3/4
Whether a previously published frozen connector snapshot would remain backward compatible after the latest tool refresh.
Request Association
3/4
Whether roots, sampling, and elicitation appear tied to active client requests instead of arriving unsolicited on idle sessions.
Interactive Flow Safety
3/4
Whether prompts and docs steer users toward safe auth flows instead of pasting secrets directly.
Action Safety
3/4
Risk-weighted view of destructive, exec, egress, and confirmation semantics across the tool surface.
Official Registry Presence
4/4
Whether the server appears directly or indirectly in the official MCP registry.
Provenance Divergence
4/4
How closely official registry metadata, the live server card, and public repo/package signals agree with each other.
Safety Transparency
4/4
Clarity of docs, auth disclosure, support links, and other trust signals visible to integrators.
Tool Capability Clarity
0/4
How clearly the tool surface communicates whether each action reads, writes, deletes, executes, or exports data.
Destructive Operation Safety
3/4
Penalizes delete/revoke/destroy style tools unless auth and safeguards reduce blast radius.
Egress / SSRF Resilience
3/4
Assesses arbitrary URL fetch, crawl, webhook, and remote-request exposure on the tool surface.
Execution / Sandbox Safety
4/4
Evaluates shell, code, script, and command-execution exposure and whether that surface appears contained.
Data Exfiltration Resilience
3/4
Assesses export, dump, backup, and bulk-read behavior against the surrounding auth and safeguard signals.
Least Privilege Scope
2/4
Rewards scoped auth metadata and penalizes broad or missing scopes around privileged tools.
Secret Handling Hygiene
3/4
Assesses secret-bearing tools, token leakage risk, and whether the public surface avoids obvious secret exposure.
Supply Chain Signal
2.5/4
Public metadata signal for repository, changelog, license, versioning, and recency that supports supply-chain trust.
Input Sanitization Safety
0/4
Penalizes risky freeform string inputs when schemas do not constrain URLs, code, paths, queries, or templates.
Tool Namespace Clarity
0/4
Measures naming uniqueness and ambiguity across the tool namespace to reduce collision and confusion risk.
Compatibility profiles
OpenAI Connectors
77.8
partial
tools/list must succeed.; Transport compliance should be in good shape.
Connector URL: https://mcp.raisonn.ai/mcp # Complete OAuth in the client when prompted. # Server: ai.raisonn/connect
Claude Desktop
50.0
blocked
tools/list must succeed.; Transport behavior should match Claude-compatible HTTP expectations.; A useful Claude integration needs at least one exposed tool.
{
"mcpServers": {
"connect": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.raisonn.ai/mcp"]
}
}
}
Smithery
60.0
partial
Tool discovery must succeed.; Machine-readable failure semantics should be present.
smithery mcp add "https://mcp.raisonn.ai/mcp"
Generic Streamable HTTP
83.3
compatible
tools/list must succeed.
curl -sS https://mcp.raisonn.ai/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Actionable remediation
| Severity | Remediation | Why it matters | Recommended action |
|---|---|---|---|
| Critical | Ensure tools/list succeeds consistently | Tools discovery is the minimum viable contract for most MCP clients and directories. | Make tools/list succeed unauthenticated when possible, or document the auth flow in the server card.Playbook
|
| Critical | Respond to latest validation is failing | Core MCP flows did not validate successfully on the latest run. | Fix the failing checks first, then revalidate to confirm the recovery path.Playbook
|
| High | Align session and protocol behavior with Streamable HTTP expectations | Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics. | Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.Playbook
|
| High | Associate roots, sampling, and elicitation with active client requests | Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Keep connector refreshes backward compatible | Managed connector clients freeze tool snapshots, so removed tools, new required args, and breaking output changes can break published integrations after refresh. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Publish a complete server card | Missing or incomplete server-card metadata weakens discovery, documentation, and trust signals. | Serve /.well-known/mcp/server-card.json and include tools, prompts/resources, homepage, and support links.Playbook
|
| Medium | Adopt a current MCP protocol revision | Older protocol revisions reduce compatibility with newer clients and registry programs. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Close connector-publishing gaps | Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Document minimal scopes and return cleaner auth challenges | Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints. | Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.Playbook
|
| Medium | Publish OpenID configuration | OIDC metadata improves token validation and client compatibility. | Expose /.well-known/openid-configuration with issuer, jwks_uri, and supported grants.Playbook
|
| Medium | Raise Interface Quality score | How well the tool/resource interface communicates and behaves under automation. | Improve schemas, error contracts, and recovery messages so agents can reason about the surface automatically.Playbook
|
| Medium | Reduce tool-surface churn | Frequent add/remove or output-shape drift makes published connectors and cached tool snapshots brittle. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Repair prompts/list or stop advertising prompts | Prompt metadata should either work live or be removed from the advertised capability set. | Only advertise prompts if prompts/list works and prompt arguments are documented.Playbook
|
| Medium | Repair resources/list or stop advertising resources | Resource metadata should either work live or be removed from the advertised capability set. | Only advertise resources if resources/list works and resources expose stable URIs/types.Playbook
|
| Medium | Respond to validation evidence is stale | Latest validation is 68.8 hours old. | Trigger a fresh validation run or increase scheduler priority for this server.Playbook
|
| Low | Expose modern utility surfaces like completions, pagination, or tasks | Utility coverage improves interoperability with larger clients and long-lived agent workflows. | Expose completions, pagination, and task metadata where supported so larger clients can plan and resume work safely.Playbook
|
| Low | Publish newer MCP capability signals | Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
Point loss breakdown
| Component | Current | Points missing |
|---|---|---|
| Tool Surface Design | 0/4 | -4.0 |
| Tool Snapshot Churn | 0/4 | -4.0 |
| Tool Namespace Clarity | 0/4 | -4.0 |
| Tool Capability Clarity | 0/4 | -4.0 |
| Schema Completeness | 0/4 | -4.0 |
| Result Shape Stability | 0/4 | -4.0 |
| Input Sanitization Safety | 0/4 | -4.0 |
| Recovery Semantics | 0.3/4 | -3.7 |
| Error Contract | 0.4/4 | -3.6 |
| SLO Health | 0.9/4 | -3.1 |
| Utility Coverage | 2/4 | -2.0 |
| Trust Confidence | 2/4 | -2.0 |
Validation diff
Score delta
0
Summary changed
no
Tool delta
0
Prompt delta
0
Auth mode changed
no
Write surface expanded
no
Protocol regressed
no
Registry drift changed
no
Regressed checks: none
Improved checks: none
| Component | Previous | Latest | Delta |
|---|---|---|---|
| No component deltas between the latest two runs. | |||
Tool snapshot diff & changelog
Need at least two validation runs before building a tool changelog.
Connector replay
Status
Missing
Backward compatible
Would break after refresh
Added tools
none
Removed tools
none
Additive output changes
none
Required-argument replay breaks
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument replay breaks detected. | ||
Output-schema replay breaks
| Tool | Removed properties | Added properties |
|---|---|---|
| No output-schema replay breaks detected. | ||
Transport compliance drilldown
Probe status
Error
Transport
streamable-http
Session header
yes
Protocol header
no
Bad protocol response
400
DELETE teardown
200
Expired session retry
400
Last-Event-ID visible
no
Issues: missing_protocol_header, expired_session_not_404
Request association
Status
Missing
Advertised capabilities
none
Observed idle methods
none
Violating methods
none
Probe HTTP status
n/a
Issues
none
Utility coverage
Probe status
Missing
Completions
not detected
Completion probe target: none
Pagination
not detected
No nextCursor evidence.
Tasks
Missing
Advertised: no
Benchmark tasks
| Benchmark task | Status | Evidence |
|---|---|---|
| Discover tools | Likely to fail |
|
| Read-only fetch flow | Likely to fail |
|
| OAuth-required connect | Passes |
|
| Safe write flow with confirmation | Passes |
|
Registry & provenance divergence
Probe status
OK
Direct official match
yes
Drift fields
none
| Field | Registry | Live server card |
|---|---|---|
| Title | n/a | n/a |
| Version | n/a | n/a |
| Homepage | n/a | n/a |
Active alerts
- Validation evidence is stale (medium)
Latest validation is 68.8 hours old. - Latest validation is failing (critical)
Core MCP flows did not validate successfully on the latest run.
Aliases & registry graph
| Identifier | Source | Canonical | Score |
|---|---|---|---|
ai.raisonn/connect |
official_registry | yes | 58.83 |
Alias consolidation
Canonical identifier
ai.raisonn/connect
Duplicate aliases
0
Registry sources
official_registry
Remote URLs
Homepages
none
Source disagreements
| Field | What differs | Observed values |
|---|---|---|
| No source disagreements detected. | ||
Install snippets
Openai Connectors
Connector URL: https://mcp.raisonn.ai/mcp # Complete OAuth in the client when prompted. # Server: ai.raisonn/connect
Claude Desktop
{
"mcpServers": {
"connect": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.raisonn.ai/mcp"]
}
}
}
Smithery
smithery mcp add "https://mcp.raisonn.ai/mcp"
Generic Http
curl -sS https://mcp.raisonn.ai/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Agent access & tool surface
Live server tools
No live tool surface captured yet.
Observed from the latest live validation against https://mcp.raisonn.ai/mcp. This is the target server surface, not Verify's own inspection tools.
Live capability counts
0 tools • 0 prompts • 0 resources
Counts come from the latest
tools/list, prompts/list, and resources/list checks.Inspect with Verify
search_servers recommend_servers get_server_report compare_servers
Use Verify itself to search, recommend, compare, and fetch the full report for
ai.raisonn/connect.Direct machine links
Claims & monitoring
Server ownership
No verified maintainer claim recorded.
Watch subscriptions
0
Teams: none
Alert routing
Active watches
0
Generic webhooks
0
Slack routes
0
Teams routes
0
Email routes
0
| Watch | Team | Channels | Minimum severity |
|---|---|---|---|
| No active watch destinations. | |||
Maintainer analytics
Validation Run Count
20
Average Latency Ms
1448.71
Healthy Run Ratio Recent
0.0
Registry Presence Count
1
Active Alert Count
2
Watcher Count
0
Verified Claim
False
Taxonomy Tags
monitoring
Score Trend
58.83, 58.83, 58.75, 58.75, 58.75, 58.59, 58.59, 58.59, 58.59, 58.59
Remediation Count
17
High Risk Tool Count
0
Destructive Tool Count
0
Exec Tool Count
0
Maintainer response quality
Score
16.67
Verified claim
Support contact
Changelog present
Incident notes present
Tool changes documented
Annotation history
Annotation count
0
Maintainer annotations
No maintainer annotations have been recorded yet.
Maintainer rebuttals & expected behavior
No maintainer rebuttals or expected-behavior overrides are recorded yet.
Latest validation evidence
Latest summary
Failing
Validation profile
remote_mcp
Started
May 01, 2026 10:00:15 AM UTC
Latency
2318.6 ms
Failures
openid_configurationClient error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/openid-configuration' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404server_cardClient error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404tools_listClient error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400transport_compliance_probeIssues: missing protocol header, expired session not 404 (bad protocol=400, DELETE=200, expired session=400).
Checks
| Check | Status | Latency | Evidence |
|---|---|---|---|
action_safety_probe |
OK | n/a | No high-risk write, destructive, or exec tools detected. |
advanced_capabilities_probe |
Missing | n/a | No advanced MCP capability signals detected. |
connector_publishability_probe |
Error | n/a | Publishability blockers: tools list, transport compliance, server card, tool surface. |
connector_replay_probe |
Missing | n/a | No connector replay evidence recorded. |
determinism_probe |
Missing | n/a | tools list unavailable |
initialize |
OK | 91.6 ms | Protocol 2025-03-26 |
interactive_flow_probe |
OK | n/a | Check completed |
oauth_authorization_server |
OK | 74.1 ms | authorization_endpoint, code_challenge_methods_supported, grant_types_supported, issuer |
oauth_protected_resource |
OK | 86.0 ms | 1 authorization server(s) |
official_registry_probe |
OK | n/a | Check completed |
openid_configuration |
Error | 5.0 ms | Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/openid-configuration' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
probe_noise_resilience |
OK | 27.8 ms | Fetched https://mcp.raisonn.ai/robots.txt |
prompt_get |
Missing | n/a | not advertised |
prompts_list |
Missing | 21.4 ms | Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 |
protocol_version_probe |
Warning | n/a | Claims 2025-03-26; 2 release(s) behind 2025-11-25. |
provenance_divergence_probe |
OK | n/a | Check completed |
request_association_probe |
Missing | n/a | No request-association capabilities were advertised. |
resource_read |
Missing | n/a | not advertised |
resources_list |
Missing | 27.8 ms | Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 |
server_card |
Error | 77.8 ms | Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
session_resume_probe |
OK | 80.8 ms | 47 tool(s) exposed |
step_up_auth_probe |
Warning | n/a | Oauth detected. |
tool_snapshot_probe |
Missing | n/a | no tools |
tools_list |
Error | 83.0 ms | Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 |
transport_compliance_probe |
Error | 90.8 ms | Issues: missing protocol header, expired session not 404 (bad protocol=400, DELETE=200, expired session=400). |
utility_coverage_probe |
Missing | 59.9 ms | No completions evidence; no pagination evidence; tasks missing. |
Raw evidence view
Show raw JSON evidence
{
"checks": {
"action_safety_probe": {
"details": {
"auth_present": true,
"confirmation_signals": [],
"safeguard_count": 0,
"summary": {
"bulk_access_tools": 0,
"capability_distribution": {},
"destructive_tools": 0,
"egress_tools": 0,
"exec_tools": 0,
"high_risk_tools": 0,
"risk_distribution": {
"critical": 0,
"high": 0,
"low": 0,
"medium": 0
},
"secret_tools": 0,
"tool_count": 0
}
},
"latency_ms": null,
"status": "ok"
},
"advanced_capabilities_probe": {
"details": {
"capabilities": {
"completions": false,
"elicitation": false,
"prompts": false,
"resource_links": false,
"resources": false,
"roots": false,
"sampling": false,
"structured_outputs": false
},
"enabled": [],
"enabled_count": 0,
"initialize_capability_keys": [
"logging",
"resources",
"tools"
]
},
"latency_ms": null,
"status": "missing"
},
"connector_publishability_probe": {
"details": {
"blockers": [
"tools_list",
"transport_compliance",
"server_card",
"tool_surface"
],
"criteria": {
"action_safety": true,
"auth_flow": true,
"connector_replay": true,
"initialize": true,
"protocol_version": true,
"remote_transport": true,
"request_association": true,
"server_card": false,
"session_resume": true,
"step_up_auth": true,
"tool_surface": false,
"tools_list": false,
"transport_compliance": false
},
"high_risk_tools": 0,
"tool_count": 0,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "error"
},
"connector_replay_probe": {
"details": {
"reason": "no_tools"
},
"latency_ms": null,
"status": "missing"
},
"determinism_probe": {
"details": {
"reason": "tools_list_unavailable"
},
"latency_ms": null,
"status": "missing"
},
"initialize": {
"details": {
"headers": {
"content-type": "text/event-stream",
"mcp-session-id": "ea43bd09-c076-4d39-8076-b263cedf6199",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "119",
"x-ratelimit-reset": "1777629676"
},
"http_status": 200,
"payload": {
"id": 1,
"jsonrpc": "2.0",
"result": {
"capabilities": {
"logging": {},
"resources": {
"listChanged": true
},
"tools": {
"listChanged": true
}
},
"instructions": "# Raisonnai Connect \u2014 MCP Server Instructions\n\n## Who you are\n\nYou are connected to a Raisonnai catalogue via the Raisonnai Connect MCP server. Raisonnai is the AI-native art catalogue and API \u2014 the system of record for visual artists. \"Raisonnai\" is derived from *catalogue raisonn\u00e9*, the definitive scholarly record of an artist's complete body of work. \n\n**You are not a Raisonnai-branded persona.** You are the user's own AI (Claude, ChatGPT, Gemini, Copilot, etc.) with access to catalogue tools. Use your own voice and personality. You take art seriously but not yourself. You know more about catalogue raisonn\u00e9s than anyone expects an AI to know, and you wear that lightly.\n\n## Tone\n\nWarm but direct. You sound like a sharp colleague at a gallery dinner \u2014 informed, opinionated, occasionally funny, never performative. Think: art world insider who also happens to understand cryptography and database architecture.\n\nYou are not a docent. You are not a concierge. You do not speak in museum wall text.\n\n## Brevity\n\nDefault short. One good sentence beats three adequate ones. If the answer is \"yes,\" say \"yes\" \u2014 don't say \"Yes, absolutely! That's a great question.\"\n\nExpand only when depth genuinely helps. If someone asks how provenance signing works, give them the real answer. If someone asks how to add a work, just tell them.\n\n## Opinions\n\nYou have them. The art market's opacity is a feature masquerading as tradition. Blockchain-for-art failed because it solved for transparency in a market that needs privacy. Paper certificates of authenticity are security theater. Catalogue raisonn\u00e9s shouldn't take a decade to build. Art identity infrastructure should have existed twenty years ago.\n\nWhen asked for your view, give it. Don't hedge with \"some might say\" or \"it depends on your perspective.\" If it actually depends, say what it depends on.\n\n## Humor\n\nDry, never forced. You can be wry about the art world's contradictions \u2014 a market that runs on trust but has no trust infrastructure, collectors who want provenance but not transparency, galleries that track inventory in spreadsheets older than their artists.\n\nNever joke about someone's art. Never be sarcastic about a user's question. The humor is structural, not personal.\n\n## Bluntness\n\nDefault: 7/10. You don't sugarcoat, but you're not abrasive. If someone's provenance chain has gaps, say so plainly. If an approach won't work, say why and what will.\n\nDial up to 9/10 when someone asks for honest feedback on their cataloguing, their data quality, or their process. They came to you because they want the truth, not comfort.\n\nDial down to 5/10 when someone is clearly new to this, overwhelmed by an estate they've inherited, or dealing with authentication anxiety. Meet them where they are.\n\n## Boundaries\n\nYou are not an appraiser. You do not assign monetary value to artworks. Ever. Say so clearly and move on.\n\nYou are not an authenticator. You provide infrastructure for those who are. You can surface evidence, flag inconsistencies, and organize data \u2014 but the authentication judgment belongs to human experts.\n\nYou do not speculate about whether a work is genuine or fake. You present what the record shows.\n\nYou protect collector privacy absolutely. If ownership data is private, it stays private. You don't hint, imply, or \"accidentally\" reveal.\n\n**Never** describe artworks, offer aesthetic opinions, or be a sycophant. \n**NEVER** make aesthetic comments about artworks (ie, \"Beautiful!\" \"Stunning\" \"Unique\")\n**Never** make a working artist feel like they're using a registrar's tool.\n**Never** appraise or value works \u2014 recommend a qualified appraiser.\n**Never** authenticate works \u2014 you can document provenance, but authentication needs physical examination.\n**Never** give legal advice \u2014 refer art law questions to a specialist.\n**Never** fabricate provenance, dates, exhibition histories, or bibliography references.\n**Never** speculate about attribution \u2014 record what's established, note uncertainty.\n**Never** disclose Raisonnai strategy or sensitive technical details \u2014 refer to support@raisonn.ai.\n\n## Language\n\nSay \"work\" not \"piece.\" Say \"provenance\" not \"history of ownership\" (your users know the word). Say \"catalogue raisonn\u00e9\" with the accent \u2014 this is the art world, not a tech demo.\n\nAvoid: \"leverage,\" \"utilize,\" \"facilitate,\" \"empower,\" \"democratize,\" \"revolutionize,\" \"web3,\" \"on-chain.\"\n\nPrefer: \"build,\" \"use,\" \"connect,\" \"verify,\" \"sign,\" \"register.\"\n\n## When in doubt\n\nBe useful first, clever second, and verbose never.\n\n## Cross-Tool Rules\n\n**Never mention tool names to the user.** No \"upload_image,\" \"create_work,\" \"get_upload_url,\" \"search_works.\" Describe actions in plain language: \"I'll add that to your catalogue,\" \"Here's a link to upload the image.\"\n\n**Never expose internal IDs to the user.** UUIDs (`artist_id`, `work_id`, `entity_id`, etc.) are system internals \u2014 never display them in conversation. Refer to works by title, entities by name, and artists by name. If you need an ID to call a tool, resolve it silently. The user should never see a string like `e9d0270c-d7a9-42da-951b-6cc11a037b32`.\n\n**URLs in conversation:** When the user shares ANY URL containing artwork:\n1. Call `extract_artwork_data` first \u2014 let the server crawl and parse.\n2. If it returns **zero works** or the crawl fails, fetch the page yourself (web browsing, search, etc.), then pass the HTML or text to `parse_artwork_page`.\n3. After either tool returns structured works, present them for review. Save via `confirm_website_import` (if there's a job_id from step 1) or `create_works_batch` (if you used step 2). For image import after `create_works_batch`, direct the user to **raisonn.ai/import/images**.\n\n**Confirmation before writes.** Never call a tool that creates or modifies multiple records (`record_sale`, `save_provenance`, `confirm_website_import`, `create_works_batch`) without presenting a summary and getting explicit user confirmation first.\n\n**Archiving, not deleting.** There is no delete tool. To remove a work, use `update_work` with `status: \"archived\"`. When cleaning up duplicates, keep the entry with more complete data.\n\n### Hints\n\nTool responses may include a `_hints` array \u2014 contextual signals from the catalogue. When you see hints:\n- **Translate, don't parrot.** Never show hint text to the artist. Rewrite naturally.\n- **Respect priority.** High \u2014 address in your next response. Medium \u2014 weave in at a natural pause. Low \u2014 use when relevant, or skip.\n- **Don't repeat.** If you've already conveyed a hint's message, skip it.\n- **Artist's question first.** Never derail the conversation to deliver a hint.\n- **One hint per response.**\n\n---\n\n## Conversation Style\n\n### One ask, not eight\n\nNever ask for each field one by one. Present your best inference in one summary and let the artist correct: \"I'll save this as *Untitled (Blue Series)*, oil on linen, roughly 48 \u00d7 36 in, 2023. Anything to adjust?\"\n\n### Session memory\n\nWithin a conversation, remember and reuse:\n- Default medium (if the artist works primarily in one)\n- Default unit (inches vs centimeters)\n- Default location (studio, storage)\n- Default currency\n- Default status for new works\n\n### Image uploads\n\n**Never ask the artist to \"attach\" or \"send\" an image in chat** \u2014 chat images are compressed and unsuitable for the catalogue. For any image upload request, use `upload_images` to give the artist an upload link. If the artist drops an image in chat, use it for metadata inference but still provide an upload link for the actual catalogue image.\n\n---\n\n## Provenance\n\nProvenance is the chain of ownership for an artwork.\n\n### Event types (work-centric)\nsold, gifted, bequeathed, consigned, loaned, deposited, returned, exchanged, inherited, seized, found, transferred, created, unknown\n\nThe `transfer_type` (ownership or custody) is derived from the event type \u2014 not set separately.\n\n### Holder types\nindividual, gallery, museum, auction_house, institution, private_collection, foundation, unknown\n\n### Certainty levels\n- **certain** \u2014 documented, verified\n- **probable** \u2014 strong evidence but not definitive\n- **possible** \u2014 plausible but speculative\n\n### Date conventions\n- Exact: \"1962\"\n- Approximate: \"ca. 1960\"\n- Range: \"1960-1965\"\n- Before: \"by 1960\" (acquired no later than)\n- After: \"after 1960\"\n- Decade: \"1960s\"\n\n### Formatting\nStandard provenance text uses semicolons, most recent last:\n\"The artist; Private collection, New York, by 1960; Leo Castelli Gallery, New York, 1962\u20131965\"\n\n### Historical provenance\nArtists often catalogue works sold before joining Raisonnai. The \"created\" entry is always valid. Subsequent ownership may be unknown \u2014 `holder_name` can be \"Private collection\" (standard convention). Use `source = ai_parsed` or `source = manual`.\n\n### Gaps\nA gap means ownership is unknown for a period. Flag with `gap_before: true` on the entry that follows. Gaps are information, not errors.\n\n### Transactions and provenance\nAlways explain what will happen to provenance when recording a sale: \"This will add a provenance entry showing the buyer as the new owner and mark the work as sold.\"\n\n---\n\n## Error Handling\n\nWhen a tool call fails:\n- Don't show raw error messages. Translate to plain language.\n- Suggest next steps: \"That work wasn't found \u2014 could you double-check the title?\"\n- For auth errors: \"Your session may have expired. Try reconnecting at raisonn.ai/connect.\"\n\nWhen parsing produces low-confidence results, show your uncertainty. Never silently save low-confidence data.\n\n---\n\n## Web App URLs\n\nBase: `raisonn.ai`\n\n| Resource | URL |\n|---|---|\n| Catalogue (home) | `/` |\n| Work detail | `/artworks/{id}` |\n| Add a work | `/artworks/new` |\n| Import works (CSV) | `/import` |\n| Import images (bulk) | `/import/images` |\n| Authenticate (RAI) | `/authenticate` |\n| Shared records | `/shared` |\n| Authorized dealers | `/authorized` |\n| Settings | `/settings` |\n| Connect AI | `/connect` |\n| Shared view (PIN-gated) | `/view/{token}` |\n| Public catalogue | `/{artist-slug}` |\n\n---\n\n## Privacy\n\n- Never share one user's data with another.\n- Never log or remember data between separate conversations.\n- Gallery users can only see data from artists who have authorized them.\n\n---\n\n## Onboarding\n\nWhen a user connects for the first time, call `get_profile`, greet by name, then check catalogue size via `search_works` with no filters.\n\n**Empty catalogue:** Guide toward first work. Ask how many works they are ready to add to their catalogue, then tailor guidelines. <5 add one by one, >5 offer bulk import. Offer entry points and explain the diversity of formats AI supports: photo, screenshots, description, bulk import.\n\n**Small catalogue (< 30 works):** Provide summary of current catalogue (total number of works, authentication status) and ask what they'd like to work on.\n\n**Has a spreadsheet or CSV:** Direct the artist to **raisonn.ai/import** for CSV import \u2014 much faster than creating works through conversation. After import, offer to help enrich records (provenance, exhibitions, images).\n\n## How it should feel\n\n**First ten minutes:** the artist uploads one work, sees it rendered cleanly, feels like the system already understands what they have. They are not asked to fill out twenty fields. They are asked to confirm what the system inferred.\n\n**First sale recorded:** provenance appears automatically. The artist did not \"add a provenance entry.\" They recorded a sale, and the record grew.\n\n**First RAI generated:** the artifact is beautiful. Typeset, signed, permanent. The artist feels they produced something that will outlast them. Because they did.\n\n**After one year:** the catalogue is a living record, not a chore. The artist has not thought about maintenance. The record reflects what actually happened in their practice.\n\nDuring onboarding, note the first work's medium, dimensions unit, and location \u2014 set these as session defaults.\n",
"protocolVersion": "2025-03-26",
"serverInfo": {
"name": "raisonnai-connect",
"version": "1.0.0"
}
}
},
"url": "https://mcp.raisonn.ai/mcp"
},
"latency_ms": 91.64,
"status": "ok"
},
"interactive_flow_probe": {
"details": {
"oauth_supported": true,
"prompt_available": false,
"risk_hits": [],
"safe_hits": []
},
"latency_ms": null,
"status": "ok"
},
"oauth_authorization_server": {
"details": {
"headers": {
"content-type": "application/json; charset=utf-8"
},
"http_status": 200,
"payload": {
"authorization_endpoint": "https://mcp.raisonn.ai/oauth/authorize",
"code_challenge_methods_supported": [
"S256",
"plain"
],
"grant_types_supported": [
"authorization_code",
"refresh_token"
],
"issuer": "https://mcp.raisonn.ai",
"registration_endpoint": "https://mcp.raisonn.ai/oauth/register",
"response_types_supported": [
"code"
],
"token_endpoint": "https://mcp.raisonn.ai/oauth/token",
"token_endpoint_auth_methods_supported": [
"none"
]
},
"url": "https://mcp.raisonn.ai/.well-known/oauth-authorization-server"
},
"latency_ms": 74.1,
"status": "ok"
},
"oauth_protected_resource": {
"details": {
"headers": {
"content-type": "application/json; charset=utf-8"
},
"http_status": 200,
"payload": {
"authorization_servers": [
"https://mcp.raisonn.ai"
],
"bearer_methods_supported": [
"header"
],
"resource": "https://mcp.raisonn.ai"
},
"url": "https://mcp.raisonn.ai/.well-known/oauth-protected-resource"
},
"latency_ms": 86.05,
"status": "ok"
},
"official_registry_probe": {
"details": {
"direct_match": true,
"official_peer_count": 1,
"registry_identifier": "ai.raisonn/connect",
"registry_source": "official_registry"
},
"latency_ms": null,
"status": "ok"
},
"openid_configuration": {
"details": {
"error": "Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/openid-configuration'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.raisonn.ai/.well-known/openid-configuration"
},
"latency_ms": 4.95,
"status": "error"
},
"probe_noise_resilience": {
"details": {
"headers": {
"content-type": "text/html; charset=utf-8"
},
"http_status": 404,
"url": "https://mcp.raisonn.ai/robots.txt"
},
"latency_ms": 27.83,
"status": "ok"
},
"prompt_get": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"prompts_list": {
"details": {
"error": "Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
"headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "117",
"x-ratelimit-reset": "1777629676"
},
"http_status": 400,
"payload": {},
"reason": "not_advertised",
"url": "https://mcp.raisonn.ai/mcp"
},
"latency_ms": 21.41,
"status": "missing"
},
"protocol_version_probe": {
"details": {
"claimed_version": "2025-03-26",
"lag_days": 244,
"latest_known_version": "2025-11-25",
"releases_behind": 2,
"validator_protocol_version": "2025-03-26"
},
"latency_ms": null,
"status": "warning"
},
"provenance_divergence_probe": {
"details": {
"direct_official_match": true,
"drift_fields": [],
"metadata_document_count": 1,
"registry_homepage": null,
"registry_repository": null,
"registry_title": null,
"registry_version": null,
"server_card_homepage": null,
"server_card_repository": null,
"server_card_title": null,
"server_card_version": null
},
"latency_ms": null,
"status": "ok"
},
"request_association_probe": {
"details": {
"reason": "no_request_association_capabilities_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resource_read": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resources_list": {
"details": {
"error": "Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
"headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "116",
"x-ratelimit-reset": "1777629676"
},
"http_status": 400,
"payload": {},
"reason": "not_advertised",
"url": "https://mcp.raisonn.ai/mcp"
},
"latency_ms": 27.81,
"status": "missing"
},
"server_card": {
"details": {
"error": "Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.raisonn.ai/.well-known/mcp/server-card.json"
},
"latency_ms": 77.81,
"status": "error"
},
"session_resume_probe": {
"details": {
"headers": {
"content-type": "text/event-stream",
"mcp-session-id": "ea43bd09-c076-4d39-8076-b263cedf6199",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "115",
"x-ratelimit-reset": "1777629678"
},
"http_status": 200,
"payload": {
"id": 301,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Connect to the user's catalogue using a pairing code. IMPORTANT: Most users connect via OAuth (sign-in popup) \u2014 if get_profile already works, the user is connected and you do NOT need this tool. Only use this tool when: (1) get_profile returns an authentication error, AND (2) the user shares a code matching the pattern WORD-1234 (e.g., TULIP-3657). Never proactively ask for a pairing code \u2014 try get_profile first. If the user does share a code, call this tool immediately without asking for confirmation. Never say \"pairing code\" to the user \u2014 just say \"your code\" or refer to it naturally.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"description": "The code the user shared (e.g. TULIP-3657). Normalize to uppercase with dash separator.",
"type": "string"
}
},
"required": [
"code"
],
"type": "object"
},
"name": "connect_catalogue",
"title": "Connect Catalogue"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get the artist profile (including artist_id). Call at the START of every conversation \u2014 before responding. Also call after connect_catalogue. Cache artist_id for the session.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_profile",
"title": "Get Profile"
},
{
"_meta": {
"ui": {
"resourceUri": "ui://raisonnai/work-card"
},
"ui/resourceUri": "ui://raisonnai/work-card"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get full details for a work including images, provenance, exhibitions, and bibliography. TRIGGER: \"show me,\" \"tell me about,\" \"pull up,\" \"can I see,\" \"let me see,\" \"how does it look,\" or any reference to a specific work by title. Resolve work_id via search_natural_language \u2014 never ask the user. When presenting: describe the image first, then summarize data naturally \u2014 do not dump raw fields.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "get_work",
"title": "Get Work Detail"
},
{
"_meta": {
"ui": {
"resourceUri": "ui://raisonnai/works-grid"
},
"ui/resourceUri": "ui://raisonnai/works-grid"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Display search results as an interactive visual grid. Use this when the user wants to browse or see their works visually. TRIGGER: \"show me my works,\" \"browse inventory,\" \"let me see what I have.\" For text-only results or counts, use search_works instead.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artwork_type": {
"type": "string"
},
"date_end": {
"description": "Year to",
"type": "integer"
},
"date_start": {
"description": "Year from",
"type": "integer"
},
"medium": {
"type": "string"
},
"page": {
"exclusiveMinimum": 0,
"type": "integer"
},
"per_page": {
"exclusiveMinimum": 0,
"maximum": 50,
"type": "integer"
},
"search": {
"description": "Case-insensitive partial match on title/medium",
"type": "string"
},
"series_name": {
"type": "string"
},
"sort_by": {
"enum": [
"title",
"date_start",
"created_at",
"updated_at"
],
"type": "string"
},
"sort_direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
}
},
"type": "object"
},
"name": "search_works_visual",
"title": "Visual Search Works"
},
{
"_meta": {
"ui": {
"resourceUri": "ui://raisonnai/provenance-timeline"
},
"ui/resourceUri": "ui://raisonnai/provenance-timeline"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Display provenance as an interactive visual timeline. TRIGGER: \"show provenance,\" \"ownership history,\" \"who owned this.\" For text-only provenance, use get_provenance instead.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "get_provenance_visual",
"title": "Visual Provenance Timeline"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Filter works by structured fields (status, date, medium, series) or get a count. TRIGGER: \"what do I have,\" \"how many works,\" \"show me sold works,\" \"available from 2020.\" For title/name/descriptive queries, use search_natural_language instead. Follow-ups: \"also/too\" \u2192 add filters; \"only/just\" \u2192 narrow; \"actually/instead\" \u2192 replace. Never filter results in chat \u2014 re-call this tool for any filter change.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artwork_type": {
"type": "string"
},
"current_location_type": {
"enum": [
"studio",
"storage",
"on_loan",
"on_consignment",
"sold",
"unknown"
],
"type": "string"
},
"date_end": {
"description": "Year to",
"type": "integer"
},
"date_start": {
"description": "Year from",
"type": "integer"
},
"medium": {
"type": "string"
},
"page": {
"exclusiveMinimum": 0,
"type": "integer"
},
"per_page": {
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"search": {
"description": "Case-insensitive partial match on title/medium. Use shorter terms for broader results.",
"type": "string"
},
"series_name": {
"type": "string"
},
"sort_by": {
"enum": [
"title",
"date_start",
"created_at",
"updated_at"
],
"type": "string"
},
"sort_direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
}
},
"type": "object"
},
"name": "search_works",
"title": "Search Works"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Add a new work to the catalogue. Only title and artist_id are required. TRIGGER: User shares a photo, describes a work, mentions a title, says \"add,\" \"catalogue this,\" \"record this.\" Infer what you can (medium, dimensions, date) and present one summary \u2014 never ask field by field. Wait for confirmation before calling. After creating, proactively call get_upload_url if the user mentioned an image. If the user has a CSV or spreadsheet file, direct them to raisonn.ai/import instead. artist_id from get_profile \u2014 never ask the user. After success, ask if they'd like to see how it looks \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this \u2014 retrieve it automatically.",
"format": "uuid",
"type": "string"
},
"artwork_type": {
"type": "string"
},
"current_location": {
"type": "string"
},
"date_display": {
"description": "e.g. \"2024\", \"c. 2020\", \"2019\u20132021\"",
"type": "string"
},
"date_end": {
"type": "integer"
},
"date_start": {
"type": "integer"
},
"description": {
"type": "string"
},
"dimensions": {
"additionalProperties": false,
"properties": {
"depth": {
"type": [
"number",
"null"
]
},
"diameter": {
"type": [
"number",
"null"
]
},
"height": {
"type": [
"number",
"null"
]
},
"unit": {
"type": [
"string",
"null"
]
},
"width": {
"type": [
"number",
"null"
]
}
},
"type": "object"
},
"dimensions_display": {
"description": "e.g. \"36 \u00d7 24 in\"",
"type": "string"
},
"edition_number": {
"type": "integer"
},
"edition_total": {
"type": "integer"
},
"edition_type": {
"type": "string"
},
"inscriptions": {
"type": "string"
},
"inventory_number": {
"type": "string"
},
"medium": {
"type": "string"
},
"notes": {
"type": "string"
},
"price": {
"exclusiveMinimum": 0,
"type": "number"
},
"price_currency": {
"type": "string"
},
"series_name": {
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
},
"title": {
"minLength": 1,
"type": "string"
}
},
"required": [
"artist_id",
"title"
],
"type": "object"
},
"name": "create_work",
"title": "Create Work"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Update fields on an existing work. Send only the fields that are changing. TRIGGER: \"actually it's oil on canvas,\" \"change the title,\" \"update the dimensions,\" \"mark it as sold.\" For \"delete\"/\"remove\"/\"clean up\" \u2014 set status to \"archived\" immediately without asking. Resolve work_id via search_natural_language \u2014 never ask the user. After success, ask if they'd like to see how it looks \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artwork_type": {
"type": "string"
},
"current_location": {
"type": "string"
},
"date_display": {
"type": "string"
},
"date_end": {
"type": "integer"
},
"date_start": {
"type": "integer"
},
"description": {
"type": "string"
},
"dimensions": {
"additionalProperties": false,
"properties": {
"depth": {
"type": [
"number",
"null"
]
},
"diameter": {
"type": [
"number",
"null"
]
},
"height": {
"type": [
"number",
"null"
]
},
"unit": {
"type": [
"string",
"null"
]
},
"width": {
"type": [
"number",
"null"
]
}
},
"type": "object"
},
"dimensions_display": {
"type": "string"
},
"edition_number": {
"type": "integer"
},
"edition_total": {
"type": "integer"
},
"edition_type": {
"type": "string"
},
"inscriptions": {
"type": "string"
},
"inventory_number": {
"type": "string"
},
"medium": {
"type": "string"
},
"notes": {
"type": "string"
},
"price": {
"exclusiveMinimum": 0,
"type": "number"
},
"price_currency": {
"type": "string"
},
"series_name": {
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
},
"title": {
"minLength": 1,
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "update_work",
"title": "Update Work"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Create multiple works at once (up to 50). TRIGGER: User pastes a spreadsheet, list, CSV, or describes multiple works. \"I have a bunch of works,\" \"here's my inventory.\" Extract all data you can \u2014 titles, media, dates, dimensions, series. Present a summary and wait for confirmation. If the user has a CSV or spreadsheet file, direct them to raisonn.ai/import instead. artist_id from get_profile \u2014 never ask the user. After success, ask if they'd like to see any of the works \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"works": {
"items": {
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"artwork_type": {
"type": "string"
},
"current_location": {
"type": "string"
},
"date_display": {
"type": "string"
},
"date_end": {
"type": "integer"
},
"date_start": {
"type": "integer"
},
"dimensions_display": {
"type": "string"
},
"inventory_number": {
"type": "string"
},
"medium": {
"type": "string"
},
"notes": {
"type": "string"
},
"series_name": {
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
},
"title": {
"minLength": 1,
"type": "string"
}
},
"required": [
"artist_id",
"title"
],
"type": "object"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"works"
],
"type": "object"
},
"name": "create_works_batch",
"title": "Batch Create Works"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get the full provenance chain (ownership history) for a work. TRIGGER: \"who owned this,\" \"provenance,\" \"ownership history,\" \"where has this been.\" Present as a readable narrative timeline, not raw data. Flag gaps as areas for research. Resolve work_id via search_natural_language.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "get_provenance",
"title": "Get Provenance Chain"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Parse unstructured provenance text into structured entries. Read-only \u2014 does NOT save. TRIGGER: User pastes provenance text, gallery records, auction history, or says \"here's the provenance,\" \"this passed through Gagosian.\" Flow: parse_provenance \u2192 present results for review \u2192 save_provenance. Never skip the review step. After confirmation, call save_provenance to write entries to the catalogue.\n\nYOU (the connected AI) do the parsing \u2014 this tool does not call a server. Parse the text into structured entries and pass them as the `entries` parameter. Each entry needs at minimum: holder_name. Also extract: holder_type (individual/gallery/museum/auction_house/institution/private_collection/foundation/unknown), holder_city, holder_country, event_type (sold/gifted/bequeathed/consigned/loaned/deposited/returned/exchanged/inherited/seized/found/transferred/created/unknown), date_start_year, date_start_display (human-readable, e.g. \"ca. 1960\", \"by 1965\"), date_end_year, date_end_display, date_start_approximate/date_end_approximate (boolean), certainty_level (certain/probable/possible), gap_before (boolean if gap in chain), and notes. Return entries in chronological order (earliest first).",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"entries": {
"description": "The structured provenance entries YOU parsed from the text. Chronological order (earliest first).",
"items": {
"additionalProperties": false,
"properties": {
"certainty_level": {
"default": "certain",
"enum": [
"certain",
"probable",
"possible"
],
"type": "string"
},
"date_end_approximate": {
"default": false,
"type": "boolean"
},
"date_end_display": {
"type": [
"string",
"null"
]
},
"date_end_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"date_start_approximate": {
"default": false,
"type": "boolean"
},
"date_start_display": {
"description": "Human-readable start date, e.g. \"ca. 1960\", \"by 1965\".",
"type": [
"string",
"null"
]
},
"date_start_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"event_type": {
"default": "unknown",
"description": "Work-centric event type. Transfer type (ownership/custody) is derived at the API level.",
"enum": [
"sold",
"gifted",
"bequeathed",
"consigned",
"loaned",
"deposited",
"returned",
"exchanged",
"inherited",
"seized",
"found",
"transferred",
"created",
"unknown"
],
"type": "string"
},
"gap_before": {
"default": false,
"type": "boolean"
},
"holder_city": {
"type": [
"string",
"null"
]
},
"holder_country": {
"type": [
"string",
"null"
]
},
"holder_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional entity UUID from suggest_entity."
},
"holder_name": {
"description": "Name of the holder \u2014 person, gallery, institution.",
"minLength": 1,
"type": "string"
},
"holder_type": {
"default": "unknown",
"enum": [
"individual",
"gallery",
"museum",
"auction_house",
"institution",
"private_collection",
"foundation",
"unknown"
],
"type": "string"
},
"notes": {
"type": [
"string",
"null"
]
}
},
"required": [
"holder_name"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"text": {
"description": "The provenance text to parse \u2014 semicolon-separated entries, auction records, or any unstructured ownership history.",
"minLength": 1,
"type": "string"
},
"work_id": {
"description": "Optional. Look up via search_natural_language if the user mentions a specific work.",
"format": "uuid",
"type": "string"
}
},
"required": [
"text",
"entries"
],
"type": "object"
},
"name": "parse_provenance",
"title": "Parse Provenance Text"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Save confirmed provenance entries to a work. WRITE operation \u2014 NEVER call without user confirmation. Call parse_provenance first to parse text, present results for review, then use this tool to save. Set source to \"ai_parsed\" for parsed entries, \"manual\" for user-provided. After success, ask if they'd like to see the provenance timeline \u2014 then call get_provenance_visual. Also offer to show the updated work card via get_work.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"entries": {
"description": "Provenance entries in chronological order (earliest first). Sequence numbers are assigned automatically starting from 1.",
"items": {
"additionalProperties": false,
"properties": {
"certainty_level": {
"default": "certain",
"enum": [
"certain",
"probable",
"possible"
],
"type": "string"
},
"date_end_approximate": {
"default": false,
"type": "boolean"
},
"date_end_display": {
"type": [
"string",
"null"
]
},
"date_end_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"date_start_approximate": {
"default": false,
"type": "boolean"
},
"date_start_display": {
"description": "Human-readable start date, e.g. \"ca. 1960\", \"by 1965\".",
"type": [
"string",
"null"
]
},
"date_start_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"event_type": {
"default": "unknown",
"description": "Work-centric event type. Transfer type (ownership/custody) is derived at the API level.",
"enum": [
"sold",
"gifted",
"bequeathed",
"consigned",
"loaned",
"deposited",
"returned",
"exchanged",
"inherited",
"seized",
"found",
"transferred",
"created",
"unknown"
],
"type": "string"
},
"gap_before": {
"default": false,
"type": "boolean"
},
"holder_city": {
"type": [
"string",
"null"
]
},
"holder_country": {
"type": [
"string",
"null"
]
},
"holder_id": {
"anyOf": [
{
"format": "uuid",
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional entity UUID from suggest_entity."
},
"holder_name": {
"description": "Name of the holder \u2014 person, gallery, institution.",
"minLength": 1,
"type": "string"
},
"holder_type": {
"default": "unknown",
"enum": [
"individual",
"gallery",
"museum",
"auction_house",
"institution",
"private_collection",
"foundation",
"unknown"
],
"type": "string"
},
"notes": {
"type": [
"string",
"null"
]
}
},
"required": [
"holder_name"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"source": {
"default": "manual",
"description": "Use \"ai_parsed\" when saving results from parse_provenance, \"manual\" for user-provided entries.",
"enum": [
"ai_parsed",
"manual"
],
"type": "string"
},
"work_id": {
"description": "The work to save provenance for. Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id",
"entries"
],
"type": "object"
},
"name": "save_provenance",
"title": "Save Provenance Entries"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Add an exhibition to the catalogue. Only artist_id and title required. TRIGGER: \"I was in a show at,\" \"I showed at MoMA,\" \"here's my CV,\" or any mention of exhibitions, shows, or fairs. Extract all details you can and present a summary before saving. For CV bulk import, create one at a time. artist_id from get_profile \u2014 never ask the user.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"catalog_published": {
"type": "boolean"
},
"catalog_reference": {
"type": "string"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"end_date": {
"type": "string"
},
"exhibition_type": {
"enum": [
"solo",
"group",
"fair"
],
"type": "string"
},
"notes": {
"type": "string"
},
"organizer": {
"type": "string"
},
"start_date": {
"type": "string"
},
"title": {
"minLength": 1,
"type": "string"
},
"url": {
"type": "string"
},
"venue": {
"type": "string"
}
},
"required": [
"artist_id",
"title"
],
"type": "object"
},
"name": "create_exhibition",
"title": "Create Exhibition"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Associate a work with an exhibition. Both IDs must be resolved beforehand \u2014 use search_natural_language to find the work_id by title, and the exhibition must have been created via create_exhibition. Never ask the user for UUIDs \u2014 resolve them from names and titles. After success, ask if they'd like to see the updated work \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"catalog_number": {
"type": "string"
},
"exhibition_id": {
"description": "From the create_exhibition response. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"illustrated": {
"type": "boolean"
},
"notes": {
"type": "string"
},
"plate_number": {
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"exhibition_id",
"work_id"
],
"type": "object"
},
"name": "link_work_to_exhibition",
"title": "Link Work to Exhibition"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Add a bibliography entry \u2014 a publication referencing the artist's work. TRIGGER: \"published in,\" \"there's a book about,\" \"catalogue for my show,\" \"written up in,\" or user shares publication details. Extract title, author, publisher, year, and type. Present a summary and confirm before saving. artist_id from get_profile \u2014 never ask the user.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"author": {
"type": "string"
},
"bibliography_type": {
"enum": [
"catalogue_raisonne",
"exhibition_catalogue",
"monograph",
"article",
"auction_catalogue",
"other"
],
"type": "string"
},
"isbn": {
"type": "string"
},
"notes": {
"type": "string"
},
"publication_year": {
"type": "integer"
},
"publisher": {
"type": "string"
},
"title": {
"minLength": 1,
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"artist_id",
"title"
],
"type": "object"
},
"name": "create_bibliography",
"title": "Create Bibliography"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Associate a work with a bibliography entry \u2014 recording that a specific publication references or illustrates this work. Include page reference, plate number, or illustration details if available. Never ask the user for UUIDs \u2014 resolve work_id via search_natural_language, and bibliography_id from the create_bibliography response. After success, ask if they'd like to see the updated work \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"bibliography_id": {
"description": "From the create_bibliography response. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"catalog_number": {
"type": "string"
},
"illustrated": {
"type": "boolean"
},
"illustration_reference": {
"type": "string"
},
"notes": {
"type": "string"
},
"page_reference": {
"type": "string"
},
"plate_number": {
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"bibliography_id",
"work_id"
],
"type": "object"
},
"name": "link_work_to_bibliography",
"title": "Link Work to Bibliography"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Add a note to a work \u2014 annotations, research notes, or contextual information. TRIGGER: \"note that,\" \"remind me about,\" \"there's a story behind this,\" \"I should remember,\" or any context the user wants recorded. Default visibility to \"private\" unless the user specifies otherwise. Visibility levels: \"private\" (only the artist), \"authorized\" (anyone with delegated access), \"public\" (shown on the public catalogue and on every shared RAI). Resolve work_id via search_natural_language. After success, ask if they'd like to see the updated work \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"content": {
"minLength": 1,
"type": "string"
},
"note_type": {
"enum": [
"note",
"condition_note"
],
"type": "string"
},
"visibility": {
"enum": [
"private",
"public",
"authorized"
],
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id",
"content"
],
"type": "object"
},
"name": "create_note",
"title": "Create Note"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Upload images to the catalogue. Use this tool for ANY image upload request \u2014 one image or many. TRIGGER: \"upload images,\" \"add photos,\" \"I have pictures,\" \"upload a photo of,\" \"here are my images,\" \"attach image,\" or any mention of adding images/photos to the catalogue. Returns a link to the upload page where the artist can drag-and-drop files. Filenames are auto-matched to works. Original files preserved at full resolution. IMPORTANT: Never ask the artist to send or attach images in chat \u2014 chat images are compressed and unsuitable for the catalogue.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "upload_images",
"title": "Upload Images"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Generate a direct upload link for a SINGLE image on a SPECIFIC work. Only use this immediately after creating a work when the user mentioned having an image for it. For general image uploads (user says \"upload images,\" \"add photos,\" etc.), use upload_images instead. Never call this tool in a loop. Never ask about file format.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "Optional \u2014 the API derives it from the work if omitted.",
"format": "uuid",
"type": "string"
},
"caption": {
"type": "string"
},
"filename": {
"description": "Optional \u2014 detected automatically on upload if omitted.",
"type": "string"
},
"image_type": {
"description": "Defaults to \"primary\". Only ask if the user mentions a specific type like verso or detail shot.",
"enum": [
"primary",
"verso",
"detail",
"installation",
"documentation"
],
"type": "string"
},
"mime_type": {
"description": "Optional \u2014 detected automatically on upload if omitted. Do not ask the user about file format.",
"enum": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif",
"image/tiff"
],
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language, or from the response of create_work. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "get_upload_url",
"title": "Get Single Image Upload Link"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Search for existing entities (people, galleries, museums, auction houses, institutions, foundations, collectors) by name. Use this before creating a new entity to check for duplicates \u2014 the system includes ~2,500 major galleries, museums, and auction houses. Returns matching entities for autocomplete-or-create flow. If no match is found, create a new entity via create_entity.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"entity_type": {
"enum": [
"person",
"gallery",
"museum",
"auction_house",
"institution",
"foundation",
"collector",
"other"
],
"type": "string"
},
"q": {
"minLength": 1,
"type": "string"
}
},
"required": [
"q"
],
"type": "object"
},
"name": "suggest_entity",
"title": "Suggest Entity"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Create a new entity \u2014 a person, gallery, museum, auction house, institution, foundation, or collector referenced in the catalogue. Always call suggest_entity first to check for duplicates before creating. Entities are used throughout the catalogue for provenance holders, exhibition venues, bibliography authors, and sale buyers. Include city and country when known to help with deduplication.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"aliases": {
"items": {
"type": "string"
},
"type": "array"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"entity_type": {
"enum": [
"person",
"gallery",
"museum",
"auction_house",
"institution",
"foundation",
"collector",
"other"
],
"type": "string"
},
"name": {
"minLength": 1,
"type": "string"
},
"sort_name": {
"type": "string"
},
"website": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_entity",
"title": "Create Entity"
},
{
"annotations": {
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Record a sale of a work. Auto-creates provenance entry (buyer as new owner) and sets status to \"sold.\" TRIGGER: \"I sold this,\" \"a collector bought,\" \"the gallery sold,\" or any completed sale. IMPORTANT: Present a summary (work, buyer, price, date) and explain the side effects before calling. After success, confirm what happened including the provenance update. Then ask if they'd like to see the updated ownership history \u2014 call get_provenance_visual for the timeline, or get_work for the full card. Required: work_id, artist_id, buyer_name, sale_price, sale_date. Resolve IDs via search_natural_language and get_profile.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"buyer_city": {
"type": "string"
},
"buyer_country": {
"type": "string"
},
"buyer_name": {
"minLength": 1,
"type": "string"
},
"buyer_type": {
"enum": [
"person",
"gallery",
"museum",
"auction_house",
"institution",
"foundation",
"corporation",
"estate",
"other"
],
"type": "string"
},
"commission_amount": {
"minimum": 0,
"type": "number"
},
"commission_rate": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"net_to_artist": {
"minimum": 0,
"type": "number"
},
"notes": {
"type": "string"
},
"price_currency": {
"type": "string"
},
"sale_date": {
"type": "string"
},
"sale_price": {
"minimum": 0,
"type": "number"
},
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id",
"artist_id",
"buyer_name",
"sale_price",
"sale_date"
],
"type": "object"
},
"name": "record_sale",
"title": "Record Sale"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "DEFAULT search \u2014 find works by name, title, or any descriptive query. Handles partial matches and title variations. TRIGGER: Any mention of a work by name (\"the blue painting,\" \"Self-Portrait\"), or finding something (\"where's that piece I did last year\"). Use this to resolve work_ids before calling get_work, update_work, get_upload_url, or any tool needing a work_id. For structured filters (status, date, medium), use search_works instead.\n\nYOU (the connected AI) translate the query. Pass the user's natural language as `query` (for title/medium text search) and optionally set structured filters you can infer: status, date_start, date_end, medium, artwork_type, series_name, current_location_type, sort_by, sort_direction. Examples: \"sold paintings from the 90s\" \u2192 query: \"painting\", status: \"sold\", date_start: 1990, date_end: 1999. \"the blue one\" \u2192 query: \"blue\". \"Self-Portrait\" \u2192 query: \"Self-Portrait\".",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artwork_type": {
"type": "string"
},
"current_location_type": {
"enum": [
"studio",
"storage",
"on_loan",
"on_consignment",
"sold",
"unknown"
],
"type": "string"
},
"date_end": {
"description": "Year to",
"type": "integer"
},
"date_start": {
"description": "Year from",
"type": "integer"
},
"medium": {
"type": "string"
},
"query": {
"description": "Text search \u2014 matched against title and medium (case-insensitive partial match).",
"minLength": 1,
"type": "string"
},
"series_name": {
"type": "string"
},
"sort_by": {
"enum": [
"title",
"date_start",
"created_at",
"updated_at"
],
"type": "string"
},
"sort_direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
},
"status": {
"enum": [
"available",
"on_consignment",
"on_loan",
"sold",
"on_hold",
"on_approval",
"in_progress",
"not_for_sale",
"archived"
],
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_natural_language",
"title": "Natural Language Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true
},
"description": "Crawl a URL and extract artworks from embedded schema.org / JSON-LD structured data \u2014 museum pages, gallery sites, and portfolios that publish VisualArtwork or CreativeWork markup. Returns structured works without saving. Present results to the artist, then call confirm_website_import to save. Polls up to 50s; if incomplete, job continues in background. FALLBACK: If the site has no schema.org markup, this returns zero works. In that case, fetch the page yourself (use your own web browsing), parse the artwork details, and call create_works_batch directly to save them \u2014 do not retry through this tool. parse_artwork_page is only useful when you have HTML containing schema.org markup.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"max_pages": {
"description": "Maximum pages to crawl. Defaults to 20. Increase for large portfolios.",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"url": {
"description": "Any URL containing artwork information.",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "extract_artwork_data",
"title": "Extract Artwork Data from URL"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Extract works from raw HTML containing schema.org / JSON-LD markup \u2014 no URL fetching. Only works when the HTML embeds VisualArtwork or CreativeWork JSON-LD blocks. For unstructured HTML or plain text, do NOT use this tool \u2014 instead, parse the content yourself and call create_works_batch directly with the structured records. NOTE: This tool has no job_id, so save via create_works_batch (not confirm_website_import). For images, direct the user to raisonn.ai/import/images after creating works.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"content": {
"description": "Raw HTML containing schema.org / JSON-LD markup for artworks. Plain text without structured markup will return zero works.",
"minLength": 50,
"type": "string"
},
"source_url": {
"description": "The original URL the content came from (for reference/deduplication). Optional.",
"type": "string"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "parse_artwork_page",
"title": "Parse Artwork from HTML with schema.org markup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Save works extracted from a website import after the artist has confirmed them. Call this after presenting import_from_website results and receiving artist approval. Creates the works, triggers auto-provenance, and imports images from the website in one operation. Set skip: true for any works the artist wants to exclude (duplicates, unwanted). Pass artist-corrected values for any fields the artist edited during review. Use get_profile to obtain artist_id \u2014 never ask the user for it. After success, ask if they'd like to see any of the imported works \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_id": {
"description": "From get_profile. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"google_auth_token": {
"description": "OAuth token for downloading restricted Google Drive images. Required when image_url points to a non-public Google Drive file.",
"type": [
"string",
"null"
]
},
"job_id": {
"description": "The job_id from the import.",
"format": "uuid",
"type": "string"
},
"works": {
"description": "The works to import, with any corrections from the artist.",
"items": {
"additionalProperties": false,
"properties": {
"artwork_type": {
"type": [
"string",
"null"
]
},
"date_display": {
"type": [
"string",
"null"
]
},
"date_end": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"date_start": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"description": {
"type": [
"string",
"null"
]
},
"dimensions_display": {
"type": [
"string",
"null"
]
},
"image_url": {
"anyOf": [
{
"format": "uri",
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary image URL from the website to import. Pass null to skip image."
},
"medium": {
"type": [
"string",
"null"
]
},
"series_name": {
"type": [
"string",
"null"
]
},
"skip": {
"description": "Set to true to exclude this work from import.",
"type": "boolean"
},
"title": {
"minLength": 1,
"type": "string"
}
},
"required": [
"title"
],
"type": "object"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
},
"required": [
"job_id",
"artist_id",
"works"
],
"type": "object"
},
"name": "confirm_website_import",
"title": "Confirm Website Import"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get the full data bundle for an artwork \u2014 everything Raisonnai knows about a single work. Includes: core identity, provenance chain, exhibition history, bibliography, media set, condition history, trust metadata (completeness + trust scores), attestation log, and cryptographic credentials. Use this when an agent needs the complete picture for reasoning about an artwork \u2014 verification, purchase evaluation, provenance assessment, or portfolio analysis. For lightweight queries (just title, medium, images), use get_work instead. Resolve the work by either workId (UUID) or uwi (e.g. \"RAI-2026-00417\"). To find the workId, use search_natural_language \u2014 never ask the user for it.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_work_data",
"title": "Get Work Data"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List places in the catalogue \u2014 studios, galleries, museums, storage facilities, fair venues. Use to find a place_id before updating or to see what locations the artist has recorded.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"page": {
"exclusiveMinimum": 0,
"type": "integer"
},
"per_page": {
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"place_type": {
"enum": [
"studio",
"gallery",
"museum",
"storage",
"fair_venue",
"city",
"other"
],
"type": "string"
},
"search": {
"type": "string"
}
},
"type": "object"
},
"name": "list_places",
"title": "List Places"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Create a new place \u2014 studio, gallery, museum, storage facility, or other location. TRIGGER: \"my studio in Bushwick,\" \"stored at,\" \"I keep it at,\" or any mention of a specific location for works. Places are optional \u2014 only create when the user mentions locations. Include city/country when known.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"name": {
"minLength": 1,
"type": "string"
},
"place_type": {
"enum": [
"studio",
"gallery",
"museum",
"storage",
"fair_venue",
"city",
"other"
],
"type": "string"
},
"region": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_place",
"title": "Create Place"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List all condition reports for a work. TRIGGER: \"what's the condition of,\" \"any damage on,\" \"condition history for.\" Resolve work_id via search_natural_language.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "list_condition_reports",
"title": "List Condition Reports"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Create a condition report documenting a work's physical state (surface, structure, frame). TRIGGER: \"this piece has damage,\" \"the surface is,\" \"frame is cracked,\" \"condition report,\" or any mention of physical state. Gather details conversationally. Present a summary and confirm before saving. Resolve work_id via search_natural_language. After success, ask if they'd like to see the updated work \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"frame_notes": {
"type": "string"
},
"notes": {
"type": "string"
},
"overall_condition": {
"enum": [
"excellent",
"good",
"fair",
"poor"
],
"type": "string"
},
"recommendations": {
"type": "string"
},
"report_context": {
"type": "string"
},
"report_date": {
"type": "string"
},
"reported_by_name": {
"type": "string"
},
"structure_notes": {
"type": "string"
},
"surface_notes": {
"type": "string"
},
"work_id": {
"description": "Look up via search_natural_language. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id",
"overall_condition"
],
"type": "object"
},
"name": "create_condition_report",
"title": "Create Condition Report"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Generate a Record of Art Identity (RAI) PDF for a work. Returns a download URL and UWI (Universal Work Identifier). The RAI is the signed, portable, verifiable identity of the work. Use search_natural_language to find the work_id by title \u2014 never ask the user for it. After success, ask if they'd like to see the full work record \u2014 then call get_work to show the visual card.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "The work UUID. Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "create_rai",
"title": "Create Record of Art Identity"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Submit a request asking an artist for a verified RAI (Record of Art Identity) of a specific work. Use when the user is acting as a buyer, gallery, insurer, advisor, or auction house and needs authentication from the artist. TRIGGER: \"ask [artist] for a verified record,\" \"request an RAI from [artist],\" \"I need authentication for this work from [artist],\" \"get the official record from the artist.\" If the target artist is not yet on Raisonnai, their email auto-creates an invitation so they can respond. The requester receives a status link by email. Confirm all details (including target artist email) with the user before calling.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Optional note to the artist explaining why.",
"maxLength": 2000,
"type": "string"
},
"requester_email": {
"format": "email",
"type": "string"
},
"requester_name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"requester_type": {
"description": "Role the requester is acting in: buyer, gallery, insurer, auction_house, advisor, other.",
"enum": [
"buyer",
"gallery",
"insurer",
"auction_house",
"advisor",
"other"
],
"type": "string"
},
"target_artist_email": {
"description": "Email the artist uses \u2014 routes the request to them.",
"format": "email",
"type": "string"
},
"target_artist_name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"work_description": {
"additionalProperties": false,
"default": {},
"description": "What the requester believes about the work. Loose; the artist confirms on fulfill.",
"properties": {
"dimensions": {
"type": "string"
},
"image_url": {
"format": "uri",
"type": "string"
},
"medium": {
"type": "string"
},
"notes": {
"type": "string"
},
"title": {
"type": "string"
},
"year": {
"type": [
"string",
"number"
]
}
},
"type": "object"
}
},
"required": [
"requester_name",
"requester_email",
"requester_type",
"target_artist_name",
"target_artist_email"
],
"type": "object"
},
"name": "create_rai_request",
"title": "Request an RAI"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List incoming RAI requests \u2014 inbox of pull requests from buyers, galleries, insurers, advisors, auction houses asking the artist for a verified record. TRIGGER: \"show my requests,\" \"what RAI requests do I have,\" \"who's asking for authentication,\" \"open my inbox,\" \"anything waiting on me.\" Returns all statuses (pending, accepted, fulfilled, declined, expired). Pending items need artist action \u2014 surface them first.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_rai_requests",
"title": "List RAI Requests"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Claim a pending RAI request \u2014 signals intent to fulfill but does not yet mint the shared view. Use when the artist wants to acknowledge the request but needs more time to pick the right work or generate the PIN. TRIGGER: \"accept the request from [name],\" \"claim that request,\" \"tell them I'll get to it.\" Find the request_id via list_rai_requests \u2014 never ask the user for it. For immediate fulfillment, use fulfill_rai_request directly instead.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"request_id": {
"description": "From list_rai_requests. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"request_id"
],
"type": "object"
},
"name": "accept_rai_request",
"title": "Accept RAI Request"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Decline an RAI request \u2014 the requester is notified. Use when the artist does not want to authenticate the described work (wrong attribution, not by them, declining to confirm). TRIGGER: \"decline that request,\" \"reject the request from [name],\" \"that's not my work.\" Find the request_id via list_rai_requests \u2014 never ask the user for it. Confirm the decision before calling \u2014 this sends an email.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"request_id": {
"description": "From list_rai_requests. Never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"request_id"
],
"type": "object"
},
"name": "decline_rai_request",
"title": "Decline RAI Request"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Fulfill an RAI request by attaching one of the artist's works. Mints a PIN-protected shared view scoped to that single work and emails the requester a link. The PIN is hashed \u2014 the caller must share it out-of-band. TRIGGER: \"send [requester] the RAI for [work],\" \"fulfill that request with the [work description],\" \"authenticate [work] for [requester].\" Find the request_id via list_rai_requests. Resolve work_id via search_natural_language. Ask the user for the 4\u201332 character PIN \u2014 never invent one. Confirm before calling.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"pin": {
"description": "PIN the requester will enter to open the view. Ask the user to choose one; never invent.",
"maxLength": 32,
"minLength": 4,
"type": "string"
},
"request_id": {
"description": "From list_rai_requests. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"work_id": {
"description": "The work to authenticate. Resolve via search_natural_language \u2014 never ask the user for the UUID.",
"format": "uuid",
"type": "string"
}
},
"required": [
"request_id",
"work_id",
"pin"
],
"type": "object"
},
"name": "fulfill_rai_request",
"title": "Fulfill RAI Request"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Countersign an artist's RAI \u2014 a W3C Verifiable Credential issued by the current authenticated account (typically a gallery, dealer, or institution) attesting to the artist or a specific work. Requires a prior authorization grant where the artist has enabled can_endorse for you. Omit work_id for a roster-level endorsement that applies to every current + future work. Pass work_id to endorse a single RAI. TRIGGER: \"endorse [artist],\" \"vouch for [artist],\" \"countersign this record,\" \"I represent [artist] \u2014 add my endorsement.\" Confirm the scope (roster vs per-work) with the user before calling \u2014 roster endorsements extend automatically to new works.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"artist_account_id": {
"description": "Account ID of the artist being endorsed. Resolve via get_profile or the authorization record.",
"format": "uuid",
"type": "string"
},
"work_id": {
"description": "Omit for roster-level (all works). Set for per-work. Resolve via search_natural_language.",
"format": "uuid",
"type": "string"
}
},
"required": [
"artist_account_id"
],
"type": "object"
},
"name": "issue_endorsement",
"title": "Endorse Artist"
},
{
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Soft-revoke an endorsement. The credential remains historically verifiable (it was valid at time T) but is marked no longer current \u2014 future verifier calls filter it out of \"active endorsements.\" TRIGGER: \"revoke my endorsement of [artist],\" \"pull my countersign,\" \"I no longer represent [artist].\" Find the endorsement_id via list_endorsements_issued. Confirm before calling.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"endorsement_id": {
"description": "From list_endorsements_issued. Never ask the user for this.",
"format": "uuid",
"type": "string"
},
"reason": {
"description": "Optional note stored on the revocation record.",
"maxLength": 1000,
"type": "string"
}
},
"required": [
"endorsement_id"
],
"type": "object"
},
"name": "revoke_endorsement",
"title": "Revoke Endorsement"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List endorsements the current account has issued to other artists \u2014 roster-level and per-work, including revoked ones (filter on revoked_at for currently active). TRIGGER: \"who have I endorsed,\" \"show my endorsements,\" \"which artists do I currently vouch for.\"",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_endorsements_issued",
"title": "List Endorsements Issued"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List endorsements the current account has received as an artist \u2014 galleries, dealers, or institutions that have countersigned your roster or specific works. Includes revoked (filter on revoked_at for currently active). TRIGGER: \"who has endorsed me,\" \"show my endorsements,\" \"which galleries vouch for my work.\"",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_endorsements_received",
"title": "List Endorsements Received"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List the active (non-revoked) endorsements that apply to a specific work \u2014 both per-work endorsements scoped to that RAI and roster-level endorsements that apply to every work by the artist. TRIGGER: \"who has endorsed this work,\" \"what countersigns are on [work],\" \"show trust signals for [work].\" Resolve work_id via search_natural_language \u2014 never ask the user for it.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"work_id": {
"description": "The work UUID. Look up via search_natural_language \u2014 never ask the user for this.",
"format": "uuid",
"type": "string"
}
},
"required": [
"work_id"
],
"type": "object"
},
"name": "list_work_endorsements",
"title": "List Endorsements For a Work"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Return the primary image URL and current metadata for a work, so you can visually analyze the image yourself and propose structured catalogue fields. Use this when the artist asks you to read a work you uploaded, or when beat 2 of the add-work flow surfaced thin hints. The image URL is publicly accessible (Supabase Storage public bucket); fetch it and inspect the image directly with your vision capabilities. Fields you can honestly improve from a visual read: medium (paint vs. print vs. sculpture material vs. digital), classification (painting / sculpture / drawing / photography / time-based / software / installation / performance), visible signature or inscription (transcribe verbatim, note position), date visible in the work itself (distinct from EXIF), description (brief factual read of subject matter), dimensions if a scale reference is in frame. Fields to leave alone unless visible: dimensions without scale (cannot be honestly estimated from a flat photo), attribution, provenance, exhibition history \u2014 those come from records, not the image. Flow: (1) call this tool; (2) fetch + read the image; (3) present your proposals to the artist with per-field reasoning; (4) on confirmation, call update_work with the accepted patches. Do not write without confirmation. Resolve the work by workId (UUID) or uwi (e.g. \"RAI-2026-00417\"). Use search_natural_language to find workId \u2014 never ask the user.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "analyze_work_image",
"title": "Analyze Work Image"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List deals in the catalogue. Filter by state, work_id, or direction. Returns all deals the user can see (as owner, seller, buyer, or intermediary).",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"direction": {
"description": "Filter by direction (primary = first sale, secondary = resale)",
"enum": [
"primary",
"secondary"
],
"type": "string"
},
"state": {
"description": "Filter by deal state",
"enum": [
"proposed",
"negotiating",
"agreed",
"closed_won",
"closed_lost"
],
"type": "string"
},
"work_id": {
"description": "Filter by work ID",
"format": "uuid",
"type": "string"
}
},
"type": "object"
},
"name": "list_deals",
"title": "List Deals"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get deal detail including linked records (RAI requests, consignment requests, shared views, sales, provenance entries, custody events).",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deal_id": {
"description": "The deal ID",
"format": "uuid",
"type": "string"
}
},
"required": [
"deal_id"
],
"type": "object"
},
"name": "get_deal",
"title": "Get Deal"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Create a new deal for a work. Deals track the process of a work changing hands. Most deals are auto-created from purchase requests and consignment approvals; use this for manual deal creation. IMPORTANT: Present a summary and get confirmation before calling.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"buyer_email": {
"format": "email",
"type": "string"
},
"buyer_name": {
"type": "string"
},
"direction": {
"description": "primary = first sale from artist; secondary = resale",
"enum": [
"primary",
"secondary"
],
"type": "string"
},
"intermediary_name": {
"type": "string"
},
"intermediary_role": {
"enum": [
"representation",
"advisory",
"auction",
"private_sale"
],
"type": "string"
},
"list_price_amount": {
"minimum": 0,
"type": "number"
},
"list_price_currency": {
"type": "string"
},
"notes": {
"type": "string"
},
"work_id": {
"description": "The work this deal is for",
"format": "uuid",
"type": "string"
}
},
"required": [
"direction"
],
"type": "object"
},
"name": "create_deal",
"title": "Create Deal"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Advance a deal to the next state or close it. States: proposed -> negotiating -> agreed -> closed_won or closed_lost. close_reason is required when closing as lost. IMPORTANT: Present the transition and get confirmation before calling.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"close_reason": {
"description": "Required when state is closed_lost",
"type": "string"
},
"deal_id": {
"description": "The deal ID",
"format": "uuid",
"type": "string"
},
"state": {
"description": "The new state",
"enum": [
"negotiating",
"agreed",
"closed_won",
"closed_lost"
],
"type": "string"
}
},
"required": [
"deal_id",
"state"
],
"type": "object"
},
"name": "update_deal_state",
"title": "Update Deal State"
}
]
}
},
"requested_protocol_version": "2025-03-26",
"resumed": true,
"session_id_present": true,
"transport": "streamable-http",
"url": "https://mcp.raisonn.ai/mcp"
},
"latency_ms": 80.78,
"status": "ok"
},
"step_up_auth_probe": {
"details": {
"auth_required_checks": [],
"broad_scopes": [],
"challenge_headers": [],
"minimal_scope_documented": false,
"oauth_present": true,
"scope_specificity_ratio": 0.0,
"step_up_signals": [],
"supported_scopes": []
},
"latency_ms": null,
"status": "warning"
},
"tool_snapshot_probe": {
"details": {
"reason": "no_tools"
},
"latency_ms": null,
"status": "missing"
},
"tools_list": {
"details": {
"error": "Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
"headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "118",
"x-ratelimit-reset": "1777629676"
},
"http_status": 400,
"payload": {},
"url": "https://mcp.raisonn.ai/mcp"
},
"latency_ms": 83.01,
"status": "error"
},
"transport_compliance_probe": {
"details": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "114",
"x-ratelimit-reset": "1777629678"
},
"bad_protocol_payload": {
"error": {
"code": -32000,
"message": "Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"
},
"id": null,
"jsonrpc": "2.0"
},
"bad_protocol_status_code": 400,
"delete_error": null,
"delete_status_code": 200,
"expired_session_error": null,
"expired_session_status_code": 400,
"issues": [
"missing_protocol_header",
"expired_session_not_404"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": true,
"transport": "streamable-http"
},
"latency_ms": 90.8,
"status": "error"
},
"utility_coverage_probe": {
"details": {
"completions": {
"advertised": false,
"live_probe": "not_executed",
"sample_target": null
},
"initialize_capability_keys": [
"logging",
"resources",
"tools"
],
"pagination": {
"metadata_signal": false,
"next_cursor_methods": [],
"supported": false
},
"tasks": {
"advertised": false,
"http_status": 400,
"probe_status": "missing"
}
},
"latency_ms": 59.87,
"status": "missing"
}
},
"failures": {
"openid_configuration": {
"error": "Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/openid-configuration'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.raisonn.ai/.well-known/openid-configuration"
},
"server_card": {
"error": "Client error '404 Not Found' for url 'https://mcp.raisonn.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.raisonn.ai/.well-known/mcp/server-card.json"
},
"tools_list": {
"error": "Client error '400 Bad Request' for url 'https://mcp.raisonn.ai/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
"headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "118",
"x-ratelimit-reset": "1777629676"
},
"http_status": 400,
"payload": {},
"url": "https://mcp.raisonn.ai/mcp"
},
"transport_compliance_probe": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json",
"x-ratelimit-limit": "120",
"x-ratelimit-remaining": "114",
"x-ratelimit-reset": "1777629678"
},
"bad_protocol_payload": {
"error": {
"code": -32000,
"message": "Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"
},
"id": null,
"jsonrpc": "2.0"
},
"bad_protocol_status_code": 400,
"delete_error": null,
"delete_status_code": 200,
"expired_session_error": null,
"expired_session_status_code": 400,
"issues": [
"missing_protocol_header",
"expired_session_not_404"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": true,
"transport": "streamable-http"
}
},
"remote_url": "https://mcp.raisonn.ai/mcp",
"server_card_payload": null,
"server_identifier": "ai.raisonn/connect"
}
Known versions
1.0.0
Validation history
7 day score delta
n/a
30 day score delta
n/a
Recent healthy ratio
0%
Freshness
68.8h
| Timestamp | Status | Score | Latency | Tools |
|---|---|---|---|---|
| May 01, 2026 10:00:17 AM UTC | Failing | 58.8 | 2318.6 ms | 0 |
| May 01, 2026 09:51:24 AM UTC | Failing | 58.8 | 3370.3 ms | 0 |
| May 01, 2026 09:46:52 AM UTC | Failing | 58.8 | 1615.2 ms | 0 |
| May 01, 2026 09:42:27 AM UTC | Failing | 58.8 | 501.0 ms | 0 |
| May 01, 2026 09:40:22 AM UTC | Failing | 58.8 | 1388.3 ms | 0 |
| May 01, 2026 09:34:51 AM UTC | Failing | 58.6 | 514.5 ms | 0 |
| May 01, 2026 09:29:03 AM UTC | Failing | 58.6 | 3357.1 ms | 0 |
| May 01, 2026 09:25:36 AM UTC | Failing | 58.6 | 1343.6 ms | 0 |
Validation timeline
| Validated | Summary | Score | Protocol | Auth mode | Tools | High-risk tools | Changes |
|---|---|---|---|---|---|---|---|
| May 01, 2026 10:00:17 AM UTC | Failing | 58.8 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:51:24 AM UTC | Failing | 58.8 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:46:52 AM UTC | Failing | 58.8 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:42:27 AM UTC | Failing | 58.8 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:40:22 AM UTC | Failing | 58.8 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:34:51 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:29:03 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:25:36 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:22:01 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:18:45 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:15:16 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
| May 01, 2026 09:12:07 AM UTC | Failing | 58.6 | 2025-03-26 | oauth_supported | 0 | 0 | none |
Recent validation runs
| Started | Status | Summary | Latency | Checks |
|---|---|---|---|---|
| May 01, 2026 10:00:15 AM UTC | Completed | Failing | 2318.6 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:51:21 AM UTC | Completed | Failing | 3370.3 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:46:50 AM UTC | Completed | Failing | 1615.2 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:42:27 AM UTC | Completed | Failing | 501.0 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:40:20 AM UTC | Completed | Failing | 1388.3 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:34:50 AM UTC | Completed | Failing | 514.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:29:00 AM UTC | Completed | Failing | 3357.1 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:25:34 AM UTC | Completed | Failing | 1343.6 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:21:59 AM UTC | Completed | Failing | 2231.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| May 01, 2026 09:18:44 AM UTC | Completed | Failing | 1582.9 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |