Artsdata

ca.artsdataPublished by artsdata.caOfficial publisherv1.0.0Updated Oct 24, 2026

Search Artsdata for authoritative data on Canadian events, artists, organizations, and places.

VerifiedStreamable HTTPWeb executableDatabasesKnowledge & Memory

Overview

AI-generated overview

Remote MCP server for the Artsdata knowledge graph, letting an assistant search Canadian events, artists, organizations and places and run read-only SPARQL.

What you can do
Search entities by name, with filters on entity type and concept scheme, returning linked labels and Artsdata IDs to cite in answers. Retrieve full entity details by URI, including the source datasets the entity was built from. Search events by place, artist, organization, event type concept and language. Read the graph's data model: classes, properties, cardinality, value types and controlled vocabularies. Run read-only SPARQL SELECT or ASK queries and get standard JSON results, with row limits and truncation flags.
When to use it
Useful when an assistant needs authoritative, sourced data on Canadian arts and culture: event listings, venue and organization lookups, artist identification, or structured queries against a linked-data graph. Best for research, directory building and data reconciliation tasks rather than general web search.
Requirements
A remote streamable HTTP endpoint; no package or local runtime needed. No authentication, API keys or headers are declared. The assistant needs network access to the Artsdata endpoints. Self-hosting the Rails app would need Ruby, Rails and Bundler, plus the documented environment variables for the reconciliation, schema, API and SPARQL endpoints.
Before you install
Queries are read-only, but the server reports usage: calls are sent to Google Analytics 4, including the tool used, duration and caller User-Agent, and for SPARQL calls the WHERE clause. Every call is also written to a request log containing the full arguments, such as search terms, entity URIs and complete SPARQL queries. Assume anything you query may be logged or analyzed.

Installation

In SourceWeft

  1. Open Artsdata in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/ca.artsdata%2Fmcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "artsdata": {
      "type": "http",
      "url": "https://mcp.artsdata.ca/mcp"
    }
  }
}

README

Artsdata MCP Server (Rails)

Prerequisites

  • Ruby 4.0.6
  • Rails 8.1
  • Bundler

Setup

bash
bundle install

Endpoints

  • POST /mcp: MCP Streamable HTTP endpoint (tools and resources are documented in docs/mcp-server.md)
  • GET /up: health check
  • GET /llms.txt: machine-readable guide for agents

Calls to /mcp are reported to Google Analytics 4.

MCP resources

  • artsdata://dumps/core-minus-provenance/latest (artsdata_dump): manifest for the latest Artsdata core-minus-provenance dump — the core graph with provenance and RDF-star annotations removed, published monthly as a gzipped Turtle file.

    resources/read asks the Artsdata Databus for the newest version of the artifact (GET /databus/artifact/latest?artifact=<ARTIFACT_URI>) and returns a small JSON document with the download URL, version, format and compression — never the dump contents. Going through the Databus means MCP clients need to know nothing about where the file is actually stored. Clients download the file from downloadUrl and compare version across reads to detect when a new dump lands.

Directory structure

text
.github/  workflows/    deploy-to-heroku.yml  # Workflow deploying to Heroku    run-unit-tests.yml    # Reusable workflow running Minitest    unit-test-on-pull-request.yml # Workflow running unit tests on pull requestsapp/  resource/     # MCP resources  schema/       # JSON schemas of the tools' input and output  services/     # Clients for the reconciliation service, SPARQL endpoint and Databus  tool/         # MCP toolsconfig/  initializers/mcp_server.rb  # MCP server: registered tools, resources and transport  initializers/mcp_analytics.rb # Google Analytics 4 reporting configuration  routes.rblib/  mcp_analytics/  # Rack middleware reporting MCP usage to Google Analytics 4test/

