Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ツール一覧

公開されている MCP ツールは以下の 6 個です。

model_query

節点・部材・断面・壁版・床板・床領域・壁領域・二次部材を検索します。

引数型必須/任意意味
kindString必須"node"/"nodes"、"member"/"members"/"element"/"elements"、"section"/"sections"、"wall_plate"/"wall_plates"、"slab"/"slabs"、"floor_region"/"floor_regions"、"wall_region"/"wall_regions"、"unassigned_beam"/"unassigned_beams"、"unassigned_post"/"unassigned_posts"、"secondary_beam"/"secondary_beams" のいずれか。それ以外は空配列を返す
filterOption<String>任意各アイテムを JSON 文字列化した内容に対する部分一致フィルタ

返り値:

{ "items": [ /* 検索結果の JSON オブジェクト配列 */ ] }
  • node: { "id", "coord", "story" }
  • member/element: { "id", "kind", "nodes", "section", "material" }。部材付帯情報(ハンチ・継手位置)があれば haunch_i/haunch_j(length/depth_increase/width_increase)と joints(distance/kind)を追加。入力モデルに保存されている部材だけを返す(壁版から都度生成する耐震壁は含まない。壁は kind=wall_plate で照会する)
  • section: { "id", "name", "area", "iy", "iz" }
  • wall_plate: { "id", "shape", "section", "opening_area", "opening_weight", "slit", "openings", "loads", "becomes_element" }。slit は { "column_face": [bool, bool], "beam_face": [bool, bool] }(耐震スリット。梁際は 0 が下辺、1 が上辺)、loads は仕上げ・増打ちの面荷重 [N/mm²](躯体の自重は含まない)、becomes_element はその壁版から壁エレメントが生成されるか。shape.kind は "Enclosed"(boundary)または "Attached"(anchor・extent・resolved_extent)。extent は入力値そのもので null は階高いっぱいを表し、resolved_extent は階レベルから解決した高さ(null は直上に階が無く解決できない。解析前チェックが止める)
  • slab: { "id", "shape", "section", "loads", "usage", "method", "one_way" }。shape は壁版と同じく "Enclosed" / "Attached"
  • floor_region: { "id", "name", "boundary", "slab_ids", "beams" }。beams は所属小梁の実体配列
  • wall_region: { "id", "name", "boundary", "wall_plate_ids", "posts" }。posts は所属間柱の実体配列
  • unassigned_beam / unassigned_post: どの領域にも入らなかった二次部材の配列
  • secondary_beam: 領域内と未割当を合わせた小梁の実体配列

実装参照:ハンドラは sepika_mcp::server::SepikaServer::model_query(crates/sepika-mcp/src/server.rs)で、検索本体は sepika_mcp::query::query_model(crates/sepika-mcp/src/query.rs)が担います。

model_edit

モデルを編集します。GUI と同じ EditCommand と Undo 履歴を使います。引数は command キーで種別を指定する JSON オブジェクトです(トップレベルに command を置く)。{ "body": { "command": "...", ... } } という入れ子も受け付けます。

返り値:

{ "op_id": "op-1", "applied": true, "undoable": true, "summary": "..." }
  • applied が false のときは、参照検証などでコマンドが Noop になった(モデルは変わらない)
  • 節点・部材・荷重・断面そのものの追加削除など、下表にない EditCommand は未対応(エラー)

壁版(9)

囲まれた壁版は任意の節点境界からは作れません。柱・梁・間柱から導出した壁版割当領域 (準備計算が作る)へ AssignWallPlateToRegion で割り当てます。四辺の対称性から 割当領域の境界がそのまま壁版の境界になります。

command必須任意と既定
AssignWallPlateToRegionregion(壁版割当領域 ID)section(既定 null)、opening_area(既定 0)、opening_weight(既定 0)。領域が既に版ありなら applied: false
SetWallPlateRegionNoPlateregion既存の版があれば削除する(同一 Undo 単位)
UnsetWallPlateRegionregion既存の版があれば削除する(同一 Undo 単位)
AddAttachedWallPlateanchorextent(2 要素 [mm]。省略または null で階高いっぱい。自立壁のみ)、section(既定 null)、self_weight_shares(境界辺順の負担率。非負・有限・総和 1、既定 [] は未指定)、opening_area(既定 0)、opening_weight(既定 0)
DeleteWallPlateid—
SetWallPlateSectionidsection(null で未割当)
SetPostGravityEndSharesmember(間柱の安定 ID)shares(端の並び順の負担率2値、非負・有限・総和1。省略・nullは未指定)
SetWallPlateAttrsidself_weight_shares(境界辺順の負担率。非負・有限・総和 1、既定 [] は未指定)、opening_area(既定 0)、opening_weight(既定 0)、openings(既定 [])、loads(仕上げ・増打ちの面荷重。既定 [])、slit({ "column_face": [bool, bool], "beam_face": [bool, bool] }。片方のキーだけでも可。既定は 4 辺とも false)
SetAttachedWallPlateExtentidextent(省略または null で階高いっぱい。自立壁のみ)
SetAttachedWallPlateAnchorid、anchor—

