Frank Goortani CV MCP Server について
Frank Goortani CV MCP Serverは、Frank Goortaniの経歴を構造化ツールとMarkdownリソースで提供します。AIアシスタントやMCP対応アプリ向けに、検索や企業別の職歴取得に対応します。
主な機能
- 01プロフィール、スキル、関心分野の取得
- 02Markdown形式の履歴書の取得
- 03履歴書テキストの検索
- 04企業別の職歴の絞り込み
- 05履歴書とプロフィール画像のリンク取得
活用シーン
- 01Frank Goortaniのスキルや経歴の確認
- 02特定企業での職歴の検索
- 03対応アプリで履歴書全体を閲覧
MCP 対応
MCPサーバーはツールと`cv://frankgoortani`リソースを通じて経歴情報を提供し、stdioとHTTP通信に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Frank Goortani CV MCP Server
Frank Goortani の CV 情報を提供するために特別に設計された Model Context Protocol(MCP)サーバーです。このサーバーは CV データへの構造化されたアクセスを提供し、AI アシスタントやその他の MCP 互換クライアントが、標準化された形式で職務情報を取得、検索、表示できるようにします。
プロジェクト概要
目的
このプロジェクトは、標準化されたインターフェースを通じて Frank Goortani の履歴書情報を公開する MCP サーバーを実装します。このサーバーにより、AI アシスタントや MCP 互換アプリケーションは、職務プロフィール、スキル、職務経験などを含む構造化された CV データにアクセスできます。
アーキテクチャ概要
このプロジェクトは FastMCP フレームワークを使用して構築され、Model Context Protocol の仕様に準拠しています。モジュール型アーキテクチャで設計されています。
- コアモジュール:データ構造、ツールの実装、リソース定義を含みます
- サーバーモジュール:stdio および HTTP 通信のトランスポートハンドラーを提供します
- デプロイ:Cloudflare Workers へのシームレスなデプロイ向けに設定されています
graph TD
LLM[LLM Systems] -->|MCP Protocol| API[CV MCP API]
API -->|Tools| CV[CV Data]
API -->|Resource| MD[CV Markdown]
subgraph "Frank Goortani CV MCP Server"
API
subgraph "Data Sources"
CV
MD
end
end
API -->|Deployment| CFW[Cloudflare Workers]
主な機能
- CV データへのアクセス:プロフィール情報、スキル、関心分野、職務経験に構造化された形式でアクセスできます
- Markdown リソース:CV 全文を Markdown リソースとして利用できます
- 検索機能:CV のすべてのセクションを対象にテキスト検索できます
- 企業経験の絞り込み:特定の企業での経験を対象に取得できます
- メディアへのアクセス:履歴書 PDF とプロフィール写真への直接リンクを利用できます
- デプロイ対応:Cloudflare Workers へのデプロイ向けに設定されています
- デュアルトランスポート:stdio(ローカル)と HTTP(リモート)の両方の通信に対応しています
リソースとツール
利用可能なリソース
| URI | 説明 | 種類 |
|---|---|---|
cv://frankgoortani | Frank Goortani の CV 全文(Markdown 形式) | text/markdown |
利用可能なツール
get_profile
名前、肩書き、職務に関する説明など、Frank Goortani のプロフィール情報を返します。
- パラメーター:なし
- 戻り値:プロフィール情報を含む JSON オブジェクト
例:
// Request
const result = await client.callTool("get_profile", {});
// Response
{
"name": "Frank Goortani",
"title": "Hands on Solution Architect | LLM, Web, Cloud, Mobile, Strategy",
"certifications": ["TOGAF", "PMP"],
"email": "[email protected]",
"description": "Visionary technology executive and AI leader with over 25 years of experience..."
}
get_skills
Frank Goortani の職務上のスキルの一覧を返します。
- パラメーター:なし
- 戻り値:スキルの JSON 配列
例:
// Request
const result = await client.callTool("get_skills", {});
// Response
[
"Distributed Systems, API platforms, Microservices, integrations, Workflow systems",
"Generative AI, Large Language Models (LLMs), AI agents, AI automation, Machine Learning",
"Reactive and Functional Programming in Go, Python, Java, Swift, Typescript and JavaScript",
// ...additional skills
]
get_interests
Frank Goortani の職務上の関心分野の一覧を返します。
- パラメーター:なし
- 戻り値:関心分野の JSON 配列
例:
// Request
const result = await client.callTool("get_interests", {});
// Response
[
"Startups", "GoLang", "Python", "Typescript", "LangChain", "LLMs", "Microservices", "MCPs"
]
search_cv
CV 全体から指定された用語を検索し、一致するセクションを返します。
- パラメーター:
query(string):CV 内で検索する語句
- 戻り値:一致するセクションを含む JSON オブジェクト
例:
// Request
const result = await client.callTool("search_cv", {
query: "generative ai"
});
// Response
{
"matches": [
{
"section": "profile",
"content": "Visionary technology executive and AI leader with over 25 years of experience driving strategic innovation in generative AI..."
},
{
"section": "skills",
"content": "Generative AI, Large Language Models (LLMs), AI agents, AI automation, Machine Learning"
}
// ...additional matches
]
}
get_company_experience
特定の企業での職務経験を取得します。
- パラメーター:
company(string):職務経験を取得する企業名
- 戻り値:一致する職務経験を含む JSON オブジェクト。一致するものがない場合は
UserErrorをスローします。
例:
// Request
const result = await client.callTool("get_company_experience", {
company: "Uber"
});
// Response
{
"experiences": [
{
"company": "Uber",
"period": "2021-now",
"title": "Solution Architect",
"highlights": [
"Worked on UDE (User Data Extraction) and DSAR (Data Subject Access Request) Automation...",
// ...additional highlights
]
}
]
}
get_resume_link
Frank Goortani の履歴書 PDF の URL を返します。
- パラメーター:なし
- 戻り値:履歴書の URL を含む JSON オブジェクト
例:
// Request
const result = await client.callTool("get_resume_link", {});
// Response
{
"resumeLink": "media/Frank Goortani Resume--solution-architect-2024.pdf"
}
get_profile_picture
Frank Goortani のプロフィール写真の URL を返します。
- パラメーター:なし
- 戻り値:プロフィール写真の URL を含む JSON オブジェクト
例:
// Request
const result = await client.callTool("get_profile_picture", {});
// Response
{
"pictureLink": "media/frankgoortani.png"
}
デプロイ手順
前提条件
- Bun または Node.js(v18 以降)
- Wrangler CLI(Cloudflare へのデプロイ用)
- Cloudflare アカウント(デプロイ用)
ローカル開発
-
リポジトリをクローンします
git clone <repository-url> cd cv-mcp -
依存関係をインストールします
# Using Bun (recommended) bun install # OR using npm npm install -
stdio トランスポートを使用してサーバーをローカルで起動します(CLI ツール向け)
# Using Bun bun start # OR using npm npm start -
HTTP トランスポートを使用してサーバーをローカルで起動します(ウェブアプリケーション向け)
# Using Bun bun run start:http # OR using npm npm run start:http -
自動リロードを有効にして開発する場合
# Using Bun with stdio transport bun run dev # Using Bun with HTTP transport bun run dev:http
Cloudflare へのデプロイ
-
Cloudflare アカウントにログインします
wrangler login -
必要に応じて wrangler.toml を更新します
設定はすでに
wrangler.tomlファイルに用意されています。次の項目をカスタマイズできます。- カスタムドメインのルート
- 環境変数
- KV 名前空間の接続
-
Cloudflare にデプロイします
# Deploy to production npm run deploy # OR deploy to development environment npm run deploy:dev -
Cloudflare Worker をローカルでテストする場合
npm run dev:cf
環境設定
このプロジェクトでは、次の環境変数を設定できます。
PORT:ローカル開発用の HTTP ポート(デフォルト:3001)HOST:HTTP サーバーのバインド先ホスト(デフォルト:0.0.0.0)ENVIRONMENT:現在の環境(development/production)API_KEY:すべてのリクエストでx-api-keyヘッダーに必要な API キーREQUEST_TIMEOUT:リクエストの最大実行時間(ミリ秒、デフォルト:120000)PING_INTERVAL:ping メッセージの間隔(ミリ秒、デフォルト:60000)
Cloudflare では、これらの変数は wrangler.toml ファイルで設定します。
[vars]
ENVIRONMENT = "production"
[env.dev.vars]
ENVIRONMENT = "development"
使用例
サーバーへの接続
CLI MCP クライアントからの接続
# Connect via stdio transport
npx fastmcp dev "bun run start"
# Connect via HTTP transport
npx fastmcp connect http://localhost:3001/sse -H "x-api-key:<your-api-key>"
<your-api-key> は、API_KEY 環境変数の値に置き換えてください。
Cursor からの接続
- Cursor を開き、「Settings」に移動します
- 左側のサイドバーで「Features」をクリックします
- 下にスクロールして「MCP Servers」セクションに移動します
- 「Add new MCP server」をクリックします
- 次の詳細を入力します。
- サーバー名:
frank-cv-mcp - stdio モードの場合:
- タイプ:
command - コマンド:
bun run start
- タイプ:
- SSE モードの場合:
- タイプ:
url - URL:
http://localhost:3001/sse
- タイプ:
- サーバー名:
- 「Save」をクリックします
Cursor での mcp.json の使用
{
"mcpServers": {
"frank-cv-stdio": {
"command": "bun",
"args": ["run", "start"],
"env": {
"NODE_ENV": "development"
}
},
"frank-cv-sse": {
"url": "http://localhost:3001/sse"
}
}
}
リクエストフローの例
基本情報の取得
// Get profile information
const profile = await client.callTool("get_profile", {});
// Get skills list
const skills = await client.callTool("get_skills", {});
// Get the CV as a markdown document
const cvMarkdown = await client.accessResource("cv://frankgoortani");
特定の職務経験の検索
// Search for AI experience
const aiExperience = await client.callTool("search_cv", {
query: "ai"
});
// Get specific company experience
const uberExperience = await client.callTool("get_company_experience", {
company: "Uber"
});
メディアリンクの取得
// Get resume PDF link
const resumeLink = await client.callTool("get_resume_link", {});
// Get profile picture link
const pictureLink = await client.callTool("get_profile_picture", {});
Docker での実行
このプロジェクトは Docker コンテナ内で実行できます。Synology NAS などのプラットフォームや、その他のコンテナオーケストレーションシステムへのデプロイに便利です。
前提条件
- システムに Docker がインストールされていること。
Docker イメージのビルド
-
プロジェクトのルートディレクトリ(
Dockerfileがある場所)に移動します。 -
次のコマンドを実行して Docker イメージをビルドします。必要に応じて、
cv-mcpを任意のイメージ名に置き換えてください。docker build -t cv-mcp .
Docker コンテナの実行
-
イメージをビルドしたら、コンテナとして実行できます。コンテナ内のアプリケーションはポート 3001 で待ち受けます。ホストマシンのポートをコンテナのポート 3001 に割り当てる必要があります。
docker run -d -p 8080:3001 --name cv-mcp-container cv-mcp-d:コンテナをデタッチモード(バックグラウンド)で実行します。-p 8080:3001:ホストマシンのポート 8080 を、コンテナ内のポート 3001 に割り当てます。ホストで使用可能な任意のポートに8080を変更できます。--name cv-mcp-container:管理しやすいように、実行中のコンテナに名前を付けます。cv-mcp:実行するイメージを指定します。
-
コンテナを実行すると、MCP サーバーにアクセスできるようになります。ホストのポート 8080 を割り当てた場合、SSE エンドポイントは通常
http://localhost:8080/sseになります。 -
Synology NAS にデプロイする場合は、通常、Synology Docker UI またはコマンドラインを使用してコンテナを実行し、適切なホストポートを割り当てます。リバースプロキシ経由でサービスにアクセスするためのターゲット URL は
https://mcp.goortani.synology.me/です。リバースプロキシが、割り当てたホストポート(例:8080)にリクエストを転送するよう設定してください。
コンテナの停止と削除
- コンテナを停止するには:
docker stop cv-mcp-container - コンテナを削除するには(停止後):
docker rm cv-mcp-container
ライセンス
このプロジェクトは MIT ライセンスの下でライセンスされています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。