Twinkle HubTwinkle Hub

10 分で​セットアップ

Twinkle Hub は MCP endpoint です。​お使いの​ツールを​選んで​手順どおりに​進めてください。

API キーを​取得

ログインすると、​ここに key が​表示され、​以下の​設定にも​自動で​入ります。

API キーを​取得

呼び出し方

接続すると、​エージェントに​見えるのは 3 つの​ツールです。​地域や​データセットは​数百の​ツールではなく execute_tool の tool_id 引数——地域を​追加しても​コンテキストは​増えません。

  1. discover_tools欲しい​データを​自然言語で​書くと、​該当する tool_id が​返ります。
  2. inspect_tool引数の​渡し方に​迷ったら、​まず​完全な​定義と​課金を​確認します。
  3. execute_tool実行します。​課金・権限・レート制限は​従来どおりです。

外側は​必ず​この形

execute_tool
execute_tool({
  tool_id: "tw_query_dataset",
  arguments: {
    dataset_id: "pcc-tender",
    filters: [{ field: "agency", operator: "contains", value: "交通部" }],
    limit: 10
  }
})

外側の​キーはtool_id と arguments の 2 つだけ。残りは​すべて arguments の中へ——引数を​外側に​並べてしまうのが​最も​多い​誤りです。

その dataset_id はどこから?データカタログの各地域ページに​載っています。​あちらは​データの​身元、​こちらは​使い方と​いう​分担です。

curl​(streamable-http トランスポート)

ステップ 1:initialize して mcp-session-id レスポンスヘッダーから session id を​取得

bash
curl -i -X POST https://api.twinkleai.tw/mcp/ \
  -H "Authorization: Bearer sk-..." \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

ステップ 2:tools/call

bash
curl -X POST https://api.twinkleai.tw/mcp/ \
  -H "Authorization: Bearer sk-..." \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -H "mcp-session-id: <from-step-1>" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
        "name":"execute_tool",
        "arguments":{
          "tool_id":"tw_search_datasets",
          "arguments":{"query":"空氣品質","limit":5}
        }}}'

レスポンスは SSE スタイルの​フレーミング — data: で始まる​最後の​行を​見つけて JSON を​パース。

Python(fastmcp)

python
import asyncio
from fastmcp.client import Client
from fastmcp.client.auth import BearerAuth

async def main():
    async with Client(
        "https://api.twinkleai.tw/mcp/",
        auth=BearerAuth("sk-..."),
    ) as client:
        tools = await client.list_tools()
        print([t.name for t in tools])

        # 外層一定是 execute_tool,tool_id 與 arguments 兩個鍵
        r = await client.call_tool(
            "execute_tool",
            {
                "tool_id": "tw_query_dataset",
                "arguments": {
                    "dataset_id": "pcc-tender",
                    "filters": [
                        {"field": "agency", "operator": "contains", "value": "交通部"}
                    ],
                    "limit": 10,
                },
            },
        )
        # response 在 r.content[0].text — JSON string
        import json
        print(json.loads(r.content[0].text))

asyncio.run(main())

ツールは CallToolResult.content[0].text を JSON 文字列と​して​返します。​ライセンス、​引用、​その​他の​メタデータは _meta フィールドで​透過。

ツールリファレンス

ツール引数戻り値​(簡潔)
discover_tools{query, country?, cursor?}[{tool_id, name, description, access}]
inspect_tool{tool_id}{input_schema, how_to_call, execution_policy}
execute_tool{tool_id, arguments}{tool_id, result, _meta.opendata.license}

tools/list が返すのは​この 3 つだけです。​地域や​データセットごとに​どれを​使うかは discover_tools が判断し、inspect_tool がその​ツールの​完全な JSON Schema と​課金を​返します。

認証

  • Bearer トークン — ヘッダー Authorization: Bearer sk-...。Twinkle Hub 発行の​仮想キー、​ユーザー 1 人に​つき 1 つ。/dashboard から​取得してください。
  • OAuth フローなし — PKCE / リフレッシュトークン不要;長期 bearer 一本。
  • レート制限 — プランごとの​ローリング方式 credits 枠で​制御されます。​USD 予算や​キーごとの RPM/TPM ではありません。​各プランの​数値は料金ページをご覧ください。

料金

無料枠・レート制限・各プランの​違いは料金ページにまとめています。​枠を​使い切ると gateway は​回復するまで​呼び出しを​止め、​回復後は​自動で​再開します。​設定の​変更は​不要です。