【Go】日付計算とかWeb検索とかするMCPサーバを手に入れた

4933 語
25 分
【Go】日付計算とかWeb検索とかするMCPサーバを手に入れた

はじまり#

リサちゃん avatar
リサちゃん
うわああああ・・・
135ml avatar
135ml
出来てしまったようだな。

MCPサーバでさらに色んなことが・・・#

最近巷で話題になっているMCPサーバをGoで組んでみたので、途中まで作成したものを紹介がてら、どんなことが出来るのかを紹介していきます。

本当にスゴイです。チャット画面の中でしか動けなかったAI君が画面を飛び出して色々なところから情報を拾ってくるようになります。楽しくなってきます。

MCPサーバとは?#

Model Context Protocol(MCP)は、AnthropicのClaudeなどのAIモデルが外部のデータソースやツールと安全に対話するための標準化されたプロトコルです。MCPサーバを使うことで、AIアシスタントは以下のようなことができるようになります。

  • ファイルシステムへのアクセス
  • データベースへの問い合わせ
  • Web検索の実行
  • 日時計算の実行
  • HTTPリクエストの送信

つまり、AIアシスタントが「外の世界」とやり取りするための窓口となるわけです。これにより、AIの能力が大幅に拡張され、より実用的なタスクをこなせるようになります。

例えば、足し算とか引き算などの算術演算の処理に対して、大規模言語モデルは当たり前のように間違えてしまいますよね。しかし、算術演算用のMCPサーバを設置してしまえばそんなことは無くなります。

MCPサーバを立てるためのSDKは、Model Context Protocolという組織の公式リポジトリで公開されていて、そのパッケージを使ったサンプルコードも紹介されているのですが、使用している言語は、Python、TypeScript、C#、Java、Kotlinだけなんですよね。(2025-03-30時点)

modelcontextprotocol
/
python-sdk
Waiting for api.github.com...
00K
0K
0K
Waiting...

しかし今回、MCPサーバを実装するのに使った言語は、Goです。なぜわざわざGoにしたのかと言うと、Pythonと同様に書き慣れていたというのと、AIにコーディングしてもらう時は静的型付け言語の方がバグの少ないソースを生成してもらいやすいというのがあるみたいなので、ちょっくらやってみました。(実際、今回も実行時には殆どバグが起きませんでした。)あと、バイナリにビルドするので、基本的にどんな環境でも動きます。

GoでMCPサーバの開発が行われているリポジトリで最も活発なものが、「mcp-go」というリポジトリでした。今回はそのパッケージを使って開発させていただきます。

mark3labs
/
mcp-go
Waiting for api.github.com...
00K
0K
0K
Waiting...

それでは行ってみましょう。

mcps-goの紹介#

今回開発したのは、「mcps-go」というリポジトリです。一旦、以下の4つのMCPサーバを提供出来ています。

  1. arithmetic_calculator - 算術計算機能
  2. datetime_calculator - 日時計算機能
  3. http_request - HTTPリクエスト機能
  4. brave_web_search - Brave検索エンジンを使用したWeb検索機能

今回作ったリポジトリは公開しています。

landmaster135
/
mcps-go
Waiting for api.github.com...
00K
0K
0K
Waiting...

これらのサーバは、コマンドライン引数によって選択的に起動できるようになっています。ClineのためのMCPサーバを設定するためのcline_mcp_settings.jsonには、以下のように記述して使用できます。

{
"mcpServers": {
"arithmetic_calculator": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"arith_calc"
],
"disabled": false,
"autoApprove": []
},
"datetime_calculator": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"datetime_calc"
],
"disabled": false,
"autoApprove": []
},
"http_request": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"http_request"
],
"disabled": false,
"autoApprove": []
},
"brave_web_search": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"brave_web_search"
],
"env": {
"BRAVE_API_KEY": "あなたのAPIキー"
},
"disabled": false,
"autoApprove": []
}
}
}

実装されているMCPサーバの詳細#

