MCP Server

Cameron Rye Portfolio MCP Server

dev.rye/portfolio
Knowledge & Documentation Media & Content Public & reachable MCP 2025-11-25

What this MCP does

Exposes searchable content from a personal portfolio, including blog posts, projects, reading lists, author information, site statistics and contact or newsletter actions.

get_about
Get author profile
Return a short bio about Cameron Rye, the portfolio owner.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
get_now
Get current focus (/now)
Return what Cameron is currently working on, learning, building, reading, and up to in life — the live /now page sections.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url', 'sections'], 'properties': {'url': {'type': 'string'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'status'], 'properties': {'body': {'type': 'string'}, 'title': {'type': 'string'}, 'status': {'type': 'string'}, 'updatedAt': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
get_post
Get blog post
Return the full markdown body and frontmatter of a post by slug.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'minLength': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug', 'frontmatter', 'body', 'url'], 'properties': {'url': {'type': 'string'}, 'body': {'type': 'string'}, 'slug': {'type': 'string'}, 'frontmatter': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}, 'additionalProperties': False}
get_project
Get project
Return the full markdown body and frontmatter of a project by slug.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'minLength': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug', 'frontmatter', 'body', 'url'], 'properties': {'url': {'type': 'string'}, 'body': {'type': 'string'}, 'slug': {'type': 'string'}, 'frontmatter': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}}, 'additionalProperties': False}
get_pulse
Get site pulse
Return live, PII-free operational stats for rye.dev: recent Core Web Vitals p75s, 30-day pageviews, trailing-30d uptime %, top-reacted pages, and the last deploy. Same data the homepage pulse strip shows.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url', 'pulse'], 'properties': {'url': {'type': 'string'}, 'pulse': {'type': 'object', 'required': ['asOf', 'webVitals', 'pageviews', 'uptime', 'topReacted', 'deploy'], 'properties': {'asOf': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'deploy': {'anyOf': [{'type': 'object', 'required': ['sha', 'message', 'branch', 'status', 'buildSeconds', 'completedAt'], 'properties': {'sha': {'type': 'string'}, 'branch': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'status': {'type': 'string'}, 'message': {'type': 'string'}, 'completedAt': {'type': 'number'}, 'buildSeconds': {'anyOf': [{'type': 'number'}, {'type': 'null'}]}}, 'additionalProperties': False}, {'type': 'null'}]}, 'uptime': {'anyOf': [{'type': 'object', 'required': ['pct', 'avgMs', 'days'], 'properties': {'pct': {'type': 'number'}, 'days': {'type': 'number'}, 'avgMs': {'type': 'number'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'pageviews': {'type': 'object', 'required': ['days', 'total', 'series'], 'properties': {'days': {'type': 'number'}, 'total': {'type': 'number'}, 'series': {'type': 'array', 'items': {'type': 'number'}}}, 'additionalProperties': False}, 'webVitals': {'type': 'array', 'items': {'type': 'object', 'required': ['metric', 'p75', 'unit', 'rating'], 'properties': {'p75': {'type': 'number'}, 'unit': {'type': 'string'}, 'metric': {'type': 'string'}, 'rating': {'type': 'string'}}, 'additionalProperties': False}}, 'topReacted': {'type': 'array', 'items': {'type': 'object', 'required': ['path', 'count'], 'properties': {'path': {'type': 'string'}, 'count': {'type': 'number'}}, 'additionalProperties': False}}}, 'additionalProperties': False}}, 'additionalProperties': False}
get_reading
Get reading list
Return Cameron's reading list — books currently reading, finished, or abandoned, with notes. Filter by status if given.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'status': {'enum': ['reading', 'finished', 'abandoned'], 'type': 'string'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url', 'books'], 'properties': {'url': {'type': 'string'}, 'books': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'author', 'status'], 'properties': {'url': {'type': 'string'}, 'notes': {'type': 'string'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'status': {'type': 'string'}, 'started': {'type': 'string'}, 'finished': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
list_posts
List blog posts
Return up to N most recent published blog posts.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['posts'], 'properties': {'posts': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'description', 'date', 'tags'], 'properties': {'date': {'type': 'string'}, 'slug': {'type': 'string'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'title': {'type': 'string'}, 'description': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
list_projects
List projects
Return all portfolio projects with their slug, title, and short description.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['projects'], 'properties': {'projects': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'description'], 'properties': {'slug': {'type': 'string'}, 'title': {'type': 'string'}, 'description': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
search_posts
Search blog posts
Case-insensitive substring match across title, description, and tags. Returns up to 10 matches.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'query': {'type': 'string', 'minLength': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['matches'], 'properties': {'matches': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'description', 'date', 'tags'], 'properties': {'date': {'type': 'string'}, 'slug': {'type': 'string'}, 'tags': {'type': 'array', 'items': {'type': 'string'}}, 'title': {'type': 'string'}, 'description': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
search_site
Semantic site search
Semantic (vector similarity) search across blog posts and projects — the same Cloudflare Vectorize retrieval the Ask chatbot uses, without the LLM call. Broader than search_posts (which only does exact substring matching on title/description/tags): finds conceptually related content even when the query words never appear verbatim. Returns scored chunks with deep-link URLs.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'url', 'score', 'snippet'], 'properties': {'url': {'type': 'string'}, 'score': {'type': 'number'}, 'title': {'type': 'string'}, 'snippet': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
submit_contact
Submit contact message
Send Cameron a message through the site contact form. Subject to the same validation and per-IP rate limits as the contact form itself.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name', 'email', 'subject', 'message'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}, 'message': {'type': 'string'}, 'subject': {'type': 'string'}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['success', 'id'], 'properties': {'id': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'success': {'type': 'boolean'}}, 'additionalProperties': False}
subscribe_newsletter
Subscribe to the newsletter
Subscribe an email address to the newsletter. Sends a confirmation email; the subscription only becomes active once confirmed. Same validation and per-IP rate limits as the signup form.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['email'], 'properties': {'email': {'type': 'string', 'format': 'email', 'pattern': "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}, 'source': {'type': 'string', 'maxLength': 50}}}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['success', 'message'], 'properties': {'message': {'type': 'string'}, 'success': {'type': 'boolean'}}, 'additionalProperties': False}
Added
subscribe_newsletter
Sept. 17, 2026, 12:39 p.m.
Added
submit_contact
Sept. 17, 2026, 12:39 p.m.
Added
get_pulse
Sept. 17, 2026, 12:39 p.m.
Added
get_reading
Sept. 17, 2026, 12:39 p.m.
Added
get_now
Sept. 17, 2026, 12:39 p.m.
Added
get_about
Sept. 17, 2026, 12:39 p.m.
Added
get_project
Sept. 17, 2026, 12:39 p.m.
Added
list_projects
Sept. 17, 2026, 12:39 p.m.
Added
get_post
Sept. 17, 2026, 12:39 p.m.
Added
search_site
Sept. 17, 2026, 12:39 p.m.
Added
search_posts
Sept. 17, 2026, 12:39 p.m.
Added
list_posts
Sept. 17, 2026, 12:39 p.m.