Cameron Rye Portfolio MCP Server
Cameron Rye's blog, projects, resume, and live site stats, plus contact and newsletter tools.
使うべきか
品質と安全性
検出事項(5)
- LOWsearch_posts 内
- LOWget_post 内
- LOWlist_projects 内
- LOWget_project 内
- LOWget_about 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"portfolio": {
"url": "https://rye.dev/mcp"
}
}
}リモートエンドポイント
https://rye.dev/mcpstreamable-httpできること
ツール一覧
ツール(12)
🟢list_posts(limit)
Return up to N most recent published blog posts.
入力スキーマ
{
"type": "object",
"properties": {
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"posts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"date": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"slug",
"title",
"description",
"date",
"tags"
],
"additionalProperties": false
}
}
},
"required": [
"posts"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search_posts(query)
Case-insensitive substring match across title, description, and tags. Returns up to 10 matches.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"matches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"date": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"slug",
"title",
"description",
"date",
"tags"
],
"additionalProperties": false
}
}
},
"required": [
"matches"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search_site(query, limit)
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.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"limit": {
"default": 5,
"type": "integer",
"minimum": 1,
"maximum": 10
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"score": {
"type": "number"
},
"snippet": {
"type": "string"
}
},
"required": [
"title",
"url",
"score",
"snippet"
],
"additionalProperties": false
}
}
},
"required": [
"results"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡get_post(slug)
Return the full markdown body and frontmatter of a post by slug.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"minLength": 1
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"frontmatter": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"body": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"frontmatter",
"body",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_projects
Return all portfolio projects with their slug, title, and short description.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"slug",
"title",
"description"
],
"additionalProperties": false
}
}
},
"required": [
"projects"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_project(slug)
Return the full markdown body and frontmatter of a project by slug.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"minLength": 1
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"frontmatter": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"body": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"frontmatter",
"body",
"url"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_about
Return a short bio about Cameron Rye, the portfolio owner.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_now
Return what Cameron is currently working on, learning, building, reading, and up to in life — the live /now page sections.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"sections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"body": {
"type": "string"
}
},
"required": [
"title",
"status"
],
"additionalProperties": false
}
}
},
"required": [
"url",
"sections"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_reading(status)
Return Cameron's reading list — books currently reading, finished, or abandoned, with notes. Filter by status if given.
入力スキーマ
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"reading",
"finished",
"abandoned"
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"books": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"author": {
"type": "string"
},
"status": {
"type": "string"
},
"started": {
"type": "string"
},
"finished": {
"type": "string"
},
"url": {
"type": "string"
},
"notes": {
"type": "string"
}
},
"required": [
"title",
"author",
"status"
],
"additionalProperties": false
}
}
},
"required": [
"url",
"books"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_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.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"pulse": {
"type": "object",
"properties": {
"asOf": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"webVitals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "string"
},
"p75": {
"type": "number"
},
"unit": {
"type": "string"
},
"rating": {
"type": "string"
}
},
"required": [
"metric",
"p75",
"unit",
"rating"
],
"additionalProperties": false
}
},
"pageviews": {
"type": "object",
"properties": {
"days": {
"type": "number"
},
"total": {
"type": "number"
},
"series": {
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"days",
"total",
"series"
],
"additionalProperties": false
},
"uptime": {
"anyOf": [
{
"type": "object",
"properties": {
"pct": {
"type": "number"
},
"avgMs": {
"type": "number"
},
"days": {
"type": "number"
}
},
"required": [
"pct",
"avgMs",
"days"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"topReacted": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"count": {
"type": "number"
}
},
"required": [
"path",
"count"
],
"additionalProperties": false
}
},
"deploy": {
"anyOf": [
{
"type": "object",
"properties": {
"sha": {
"type": "string"
},
"message": {
"type": "string"
},
"branch": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"buildSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"completedAt": {
"type": "number"
}
},
"required": [
"sha",
"message",
"branch",
"status",
"buildSeconds",
"completedAt"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"asOf",
"webVitals",
"pageviews",
"uptime",
"topReacted",
"deploy"
],
"additionalProperties": false
}
},
"required": [
"url",
"pulse"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟡submit_contact(name, email, subject, 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.
入力スキーマ
{
"type": "object",
"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,}$"
},
"subject": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"name",
"email",
"subject",
"message"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"success",
"id"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}⚪subscribe_newsletter(email, source)
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.
入力スキーマ
{
"type": "object",
"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
}
},
"required": [
"email"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}出力スキーマ
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"message": {
"type": "string"
}
},
"required": [
"success",
"message"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}コミュニティ
エビデンス