壁版割当領域への割当の例:

{
  "command": "AssignWallPlateToRegion",
  "region": 0,
  "section": null,
  "opening_area": 0.0,
  "opening_weight": 0.0
}

取付き先 anchor が線のときの形(nodes は取付き梁の 2 節点、span は梁全長に対する無次元区間):

{
  "Line": { "nodes": [0, 1], "span": [0.0, 1.0], "transfer": "Anchor" }
}

床板(10)

囲まれた床板は任意の節点境界からは作れません。大梁・小梁から導出した床板割当領域 (floor_assignment_region)へ割り当てます。割当・版なし・未設定は同一 Undo 単位です。

command必須任意と既定
AssignSlabToFloorPlateRegionregion(床板割当領域 ID)版仕様はフラット引数(section/loads/usage/method/one_way)か plate オブジェクト。method 未指定は "TriTrapezoid"。loads 未指定は []。領域が既に版ありなら applied: false
SetFloorPlateRegionNoPlateregion既存の版があれば削除する(同一 Undo 単位)
UnsetFloorPlateRegionregion既存の版があれば削除する(同一 Undo 単位)
AddAttachedSlabanchor、extent版仕様はフラット引数(section/loads/usage/method/one_way)か plate オブジェクト。method 未指定は "TriTrapezoid"。loads 未指定は []
DeleteSlabid—
SetSlabSectionidsection(null で未割当)
SetSlabUsageidusage(null で積載荷重なし)
SetSlabOneWayidone_way(null で境界辺 0・2 が負担)
SetAttachedExtentid、extent—
SetAttachedAnchorid、anchor—

AddAttachedSlab のフラット引数の例:

{
  "command": "AddAttachedSlab",
  "anchor": { "Line": { "nodes": [0, 1], "span": [0.0, 1.0], "transfer": "Anchor" } },
  "extent": [1000.0, 1000.0],
  "section": 0
}

床領域(2)

command必須任意と既定
SetFloorRegionNameid、name—
SetFloorRegionSecondaryBeamsfloor_region(別名 id)、secondary_beams(SecondaryMember の配列。空にするときは []。空にすると旧所属は未割当へ移る)—

secondary_beams を省略するとエラーになります(欠落を空配列とみなしてリストを消すことはしません)。旧小梁語彙のコマンドやキーは受け付けずエラーになります。

未割当二次部材(4)

command必須任意と既定
AddUnassignedBeambeam(SecondaryMember)—
DeleteUnassignedBeamindex—
AddUnassignedPostpost(SecondaryMember)—
DeleteUnassignedPostindex—

同じ端点の小梁・間柱が既にあるときは適用されず applied: false になります。SecondaryMember は id(安定 ID)・kind・ends(支持部材アンカー/片持ち自由端)・section・name を持ちます。端部支持条件は SetSecondaryMemberEndSupport で設定できます。

二次部材の端部支持条件(1)

command必須任意と既定
SetSecondaryMemberEndSupportmember(二次部材の安定 ID)、end_support("Supported" / "Free" の 2 要素配列)—

安定 ID で対象の小梁・間柱を探し、床領域内・壁領域内・未割当のいずれにあっても設定します。支持端は現在の端部座標から支持部材アンカーへ再解決し、片持ち小梁は自由端の位置を "Free" にします(例: "end_support": ["Supported", "Free"])。同じ条件のときは適用されず applied: false になります。

二次部材の配置・移動・削除(3)

command必須任意と既定
PlaceSecondaryMemberparent("floor" / "wall" / "unassigned")、kind("Beam" / "Post")、ends(取付き位置表現)region(parent が "floor" / "wall" のとき必須。対象の床領域/壁領域 ID)、section(既定は未割当)、name(既定は空)
SetSecondaryMemberEndsmember(二次部材の安定 ID)、ends(取付き位置表現)—
DeleteSecondaryMembermember(二次部材の安定 ID)—

PlaceSecondaryMember は安定 ID を新規に払い出し、親領域(floor なら小梁、wall なら間柱、unassigned なら未割当)へ追加したうえで床板・壁版割当領域を再構築します。ends は {"Supported": [{"support": {"Primary": 0}, "position": 0.5}, ...]} のように支持部材アンカーで指定します。支持が決まらない端(Detached)、種別に合わない親、支持端が親領域(SecondaryParent が指す床領域・壁領域)の内側または境界上(許容差 10 mm)にない場合は適用されず applied: false になります(片持ちへの読み替えはしません)。SetSecondaryMemberEnds も同じ親領域内判定を行い、移動先が現在の所属領域の外へ出る場合は適用されません。

