A Model Context Protocol server for the complete schema.org vocabulary
Empower AI assistants to explore schema.org types, generate JSON-LD examples, validate structured data, and navigate the complete ontology with intelligent fuzzy matching and persistent caching.
Features · Installation · Quick Start · Documentation · Contributing
- Features
- Installation
- Quick Start
- Available Tools
- Example Workflows
- How It Works
- Configuration
- Development
- Deployment
- Troubleshooting
- Contributing
- License
| Feature | Description |
|---|---|
| Persistent Caching | Schema.org data cached locally with TTL-based refresh—no cold start delays |
| Fuzzy Matching | Typo-tolerant lookups with intelligent "Did you mean?" suggestions |
| Type Aliases | Natural language shortcuts: blog → BlogPosting, faq → FAQPage |
| Filtered Properties | Get direct-only, inherited-only, or paginated property lists |
| Batch Operations | Compare types, validate multiple JSON-LD objects, bulk lookups |
| Dynamic Examples | Generated examples use current dates and realistic data |
- Type Exploration — Detailed information about any schema.org type with deprecation status
- Smart Search — Keyword search with relevance-based ranking
- Hierarchy Navigation — Explore inheritance relationships, ancestors, and descendants
- Property Discovery — List all properties with expected types, including inherited ones
- JSON-LD Generation — Create realistic examples at minimal, standard, or comprehensive detail levels
- Validation — Check structured data against the schema.org vocabulary with actionable feedback
- Relationship Mapping — Discover types connected through property relationships
- Node.js >= 18.0.0
- npm or yarn
# Clone the repository
git clone https://github.com/your-org/schema-org-mcp.git
cd schema-org-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Verify the installation
npm startnpm install -g schema-org-mcpAdd the server to your Claude Desktop configuration:
| Platform | Configuration Path |
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Local Installation:
{
"mcpServers": {
"schema-org": {
"command": "node",
"args": ["/absolute/path/to/schema-org-mcp/dist/index.js"]
}
}
}Via npx:
{
"mcpServers": {
"schema-org": {
"command": "npx",
"args": ["schema-org-mcp"]
}
}
}The server provides 14 tools organized into three categories.
Returns server version, build metadata, and runtime information. Use this to verify which version is deployed.
{}Response:
version,gitSha,gitBranch,buildTimeruntime— Node version, platform, uptimetools— Count and names of registered toolscache— Cache status
Returns performance statistics including cache hit rates, tool invocation counts, and timing metrics.
{}Response:
coldStartMs,warmStartMscacheHits,cacheMisses,cacheStaleHitstoolInvocations— Per-tool count, errors, average durationuptimeMs
Retrieve detailed information about a schema.org type. Supports fuzzy matching for typos and natural aliases.
{
"typeName": "Person"
}Also accepts:
- Typos:
"Persn"→ suggestsPerson - Aliases:
"blog"→BlogPosting,"faq"→FAQPage
Response:
name,description,id,urlsuperTypes— Direct parent typescategory—core,pending,auto,bib, orhealth-lifescideprecatedandsupersededBy(if applicable)
Search for schema types by keyword with relevance-based ranking.
{
"query": "local business",
"limit": 10
}Get complete inheritance hierarchy including ancestors and children.
{
"typeName": "NewsArticle"
}List all properties available for a type with filtering and pagination support.
{
"typeName": "Organization",
"mode": "direct",
"includeDeprecated": false,
"limit": 20,
"offset": 0
}| Parameter | Options | Default |
|---|---|---|
mode |
all, direct, inherited |
all |
includeDeprecated |
true, false |
false |
limit |
Number | — |
offset |
Number | 0 |
Generate realistic JSON-LD examples with dynamic dates and nested types.
{
"typeName": "LocalBusiness",
"style": "comprehensive",
"customProperties": {
"name": "My Coffee Shop"
}
}| Style | Description |
|---|---|
minimal |
Name property only |
standard |
Common properties |
comprehensive |
Full property set with nested types |
Supported domain presets: Person, Organization, LocalBusiness, Product, Event, Article, BlogPosting, Recipe, WebSite, FAQPage, Place
Get comprehensive information about a specific property. Supports fuzzy matching.
{
"propertyName": "address"
}Retrieve all valid values for an enumeration type.
{
"enumerationType": "DayOfWeek"
}Validate JSON-LD structured data with intelligent suggestions for typos.
{
"jsonld": {
"@context": "https://schema.org",
"@type": "Product",
"name": "Widget",
"nmae": "typo"
}
}Response:
valid— Boolean resulterrors— Unknown types or properties with suggestionswarnings— Deprecated items, missing contextsuggestions— Recommended properties to add
Discover types connected through property relationships.
{
"typeName": "Person"
}Retrieve information about multiple types in a single call.
{
"typeNames": ["Person", "Organization", "LocalBusiness"]
}Compare 2–5 schema.org types side by side with usage recommendations.
{
"typeNames": ["Article", "BlogPosting", "NewsArticle"]
}Response:
types— Summary of each typesharedProperties— Properties common to alluniqueProperties— Properties unique to eachrecommendation— When to use each type
Validate multiple JSON-LD objects in a single call.
{
"items": [
{ "@context": "https://schema.org", "@type": "Person", "name": "John" },
{ "@context": "https://schema.org", "@type": "Organization", "name": "Acme" }
]
}1. search_schemas → {"query": "product"}
2. compare_types → {"typeNames": ["Product", "Offer", "AggregateOffer"]}
3. get_type_properties → {"typeName": "Product", "mode": "direct", "limit": 15}
4. generate_example → {"typeName": "Product", "style": "comprehensive"}
1. compare_types → {"typeNames": ["Article", "BlogPosting"]}
Response includes recommendation:
"Use BlogPosting for blog content with clear publication dates and author.
Use Article for general news or editorial content."
1. validate_jsonld_batch → {"items": [...array of JSON-LD objects...]}
Returns per-object validation with actionable suggestions
1. get_schema_type → {"typeName": "Perosn"}
Error: "Type 'Perosn' not found. Did you mean: Person, Physician, Performer?"
The server fetches the complete schema.org vocabulary and implements a multi-layer cache:
| Layer | Location | Behavior |
|---|---|---|
| Memory | Runtime | Instant access after first load |
| Disk | ~/.cache/schema-org-mcp/schema-org-data.json |
Persists across restarts |
- TTL: 24 hours (configurable)
- Fallback: Uses stale cache if schema.org is unavailable
- Check natural language aliases (
blog→BlogPosting) - Attempt case-insensitive and normalized matching
- Calculate similarity scores using Levenshtein distance
- Return top 3 suggestions if score > 0.4
| Category | Count |
|---|---|
| Types (classes) | ~800+ |
| Properties | ~1,400+ |
| Enumeration types | ~80+ |
The client accepts optional configuration parameters:
const client = new SchemaOrgClient({
cacheDir: '/custom/cache/path', // Default: ~/.cache/schema-org-mcp
ttlMs: 12 * 60 * 60 * 1000, // Default: 24 hours
offline: false, // Default: false
});# Watch mode for development
npm run dev
# Run the test suite
npm test
# Build for production (generates build fingerprint)
npm run build
# Run full QA checklist
npm run qa
# Verify deployment
npm run verifyEvery build embeds version metadata for traceability:
npm run build
# Output: Build info generated: v1.1.0 (abc1234)Confirm the correct version is running:
npm run verify
# Or with explicit version:
npm run verify 1.1.0 abc1234Verification checks:
- Version and git SHA match
compare_typestool responds correctly- Fuzzy matching returns suggestions
- FAQPage examples include
mainEntity - Cache status is available
On startup, the server logs its identity:
═══════════════════════════════════════════
schema-org-mcp v1.1.0 (abc1234)
Built: 2025-04-04T15:00:00.000Z
Branch: main
Node: v22.20.0
Tools: 14 registered
server_info, server_stats, get_schema_type, ...
═══════════════════════════════════════════
Use the server_info tool to check the running version programmatically.
If the first request is slow, the cache may have expired:
ls -la ~/.cache/schema-org-mcp/Ensure schema data is fully loaded. The initialize() method must complete before fuzzy matching works.
Delete the cache directory to fetch fresh data:
rm -rf ~/.cache/schema-org-mcp/Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please ensure all tests pass before submitting.
This project is licensed under the MIT License — see the LICENSE file for details.