それでは、各MCPサーバの機能を詳しく見ていきましょう。

arithmetic_calculator(算術計算機能)#

基本的な算術計算を行うためのMCPサーバです。足し算、引き算、掛け算、割り算などの基本的な計算機能を提供します。この機能は、mcp-goのクイックスタートをそのまま利用しています。

datetime_calculator(日時計算機能)#

日時に関する様々な計算を行うためのMCPサーバです。主な機能は以下の通りです:

  • 日時に年月日時分秒を追加(AddDatetime)
  • 日時から年月日時分秒を引く(SubtractDatetime)

例えば、現在の日時から1年3ヶ月5日後の日時を計算したり、4時間15分7秒前の日時を計算したりすることが出来ます。日付に関する複雑な計算を簡単に行えるので、スケジュール管理やイベント計画などに役立つかもしれません。この機能は実装に必要なパラメータが多かったので、AIコーディングがあって本当に助かりました。

http_request(HTTPリクエスト機能)#

外部APIにHTTPリクエストを送信するためのMCPサーバです。GET、POST、PUT、DELETEなどの主要なHTTPメソッドをサポートしており、外部のWebサービスやAPIと連携できます。

これにより、AIアシスタントは天気情報の取得、ニュースの検索、データの送信など、インターネット上の様々なサービスにアクセスできるようになります。この機能も、mcp-goのクイックスタートをそのまま利用しています。

brave_web_search(Brave検索機能)#

Brave Search APIを使用してWeb検索を行うためのMCPサーバです。このサーバは以下の2つの主要な機能を提供しています。

  1. brave_web_search - 一般的なWeb検索機能
    • 一般的なクエリ、ニュース、記事、オンラインコンテンツの検索に適しています。
    • 最大20件の結果を取得可能。
    • ページネーション、コンテンツフィルタリング、鮮度コントロールをサポート。
  2. brave_local_search - ローカルビジネス検索機能
    • 物理的な場所、ビジネス、レストラン、サービスなどに関連するクエリに適しています。
    • ビジネス名や住所、評価とレビュー数、電話番号や営業時間などの詳細情報を返します。
    • 「近くの」や特定の場所を含むクエリに最適。
    • ローカル結果が見つからない場合は自動的にWeb検索にフォールバック。

このサーバを使用するには、Brave Search APIのAPIキーが必要です。APIキーは環境変数「BRAVE_API_KEY」として設定する必要があります。

使い方と設定方法#

mcps-goを使用するには、まず以下の手順でビルドします。

Terminal window
# 通常のビルド
go build main.go
# Dockerを使用したビルド
docker build -t mcps-go .

一応、Dockerを使ったビルドも出来ることには出来ますが、その場合だとなぜか、Cline君がMCPサーバを利用するのに必要な引数を渡せなくなってしまい、動かすことが出来ませんでした・・・。ちょっとまだ、mcp-goの動きがよく分かっていないので、一旦通常のビルドでバイナリを動かす形で利用していきます。

次に、Clineなどのクライアントで使用するために、設定ファイル(cline_mcp_setting.json)に以下のような設定を追加します。これは冒頭の方で見せたJSONファイルと同じものです。brave_web_searchを使用する場合は、Brave Search APIのAPIキーを取得して設定する必要があります。(実はここにAPIキーを書きたくなかったので、Dockerを使いたかったんですけどね。)

{
"mcpServers": {
"arithmetic_calculator": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"arith_calc"
],
"disabled": false,
"autoApprove": []
},
"datetime_calculator": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"datetime_calc"
],
"disabled": false,
"autoApprove": []
},
"http_request": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"http_request"
],
"disabled": false,
"autoApprove": []
},
"brave_web_search": {
"command": "/home/nov/mcps-go-for-claude/mcps-go",
"args": [
"brave_web_search"
],
"env": {
"BRAVE_API_KEY": "あなたのAPIキー"
},
"disabled": false,
"autoApprove": []
}
}
}

設定が完了したら、Clineなどのクライアントを再起動すると、AIアシスタントが新しいMCPサーバを使用できるようになります。

利用可能なMCPサーバを確認

MCPサーバの実際の使用例#

それでは、実際にこれらのMCPサーバをどのように使用できるか、いくつか例を見てみましょう。使ったモデルは、ChatGPT-4o-miniだったり、Claude 3.7 Sonnetだったりでした。

日時計算の例#

ざっくりと、以下のようなやり取りになりました。

ユーザー: 500/100の計算をツールを使って行ってください。
GPT 4o-mini: ユーザーは500/100の計算結果を知りたいようです。
これを計算するために、arithmetic_calculatorというMCPサーバーを使うことができます。
このサーバーは算術計算を行うツールを提供しています。
500/100は5.00です。

日時計算の例#

ざっくりと、以下のようなやり取りになりました。

ユーザー: 今日の4日後の日付をツールを使って教えて。
GPT 4o-mini: ユーザーは今日の4日後の日付を知りたいようです。
これを計算するために、datetime_calculatorというMCPサーバーを使うことができます。
このサーバーは日付計算を行うツールを提供しています。
今日の4日後の日付は2025年4月3日です。

実行した時のスクショです。こういう機能ってどこかで使うような気がするので、実装できてよかったです。

日時計算ツール実行時のスクショ

パラメータをこれぐらい分けないと、大規模言語モデルはパラメータに適切な値を渡してくれません。

パラメータ改良後のスクショ

MCPツールの結果による回答のスクショ

13日前だろうが、4日後だろうが、使いたいMCPツールを呼び出すことが出来ています。

日時計算ツールの更なる検証のスクショ

HTTPリクエストの例#

ざっくりと、以下のようなやり取りになりました。

ユーザー: ツールを使って、以下のwebページから内容を取得して、それを要約して。
Claude:
...
Status: 200
Body: <!doctype html>
<html lang="ja">
...
ウェブページの内容を取得して要約するタスクです。ウェブページの内容は既に取得できており、
これは「今年食ったサバ缶のまとめ(2024年版)」というブログ記事です。
この記事は、著者が2024年に食べたサバ缶、イワシ缶、サンマ缶などの缶詰を紹介しています。
記事の構造を分析すると:
...

以前に当ブログで書いた、サバ缶に関する記事を要約してもらいます。以下が実行時のスクショです。

サバ缶に関する記事の要約のスクショ

サバ缶に関する記事の要約のスクショその2

記事の内容を取得できたので、要約の作業が始まりました。

サバ缶に関する記事の要約内容のスクショ

すげえじゃん、まとまってんじゃん・・・。

サバ缶に関する記事の要約内容のスクショその2

Web検索の例#

ざっくりと、以下のようなやり取りになりました。

ユーザー: Web検索しておすすめのMCP Serverを探して、リスト化して書き出して。
Claude: Brave検索MCPサーバを使用して検索します。
brave_web_searchツールを使用して、「recommended MCP servers for Claude」や
「popular MCP servers for AI assistants」などのキーワードで検索してみましょう。
現在の設定を確認しました。次に、Web検索を使用して推奨されるMCP Serverを探します。
...(検索結果に基づく情報)
素晴らしい!Awesome Claude MCP ServersのREADMEの内容を取得できました。
これは非常に包括的なMCP Serverのリストで、カテゴリ別に整理されています。
次に、もう一つの「awesome-mcp-servers」リポジトリの内容も...(検索結果に基づく情報)

この機能はヤバいですね。Web検索出来るってことは、それってDeep Researchではないですか。以下がスクショです。

Web検索ツール実行時のスクショ

Web検索ツール実行時のスクショその2

検索結果を引っ張ってこれています。

Web検索結果取得時のスクショ

Web検索結果取得時のスクショその2

なんかまだ、Cline君は調べ足りないようです。好奇心旺盛だなあ。

好奇心旺盛なClineのスクショ

好奇心旺盛なClineのスクショその2

先ほど実装したHTTPリクエストのMCPツールまで使って調べてくれました。好奇心旺盛だなあ。

さらに好奇心旺盛なClineのスクショ

さらに好奇心旺盛なClineのスクショその2

どうやら調べ終わって、まとめ作業が始まりました・・・。

Web検索作業終了時のスクショ

開発時のまとめ#

MCPサーバを開発していた時の出来事などに関するまとめです。

AIが渡しやすいパラメータを設定する。#

「datetime-calculate」の部分の機能って、当初はパラメータの数が3つぐらいしか設定していなかったんですよね。しかし、そのパラメータ数だとどうにもAI君がMCPサーバに適切な数値を渡してくれなかった・・・。

そこで、パラメータ数を基準となる年月日時分秒の6個に増やして、そこから計算するためにさらに年月日時分秒の6個の引数を追加して、総計12個のパラメータを実装しました。こうすると、ガッチリMCPサーバに適切な値を渡せるようになりました。

...
s.AddTool(tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
op := request.Params.Arguments["operation"].(string)
year_1 := request.Params.Arguments["year_1"].(float64)
month_1 := request.Params.Arguments["month_1"].(float64)
day_1 := request.Params.Arguments["day_1"].(float64)
hour_1 := request.Params.Arguments["hour_1"].(float64)
minute_1 := request.Params.Arguments["minute_1"].(float64)
second_1 := request.Params.Arguments["second_1"].(float64)
duration_of_year := request.Params.Arguments["duration_of_year"].(float64)
duration_of_month := request.Params.Arguments["duration_of_month"].(float64)
duration_of_day := request.Params.Arguments["duration_of_day"].(float64)
duration_of_hour := request.Params.Arguments["duration_of_hour"].(float64)
duration_of_minute := request.Params.Arguments["duration_of_minute"].(float64)
duration_of_second := request.Params.Arguments["duration_of_second"].(float64)
var c DatetimeCalculator
var result string
switch op {
case "add":
result = c.AddDatetimeFloat(year_1, month_1, day_1, hour_1, minute_1, second_1, duration_of_year, duration_of_month, duration_of_day, duration_of_hour, duration_of_minute, duration_of_second)
case "subtract":
result = c.SubtractDatetimeFloat(year_1, month_1, day_1, hour_1, minute_1, second_1, duration_of_year, duration_of_month, duration_of_day, duration_of_hour, duration_of_minute, duration_of_second)
// case "diff":
// result = c.DiffTime(x, y)
}
return mcp.NewToolResultText(result), nil
})
...

こういう時に、AIにコーディングしてもらうととても快適ですね。本当に今日のレベルのAIが登場してくれて有り難い。

MCPサーバはキャッシュされる。#

Clineに限った現象なのか分かりませんが、今回、MCPサーバをビルドする時はGoの標準機能でバイナリファイルにデプロイするわけでしたが、そのバイナリファイルを修正した際に、Clineが参照しているバイナリが以前の状態のバイナリを見ている時がありました。(Clineが提示したパラメータが修正前のものだった時に気付きました。)

原因として、AIエージェントの中で少なくともClineには、「メモリバンク機能」というものが備わっているらしく、その機能はまだ消されていないClineとのチャット履歴を参照して、Clineが長期記憶として情報を維持しているらしいです。つまり、そのメモリバンク機能で修正前のバイナリファイルの内容をキャッシュしているのかもしれない・・・。

そして、チャット履歴を全て消して、再びClineにMCPツールを使うようにプロンプトを送ると、今度はちゃんと修正後のバイナリが受け取れるパラメータでMCPツールを使ってくれました。メモリバンク機能は便利ではありますが、開発中には時々チャット履歴を消す必要があります。

数値は基本的にはfloat64で受け取る。#