Configuration

  • ARTSDATA_RECONCILIATION_ENDPOINT: reconciliation service URL used by the search_entities, get_entity and search_events tools.
  • ARTSDATA_SCHEMA_URL (optional): Turtle file compiled by the get_schema tool (default https://docs.artsdata.ca/artsdata-schema.ttl).
  • ARTSDATA_SCHEMA_CACHE_TTL_SECONDS (optional): how long the compiled schema is cached in process (default 86400).
  • ARTSDATA_CORS_ORIGINS (optional): comma-separated CORS origins (default *).
  • ARTSDATA_API_ENDPOINT (optional): base URL of the Artsdata API, used to query the Databus for the latest data dump (default https://api.artsdata.ca).
  • ARTSDATA_SPARQL_ENDPOINT (optional): SPARQL endpoint queried by the sparql_query tool (default https://query.artsdata.ca/query).
  • ARTSDATA_SPARQL_TIMEOUT_SECONDS (optional): read timeout for a sparql_query call (default 25).
  • ARTSDATA_SPARQL_MAX_ROWS (optional): maximum rows sparql_query returns; extra rows are cut and the result is flagged truncated (default 1000).
  • Docker instance profiles are provided in:
    • env/production.env
    • env/staging.env
  • ARTSDATA_INSTANCE_TYPE (optional): PRODUCTION (default) or STAGING. The Docker entrypoint loads the matching file from env/.

Usage analytics

Calls to /mcp are reported to Google Analytics 4, including the tool used, how long the call took, and the caller's User-Agent. Reporting stays off until both variables below are set, so development and CI need no configuration.

  • GA4_MEASUREMENT_ID: the GA4 property's G-XXXXXXXXXX id. Not a secret; defaulted for production in config/environments/production.rb.
  • GA4_API_SECRET: Measurement Protocol secret. Secret — set it as a Heroku. config var, never in env/*.env, which is committed.
  • GA4_DEBUG (optional): tag events so they appear in GA4's DebugView within seconds, and log whether GA4 considers each payload valid. Events are still recorded. Useful because the normal endpoint answers 204 whether or not the payload is valid.

Reporting is on when both credentials are present and off otherwise.

Separately, every MCP call is written to stdout as one JSON line, including the complete arguments the agent sent — the full SPARQL query, search terms, entity URIs. On Heroku these lines go to heroku logs and to any drain you attach.

  • MCP_REQUEST_LOG (optional): set to false to silence the request log. It runs independently of Google Analytics and works with no GA4 credentials set.

For sparql_query calls, two extra facts are reported: sparql_form (SELECT, ASK or UNKNOWN) and sparql_where, the WHERE clause as the agent wrote it with the PREFIX block removed and whitespace collapsed. Both go to Google Analytics and to the request log; GA4 cuts the WHERE clause at its 100-character limit, the log keeps it whole.

Run the application

bash
bundle exec rails server

The API will be available at http://localhost:3000.

Docker

Build the image:

bash
docker build -t artsdata-mcp-server .

Run the server:

bash
docker run --rm -p 3000:3000 artsdata-mcp-server

Run with staging profile:

bash
docker run --rm -p 3000:3000 -e ARTSDATA_INSTANCE_TYPE=STAGING artsdata-mcp-server

Run tests in Docker:

bash
docker run --rm artsdata-mcp-server bundle exec rails test

Run tests

Run a single test file:

bash
bundle exec rails test test/tool/search_events_test.rb

Run all tests:

bash
bundle exec rails test

llms.txt maintenance

The public/llms.txt file is generated from MCP server metadata (tools, resources, descriptions, and schemas).

CI behavior:

  • Pull request CI runs bundle exec rake docs:check_llms.
  • If public/llms.txt is stale, the workflow fails.

Developer workflow:

  • Most of the time, no manual action is needed.
  • If you change MCP tools, resources, or schemas, regenerate the file with:
bash
bundle exec rake docs:generate_llms
  • Confirm it is in sync with:
bash
bundle exec rake docs:check_llms
  • Commit the updated public/llms.txt.

Deployment & CI/CD Details:

This project uses GitHub Actions for continuous integration and automated deployment to Heroku. Every push to the main branch triggers a workflow that builds and deploys the application to Heroku. The workflow is defined in .github/workflows/deploy-to-heroku.yml.

Every pull request triggers a workflow that unit tests. The workflow is defined in .github/workflows/run-unit-tests.yml.

Server Access & API Documentation

The Artsdata MCP Server is actively deployed and hosted in a live production environment.

Live Production Endpoints

Source: README.md at commit 2ed7f52

Tools

5

search_entities

Tool to search for entities in the Artsdata knowledge graph by name, with optional filters on entity type and on the controlled vocabulary (skos:ConceptScheme) a concept belongs to. Each result has a markdown-link `label` like '[Name (K12-345)](https://kg.artsdata.ca/resource/K12-345)': use it verbatim when mentioning the entity.

Parameterslimitqueryrequiredtypeslanguagein_scheme

get_entity

Tool to get entities details from Artsdata Knowledge Graph by entity URI. Entity URIs end in the Artsdata ID (K\d+-\d+, e.g. K12-345); cite it with the entity name. The result's `sources` lists the datasets the entity was built from: name them when you answer about the entity, linking `url` when present, else by `name`.

Parametersurirequired

search_events

Tool to search for events in the Artsdata knowledge graph by place, artist, organization, has_event_type_concept and language. Places, artists and organizations are Artsdata entity URIs; the has_event_type_concept filter takes concept URIs from the Artsdata Event Types vocabulary (adr:ArtsdataEventTypes), not schema.org classes. Resolve any name or label to its URI with search_entities first. Places must be venues; for events in a city or region, use sparql_query (see the places parameter). At least one filter is required. Entity URIs end in the Artsdata ID (K\d+-\d+, e.g. K12-345); cite it with the entity name.

ParameterslimitplacesartistslanguagestartDateToorganizationsstartDateFromhas_event_type_concept

get_schema

Returns the data model of the Artsdata Knowledge Graph: its entity classes (Event, Place, Organization, Person, LivePerformanceWork...), the properties of each with required/optional, cardinality, value types, linked classes and allowed values, the controlled vocabularies, the SPARQL prefixes, and conventions for querying. Derived from the Artsdata Ontology and the Artsdata CORE graph SHACL shapes. Call this before writing a SPARQL query to run with sparql_query against https://query.artsdata.ca/query, since Artsdata's model is not general knowledge. Takes no input.

Takes no parameters.

sparql_query

Runs a read-only SPARQL 1.1 SELECT or ASK query against the Artsdata Knowledge Graph (https://query.artsdata.ca/query) and returns the result as SPARQL 1.1 Query Results JSON, exactly as the endpoint returns it: head.vars and results.bindings for SELECT, boolean for ASK. Call get_schema first and build the query from the classes, properties, prefixes and conventions it returns, since Artsdata's model is not general knowledge. Declare every PREFIX you use and always add a LIMIT: at most 1000 rows are returned (the rest is cut and truncated is true; page with OFFSET), and a query gets 25 seconds. If the endpoint rejects the query, its error message is returned so you can fix the query and retry. For the details of an entity URI in the results use get_entity; to find an entity's URI from its name use search_entities. Always SELECT the entity URI next to its label so its Artsdata ID can be cited. Entity URIs end in the Artsdata ID (K\d+-\d+, e.g. K12-345); cite it with the entity name. To find who claims a property value, see the sources guidance in the get_schema conventions.

Parametersqueryrequired

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.