こんにちはジョージです。かねてから訪問してみたかった、熱海の Fuua にいってきました!館内では熱海プリン🍮も並ばず食べれるのでゆっくりしたい旅人にはおすすめです。
さて、最近 MCP (Model Context Protocol) という言葉をよくきくので FileMaker でも使えるのか、どのようなアプローチが効果的か、他サイトを参考にしながらとりあえず試してみました。結果、自然言語を使って FileMaker Server で共有されているのデータベースエンドポイントを取得できました。
この先は FileMaker OData API の仕様にしたがて Python でプログラムできるようになりましたので、ここまでの道のりをとりあえず簡単にまとめてみました。

MCP
MCP とは、Model Context Protocol の略です。界隈には丁寧に説明してくれているサイトや AI による回答がいくらでもあるのでそちらを参考にしてみてください。FileMaker プラットフォームでの使い道としては、自然言語でカスタム App を操作したり、他のサービスと簡単に連携するのが主な用途かと思われます。
検証環境構成
自機が macOS なので Claude のデスクトップアプリを使うのが一般的なのでしょうが、ChatGPT の有料プランを使ってなんとかしたかったので以下のような構成になっています。何かと自機に影響がおよばないように、検証環境は Docker で構築しました。
アプリやプラグイン等 | 主な用途 |
VSCode 拡張機能 Cline | ChatGPT を API Provider に利用して操作可能 ローカル/リモート MCP サーバを登録可能 |
Docker Desktop VSCode 拡張機能 DevContainer | 自機とは別の環境をコンテナに構築可能 今回は Python 環境で MCP サーバを構築 |
FastMCP | MCPサーバーとクライアントの構築をシンプルにする為のPython フレームワーク https://github.com/jlowin/fastmcp |
FileMaker OData API | OData (Open Data Protocol) を使った API プロトコル |
FileMaker Server + FileMaker カスタム App | OData の接続ができる FileMaker プラットフォーム環境 |
事前準備
ここら辺は割愛します。ChatGPT の API キーや、コンテナ作成は以前のブログを参考にしてみてください。とりあえず python や git、uv が使えるコンテナを準備して、FastMCP のインストレーション通りに実行します。
uv pip install fastmcp
git clone https://github.com/jlowin/fastmcp.git
cd fastmcp
uv sync
とりあえず環境が準備できました。サンプルの server.py を作成してソースをコピペします。
# server.py
from fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"

公式のインストレーションでは Claude デスクトップアプリに MCP サーバを登録ですが今回はコンテナ環境なので、まずは VSCode の拡張機能 Cline をインストールします。

Cline の設定画面から API Provider に Open AI を指定して、API Key を入力します。これで VSCode から AI アシスタントが利用できます。Custom Instructions に 「日本語で応答 Speak in Japanese」といれておくと応対が日本語になるそうです。

MCP サーバを追加します。MCP サーバの仕様にしたがって、作成した server.py を追加します。コンテナ内部で完結するので Python スクリプトの実際のパスと transportType は studio に設定しておきます。とりあえず MCP がどんなものか試してみましょう。
{
"mcpServers": {
"server1": {
"disabled": false,
"timeout": 60,
"command": "python",
"args": [
"/workspaces/fastmcp/server.py"
],
"transportType": "stdio"
}
}
}

a は 1、b は 2 を add して
かなり強引ですが「a は 1、b は 2 を add して」とプロンプトに入力してみます。きちんと MCP サーバが登録されていれば以下のように server.py を使って計算する為の許可が求められます。


a=1、b=2 を add ツールで計算した結果は 3 です。
うまく実行できたようです。ポイントとしては Cline が入力されたプロンプトを元に、登録済みの MCP サーバで公開されているツール add を使う為にユーザへ許可をとり、認められた場合は server.py を実行して計算をしている点かと思います。
リモートから接続
次にコンテナ内部ではなく、リモートから MCP サーバに接続してみます。理由はなんとなくかっこいいからです。FasMCP の説明にしたがって、proxy 機能を使ってみます。以下のスクリプトを作成して保存します。
import asyncio
from fastmcp import FastMCP, Client
from fastmcp.client.transports import PythonStdioTransport
# Create a client that connects to the original server
proxy_client = Client(
transport=PythonStdioTransport('server.py'),
)
# Create a proxy server that connects to the client and exposes its capabilities
proxy = FastMCP.from_client(proxy_client, name="Stdio-to-SSE Proxy")
if __name__ == "__main__":
proxy.run(
transport='sse',
host='0.0.0.0',
port=8000
)
実行します。
python proxy_server.py