mcp.CallToolRequest.Params.Arguments["operation"].()で受け取る引数の型はfloat64でなければならないみたいですね。例えばintで渡すとエラーになります。ここは静的に型拘束がされない部分なので少しハマりました。ClineのMCPサーバを設定する画面で、「interface conversion: interface {} is float64, not int」というエラーが表示されて気付きました。

AIでかなり書けてしまった・・・。#

「brave-web-search」の部分の機能って、Model Context Protocol公式からのTypeScriptのサンプルはあったんですけど、Goのコードは皆無だったんですよね。なので、この機能を作るのは結構時間が掛かるのかなと思ってたんですけど・・・。

蓋を開けてみると、自分が書いたGoのMCPサーバのソース(確か日時計算のソースを見せたような。)と、MCP公式のBrave Search APIを叩くTypeScriptソースをClaude 3.7 sonnetに食わせたら、なんと2往復で実装することが出来てしまいました・・・。要は、使い方なんだなって思います。(1往復目で引っ掛かってたのは、JSONのパースエラーだけだった。)

おすすめMCP Serverリスト#

先ほど、「brave_web_search」機能でまとめ上げ(てもらっ)たMCPサーバのまとめです。(2025-03-30時点)

一番驚いたのは、Web検索とこの要約作業に35円ぐらいしか掛からなかったことです!Σ(・ω・ノ)ノ!

現在設定済みのMCP Server#

  1. arithmetic_calculator: 基本的な算術計算機能
  2. datetime_calculator: 日時計算機能
  3. http_request: 外部APIへのHTTPリクエスト機能
  4. brave_web_search: Brave検索エンジンを使用したWeb検索機能

ファイルシステム関連 📂#

  1. @modelcontextprotocol/server-filesystem - ローカルファイルシステムへの直接アクセス
  2. @modelcontextprotocol/server-google-drive - Google Driveとの統合(ファイル管理)

検索エンジン関連 🔍#

  1. exa-labs/exa-mcp-server - Exa AI Search APIを使用したリアルタイムWeb検索
  2. ac3xx/mcp-servers-kagi - Kagi検索エンジンとの統合
  3. blazickjp/arxiv-mcp-server - ArXivを通じた研究論文検索

データベース関連 🗄️#

  1. @modelcontextprotocol/server-postgres - PostgreSQLとの統合(スキーマ検査機能付き)
  2. @modelcontextprotocol/server-sqlite - SQLite操作(分析機能付き)
  3. domdomegg/airtable-mcp-server - Airtableデータベース統合
  4. ClickHouse/mcp-clickhouse - ClickHouseデータベース統合

知識・メモリ関連 🧠#

  1. @modelcontextprotocol/server-memory - ナレッジグラフベースの永続的メモリシステム
  2. @hannesrudolph/mcp-ragdocs - ベクトル検索によるドキュメント検索・処理ツール
  3. @kaliaboi/mcp-zotero - Zotero Cloudのコレクションとソースへの接続

バージョン管理関連 📊#

  1. @modelcontextprotocol/server-github - GitHub APIとの統合(リポジトリ管理、Issue管理など)
  2. @modelcontextprotocol/server-gitlab - GitLabプラットフォーム管理
  3. @modelcontextprotocol/server-git - Gitリポジトリの直接操作

クラウド統合関連 ☁️#

  1. Cloudflare MCP Server - CloudflareサービスへのアクセスとWorkersやKVの利用
  2. alexei-led/aws-mcp-server - AWS CLIコマンドの実行と一般的なAWSタスクのテンプレート

コミュニケーション関連 💬#

  1. @modelcontextprotocol/server-slack - Slackワークスペースとチャンネル管理
  2. zcaceres/gtasks-mcp - Google Tasksの管理
  3. elie222/inbox-zero - Gmailの機能拡張(返信が必要なメールの特定など)

ブラウザ自動化関連 🌐#

  1. @modelcontextprotocol/server-puppeteer - Webの自動化とスクレイピング
  2. @kimtaeyoon83/mcp-server-youtube-transcript - YouTube字幕の抽出

