Define a normalized course schema with canonical fields: course_id, provider, title, description, subject_area, level, duration_hours, language, url, and availability_status
For each provider (e.g., internal LMS, Open edX, external catalog), write an adapter that calls the provider's API and maps its response fields to your canonical schema
Cache provider responses with a TTL appropriate to how frequently the provider's catalog changes (e.g., 1-24 hours), using the provider's last_modified or updated_at field where available to do conditional fetches
Expose a unified search endpoint that accepts query parameters (keyword, subject, level, language) and fans out to all adapters, merging and deduplicating results by URL or course_id before returning
Include a provider_metadata field in each result object to surface provider-specific data that does not fit the canonical schema without breaking consumers
Known gotchas
Provider APIs have different rate limits and SLAs; a single slow or rate-limited provider should not block the entire catalog response — implement per-provider timeouts and return partial results with an error flag for timed-out providers
Course availability can change between catalog fetch and user enrollment attempt; always re-verify availability at enrollment time rather than relying solely on cached catalog data
Deduplication across providers is non-trivial; the same course (e.g., a MOOC cross-listed on multiple platforms) will have different IDs and slightly different metadata on each platform — use URL canonicalization or ISBN/course-code matching as a secondary key
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp