JAXA Earth API for JavaScript
    検索インデックスを準備しています...

    MCP基礎(STDIO編)

    JAXA Earth API for JavaScript を使うと生成AIと連携するためのMCP (Model Context Protocol)の開発も可能です。 このチュートリアルでは、公式サイトの掲載方法に基づいてSTDIO方式のMCPを作ります。

    そのため、MCPサーバー(下記のソースコード)とMCPクライアント(Claude Desktopなど)は同一の端末上で稼働することが前提となります。

    この解説内容は次の環境で動作確認済です(2026.2時点)。

    • Windows 11
    • Node.js (v22.20.0)
    • TypeScript (5.9.3)
    • Claude Desktop (バージョン 1.1.1520)
    • Claude Freeプラン

    下記リンクからソースコード一式をダウンロードしてZIPファイルを展開して、任意のフォルダ(以下、「プロジェクトルート」と言います)に保存します。

    MCPサンプルコード一式

    フォルダへのパスの途中に日本語名が含まれると問題が生じる可能性がありますので、C:\mcp-testのような階層が浅い英語名のフォルダを使う事をお勧めします。

    サンプルコードには次のようなファイルが含まれます。

    - package.json //このパッケージに関する情報を記載したNode.js用のファイル
    - tsconfig.json //TypeScriptの設定ファイル

    - src/
    - index.ts //MCPの実行に必要なファイル
    - test.ts //モジュール単体テスト用のファイル
    - getElevationValue.ts //JAXA Earth APIで標高データの値を返すための関数
    - getElevationImage.ts //JAXA Earth APIで標高データの画像を返すための関数
    - getCatalogList.ts //JAXA Earth APIで利用できるカタログファイルを返すための関数
    - jaxa.earth.esm.js //JAXA Earth APIのモジュールファイル
    - jaxa.earth.esm.d.ts //JAXA Earth APIのモジュールの型定義ファイル

    index.tsファイルにはMCPサーバーとして動作させるためのコードが含まれています。ツールの説明や受け付ける引数の詳細について定義されています。

    //MCPの実装に必要なモジュール
    import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
    import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
    import { z } from "zod";

    //JAXA Earth APIを使った各機能
    import getElevationValue from "./getElevationValue.js";

    //(途中省略)

    //利用できるツールを登録
    server.registerTool(
    "jaxa-earth-api-get-elevation-value",
    {
    //このツールの説明を記載
    description: `
    JAXA Earth APIを使って全世界の標高のデータを数値で取得します。
    標高の値を知りたい場所の経度(longitude)と緯度(latitude)を指定すると、その場所の標高(単位はm)を返します。
    海上など、観測データが無い場合はNaNまたはエラーを返します。
    源泉となるデータはAW3Dです。データセットの詳細について知りたい場合は、
    https://data.earth.jaxa.jp/ja/datasets/#/id/JAXA.EORC_ALOS.PRISM_AW3D30.v3.2_global
    をご参照ください。
    `,
    //受け付ける引数を登録
    inputSchema: {
    longitude: z.number().describe("経度を指定します。(例:135.5)"),
    latitude: z.number().describe("緯度を指定します。(例:35.8)"),
    },
    },
    //引数を受け付けて実行する関数
    async ({ longitude, latitude }) => {
    return {
    content: [
    {
    type: "text",
    //結果の数値については文字列として返します。
    text: String(await getElevationValue(longitude, latitude)),
    },
    ],
    };
    },
    );

    //(途中省略)

    getElevationValue.tsなどの中にはJAXA Earth API for JavaScriptを利用する具体的な処理が書かれています。

    import * as je from "./jaxa.earth.esm.js";

    //AW3Dのデータを利用して、指定した緯度経度の場所の標高を返す
    export default async (lng: number, lat: number): Promise<number> => {

    //指定された緯度経度を中心として±0.001度の狭い区域でbboxを作る
    const dl = 0.001;
    const bbox: je.Bbox = [lng - dl, lat - dl, lng + dl, lat + dl];

    //AW3Dを指定
    //https://data.earth.jaxa.jp/ja/datasets/#/id/JAXA.EORC_ALOS.PRISM_AW3D30.v3.2_global
    const collectionUrl = "https://s3.ap-northeast-1.wasabisys.com/je-pds/cog/v1/JAXA.EORC_ALOS.PRISM_AW3D30.v3.2_global/collection.json";
    const band = "DSM";

    //DataObjectを取得
    //画像サイズは100px四方
    const dataObject = await je.getDataObject({
    collectionUrl,
    band,
    bbox,
    width: 100,
    height: 100,
    });

    //統計値計算を行う(最小値、最大値、平均値など)
    const stat = je.data.globalStat(dataObject);

    //平均値meanを返す
    return stat.mean;
    };

    プロジェクトルートでターミナル(コマンドプロンプト)を開き、次を実行することで、package.jsonの記載に従って、TypeScriptやMCPなどの必要なモジュールがインストールされます。

    npm i
    

    ターミナルで続けて次を実行します。TypeScriptファイルがコンパイルされて、実際に実行するためのJavaScriptファイルが./buildフォルダに出力されます。

    npm run build
    

    次のようなファイルがそろえば完成です。

    getElevationValue.tsなどの各処理内容を変更した場合には、次のコマンドでtest.tsに書かれている単体テストを実行できます。

    npm run test
    
    //このファイルは下記のモジュール単体のテスト用です。
    //MCPの実行には利用されません。

    //JAXA Earth APIを使った各機能
    import getElevationValue from "./getElevationValue.js";
    import getElevationImage from "./getElevationImage.js";
    import getCatalogList from "./getCatalogList.js";

    //Node.jsのファイル保存機能
    import fs from "node:fs";

    //コンソール上に標高を表示します。
    console.log(await getElevationValue(138.727, 35.361));

    //test.pngに画像を保存します。
    fs.writeFileSync("test.png", await getElevationImage(138.727, 35.361));

    //test.txtに回答の文字列を保存します。
    fs.writeFileSync("test.txt", await getCatalogList(), "utf8");

    Claude Desktopを経由せずにモジュール単体で実行するため、効率良く動作確認が可能です。

    JAXA Earth API for JavaScript では、データの取得のためにデータが保存されたサーバーと通信を行います。 企業や組織内のネットワークの都合上、SSL証明書のエラーが発生する場合は、SSL証明書の確認を一時的に回避する方法として、次のコードをindex.tstest.tsの一番最初に追記します。

    process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0";
    

    STDIO方式ではMCPの通信にSTDIOを用いる仕組みであるため、STDIOに出力してしまうconsole.log()を利用するとエラーが発生します。 console.log()は使用しないようにするか、console.error()をご利用ください。 公式サイトの記載はこちら

    Claude Desktopを開き、メニュー→ファイル→設定→開発者→"設定を編集"をクリックし、開いたフォルダでclaude_desktop_config.jsonファイルを探します。このファイルに下記の通り記載します。

    {
    "mcpServers": {
    "jaxa-earth-api": {
    "command": "node",
    "args": [
    "C:\\(PATH-TO-YOUR-PROJECT-ROOT)\\build\\index.js"
    ]
    }
    }
    }

    TypeScriptファイルのコンパイルで出力された./buildフォルダ内のindex.jsを指定します。パス区切りは\\のように2つ書く必要がある点にご注意ください。

    Claude Desktopを再起動します。ウィンドウを閉じてもタスクバーに常駐していることがありますので、完全に終了させます。

    次のような項目が出現していれば読み込み成功です。

    次のように質問してみてください。JAXA Earth APIのデータを駆使して生成AIが答えてくれます!

    JAXA Earth APIではPNG画像を返すことも可能なため、画像を用いたマルチモーダルな生成AI連携が可能です。

    STDIO方式では生成AIのアプリケーション上でMCPが実行されるため、MCPのサービスを異なる端末に提供することはできません。 ネットワーク越しにMCPを利用する場合は、Streamable HTTP方式を利用します。

    Streamable HTTP方式のサンプルはこちらへ