Mcp Stargazing について
Mcp Stargazingは、天体計算と観測計画を行うMCPサーバーです。天体の見え方や観測条件を調べ、場所に応じた候補を順位付けしたいエージェントやクライアント向けです。
主な機能
- 01天体の高度と方位の計算
- 02天体の出没時刻の取得
- 03光害マップの分析
- 04順位付き観測計画の作成
- 05エリア分析結果のページ取得
活用シーン
- 01場所ごとの惑星の可視時刻を確認
- 02天候と月明かりを考慮した観測計画
- 03光害に基づく観測場所の比較
MCP 対応
Streamable HTTPまたはSSEを通じて、天体計算や計画作成のツールをMCPクライアントに公開します。総合観測計画、エリア分析、ツールカタログの取得に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
11掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| celestial_object | string | はい | 天体名(例:「sun」、「moon」、「andromeda」) |
| lat | number | はい | 観測者の緯度(度) |
| lon | number | はい | 観測者の経度(度) |
| time | string | はい | 観測時刻の文字列 "YYYY-MM-DD HH:MM:SS" |
| time_zone | string | はい | IANA タイムゾーン文字列 |
詳細
mcp-stargazing
地球上のあらゆる場所で、天体(太陽、月、惑星、恒星、深宇宙天体)の高度、出、入りの時刻を計算します。任意で光害分析も利用できます。
特長
- 高度/方位角の計算:あらゆる天体の高度と方位を取得します。
- 出/入りの時刻:天体が地平線の上に現れる時刻、沈む時刻を特定します。
- 光害分析:光害マップ(GeoTIFF 形式)を読み込み、分析します。
- 観測計画の作成:観測場所の条件、天候、月明かり、おすすめの対象天体を組み合わせ、順位付けされた観測計画を作成します。
- ツールの検索:
get_tool_catalogを使って、登録済みの MCP ツールをプログラムから確認できます。 - コード実行に対応:
- シリアライズ可能な戻り値:すべてのツールは JSON にシリアライズ可能なデータ(日付は ISO 文字列)を返すため、LLM でそのまま利用できます。
- ページネーション:
analysis_areaはページネーション(page、page_size)に対応しており、大規模なデータセットを効率的に処理できます。 - 安定した結果ハンドル:
analysis_area.resource_idはページネーションを除いたクエリのキャッシュを識別するため、エージェントは複数ページを安全に取得できます。 - 標準化された応答:呼び出しが成功すると
{ "data": ..., "_meta": ... }を返し、業務上の検証に失敗すると{ "error": ..., "_meta": ... }を返します。
- パフォーマンス:
- 非同期実行:天体計算をノンブロッキングで実行します。
- キャッシュ:Simbad クエリと地域分析をインテリジェントにキャッシュします。
- プロキシ対応:HTTP/HTTPS プロキシを標準でサポートします(天文データのダウンロードに便利です)。
- タイムゾーン対応:現地時刻と UTC のどちらでも動作します。
- データ駆動型:おすすめを提示するため、10,000 件を超える深宇宙天体(Messier および NGC)のデータベースを統合しています。
インストール
このプロジェクトでは、依存関係の管理に uv を使用します。
ローカルインストール
-
uvをインストールする:pip install uv -
依存関係を同期する:
uv sync仮想環境
.venvが作成され、pyproject.tomlで定義されているすべての依存関係がインストールされます。 -
環境を有効にする:
source .venv/bin/activate -
データを初期化する(ナイトリープランナーに必須): 最新の Messier および NGC カタログデータを
src/data/objects.jsonにダウンロードします。python scripts/download_data.py注:ファイアウォールの内側にいる場合は、このスクリプトを実行する前に
HTTP_PROXY環境変数が設定されていることを確認してください。
Docker インストール
Docker を使ってサーバーを実行することもできます。依存関係の処理とデータの初期化は自動で行われます。
-
イメージをビルドする:
docker build -t mcp-stargazing .注:プロキシを使用している場合は、ビルド時にプロキシ URL を渡してください:
docker build --build-arg HTTP_PROXY=http://127.0.0.1:7890 -t mcp-stargazing . -
コンテナを実行する:
# Basic run (MCP on :3001 + SPF web UI on :5001) docker run -p 3001:3001 -p 5001:5001 mcp-stargazing # With Environment Variables docker run -p 3001:3001 -p 5001:5001 \ -e QWEATHER_API_KEY=your_key \ -e STARGAZING_DB_CONFIG=your_db_config \ mcp-stargazing -
アクセス先:
- MCP サーバー →
http://localhost:3001/shttp(AI エージェント/MCP クライアント用) - SPF ウェブ UI →
http://localhost:5001/(星空観測スポット検索フロントエンド)
- MCP サーバー →
Docker アーキテクチャ
コンテナでは、supervisord が管理する 2 つのサービスが、uv run を介して同じ Python
仮想環境を共有して実行されます。
Container
├── supervisord
│ ├── program:mcp → uv run mcp-stargazing --mode shttp --port 3001
│ └── program:spf-web → uv run uvicorn server.main:app --port 5001
│
Dependency resolution (single venv, no duplication):
stargazing-core>=0.2.0 ← resolved once from PyPI
stargazing-place-finder>=0.9.1
fastapi, uvicorn, ... ← SPF's transitive deps
MCP サーバーの使い方
MCP サーバーを起動して、AI エージェントや他のクライアントにツールを公開します。
エージェントを第一に考えた方向性
plan_stargazing_session は、サードパーティーのエージェント向けに推奨される複合的な意思決定のエントリーポイントです。
場所の名前、中心点と半径、または正確な境界を受け取り、Seestar S50、
HOPE D60 + ASI2600MC Air、またはカスタム光学機器の構成を解決します。プロバイダーとデータベースの選択は
サーバー側で行い、第一級の意思決定、代替案、正確なスコア構成要素、根拠、
不確実性、重要な不足入力、順位が逆転する条件、次のアクションを返します。
get_best_stargazing_plan と get_multiday_stargazing_plan は、既存の bbox を最初に指定する呼び出し元との互換性を保つため、引き続き登録されています。決定論的な 10 シナリオのゲートと、代表的な Codex/Claude のブラックボックススモークテストは、主要エントリーポイントの登録前に合格しました。長時間実行タスクのセマンティクスと 1.0 コントラクトが完成するまで、新しい独立した天文学検索ツールの追加は延期されています。
バックグラウンドのエリア分析では、実行時間、重複送信、キャンセル、期限、保持、ページ分割された結果取得に上限を設けています。タスクツールでは、オプションの task_id/progress メタデータが有効になります。実行中の進捗は不明であり、ランタイムが失われた場合は再送信が必要です。ワークフロー、制限、復旧のセマンティクスについては、タスクのライフサイクルを参照してください。
サードパーティーエージェントのコントラクト、
ワークスペース技術マップ、および
エージェント進化チェックリストを参照してください。現在の 21 ツールのルーティングと
パラメーターのレビューは、ツールサーフェス監査に記録されています。評価アセット
と 2 つのクライアントによるエビデンスは、evaluations/にあります。
1.0 より前の公開スキーマのベースラインには、既存のツール
スキーマと詳細な計画/エリアモデルが記録されています。SDK と実際の tools/list テストにより、新しいツールが追加される
前にコントラクトのドリフトを検出します。
独立した1.0 コントラクトと移行ガイドでは、過去のスナップショットを置き換えることなく、
21 個すべてのツール、タスクモデル、詳細なペイロード、アノテーション、エンベロープのセマンティクスを固定しています。bbox を最初に指定する 2 つのプランナーは引き続きサポートされており、現在、廃止予定の告知はありません。
今後削除するには、少なくとも 90 日間、後続のマイナーリリース 2 回分、およびその後のメジャーリリース 1 回が必要です。
パッケージのバージョンとレスポンスの _meta.version は別個のものです。このコントラクトの固定はリリースではありません。
主要プランナーを完全に利用するクライアントの場合は、ガイドの JSON リクエストを 1 つ保存して実行してください。
uv run python examples/agent_planning_demo.py --request request.json --url http://localhost:3001/shttp
1. 環境のセットアップ
.env ファイルを作成するか、変数をエクスポートしてください。
# Weather tools
# 推荐:使用你账号专属的 API Host(公共域名将从 2026 年起逐步停止服务)
export QWEATHER_API_HOST="abc1234xyz.def.qweatherapi.com"
# 鉴权(二选一)
# 1) API KEY(兼容旧用法)
export QWEATHER_API_KEY="your_api_key"
# 2) JWT(推荐,更安全)
# export QWEATHER_JWT_TOKEN="your_jwt_token"
# 如需临时兼容旧公共域名(不推荐),显式开启:
# export QWEATHER_ALLOW_PUBLIC_HOST=1
# Geocoding(默认零付费、零 key)
# CJK 查询默认使用内置离线行政区划数据;未命中时回退 Photon / Nominatim。
# 可选 provider 顺序覆盖(全部支持:gazetteer, photon, nominatim, amap)
# export GEOCODER_PROVIDERS="gazetteer,photon,nominatim"
# 仅当你希望显式启用付费的 Amap 地理编码时才需要:
# export GEOCODER_PROVIDERS="amap,gazetteer,photon,nominatim"
# export AMAP_KEY="your_amap_key"
# Optional: Proxy for downloading astronomical data (Simbad/IERS)
# Highly recommended if you are in a restricted network environment
export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
2. サーバーの起動
Streamable HTTP(SHTTP)モード(ほとんどのエージェントに推奨):
# Basic start
python -m src.main --mode shttp --port 3001 --path /shttp
# With proxy explicitly passed (overrides env vars)
python -m src.main --mode shttp --port 3001 --path /shttp --proxy http://127.0.0.1:7890
SSE モード:
python -m src.main --mode sse --port 3001 --path /sse
現在の FastMCP バージョンでは run_dev() が提供されなくなったため、dev モードはサポートされなくなりました。local、shttp、または sse を使用してください。
3. レスポンス形式
成功したビジネスレスポンスでは、標準化された JSON 形式でデータが返されます。
{
"data": {
// Tool-specific return data
"altitude": 45.5,
"azimuth": 180.0
},
"_meta": {
"version": "1.0.0",
"status": "success"
}
}
ビジネス上の検証エラーでも、同じエンベロープ形式が使用されます。
{
"error": {
"code": "INVALID_TIME_FORMAT",
"message": "Invalid time format: invalid-time-format",
"details": {
"time_string": "invalid-time-format"
}
},
"_meta": {
"version": "1.0.0",
"status": "error"
}
}
MCP プロトコルレイヤーでは、tools/list と get_tool_catalog の内容が一致するように保たれており、SHTTP と SSE の両方のトランスポートテストで JSON-RPC のリクエスト ID が保持されます。
各ツールの標準的な MCP の説明には、使用する場合、使用しない場合、必要なもの、
返されるもの、後続のアクションに関するガイダンスが含まれます。これらは、主要プランナーと互換性用エントリー、
事実と観測の意思決定、同期とバックグラウンドのエリア検索、サーバーのローカル時刻や星座中心の検索など、よくあるスコープ上の落とし穴について説明します。ラップされたカタログには、要約の description と完全な docstring が保持されます。明示的なデコレーターの説明は完全な内容であり、優先して使用されます。ツールルーティング監査を参照してください。
4. 利用可能なツール
-
get_celestial_pos:高度/方位角を計算します。 -
get_celestial_rise_set:出/入り時刻を計算します(ISO 形式の文字列を返します)。従来どおり現地日の全体を対象とするにはevent_scope="calendar_day"を使用し、指定したtime以降で最初の出と最初の入りを検索し、必要に応じて日付をまたぐにはevent_scope="next_events"を使用します。 -
get_moon_info:月相、照度、月齢の詳細を取得します。 -
list_visible_planets:現在地平線上にあるすべての惑星を位置とともに一覧表示します。 -
get_constellation:星座の中心位置(高度/方位角)を検索します。 -
get_nightly_forecast:今夜観測するのに最適な天体(惑星+ディープスカイ)を厳選して返すスマートプランナーです。夕暮れ、夜明け、継続時間、日付、タイムゾーンを含む現地の天文薄明終了後のnight_windowも返します。 -
get_weather_by_name/get_weather_by_position:ネットワーク障害時に自動で再試行して、現在の天気を取得します。 -
get_local_datetime_info:現地の現在時刻情報を取得します。 -
get_tool_catalog:利用可能な MCP ツールのメタデータとパラメーターを確認します。 -
plan_stargazing_session:1~7夜にわたって、いつ、どこで、何を観測するかを決めるための、エンドツーエンドの推奨エントリーポイントです。- 入力:
location(place_name、center、boundsのいずれか1つのみ)、start_date、任意のtime_zone、nights、observation_style、equipment、候補/対象の上限、人気度に関する設定を含むrequestオブジェクトです。 - 機材:安定したプリセットは
seestar_s50とhope_d60_asi2600mc_airです。高度な呼び出しではcustomを使用するか、個々の光学フィールドを上書きできます。 - 戻り値:正規化されたリクエストと解決済みの地理情報、第一候補の
decision、順位付けされたalternatives、追跡可能なevidence、uncertainties、重要なmissing_inputs、条件別のwould_change_if、具体的なnext_actionsを返します。 - 使い分け:観測に関する包括的な判断にはこのツールを使用します。特定の情報だけを調べる場合は、天気、天体、望遠鏡、場所の各ツールを直接使用します。
- 入力:
-
get_best_stargazing_plan:候補地、天気の概要、最適な観測時間帯、主な対象を含む、地域の観測プランを順位付けして作成します。- 入力:
south、west、north、east、time、time_zone、candidate_limit、target_limit、weather_provider、max_locations、min_height_diff、road_radius_km、network_type、observation_style、avoid_popular_spots、prefer_quiet_at_night、popularity_radius_km、db_config_path。 - 候補の再現率:
candidate_limitは返される順位付き候補の数です。サービスは最終的に件数を制限する前に、上限付きの再現率対象候補群を評価するため、天気の良い場所が、静的な順位でより上位の場所を追い越すことがあります。 - コストを考慮した評価:再現率対象候補群には、まず低コストの天気スクリーニングを実施します。その後、最終順位付け前に、内部候補のうち有力なものだけを対象として、夜間時間帯と対象天体の予報を評価します。
- 地域の天気情報:利用可能な場合、サーバーは星空観測コアの空間的な雲量グリッドを、bbox 全体について一度サンプリングし、地域比較に反映します。空間モデルに障害が発生しても、プランの生成は失敗せず、機能を低下させて処理を継続します。
- 戻り値:
query、summary、candidatesを返します。利用可能な場合、query.analysis_resource_idはプランを基盤となる中立的なanalysis_area検索に関連付けます。人気度の設定が有効な場合、MCP は返されたヒューリスティックフィールドに基づいて1回だけ調整を適用し、その理由をcandidates[*].recommendation_reasonsに示します。また、上位の推奨をsummary.popularity_preferences_enabled、summary.primary_recommendation_drivers、summary.recommended_location_reason_summaryに要約します。各候補のscore_breakdown.factor_contributionsでは、順位付けに用いた場所、天気、人気度、アクセス性の寄与度を符号付きで確認できます。説明理由には同じ有効な要因を使用します。ドライバー値は、安定した列挙型です:dark_sky、high_place_score、clear_weather、good_visibility、observation_style_fit、low_popularity_risk、quiet_at_night、strong_targets。 - 人気度設定の適用主体:すべての複合プランナー(1夜、複数夜、
plan_stargazing_session)は、avoid_popular_spots=falseとprefer_quiet_at_night=falseを指定して SPF の場所スコアを要求し、popularity_radius_kmとヒューリスティックの根拠情報を保持します。ユーザーが指定した設定を適用するのは MCP のみです。スクリーニングと最終評価は、いずれも中立的なスコアから開始します。リクエストのエコーにはユーザーの設定が保持されます。query.analysis_resource_id(または主プランナーの場所のevidence.resource_id)を再現するには、両方の設定フラグを無効にして同じエリア検索を繰り返します。単独のanalysis_areaでは、引き続き設定を SPF に渡し、有効な場合は別のキャッシュエントリーを使用します。 - 観測スタイル:
balancedはデフォルトの動作を維持します。deep_skyは暗い空と少ない月明かりを重視し、visualは天気の重みを上げ、planetaryは月による減点を抑えて惑星を優先し、beginnerはさらに近くの道路へのアクセスを優先します。 - 夜間時間帯:天文薄明終了後の暗さを判定できる場合、各候補に現地日、天文薄明終了時刻、その後の天文薄明開始時刻、継続時間、タイムゾーンを含む
night_windowが追加されます。best_observation_windowは、時間ごとのデータがある場合、連続した暗空の時間帯を表すようになりました。start_timeと天気フィールドに加え、end_time、duration_hours、quality_scoreがまとめて返されます。
- 入力:
-
get_multiday_stargazing_plan:連続する1~7夜を比較し、地域内で最適な夜と場所を返します。- 入力:
south、west、north、east、start_date、time_zone、nightsに加え、get_best_stargazing_planと同じ候補、天気、道路ネットワーク、観測スタイルの各オプションを指定します。 - 戻り値:
query、best_night_date、best_location_name、best_scoreを含む複数夜を横断したsummary、および各夜のnight_window、夜ごとのplan、エラー、警告を含むnights[]を返します。 - 機能低下時の動作:天気や予報のサブクエリーで機能が低下した場合、
summary.warningsと候補ごとのnotesにその内容を示しますが、プランニング全体のレスポンスは成功として返されます。
- 入力:
-
get_telescope_targets:ディープスカイ天体を望遠鏡の光学系に照らし合わせ、機材で最もよく見える天体を検索します。- 入力:
focal_length_mm、lon、lat、time、time_zoneに加え、aperture_mm、センサー寸法、ピクセルサイズ、レデューサー/バローレンズ倍率、マウントタイプ、フィルター、limitなどの任意の光学系フィールドを指定します。 - 戻り値:視認性スコア、高度/方位角、出/入り/南中データ、視野への適合性、表面輝度、モザイク撮影のガイダンス、正規化された望遠鏡設定を含む、順位付きの対象を返します。
- 入力:
-
get_shooting_plan:高度のしきい値を超える時間を最大化する、対象向けの最適化された撮影スケジュールを生成します。- 入力:
get_telescope_targetsと同じ望遠鏡/観測者フィールドに加え、任意のlimitとmin_altitudeを指定します。 - 戻り値:
targets、moon、時刻付き撮影スロットを含む1夜分のplan、config、totalを返します。
- 入力:
-
light_pollution_map:境界ボックスのエリアについて、光害データを検索します。- 入力:
south、west、north、east、zoom(デフォルト値は 10)。 - 戻り値:ボートル・クラス、輝度、SQM 値を含むデータポイントのグリッドを返します。
- 入力:
-
analysis_area:地域内で最適な星空観測スポットを検索します。- 入力:
south、west、north、east、max_locations、min_height_diff、road_radius_km、network_type、avoid_popular_spots、prefer_quiet_at_night、popularity_radius_km、db_config_path、page、page_size。 - 戻り値:ページネーションメタデータ(
total、page、page_size、total_pages)を含むスポット一覧と、ページネーション以外のクエリパラメーターを識別するキャッシュ済みのresource_idを返します。各項目には、static_popularity_risk_score、night_quiet_likelihood_score、popularity_notesなどの人気度ヒューリスティックフィールドが含まれることもあります。 - 検証:
page >= 1、page_size >= 1、popularity_radius_km > 0が必要です。無効な引数の場合はCONFIGURATION_ERRORを返します。 バックグラウンドエリアツール:
- 入力:
-
submit_area_analysis:boundsと場所検索の設定を含むrequestを受け取り、タスクのスナップショットと正規化されたリクエストを返します。max_locationsの値は1~100です。デプロイ方法と実行予算は、引き続きサーバーのポリシーに従います。 -
get_area_analysis_task:task_idを受け取り、状態、タイムスタンプ、失敗の詳細、execution_pending、および存在する場合は成功したresult_revisionを返します。失敗したタスクへのポーリングはステータスの照会として成功します。data.stateとdata.failureを確認してください。 -
cancel_area_analysis_task:task_idを受け取り、べき等なキャンセルを記録します。実行中のプロバイダー呼び出しは、完了するまで実行枠を保持し、遅れて返された結果は破棄されます。 -
get_area_analysis_result:task_id、page、page_sizeを受け取り、既存のAnalysisAreaResultのページネーション形式で返します。データが失われていても、暗黙的に再計算することはありません。公開データの有効期限が切れた場合や置き換えられた場合は、再送信が必要です。
ワークフロー:送信 → succeededになるまでポーリング → ページを取得。観測の判断を一通り行うにはplan_stargazing_sessionを使用してください。これらのタスクツールは、生の場所分析用です。既存の同期型analysis_areaも引き続き利用できます。
AI リカバリー受け入れレポートには、2つのクライアントがそれぞれ完了した、読み取り専用の状態/結果に関する10件の質問が記録されています。監査可能な呼び出しと明示的な制限も含まれています。このレポートは、AI による送信/キャンセルのワークフローや、実際のプロバイダーの稼働状況を評価するものではありません。別のアクティブワークフローのレポートでは、クライアントごとに3つの独立したワークフローで、送信、ステータス確認後のページネーション、キャンセル、アクティブなクエリの再利用を評価しています。制御されたプロバイダーを使用する実際のワーカーを用いています。実際のプロバイダーの稼働状況は、引き続きこの受け入れ判定の対象外です。
5. エラー処理
すべてのツールはJSONにシリアライズ可能なデータを返し、構造化されたエラー処理を使用します。
- 標準エラーコード:
INVALID_COORDINATES、INVALID_TIMEZONE、INVALID_TIME_FORMAT、MISSING_API_KEY、API_AUTH_FAILURE、API_TIMEOUT、API_RATE_LIMIT、EXTERNAL_API_ERROR、NETWORK_ERROR、CONFIGURATION_ERROR - タスクエラーコード:
TASK_NOT_FOUND、TASK_RUNTIME_CHANGED、TASK_CAPACITY_EXCEEDED、TASK_NOT_READY、TASK_UNAVAILABLE、TASK_RESULT_EXPIRED。詳しくはタスクのリカバリーガイダンスを参照してください。 - 天気ツール:ネットワーク障害時の自動再試行ロジック(指数バックオフを使用して最大3回)を備えています。
- 業務エラーレスポンス:呼び出し元のエージェントが対応できるメッセージを含む、MCPErrorから派生した構造化ペイロードを返します。
- プロトコルテスト:
tools/list、get_tool_catalog、SSEのリクエストID動作を、プロトコルレベルのテストでカバーしています。 - 検証:処理前に入力パラメーターを検証し、明確なエラーメッセージを返します。
例
-
バックグラウンドエリア分析:
python examples/background_area_demo.py- 送信、ポーリング、結果ページの取得を行います。
--task-idを指定するとポーリングを再開でき、--cancel --task-id ...を指定すると明示的にキャンセルできます。
- 送信、ポーリング、結果ページの取得を行います。
-
夜間プランナー:
python examples/nightly_forecast_demo.py- 月明かりを考慮して、今夜見える惑星と深宇宙天体の厳選リストを表示します。
-
観測可能な惑星:
python examples/visible_planets_demo.py- 現在地平線上にある惑星を一覧表示します。
-
月の情報:
python examples/moon_phase_demo.py- 30日分の月相カレンダーを表示します。
-
オーケストレーション:
python examples/code_execution_orchestration.py- 時刻の取得 → 天体位置の取得 → 天気の確認 → 観測場所の検索という一連のワークフローを実演します。
- 標準化されたレスポンス形式をプログラムから処理する方法を紹介します。
-
ページネーション:
python examples/pagination_demo.pyresource_idを使って、大きな結果セットをページごとに取得する方法を実演します。
-
望遠鏡のターゲット:
python examples/telescope_targets_demo.py- RedCat51形式の光学構成向けに、深宇宙の観測対象を順位付けします。
-
撮影計画:
python examples/shooting_plan_demo.py- 1晩分の撮影計画を時系列順に作成します。
プロジェクト構成
.
├── src/
│ ├── functions/ # Tool implementations grouped by domain
│ │ ├── celestial/ # Celestial calculations (pos, rise/set)
│ │ ├── metadata/ # Tool discovery surface (`get_tool_catalog`)
│ │ ├── planning/ # Single-night and multi-night composite planning
│ │ ├── telescope/ # Telescope target matching + shooting plan
│ │ ├── weather/ # Weather API integration
│ │ ├── places/ # Location and area analysis
│ │ └── time/ # Time utilities
│ ├── services/ # Transport-independent application services
│ │ └── planning.py # Single-night and multi-night planning orchestration
│ ├── schemas/ # Pydantic v2 data models
│ ├── analysis_cache.py # Caching logic for analysis results
│ ├── response.py # Standardized response formatting
│ ├── server_instance.py # FastMCP server instance (avoids circular imports)
│ ├── main.py # Entry point and tool registration
│ ├── celestial.py # Core astronomy logic (Astropy wrappers)
│ ├── placefinder.py # Place-finder bridge logic
│ └── qweather_interaction.py # Thin QWeather URL wrappers
├── tests/ # Unified test suite covering every registered tool
├── examples/ # Runnable usage examples, including both telescope tools
├── docs/ # Design docs and roadmap
├── Dockerfile # Multi-stage Docker build
├── supervisord.conf # Dual-service process manager config
└── pyproject.toml # Project configuration and dependencies
テスト
統合テストスイートを実行します。
uv run pytest -v tests/
主なテストは次のとおりです。
test_serialization.py:すべてのツールが、正しいスキーマに準拠した有効な JSON を返すことを確認します。test_integration.py:外部 API をモックし、ツールチェーン全体を検証します。test_mcp_client.py:tools/list、tools/call、および SSE のリクエスト ID プロトコルの動作を検証します。test_structured_errors.py:ビジネス検証エラーが構造化されたレスポンスエンベロープに保持されることを検証します。
リポジトリ間の互換性は、再利用可能な
依存関係チェーンのワークフローで確認します。このワークフローは、
ベースラインと候補のホイールを使用して
stargazing-core → stargazing-place-finder → mcp-stargazing をテストし、
下流で新たな障害を引き起こす変更をブロックします。
コントリビューション
- MCP を使用したコード実行のベストプラクティスに従ってください。
- 新しいツールはすべて、
src.response.format_responseを使用して標準の JSON レスポンスを返すようにしてください。 - 新しい機能を追加する場合は、
tests/にテストを追加してください。 - MCP ツールおよびエージェント向けの変更では、
AGENTS.mdに記載されたリポジトリのエージェント規約に従ってください。 - 公開エージェントの方針と実装ロードマップについては、
docs/agent-contract.mdおよびdocs/ROADMAP.mdを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。