Claude CodeからTines MCPサーバーを呼ぶ — ストーリーをツールにする
TinesのMCPサーバーテンプレートで作ったストーリーを、Claude Codeからツールとして呼ぶ手順です。4つのアクセス制御、30秒の応答制限、メールアドレスによる実行者の記録までまとめます。
TinesのMCPサーバーは、Tinesのストーリー(自動化ワークフロー)を外部のMCPクライアントにツールとして見せるためのアクションテンプレートです。つなぐ向きは「ClaudeからTinesのAPIを叩く」ではありません。Tines側がMCPサーバーになり、Claude Codeはそれを呼ぶクライアントになります。
何を公開するかを決めるのはTines側です。Claudeに渡す権限は、ストーリーとして作ったツールの範囲に収まります。この記事では、サーバーの作り方、Claude Codeへの登録、アクセス制御の選び方、30秒の応答制限の扱いを順に説明します。
何がClaudeから見えるのか
TinesのストーリーボードでTemplatesから「MCP」を検索し、MCPサーバーのアクションをドラッグして置くと、サーバーができます。ここにツールを足していきます。
ツールの種類は3つです。
- テンプレートツール
- ストーリーに処理を渡すsend-to-storyツール
- カスタムツール
設定方法はAI Agentアクションと同じです。ツール名・説明・引数は、Claude側が接続に成功した時点で自動的に見えるようになります。
MCPサーバーのアクションに書いたdescriptionは、クライアントへのinstructionsとしてそのまま渡ります。サーバー全体の使い方や禁止事項をここに書いておくと、Claudeが最初から読める形になります。
対応範囲は狭めです。
Tines MCPサーバーの対応範囲
使えるもの
トランスポートはStreamable HTTPだけです。プロトコルのバージョンは2025-11-25に対応し、2025-03-26は部分対応です。
使えないもの
Prompts / Resources / OAuth / Notifications / Sessions / Paginationは未対応です。2024-11-05版も対応外で、ツールの応答は常にテキストになります。
Claude Codeから見ると、スラッシュコマンドやリソース参照ではなく、ツール呼び出しだけが使える接続です。
Claude Codeに登録する
Tines側で表示されるサーバー URLは https://<テナント名>.tines.com/mcp/<mcp-path> の形です。Claude CodeはStreamable HTTPを --transport http で扱えます。
claude mcp add --transport http tines \
https://<tenant>.tines.com/mcp/<mcp-path> \
--header "Authorization: Bearer <webhook-secret or api-key>"チームで共有するなら、.mcp.json にトークンを直書きせず、環境変数の展開を使います。
{
"mcpServers": {
"tines": {
"type": "http",
"url": "https://<tenant>.tines.com/mcp/<mcp-path>",
"headers": {
"Authorization": "Bearer ${TINES_API_KEY}"
}
}
}
}Claude Codeの .mcp.json では url があって type が無い項目は設定エラーになります。Tinesの公式ページにある設定例は type を省いた形なので、そのままコピーせず "type": "http" を足してください。
接続できたかは claude mcp get tines で確かめられます。
BearerとBasicの食い違い
Tinesのページには、同じ認証情報に対して Bearer を使う例と Basic を使う例の両方があります。直接つなぐHTTPの設定例は Bearer、mcp-remote を挟むstdioの設定例は Basic です。
どちらが効くかは、ページには書かれていません。401が返るときは、まず Bearer に揃えて試し、通らなければTines側のアクセス制御モードを見直す順で切り分けると早く済みます。
stdioしか使えないクライアントの場合
Tinesはstdioをサポートしません。stdioしか話せないクライアントには、mcp-remote をローカルのプロキシとして挟む方法が案内されています。Node.jsが要ります。Claude Code自身はHTTPで直接つながるので、この経路は不要です。
アクセス制御はどれを選ぶか
TinesのMCPサーバーには4つのモードがあります。
| モード | 認証の中身 |
|---|---|
| 誰でも(パスを知っていれば) | 認証の中身認証なしの公開 |
| シークレット | 認証の中身URLかAuthorizationヘッダーで渡す |
| Tines APIキー | 認証の中身指定チームのメンバー、またはテナントの全メンバー |
| OAuth | 認証の中身指定チームのメンバー、またはテナントの全メンバー |
セキュリティ運用のストーリーを渡すなら、公開モードは選びにくいでしょう。残るのはシークレットかAPIキーです。違いは実行者の記録に出ます。
APIキーかOAuthで認証したとき、認証したユーザーのメールアドレスがヘッダーの email として付きます。下流のアクションでは <<headers.email>>、ツールの式の中では META.headers.email で参照できます。この値で「誰のClaudeが実行したか」をケースの記録や承認フローに残せます。
シークレット方式では、誰が呼んだかを特定できません。共有のシークレットを複数人の .mcp.json に入れると、実行者を区別する手段がなくなります。
OAuthには注意が要ります。Tinesのページはアクセス制御のモードとしてOAuthを挙げる一方で、プロトコル詳細の未対応機能にもOAuthを並べています。どちらの記述がどの接続形態を指すのか、ページには書かれていません。Claude Code側では /mcp からOAuthの認証を進められますが、TinesのMCPサーバーとの組み合わせは、ページの記述だけを根拠に動くと決めない方が安全です。APIキーなら動作の筋道がはっきりしています。
なお、認証済みリクエストではAuthorizationヘッダーはキャプチャされるヘッダーに含まれません。
権限設計は両側で絞る
Claudeに何をさせるかの絞り込みは、2か所でできます。
Tines側では、ツールごとにhints(アノテーション)を付けられます。ツール設定の下にあるTool hintsを開いて設定します。クライアントが「この呼び出しは読み取りか、副作用があるか」を判断する材料になります。ただしhintsはクライアントへの目安であり、強制ではありません。副作用のあるストーリーは、そもそもツールとして公開しないか、承認ステップをストーリー内に入れるのが堅実です。
Claude Code側では、権限ルールでMCPのツールを個別に許可・拒否できます。mcp__tines__* でサーバー全体、mcp__tines__<ツール名> で1つのツールを指します。
{
"permissions": {
"allow": ["mcp__tines__lookup_alert"],
"ask": ["mcp__tines__isolate_host"]
}
}ここで使った lookup_alert と isolate_host は例のための名前です。実際のツール名は、Tines側で付けた名前が claude mcp get や /mcp に出るので、それに置き換えます。参照系は許可、遮断のような変更系は毎回確認、という分け方が基本です。
ほかのMCPの権限設計は、Zscaler MCPサーバーの読み取り専用と書き込みallowlistやJamf MCPサーバーの運用の記事にも例があります。
30秒を超えるストーリーはどうなるか
応答時間の上限は30秒です。レスポンス付きWebhookと同じ制限が適用されます。超えるとクライアントにはタイムアウトエラーが返り、ツール自体はバックグラウンドで動き続けますが、結果はクライアントに届きません。
同時実行は100件までです。専用テナントでは1,000件になります。この数はテナント内のすべてのMCPサーバーとレスポンス付きWebhookを合わせて数えます。
Claude Codeのツール実行タイムアウトは、MCP_TOOL_TIMEOUTを設定しなければ約28時間です。応答も進捗もないときに中断するアイドル時間は、HTTPサーバーで5分です。つまり実際に効く壁はClaude Codeではなく、Tinesの30秒です。
この仕様は設計に影響します。
- 調査系ツールは、30秒で返せる範囲に絞る(検索、ルックアップ、スコアの取得など)
- 長い処理は「開始して受付番号を返す」ツールと「状態を確認する」ツールに分ける
- タイムアウトしたあとも処理は走り続けるため、変更系のツールをClaudeが再試行すると二重に実行される可能性がある。ストーリー側で冪等にするか、実行前に状態を確認する
3つ目は、公式ページが明言しているわけではありません。「結果が届かないが処理は続く」という仕様から導いた注意点です。
イベントを使って記録を残す
MCPサーバーは、受けたリクエストごとにイベントを出します。種類は initialize、tools/list、tools/call の3つです。tools/call のイベントにはツールの結果は入らず、結果はツール側のアクションが完了時に出すイベントで取れます。ping など意味のないメソッドは、ノイズを避けるためイベントになりません。
このイベントにストーリーを接続すれば、Claudeが何を呼んだかをSlackに流したり、ケース管理に記録したりできます。ヘッダーの取得はInclude headersで切り替えられ、既定は有効です。切るとメールアドレスの参照もできなくなります。
クライアントが独自のヘッダーを送ることもできます。たとえば X-Department: security を設定に足すと、ツールの式では META.headers.x_department で読めます。部署やセッションの目印を渡す用途に使えます。
つまずきやすい点
typeを書き忘れて設定エラーになる(上で触れたとおり、Claude Codeの.mcp.jsonではurlだけでtypeが無い項目は設定エラーになる)- 401が出る。
BearerとBasicの違い、またはAPIキーの権限のあるチームに入っていない - ツールが表示されない。接続に成功した時点で一覧が取得されるため、まず
claude mcp get tinesでステータスを確認する - 結果が空になる。30秒を超えていないか、ツール側アクションのイベントをTines側で確認する
- TinesのCORS、マッチルール、レート制限はWebhookと同じように設定できる。レート制限を入れておくと、Claudeが短時間に連続で呼んだときの暴走を抑えられる
まとめ
TinesのMCPサーバーは、権限の境界を「ストーリーとして何を公開したか」で引ける接続です。Claude Code側は --transport http の登録だけで済み、重みはTines側の設計に寄ります。
実運用では、APIキーで実行者のメールアドレスを残し、30秒以内に終わる参照系から公開し、変更系はClaude Codeの ask とTines側の承認で二重に止める構成が組みやすいでしょう。OAuthは記述の食い違いがあるため、先に小さなストーリーで試してから広げるのが無難です。
MCPサーバーを自前で作る側の手順は、mcp-server-devプラグインの記事で扱っています。