配置・移動・削除では、境界が変わって参照先を失った囲まれた床板・壁版を取り除き、新しい割当領域を未設定にします。版の除去まで含めて 1 つの Undo 単位です。ends の解析に失敗した場合は ends の解析エラーを返します。

壁領域(1)

command必須任意と既定
SetWallRegionPostswall_region(別名 id)、posts(SecondaryMember の配列。空にするときは [])—

posts を省略するとエラーになります。壁領域の新規作成・削除は公開していません(準備計算が壁領域を作り直すため)。

床領域の新規作成・削除は公開していません(準備計算が床領域を作り直すため)。

実装参照:ハンドラは sepika_mcp::server::SepikaServer::model_edit(crates/sepika-mcp/src/server.rs)で、コマンドの解析と GUI と同じ Undo 経路での適用は sepika_mcp::edit::{parse_edit_command, apply_edit}(crates/sepika-mcp/src/edit.rs)が担います。

quantity_takeoff

数量積算(コンクリート体積・型枠面積・鉄筋/鉄骨重量の概算)を集計します。

引数型必須/任意意味既定値
group_byOption<String>任意"category"(部位別)/"story"(階別)/"steel"(鉄骨種類別)/"rebar"(鉄筋径別)/"detail"(明細)"category"

返り値:

{ "rows": [ /* group_by に応じた行 */ ], "totals": { "concrete_m3": .., "formwork_m2": .., "rebar_t": .., "steel_t": .., "rebar_joints": .. }, "notes": [ /* 注記 */ ] }

rows の形は group_by により異なります。

group_by行の形
category(既定){ category, concrete_m3, formwork_m2, rebar_t, steel_t, rebar_joints }
story{ story, concrete_m3, formwork_m2, rebar_t, steel_t, rebar_joints }
steel{ section, length_m, weight_t }
rebar{ dia_mm, length_m, weight_t }
detail{ elem, slab, label, story, category, structure, concrete_m3, formwork_m2, rebar_t, steel_t, rebar_joints }

数量の算定式は数量積算を参照してください。

実装参照:ハンドラは sepika_mcp::server::SepikaServer::quantity_takeoff(crates/sepika-mcp/src/server.rs)で、集計本体は sepika_mcp::query::quantity_takeoff_json(crates/sepika-mcp/src/query.rs)が担います。

analysis_run

解析を非同期で実行し、ジョブを登録して job_id を即座に返します(計算完了は待ちません)。

引数型必須/任意意味既定値
kindJobKind必須LinearStatic/Eigen/Pushover/TimeHistory/DesignCheck/UltimateCheck(質点系は含まれません)—
load_caseOption<u32>任意LinearStatic/DesignCheck/UltimateCheck: 対象荷重ケース ID先頭の荷重ケース
n_modesOption<usize>任意Eigen: モード数3
dirOption<String>任意Pushover/TimeHistory: 加力・入力方向。"X"/"Y" 以外はエラー"X"
stepsOption<usize>任意Pushover: 最大ステップ数50
max_dispOption<f64>任意Pushover: 目標変位 [mm]。未指定なら目標層間変形角のみで判定なし
max_drift_denomOption<f64>任意Pushover: 目標最大層間変形角の分母 n(角度 1/n)。max_disp と両方指定した場合は早く達した方で終了150(max_disp 未指定時)
dtOption<f64>任意TimeHistory: サンプル波の時間刻み [s]0.01
durationOption<f64>任意TimeHistory: サンプル波の継続時間 [s]2.0
periodOption<f64>任意TimeHistory: サンプル波の周期 [s]0.5
ampOption<f64>任意TimeHistory: サンプル波の振幅 [mm/s²]1000
zOption<f64>任意荷重自動同期: 地域係数 Z(令88条)1.0
soilOption<String>任意荷重自動同期: 地盤種別。"I"/"II"/"III" 以外はエラー"II"
c0Option<f64>任意荷重自動同期: 標準せん断力係数 C00.2
ai_modeOption<String>任意荷重自動同期: Ai 算定法。"Approx"/"SemiPrecise" 以外はエラー"Approx"
design_periodOption<f64>任意荷重自動同期: 精算時の設計用基本周期 T [s]。ai_mode="SemiPrecise" かつ未指定なら EX/EY を同期しないなし

返り値:

{ "job_id": "job-0" }

kind ごとに使用するパラメータと概略処理:

