JAXA Earth API for JavaScript を使うと生成AIと連携するためのMCP (Model Context Protocol)の開発も可能です。 このチュートリアルではStreamable HTTP方式のMCPを作ります。 そのため、MCPサーバー(下記のソースコード)とMCPクライアント(Claude Desktopなど)を別の端末で起動して、ネットワーク越しに動作させることも可能です。
ただし下記のソースコードではHTTPS対応やユーザー認証等のセキュリティ対策は省略していますので、信頼できるローカルネットワーク内での利用を想定しています。 不特定多数のユーザーがアクセスできるようにインターネットに公開するためには別途セキュリティ対策が必要です。
STDIO方式を理解した上での解説となりますので、不明な部分はSTDIO方式のチュートリアルをご覧ください。
この解説内容は次の環境で動作確認済です(2026.2時点)。
下記リンクからソースコード一式をダウンロードしてZIPファイルを展開して、任意のフォルダ(以下、「プロジェクトルート」と言います)に保存します。
サンプルコードには次のようなファイルが含まれます。
- package.json //このパッケージに関する情報を記載したNode.js用のファイル
- tsconfig.json //TypeScriptの設定ファイル
- src/
- index.ts //MCPの実行に必要なファイル
- createMcpServer.ts //McpServerを作成する関数のファイル
- 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サーバーとして動作させるためのコードが含まれています。
STDIO方式の場合との違いとして、McpServerを作成する部分についてはcreateMcpServer.tsとして分離しています。
ツールの説明や受け付ける引数の詳細について定義されている部分については同じです。
index.tsファイルのサーバーの起動部分については、Streamable HTTP方式の場合は下記のようになっています。
const host = の部分については、このソースコードを実行する端末のIPアドレスを指定してください。
//Streamable HTTP用のモジュールを読み込み
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import cors from "cors";
import type { Request, Response } from "express";
//(途中省略)
const port = "3001";
// const host = "localhost"; //Claude Desctopなどのクライアントが同一端末内で実行される場合。
const host = "192.168.xxx.xxx"; //Claude Desctopなどのクライアントが別の端末で実行される場合には、この端末のIPアドレスを指定。
const app = createMcpExpressApp({ host });
app.use(cors());
app.all("/mcp", async (req: Request, res: Response) => {
//生成AIから届くリクエストの内容をコンソールに表示します。
console.log(req.body);
//このサンプルはステートレスな機能のみのため、セッションは持たずに都度新しく立ち上げます。
//ユーザー認証等、ステートフルな機能を作る場合はセッションを管理するための別の実装が必要です。
const server = createMcpServer();
const transport = new StreamableHTTPServerTransport();
res.on("close", () => {
transport.close().catch(() => { });
server.close().catch(() => { });
});
try {
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
} catch (error) {
console.error("MCP error:", error);
if (!res.headersSent) {
res.status(500).json({
jsonrpc: "2.0",
error: { code: -32603, message: "Internal server error" },
id: null,
});
}
}
});
const httpServer = app.listen(port, (err) => {
if (err) {
console.error("Failed to start server:", err);
process.exit(1);
}
console.log(`MCP server listening on http://${host}:${port}/mcp`);
});
//(以後省略)
プロジェクトルートでターミナル(コマンドプロンプト)を開き、次を実行することで、必要なモジュールがインストールされます。
npm i
ターミナルで続けて次を実行します。TypeScriptファイルがコンパイルされて、MCPサーバーの起動まで行います。npmの使い方として、startに関してはnpm startと省略して書くことも可能です。
npm run start
次の表示が出ればMCPサーバーの起動成功です。
> jaxa-earth-api@1.0.0 start
> npm run build && node ./build/index.js
> jaxa-earth-api@1.0.0 build
> tsc
MCP server listening on http://192.168.xxx.xxx:3001/mcp
ターミナル上ではMCPサーバーが起動したままの状態となるため、終了させるには [Ctrl] + C を押します。
STDIO方式の場合と同じくclaude_desktop_config.jsonファイルを開き、下記の通り記載します。
{
"mcpServers": {
"jaxa-earth-api": {
"command": "npx",
"args": [
"mcp-remote",
"http://192.168.xxx.xxx:3001/mcp",
"--allow-http"
]
}
}
}
URL部分に関しては、index.tsでconst host = "localhost";とした場合は、"http://localhost:3001/mcp"と記載します。
Claude DesktopのFreeプランではリモートMCPに未対応(2026.2時点)のため、npxとmcp-remoteを利用します。 mcp-remoteはnpx実行時に自動でインストールされるため、特にインストール作業は不要です。
STDIO方式の場合と同じくClaude Desktopを再起動して、コネクタにjaxa-earth-apiが表示されていればMCPサーバー接続完了です。
チャット欄で質問してみてください。STDIO方式の場合と同じくJAXA Earth APIのデータを駆使して生成AIが答えてくれます!
STDIO方式やStreamable HTTP方式では生成AIに対して文字列や画像の応答を返すことができました。 MCP Appsを利用すると、さらにUIとしてウェブアプリケーションを返すことも可能です。