かっこいい Cline – Proxy Servers – FastMCP (Python) – MCP – FileMaker OData API の接続の仕方

  • URLをコピーしました!

こんにちはジョージです。かねてから訪問してみたかった、熱海の 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 サーバを構築
FastMCPMCPサーバーとクライアントの構築をシンプルにする為のPython フレームワーク
https://github.com/jlowin/fastmcp
FileMaker OData API
OData (Open Data Protocol) を使った API プロトコル
FileMaker Server + FileMaker カスタム AppOData の接続ができる 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 のデータを検索して、別のサービスで分析したり、そのレポートを作成したりと応用ができそうです。興味をもたれたかたは是非試してみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次