位置情報サービス関連 🗺️#

  1. @modelcontextprotocol/server-google-maps - Google Mapsとの統合(位置情報、ルート検索など)
  2. SecretiveShell/MCP-timeserver - 任意のタイムゾーンの時間アクセス

モニタリング関連 📈#

  1. @modelcontextprotocol/server-sentry - Sentry.ioを通じたエラー追跡
  2. @modelcontextprotocol/server-raygun - Raygunを通じたクラッシュレポート
  3. grafana/mcp-grafana - Grafanaインスタンスのダッシュボード検索とインシデント調査

その他の有用なMCP Server#

  1. mzxrai/mcp-openai - OpenAIの最新モデルとのチャット
  2. pierrebrunelle/mcp-server-openai - MCPプロトコルを通じてOpenAIモデルに直接クエリ
  3. calclavia/mcp-obsidian - Obsidianノートの読み取りと検索
  4. isaacwasserman/mcp-vegalite-server - VegaLiteフォーマットを使用したデータの可視化
  5. tevonsb/homeassistant-mcp - Home Assistantデータへのアクセスとデバイス制御

これらのMCP Serverは、AIアシスタントの機能を大幅に拡張し、様々なタスクを自動化するのに役立ちます。特に、データベース操作、ファイル管理、Web検索、APIとの統合などの機能は、日常的なタスクを効率化するのに非常に有用です。

まとめ#

Model Context Protocol(MCP)を使用することで、AIアシスタントの能力を大幅に拡張できます。今回紹介したmcps-goは、Goで実装された使いやすいMCPサーバで、算術計算、日時計算、HTTPリクエスト、Web検索などの機能を提供します。

これらの機能を活用することで、AIアシスタントはより実用的なタスクをこなせるようになり、ユーザーの生産性向上に貢献します。また、Goで実装されているため、高速で安定した動作が期待できます。

MCPの世界はまだ発展途上ですが、今後さらに多くの機能が追加され、AIアシスタントの可能性がさらに広がることでしょう。ぜひ、mcps-goを試してみて、AIアシスタントの新しい可能性を探ってみてください!

この青臭いまとめを書かないように直さなければならんな。

おしまい#

リサちゃん avatar
リサちゃん
ここまで出来るようになるんだなぁ
135ml avatar
135ml
他にも作りたいですね。

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【Go】日付計算とかWeb検索とかするMCPサーバを手に入れた
https://endorphinbath.com/posts/go-cline-mcp-server-date-calculation-web-search/
著者
kinkinbeer135ml
公開日
2025-03-14
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【Golang】ローカル自作パッケージを使おうとすると「package XXX/ZZZZ is not in std」になる
Code Go言語でローカルパッケージをインポートする際に遭遇するエラーの解決方法に関する初心者向けの記事です。メインディレクトリのgo.modファイルのmoduleの設定が、main.goのimport文と繋がっています。
2
【Python】死ぬほどモックで沼ってたのでその過程でClaude君が出してくれた対策を並べた
Code Pythonでテストメソッドを作る時にかなり沼っていたので、その過程でClaudeが教えてくれたことを並べました。色々とpytest-mockの書き方があるようです。
3
【Cloud SQL】GolangでDBインスタンスの開始停止をスケジュール実行して節約する
Code Golangで書いたCloud Run FunctionでCloud SQLインスタンスの起動と停止を行い、Cloud SchedularとPub/Subでスケジュール実行してコスト削減を図ります。
4
【Luma Dream Machine】プロンプトガイドやFAQを検証してみた
Software この記事は、動画生成AI「Luma Dream Machine」のプロンプトガイドとFAQについて解説しています。実際にガイドにある内容を使ってプロンプトしてみています。
5
【Go、Docker】「api」という名前のパッケージを作るとビルド出来なくなる
Code Goでアプリケーションを開発する際、「api」というパッケージ名を含んだモジュールをDockerコンテナ内でビルドしようとするとバグります。そんな奇妙な事象に遭遇して沼りました。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次