VSCode で新しいウインドウを作成して Cline 設定から MCP サーバを登録します。プロキシがうまく動作していればコンテナで公開されている MCP サーバを追加できます。
{
"mcpServers": {
"Stdio-to-SSE Proxy": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"url": "http://127.0.0.1:8000/sse",
"transportType": "sse"
}
}
}

ポイントは transportType を sse にする事と、url が http://127.0.0.1:8000/sse となるところです。コンテナ環境では直接 server.py を実行できましたが、リモート環境からは Server-Sent Events (HTTP) を経由して MCP サーバにアクセスします。たぶん Claude デスクトップや他の AI アプリから MCP サーバを登録できるようになると思うので、この構成の方がなんとなく拡張性が高そうでしっくりきました。先程と同様に計算をさせてみましょう。
a=1、b=2 を add ツールで計算


リモート接続なのか MCP サーバを明示的に指定してからでないとエラーがでましたが、とりあえずリモート接続からでもうまく実行できました。
FileMaker OData を連携
何となく MCP サーバを構築 Cline に登録、リモートからの実行まで成功したので、いよいよ FileMaker OData を連携させます。まずは filemaker.py を作成してコンテナ環境で MCP サーバを登録してみます。
import os
import requests
from typing import cast
from requests.auth import HTTPBasicAuth
from fastmcp import FastMCP
from base64 import b64encode
import xml.etree.ElementTree as ET
# MCP インスタンス
mcp = FastMCP("filemaker")
# 固定の接続先設定(host, etc...)
config = {
"host": "your host url"
}
# MCP ツール定義:引数で username, password を受け取る
@mcp.tool()
def fetch_databasese(username: str, password: str):
"""username と passwordを指定してホストのデータベース一覧を取得する"""
auth_string = f"{username}:{password}"
auth_encoded = b64encode(auth_string.encode("utf-8")).decode("utf-8")
headers = {
"Authorization": f"Basic {auth_encoded}",
"Accept": "application/json"
}
url = f"https://{config['host']}/fmi/odata/v4/"
response = requests.get(url, headers=headers)
if response.ok:
return response.json()
else:
raise Exception(f"Error {response.status_code}: {response.text}")
# MCP 起動
mcp.run(transport="stdio")

username と password は base64 でエンコードしてヘッダーに埋め込みます。もう少しうまいやり方があるかと思いますがとりあえずこんな感じでスクリプトを作成、MCP サーバに登録してみます。続けて多少強引ですがプロンプトに以下を指示してみます。
fmodata:p@ssword を使ってデータベース一覧を取得

うまく、結果が返ってきました!

リモート接続から検証
こんどはリモート接続から検証してみます。proxy_server.py の接続を server.py から filemaker.py に変更してproxy_server.py を実行します。

リモート環境の Cline に登録した MCP サーバを更新します。ツールが fetch_database にかわりました。

今度はもう少し抽象的にプロンプトに指示します。
データベース一覧を取得したい

データベースに接続するためのユーザー名とパスワードを教えてください。
ユーザー名とパスワードを入力する
キャンセルする
選択肢がでてきました。とりあえずユーザー名とパスワードを入力してみましょう。

MCP サーバを指定でエラーがでましたが、リモート環境からもうまく実行できました!おぉかっこいい!

まとめ
最近はやりの MCP サーバを FileMaker でも使ってみました!自然言語でカスタム App にアクセスできるのはやはりすごいですね。他のサービスと連携すれば、カスタム App のデータを検索して、別のサービスで分析したり、そのレポートを作成したりと応用ができそうです。興味をもたれたかたは是非試してみてください!