Cameron Rye Portfolio MCP Server

Cameron Rye's blog, projects, resume, and live site stats, plus contact and newsletter tools.

使うべきか

品質と安全性

B
説明の品質
83%
スキーマの完全性
62%
命名の品質
100%
ポイズニングのリスク
100%
権限の一致
100%
プロトコルへの準拠
100%

検出事項(5)

  • LOWTool 'search_posts' description lacks action verbsearch_posts 内
  • LOWTool 'get_post' description lacks action verbget_post 内
  • LOWTool 'list_projects' description lacks action verblist_projects 内
  • LOWTool 'get_project' description lacks action verbget_project 内
  • LOWTool 'get_about' description lacks action verbget_about 内

ツール定義とプロトコルへの準拠に関する自動分析に基づいています。

コンテキストコスト

~2,313トークン数(ツール定義)
~1.8 KB一般的なレスポンスサイズ
注意への影響は中程度(128k コンテキストの 1.81%)

これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。

インストール

ワンクリックインストール

これを `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
}

コミュニティ

このサーバーを評価する

エビデンス

最近の観測

検証済みバージョンは記録されていませんツール 12 件
検証済みバージョンは記録されていませんツール 12 件