kind使用パラメータ処理概要
LinearStaticload_case, z, soil, c0, ai_mode, design_period指定/先頭の荷重ケースで線形静解析(解析前に荷重自動同期)
Eigenn_modes, z, soil, c0, ai_mode, design_period固有値解析(周期・刺激係数・有効質量。解析前に荷重自動同期)
Pushoverdir, steps, max_disp, max_drift_denom(解析前同期: z, soil, c0, ai_mode, design_period)増分解析(プッシュオーバー解析)。水平載荷の Ai 分布は solver 側で略算 T・Z=1・地盤 II・C0=0.2 固定。地震引数は階重量・EX/EY の同期にのみ効く。結果ストアには書かずサマリ JSON のみを返す
TimeHistorydir, dt, duration, period, amp, z, soil, c0, ai_mode, design_periodサンプル波(amp * sin(ωt) * e^{-0.3t})による時刻歴応答解析。減衰は剛性比例減衰(h=0.02、1 次固有振動数使用)固定(解析前に荷重自動同期)。結果ストアには書かずサマリ JSON のみを返す
DesignCheckload_case, z, soil, c0, ai_mode, design_period荷重ケースの線形静解析結果に対する断面検定(鋼/RC 許容応力度、危険断面位置基準)。検定条件は荷重ケース種別で決まる(地震・風は短期、それ以外は長期)。地震時短期は重力ケースを別途解析して長期内力を重ね、Q0 も算定する(重力の再解析に失敗した分は gravity_failed に件数を載せ、成功分だけで組む)。付着は Rc1999、QD は既定方式、一本部材は未対応。検定結果自体はサマリ JSON のみに入り、結果ストアには断面力のみを書く
UltimateCheckload_case, z, soil, c0, ai_mode, design_periodRC 部材の終局せん断・付着・軸余裕度、CFT 柱の軸終局検定(靭性保証型耐震設計指針)。QL・Q0 は設定しない。結果ストアには書かずサマリ JSON のみを返す

Done の result_ref(サマリ JSON)には、解析結果に加え、前処理の注意事項があれば notices 配列が付きます。たとえば ai_mode="SemiPrecise" かつ design_period 未指定のときは EX/EY を同期せず、その旨が notices に入ります(ジョブ自体は完了します)。未設定の床板・壁版割当領域が残っている場合も、件数と対象 ID を記した警告が notices に入ります。GUI のように計算前の確認は挟まず、警告を結果へ添えて計算は続行します(未設定は荷重・剛性を過小評価し得るため、結果を採用する前に必ず解消してください)。

実装参照:ハンドラは sepika_mcp::server::SepikaServer::analysis_run(crates/sepika-mcp/src/server.rs)で、kind ごとの振り分けは sepika_mcp::job::compute_job(crates/sepika-mcp/src/job/mod.rs)が担います。

analysis_status

ジョブの状態を取得します。

引数型必須/任意意味
job_idString必須analysis_run が返した ID

返り値:

{ "id": "job-0", "kind": "LinearStatic", "status": { /* Queued | Running{progress} | Done{result_ref} | Failed{error} */ } }
  • status は次のいずれかの形を取ります。
    • "Queued"(ジョブ登録直後の内部状態。通常は analysis_run がすぐに実行を開始するため、ポーリングではほとんど見えません)
    • { "Running": { "progress": 0.0 } }
    • { "Done": { "result_ref": "<サマリ JSON 文字列>" } }
    • { "Failed": { "error": "<エラーメッセージ>" } }
  • job_id が存在しない場合はエラー(invalid_params)。

実装参照:ハンドラは sepika_mcp::server::SepikaServer::analysis_status(crates/sepika-mcp/src/server.rs)で、ジョブの登録・状態保持は sepika_mcp::JobRegistry(crates/sepika-mcp/src/lib.rs)が担います。

result_get

解析結果ストアから結果を取得します。

引数型必須/任意意味
caseu32必須荷重ケース ID(Eigen の結果は case=0 固定)
kindString必須"NodalDisp"/"MemberForce"/"Modal"/"TimeHistory" のいずれか
node_idsOption<Vec<u32>>任意節点 ID での絞り込み
member_idsOption<Vec<u32>>任意部材 ID での絞り込み
step_rangeOption<Vec<u64>>任意[start, end) のちょうど 2 要素。それ以外はエラー

返り値:

{ "case": 1, "kind": "NodalDisp", "rows": [ /* 明細行 */ ], "truncated": false }

(case, kind) の組が結果ストアにない場合はエラーになります(analysis_run を先に実行する必要があります)。 各 kind の列構成は解析ジョブのフローと結果ストアを参照してください。

実装参照:ハンドラは sepika_mcp::server::SepikaServer::result_get(crates/sepika-mcp/src/server.rs)で、結果の読み出しと絞り込み・行数上限の適用は sepika_mcp::persist::result_get_json(crates/sepika-mcp/src/persist.rs)が担います。