Skip to content

[Feature Request] 外部MCPクライアント(Claude.ai等)から画像をデッキに取り込む手段がない #75

@ken-kawagu

Description

@ken-kawagu

素晴らしいプロジェクトを公開いただきありがとうございます。Layer 2 を Kiro から、Layer 3 を Claude.ai のカスタムコネクタから利用しています。

やりたいこと

Claude.ai のチャットに添付した写真やスクリーンショットを、スライドに埋め込みたい。

現状の制約

外部 MCP クライアント(Claude.ai、Claude Desktop、Kiro 等)から Layer 3 のリモート MCP サーバーを利用する場合、ユーザーがクライアント側で添付した画像をデッキのワークスペースに取り込む導線がありません。

既存ツール | 制約 -- | -- save_web_image | 公開 URL が必要。ローカル画像は不可 read_uploaded_file | Layer 4 Web UI 経由の upload_id が必要。外部クライアントが発行できない run_python(files=...) | テキストファイルのみ。バイナリ非対応

Layer 4 の Web UI は REST API 経由で S3 に直接アップロードし、MCP サーバーと同じバケットを共有しているため問題が起きません。しかし、Layer 3 を Layer 4 の Web UI なしで使う場合(MCP クライアントから直接接続)、この導線が存在しません。

提案

以下のいずれか(または両方)の対応を検討いただけないでしょうか。

案 A: base64 画像受け取りツールの追加(最小改修)

python
@mcp.tool()
async def upload_image(deck_id: str, filename: str, data_base64: str) -> str:
    """Base64エンコードされた画像をデコードしてデッキのimages/に保存する"""
    image_bytes = base64.b64decode(data_base64)
    await storage.put_file(f"decks/{deck_id}/images/{filename}", image_bytes)
    return json.dumps({"status": "ok", "key": f"decks/{deck_id}/images/{filename}"})

Claude.ai はコンテキスト内の画像を base64 として認識できるため、このツールがあれば save_web_image と同様にスライドへの画像埋め込みが可能になります。

案 B: run_python(files=...) のバイナリ対応

既存の files パラメータが base64 エンコードされたバイナリも受け取れるように拡張する。

補足

  • スキーマは dict リテラルで定義すれば Gateway の $ref 制約に抵触しません
  • ファイル名のサニタイズ、拡張子ホワイトリスト、サイズ上限は必要です
  • 既存の _check_deck_access() による認可チェックはそのまま適用できます

環境

  • Layer 3 + AgentCore Gateway 経由
  • クライアント: Claude.ai カスタムコネクタ(モバイル含む)、Kiro

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions