swiss-ip-mcp について
swiss-ip-mcpは、スイスのSwissreg知的財産登録簿を検索する読み取り専用MCPサーバーです。商標、特許、特許公報、補足的保護証明書を調べるユーザー向けに、自然言語で各分野を検索できます。
主な機能
- 01商標の検索と詳細取得
- 02テキストや出願人による特許検索
- 03公式特許公報の検索
- 04補足的保護証明書の検索
- 05期間指定による最近の出願の絞り込み
- 06登録情報リソースとレポート用プロンプト
活用シーン
- 01名称が商標登録済みか確認
- 02企業の商標と特許を調査
- 03期間内の新規出願を検索
- 04製薬会社が保有する証明書を調査
MCP 対応
Swissregの検索・照会ツール、読み取り専用リソース、定型プロンプトをMCP対応クライアントに提供します。stdioとHTTPのトランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx swiss-ip-mcpIGE_USERNAMEシークレットUsername for the Swiss Federal Institute of Intellectual Property (IGE/IPI) Swissreg API. Issued by IGE after signing the terms of use.IGE_PASSWORDシークレットPassword for the IGE/IPI Swissreg account.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
💡 swiss-ip-mcp
スイス知的財産データ(IGE/IPI)向け MCP サーバー
概要
swiss-ip-mcpは、**スイス連邦知的財産機関(IGE/IPI)**が運営するスイスの知的財産登録簿Swissregに、AI モデルが構造化された自然言語ベースでアクセスできるようにするModel Context Protocol (MCP)サーバーです。
これはpatent-mcpの後継であり、Swissreg Datadelivery APIで利用できるすべての分野を対象としています。商標、特許、特許公開公報、補足的保護証明書(SPC/ESZ)に対応しています。
このサーバーはモデルに依存しません。 Claude、GPT-4、Llama、その他のMCP対応クライアントで動作し、Claude Desktop専用ではありません。
質問例
本領を発揮するのは自然言語での検索です。登録簿を手動で検索する代わりに、質問するだけです。
「チューリッヒ市はIGEにどのような商標を登録していますか?」
「『Learning City Zurich』という名称は、スイスで商標登録されていますか?」
「過去6か月間にスイスの特許を出願した製薬会社はどこですか?」
「2025年1月以降の教育分野(ニース分類第41類)の商標出願をすべて表示してください。」
「Novartisはスイスでどのような補足的保護証明書を保有していますか?」
対応分野
| 分野 | 説明 |
|---|---|
| 商標 | スイスの商標登録簿 — 出願、保護、権利者、ニース分類 |
| 特許 | スイス特許 — 出願、付与、IPC分類、出願人、発明者 |
| 特許公開公報 | スイス官報に掲載された公式の特許公開公報 |
| SPC / ESZ | 医薬品および植物保護製品の補足的保護証明書 |
注: 意匠検索は、Swissreg Datadelivery APIではまだ利用できません。
ツール(11)
| ツール | 機能 |
|---|---|
swiss_ip_search_trademarks | 商標の全文検索(ワイルドカード*に対応) |
swiss_ip_get_trademark | 登録番号を指定して商標を取得 |
swiss_ip_search_trademarks_by_owner | 指定した権利者が保有する商標をすべて検索 |
swiss_ip_search_trademarks_by_class | ニース分類の類で商標を絞り込み |
swiss_ip_search_patents | 特許の全文検索 |
swiss_ip_get_patent | 番号を指定して特許を取得 |
swiss_ip_search_patents_by_applicant | 出願人名または発明者名で特許を検索 |
swiss_ip_search_patent_publications | 特許公開公報を検索 |
swiss_ip_search_spc | SPC/ESZ検索(医薬品および植物保護) |
swiss_ip_search_recent_filings | すべての分野を対象に、期間で出願を絞り込み |
swiss_ip_get_quota | APIのデータ転送残量を確認 |
リソースとプロンプト
ツールに加えて、サーバーは次の2つのMCPプリミティブを公開します。
リソース(読み取り専用のメタデータ、swissip:// URIスキーム):
| URI | 内容 |
|---|---|
swissip://about | サーバーとデータソースのメタデータ(出典、対象ドメイン) |
swissip://domains | 対象となる知的財産ドメインの一覧 |
プロンプト(厳選されたワークフローテンプレート):
| プロンプト | 引数 | 目的 |
|---|---|---|
trademark_availability | name | 名前がスイスで登録済みの商標かどうかを確認します |
competitor_ip_report | company | 企業の知的財産の概要(商標+特許)を提示します |
recent_ip_filings_report | ip_type, date_from, date_to | 指定期間の最近の出願についてレポートします |
エラーの意味
ツールの実行エラー(APIの失敗、タイムアウト、認証情報の不足)は、MCPのisError: trueと、マスキングされたユーザーフレンドリーなメッセージとともに返されます。内部の詳細(スタックトレース、生のAPIレスポンス本文)はサーバーログにのみ記録されます。該当する番号が見つからない場合はエラーではありません。match_type: "none"とmessageを含む通常の結果が返されます。
プロジェクトのフェーズ
このサーバーは、MCPの段階的ロールアウトモデルの**フェーズ1(読み取り専用)**にあり、すべてのツールは読み取り専用で、書き込みは行いません。フェーズ計画と、将来書き込み可能なフェーズに進むための前提条件については、ROADMAP.mdをご覧ください。
アーキテクチャ
AI client (Claude Desktop, Cursor, VS Code + Continue, …)
│
│ MCP (stdio or SSE)
▼
swiss-ip-mcp
│
│ HTTPS + OAuth2 (IGE IDP)
▼
Swissreg Datadelivery API
https://www.swissreg.ch/public/api/v1
│
├── TrademarkSearch
├── PatentSearch
├── PatentPublicationSearch
├── SPCSearch
└── UserQuota
トランスポートモード
| トランスポート | 用途 | 設定 |
|---|---|---|
| stdio | Claude Desktop、ローカル開発 | デフォルト(追加設定不要) |
| Streamable HTTP | クラウドへのデプロイ(Render.comなど) | MCP_TRANSPORT=streamable-http |
| SSE | 従来のHTTPクライアント — 非推奨 | MCP_TRANSPORT=sse |
SSEは非推奨です。 プロトコルリビジョン
2026-07-28により、機能ライフサイクルポリシー(SEP-2596)のもと、HTTP+SSEトランスポートは非推奨に再分類されました(2025-03-26以降、段階的に非推奨となっていました)。12か月の非推奨期間中は引き続き利用できますが、新規デプロイではMCP_TRANSPORT=streamable-httpを使用してください。
トランスポートは、起動時に環境変数MCP_TRANSPORTから選択されます(デフォルトはstdio)。HTTPトランスポートはuvicornによって提供され、次の設定が適用されます。
| 変数 | デフォルト | 用途 |
|---|---|---|
MCP_HOST | 127.0.0.1 | バインドアドレス。0.0.0.0を使用するのは、コンテナ内またはリバースプロキシの背後に限ります。 |
PORT / MCP_PORT | 8000 | バインドポート(PaaSの慣例によりPORTが優先されます)。 |
MCP_ALLOWED_ORIGINS | (空) | カンマ区切りのCORSオリジン許可リスト。本番環境ではワイルドカードを使用しないでください。 |
MCP_ALLOWED_HOSTS | (空) | カンマ区切りのHostヘッダー許可リスト。設定するとDNSリバインディング保護が有効になります。 |
Mcp-Session-IdヘッダーはCORS経由で公開されるため、ブラウザベースのクライアントは後続のリクエストでこのヘッダーを読み取り、返送できます。
前提条件
- IGEの認証情報(無料):利用規約に署名し、フォームを郵送でIGEに送付してください。受領後、認証情報が発行されます。
- Python 3.11以降
uv(推奨)またはpip
インストール
# Run directly with uv (recommended, no local installation needed)
uvx swiss-ip-mcp
# Local development installation
git clone https://github.com/malkreide/swiss-ip-mcp
cd swiss-ip-mcp
pip install -e ".[dev]"
設定
環境変数
export IGE_USERNAME="your_username"
export IGE_PASSWORD="your_password"
Claude Desktop
設定ファイルを開きます。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"swiss-ip": {
"command": "uvx",
"args": ["swiss-ip-mcp"],
"env": {
"IGE_USERNAME": "your_username",
"IGE_PASSWORD": "your_password"
}
}
}
}
その他のMCPクライアント
swiss-ip-mcpは、MCPに対応したあらゆるクライアントで使用できます。
| クライアント | 設定 |
|---|---|
| Cursor | ~/.cursor/mcp.jsonに追加します(Claude Desktopと同じ形式) |
| VS Code + Continue | continue.jsonのMCPサーバーブロックから追加します |
| Windsurf | MCPサーバーの設定から追加します |
| セルフホスト(mcp-proxy) | MCP_TRANSPORT=sseでSSEトランスポートを使用します |
クラウド / Render.com(Streamable HTTP)
MCP_TRANSPORT=streamable-http \
MCP_HOST=0.0.0.0 PORT=8000 \
MCP_ALLOWED_ORIGINS="https://your-client.example" \
MCP_ALLOWED_HOSTS="your-app.onrender.com" \
IGE_USERNAME=... IGE_PASSWORD=... \
swiss-ip-mcp
セキュリティに関する注意:
0.0.0.0にバインドするのは、コンテナ内またはリバースプロキシの背後に限ってください。公開環境では、必ずMCP_ALLOWED_ORIGINSとMCP_ALLOWED_HOSTSを設定してください。これにより、CORS のスコープ制限と DNS リバインディング対策が有効になります。 エンドポイントは認証なしで利用でき、公開されている IP レジスターのデータのみを提供します。先に認証を追加しない限り、認証情報を必要とするツールや非公開のツールをこのトランスポートの背後に配置しないでください。
Docker / Kubernetes
強化されたマルチステージ構成の Dockerfile(非 root UID 10001、/health の HEALTHCHECK)、リソース制限を設定した docker-compose.yml、および Kubernetes マニフェストと HAProxy のスティッキーセッション設定が deploy/ に含まれています。
docker compose up --build # reads IGE_* from .env
強化、リソース制限、スケーリング(ステートレスとスティッキーセッション)の詳細については、docs/deployment.md を参照してください。
テスト
# Unit tests (no credentials needed)
PYTHONPATH=src pytest tests/ -v
# Including live integration tests against the real API
IGE_USERNAME=... IGE_PASSWORD=... PYTHONPATH=src pytest tests/ -v
CI ワークフローは Python 3.11、3.12、3.13 で実行されます。
オブザーバビリティ(任意)
サーバーは OpenTelemetry トレースを出力できます。各ツール呼び出しにつき 1 つのスパンが作成され、バックエンドの Swissreg/IDP への HTTP 呼び出しには子スパンが作成されます。トレーシングはデフォルトで無効で、有効にするまでオーバーヘッドは発生しません。
pip install 'swiss-ip-mcp[otel]'
MCP_OTEL_ENABLED=1 \
OTEL_EXPORTER_OTLP_ENDPOINT=http://your-collector:4318 \
MCP_ENV=production \
swiss-ip-mcp
| 変数 | 用途 |
|---|---|
MCP_OTEL_ENABLED | トレースのエクスポートを有効にするには 1 を設定します(または、下記のエンドポイントのみを設定します)。 |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP/HTTP コレクターのエンドポイント(標準の OTEL 変数)。 |
MCP_ENV | deployment.environment リソース属性の値(デフォルトは production)。 |
ツールのスパンに記録されるのは mcp.tool.name と mcp.tool.result.is_error のみです。クエリ引数、認証情報、レスポンス本文は記録されません。
ロギング
サーバーは構造化 JSON を stderr に出力します(stdout は stdio プロトコル用に確保されています)。各ツール呼び出しには tool 名と correlation_id が紐付けられるため、1 回の呼び出しに関するすべてのログ行を関連付けられます。LOG_LEVEL でログレベルを設定します(DEBUG / INFO / WARNING / ERROR、デフォルトは INFO)。
{"event": "tool.call.start", "tool": "swiss_ip_search_trademarks", "correlation_id": "da55…", "level": "info", "timestamp": "…Z"}
MCP プロトコルバージョン
このサーバーは、同じエンドポイントで2 つのプロトコル世代に対応しています。接続時のクライアントの最初のリクエストによって、どちらを適用するかが決まります。後続のリクエストで別の世代を指定しても拒否されます。
| 世代 | リビジョン | 利用するクライアント |
|---|---|---|
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | 現在のクライアントが使用するものです。サーバーは指定されたリビジョンで応答します。リクエストでそれより新しいバージョンが要求された場合は、上限である 2025-11-25 で応答します。 |
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエストによって、モダン接続が開始されます。 |
どちらのリビジョンも tests/test_protocol_version.py で固定され、インストール済み SDK に対して検証されます。そのため、Dependabot による mcp の更新で、どちらかのリビジョンが予期せず変わることはありません。
さらに、tests/test_modern_era.py では、両方の世代を実測します。Mcp-Method / Mcp-Protocol-Version ルーティングヘッダー付きの 2026-07-28 _meta エンベロープと、旧式の initialize を実際に送信し、組み立て済みの ASGI アプリを経由した応答を検証します。このセクションの以前のリビジョンには、「このサーバーは initialize を送信する ASGI アプリを構築しない」という反対の主張がありましたが、それは誤りでした。_build_http_app() は ASGI アプリを構築しており、tests/test_cors.py でも以前からそのアプリにリクエストを送信していました。ゲートが依存していた SDK 定数には、その根拠がありませんでした。
なお、SDK の LATEST_PROTOCOL_VERSION はハンドシェイク世代ではなく、モダン世代のエイリアスです。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする世代が変更されても検知できません。
サーバーの識別情報
2026-07-28 以降、このサーバーは initialize
レスポンスで一度だけではなく、すべての結果の _meta
(io.modelcontextprotocol/serverInfo、SEP-2575)で自身を識別します。このサーバーはそこにパッケージのバージョンと websiteUrl を報告します。測定して修正するまでは、SDK のデフォルト値である空の version 文字列を使用していました。icons は意図的に未設定です。リポジトリにアイコンのアセットが含まれていないためです。
更新ポリシー。 ゲートに失敗した場合は、定数をそのまま編集しないでください。2 つのリビジョン間の仕様変更履歴を確認し、サーバーが引き続き正常に動作することを検証してから、定数、このセクション、README.de.md、CHANGELOG.md をまとめて更新してください。
データソース
すべてのデータは、IGE/IPI Swissreg Datadelivery API によって提供されます。利用規約に署名すれば API を無料で利用できますが、月間のデータ転送量には上限があります。swiss_ip_get_quota ツールを使用すると、残りの割り当て量をいつでも確認できます。
| 項目 | 値 |
|---|---|
| 提供元 | スイス連邦知的財産機関(IGE/IPI) |
| ソース | Swissreg Datadelivery API — https://www.swissreg.ch/public/apidocs/ |
| ライセンス/規約 | IGE/IPI Swissreg Datadelivery API 利用規約 |
出典情報: すべてのツールレスポンスには source ブロック(提供元、ソース URL、ライセンス)が含まれるため、下流の利用者は出典を保持できます。結果のエンベロープは { source, total, count, match_type, results, next_page_token } です。
安全性と制限事項
- 読み取り専用: すべてのツールは、認証済みの POST リクエストを Swissreg API に送信します。いずれのシステムでも、データの書き込み、変更、削除は行いません。
- 個人データなし: API が返すのは、公的な IP 登録情報(商標名、特許の名称、出願人の組織)です。このサーバーが処理または保存する個人を特定できる情報(PII)は、IGE API が公開記録として返す情報以外にはありません。
- レート制限とクォータ: IGE Swissreg API は、アカウントごとに月間データ転送クォータを適用します。残りのクォータを確認するには、
swiss_ip_get_quotaツールを使用してください。サーバーはリクエストごとに 60s のタイムアウトを設定します。調査目的のクエリでは、大きなpage_size値(>20)を避けてください。 - 認証: 認証情報(
IGE_USERNAME、IGE_PASSWORD)は実行時に環境変数から読み込まれ、ログに記録されたり、永続化されたりすることはありません。 - 利用規約: データには、IGE Swissreg Datadelivery API の利用規約が適用されます。API にアクセスするには、IGE/IPI との署名済み利用契約が必要です。
- 認証情報なしでアドレス一覧を検証済み(2026-08-08)。 各アドレス、Keycloak realm、およびこのサーバーが構築する
client_idは、ソースが公開しているものと一致します。null の結果も記録しました。誰も書き留めなかった null の結果は、次回の確認では存在しなかったのと同じだからです。独立した検証は 3 つあります。1 つだけでは不十分だからです。- IDP は区別します。認証情報が誤っている状態で
realms/egovを指定するとinvalid_grant("Invalid user credentials")、存在しない realm を指定すると 404 "Realm does not exist"、存在しないclient_idを指定するとinvalid_clientが返されます。つまり、realm と client は存在し、不足しているのは認証情報だけです。 - realm は
.well-known/openid-configurationの下で独自のトークンエンドポイントを宣言しており、ここで構築する URL と一致します。 - 公式 API ドキュメントには、
client_idを「constant string」と明記したうえで、両方のアドレスがそのまま記載されています。
- IDP は区別します。認証情報が誤っている状態で
- 3 つ目の検証が必要な理由: Swissreg API 自体は区別しません。トークンなしの POST は 403、存在しないトークンを使った POST は 401 を返します。また、
/public/api/の下に存在しないパスを自由に指定しても、まったく同じ結果になります。この場合、ステータスコードは何の証明にもなりません。scripts/record_fixtures.pyは実行のたびにこれを再測定し、対照テストで区別できなくなった場合は中断します。 - レスポンスのペイロードは 2026-10-04 以降に記録されています(
tests/fixtures/live/、専用のRECORDING.mdあり)。実際の構造を使い、テキスト値は合成データです。認証情報を入手するまでは NOT RECORDED と記載されており、その空白には代償がありました。手書きのフィクスチャでは、レコード要素をItem、カウンターをTotalCountと名付けていました。これはパーサーが探していたものとまったく同じでした。しかし、ソースではどちらの名前も使われていません。レコードはrole="item"を持つResultの子要素で、カウンターはMeta/TotalItemCountです。どちらも同じように誤っていたため、単体テスト 171 件がすべて成功する一方で、すべての検索ツールがヒット数 0 を返していました。実行番号 37198882345 と 37201829767 で測定しました。 - 保証なし: このサーバーはコミュニティプロジェクトであり、Swiss Federal Institute of Intellectual Property(IGE/IPI)とは提携していません。利用可能かどうかは、上流 API の稼働状況に依存します。
関連サーバー
| サーバー | 内容 |
|---|---|
zurich-opendata-mcp | チューリッヒ市のオープンデータ(CKAN、天気、駐車場、地理データ) |
fedlex-mcp | Fedlex SPARQL によるスイス連邦法 |
swiss-transport-mcp | 公共交通機関、運行障害、チケット、列車編成 |
swiss-road-mobility-mcp | シェアモビリティ、EV 充電ステーション、交通データ |
global-education-mcp | UNESCO / OECD の教育データ |
patent-mcp | ⚠️ 非推奨 — このサーバーに置き換えられました |
貢献
バグの報告や変更の提出方法については、CONTRIBUTING.md(ドイツ語)をご覧ください。
セキュリティ
セキュリティ体制、強化の概要、脆弱性の報告方法については、SECURITY.mdをご覧ください。
ライセンス
MIT License — LICENSEをご覧ください。
作者
Hayal Oezkan · github.com/malkreide
インストール
uv の uvx 経由で実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json のトップレベルキー servers を使用します)。
{
"mcpServers": {
"swiss-ip-mcp": {
"command": "uvx",
"args": [
"swiss-ip-mcp"
],
"env": {
"IGE_USERNAME": "<your IGE_USERNAME>",
"IGE_PASSWORD": "<your IGE_PASSWORD>"
}
}
}
}
認証情報が必要です。IGE_USERNAME と IGE_PASSWORD を設定してください(上記のプレースホルダー値を置き換えてください)。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。